/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.sherpa;
import org.apache.http.HttpStatus;
import org.apache.http.config.SocketConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger;
import org.dspace.core.ConfigurationManager;
public class SHERPAService
{
private CloseableHttpClient client = null;
private int maxNumberOfTries;
private long sleepBetweenTimeouts;
private int timeout;
/** log4j category */
private static final Logger log = Logger.getLogger(SHERPAService.class);
public SHERPAService() {
HttpClientBuilder custom = HttpClients.custom();
// httpclient 4.3+ doesn't appear to have any sensible defaults any more. Setting conservative defaults as not to hammer the SHERPA service too much.
client=custom.disableAutomaticRetries().setMaxConnTotal(5).setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(timeout).build()).build();
}
public SHERPAResponse searchByJournalISSN(String query)
{
String endpoint = ConfigurationManager.getProperty("sherpa.romeo.url");
String apiKey = ConfigurationManager.getProperty("sherpa.romeo.apikey");
HttpGet method = null;
SHERPAResponse sherpaResponse = null;
int numberOfTries = 0;
while(numberOfTries<maxNumberOfTries && sherpaResponse==null) {
numberOfTries++;
try {
Thread.sleep(sleepBetweenTimeouts * (numberOfTries-1));
URIBuilder uriBuilder = new URIBuilder(endpoint);
uriBuilder.addParameter("issn", query);
uriBuilder.addParameter("versions", "all");
if (StringUtils.isNotBlank(apiKey))
uriBuilder.addParameter("ak", apiKey);
method = new HttpGet(uriBuilder.build());
// Execute the method.
HttpResponse response = client.execute(method);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) {
sherpaResponse = new SHERPAResponse("SHERPA/RoMEO return not OK status: "
+ statusCode);
}
HttpEntity responseBody = response.getEntity();
if (null != responseBody)
sherpaResponse = new SHERPAResponse(responseBody.getContent());
else
sherpaResponse = new SHERPAResponse("SHERPA/RoMEO returned no response");
} catch (Exception e) {
log.error(e.getMessage(),e);
}
}
if(sherpaResponse==null){
sherpaResponse = new SHERPAResponse(
"Error processing the SHERPA/RoMEO answer");
}
return sherpaResponse;
}
public void setMaxNumberOfTries(int maxNumberOfTries) {
this.maxNumberOfTries = maxNumberOfTries;
}
public void setSleepBetweenTimeouts(long sleepBetweenTimeouts) {
this.sleepBetweenTimeouts = sleepBetweenTimeouts;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
}