/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.core.manager.impl;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.orcid.core.crossref.CrossRefMetadata;
import org.orcid.core.manager.CrossRefManager;
import org.orcid.core.utils.ContentTypeFromTextToJsonClientFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.client.apache4.ApacheHttpClient4;
/**
*
* @author Will Simpson
*
*/
public class CrossRefManagerImpl implements CrossRefManager {
private static final Logger LOGGER = LoggerFactory.getLogger(CrossRefManagerImpl.class);
/* sample url get
* old: http://crossref.org/sigg/sigg/FindWorks?version=1&access=API_KEY&format=json&op=OR&expression=Laura+Paglione
* new: http://search.crossref.org/dois?content-type=application%2Fjson&op=OR&access=API_KEY&version=1&q=Laura+Paglione
*
* Documentation: http://search.crossref.org/help/api
*/
private String crossRefUrl = "http://search.crossref.org/dois";
private static final String queryString = "content-type=application%2Fjson&op=OR&access=API_KEY&version=1&q=";
public void setCrossRefUrl(String crossRefUrl) {
this.crossRefUrl = crossRefUrl;
}
@Override
public List<CrossRefMetadata> searchForMetadata(String searchTerms) {
WebResource resource = createResource(searchTerms);
return resource.get(new GenericType<ArrayList<CrossRefMetadata>>() {
});
}
@Override
public String searchForMetadataAsString(String searchTerms) {
WebResource resource = createResource(searchTerms);
return resource.post(String.class);
}
private WebResource createResource(String searchTerms) {
Client client = createClient();
String encoded = null;
try {
encoded = URLEncoder.encode(searchTerms, "UTF-8");
} catch (UnsupportedEncodingException e) {
LOGGER.error("search terms: " + searchTerms + "cannot be encoded", e);
}
WebResource resource = client.resource(crossRefUrl + "?" + queryString + encoded);
return resource;
}
private Client createClient() {
Set<Class<?>> providers = new HashSet<Class<?>>();
providers.add(JacksonJsonProvider.class);
ClientConfig config = new DefaultClientConfig(providers);
config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = ApacheHttpClient4.create(config);
client.setFollowRedirects(true);
client.addFilter(new ContentTypeFromTextToJsonClientFilter());
return client;
}
}