Skip to content

Commit

Permalink
Add CrossRef provider logic
Browse files Browse the repository at this point in the history
  • Loading branch information
Konrad Perłowski authored and konradperlowski committed Jan 15, 2024
1 parent 39794d5 commit e1bf3c3
Show file tree
Hide file tree
Showing 11 changed files with 619 additions and 23 deletions.
9 changes: 9 additions & 0 deletions doc/sphinx-guides/source/installation/config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,15 @@ this provider.
- :ref:`dataverse.pid.ezid.username`
- :ref:`dataverse.pid.ezid.password`

**JVM Options for CrossRef:**

- :ref:`dataverse.pid.crossref.url`
- :ref:`dataverse.pid.crossref.rest-api-url`
- :ref:`dataverse.pid.crossref.username`
- :ref:`dataverse.pid.crossref.password`
- :ref:`dataverse.pid.crossref.depositor`
- :ref:`dataverse.pid.crossref.depositor-email`

**Database Settings:**

- :ref:`:DoiProvider <:DoiProvider>`
Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -653,6 +653,11 @@
<version>3.2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>fluent-hc</artifactId>
<version>4.5.14</version>
</dependency>
</dependencies>
<build>
<testResources>
Expand Down
118 changes: 118 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/CrossRefRESTfullClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package edu.harvard.iq.dataverse;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.Closeable;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CrossRefRESTfullClient implements Closeable {

private static final Logger logger = Logger.getLogger(CrossRefRESTfullClient.class.getCanonicalName());

private final String url;
private final String apiUrl;
private final String username;
private final String password;
private final CloseableHttpClient httpClient;
private final HttpClientContext context;
private final String encoding = "utf-8";

public CrossRefRESTfullClient(String url, String apiUrl, String username, String password) {
this.url = url;
this.apiUrl = apiUrl;
this.username = username;
this.password = password;
try {
context = HttpClientContext.create();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(null, -1),
new UsernamePasswordCredentials(username, password));
context.setCredentialsProvider(credsProvider);

httpClient = HttpClients.createDefault();
} catch (Exception ioe) {
close();
logger.log(Level.SEVERE,"Fail to init Client",ioe);
throw new RuntimeException("Fail to init Client", ioe);
}
}

public void close() {
if (this.httpClient != null) {
try {
httpClient.close();
} catch (IOException io) {
logger.warning("IOException closing hhtpClient: " + io.getMessage());
}
}
}

public String getMetadata(String doi) {
HttpGet httpGet = new HttpGet(this.apiUrl + "/works/" + doi);
httpGet.setHeader("Accept", "application/json");
try {
HttpResponse response = httpClient.execute(httpGet);
String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 200) {
String errMsg = "Response from getMetadata: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.info(errMsg);
throw new RuntimeException(errMsg);
}
return data;
} catch (IOException ioe) {
logger.info("IOException when get metadata");
throw new RuntimeException("IOException when get metadata", ioe);
}
}

public String postMetadata(String xml) throws IOException {
HttpEntity entity = MultipartEntityBuilder.create()
.addTextBody("operation", "doMDUpload")
.addTextBody("login_id", username)
.addTextBody("login_passwd", password)
.addBinaryBody("fname", xml.getBytes(StandardCharsets.UTF_8), ContentType.APPLICATION_XML, "metadata.xml")
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.build();
HttpResponse response = Request.Post(url + "/servlet/deposit")
.body(entity)
.setHeader("Accept", "*/*")
.execute().returnResponse();

String data = EntityUtils.toString(response.getEntity(), encoding);
if (response.getStatusLine().getStatusCode() != 200) {
String errMsg = "Response from postMetadata: " + response.getStatusLine().getStatusCode() + ", " + data;
logger.info(errMsg);
throw new IOException(errMsg);
}
return data;
}

public boolean testDOIExists(String doi) throws IOException {
HttpGet httpGet = new HttpGet(this.apiUrl + "/works/" + doi);
httpGet.setHeader("Accept", "application/json");
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() != 200) {
EntityUtils.consumeQuietly(response.getEntity());
return false;
}
EntityUtils.consumeQuietly(response.getEntity());
return true;
}
}
Loading

0 comments on commit e1bf3c3

Please sign in to comment.