/**
* =============================================================================
*
* 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.api.t1.server;
import static org.orcid.core.api.OrcidApiConstants.AFFILIATIONS_PATH;
import static org.orcid.core.api.OrcidApiConstants.APPLICATION_RDFXML;
import static org.orcid.core.api.OrcidApiConstants.BIO_PATH;
import static org.orcid.core.api.OrcidApiConstants.BIO_SEARCH_PATH;
import static org.orcid.core.api.OrcidApiConstants.CLIENT_PATH;
import static org.orcid.core.api.OrcidApiConstants.EXPERIMENTAL_RDF_V1;
import static org.orcid.core.api.OrcidApiConstants.EXTERNAL_IDENTIFIER_PATH;
import static org.orcid.core.api.OrcidApiConstants.FUNDING_PATH;
import static org.orcid.core.api.OrcidApiConstants.ORCID_JSON;
import static org.orcid.core.api.OrcidApiConstants.ORCID_XML;
import static org.orcid.core.api.OrcidApiConstants.PROFILE_GET_PATH;
import static org.orcid.core.api.OrcidApiConstants.STATUS_PATH;
import static org.orcid.core.api.OrcidApiConstants.TEXT_N3;
import static org.orcid.core.api.OrcidApiConstants.TEXT_TURTLE;
import static org.orcid.core.api.OrcidApiConstants.VND_ORCID_JSON;
import static org.orcid.core.api.OrcidApiConstants.VND_ORCID_XML;
import static org.orcid.core.api.OrcidApiConstants.WORKS_PATH;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.commons.lang.StringUtils;
import org.orcid.api.common.OrcidApiService;
import org.orcid.api.common.T2OrcidApiService;
import org.orcid.api.common.delegator.OrcidApiServiceDelegator;
import org.orcid.api.common.delegator.impl.OrcidApiServiceVersionedDelegatorImpl;
import org.orcid.core.manager.impl.ValidationManagerImpl;
import org.orcid.core.oauth.OrcidClientCredentialEndPointDelegator;
import org.orcid.jaxb.model.message.OrcidMessage;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
/**
* @author Declan Newman (declan) Date: 01/03/2012
*/
abstract public class T1OrcidApiServiceImplBase implements OrcidApiService<Response>, InitializingBean {
@Value("${org.orcid.core.pubBaseUri:http://orcid.org}")
private String pubBaseUri;
@Context
private UriInfo uriInfo;
private OrcidApiServiceDelegator orcidApiServiceDelegator;
/**
* Only used if service delegator is not set and this bean needs to
* configure one for itself.
*/
private String externalVersion;
/**
* Only used if service delegator is not set and this bean needs to
* configure one for itself.
*/
@Resource(name = "t1OrcidApiServiceDelegatorPrototype")
private OrcidApiServiceVersionedDelegatorImpl orcidApiServiceDelegatorPrototype;
// Base the RDF stuff on the root version of the API, because sits outside
// the versioning mechanism
@Resource(name = "t1OrcidApiServiceDelegatorLatest")
private OrcidApiServiceDelegator orcidApiServiceDelegatorLatest;
@Resource
private OrcidClientCredentialEndPointDelegator orcidClientCredentialEndPointDelegator;
public void setUriInfo(UriInfo uriInfo) {
this.uriInfo = uriInfo;
}
public void setOrcidApiServiceDelegator(OrcidApiServiceDelegator orcidApiServiceDelegator) {
this.orcidApiServiceDelegator = orcidApiServiceDelegator;
}
/**
*
* @param externalVersion
* The API schema version to use. Not needed if we are setting a
* service delegator explicitly (and not relying on this bean to
* configure one for itself).
*/
public void setExternalVersion(String externalVersion) {
this.externalVersion = externalVersion;
}
@Override
public void afterPropertiesSet() throws Exception {
// Automatically configure a service delegator, if one hasn't been set
if (orcidApiServiceDelegator == null && externalVersion != null) {
orcidApiServiceDelegatorPrototype.setExternalVersion(externalVersion);
ValidationManagerImpl outgoingValidationManagerImpl = new ValidationManagerImpl();
outgoingValidationManagerImpl.setVersion(externalVersion);
orcidApiServiceDelegatorPrototype.setOutgoingValidationManager(outgoingValidationManagerImpl);
orcidApiServiceDelegator = orcidApiServiceDelegatorPrototype;
}
}
/**
* @return Plain text message indicating health of service
*/
@GET
@Produces(value = { MediaType.TEXT_PLAIN })
@Path(STATUS_PATH)
public Response viewStatusText() {
return orcidApiServiceDelegator.viewStatusText();
}
/**
* GETs the HTML representation of the ORCID record
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(BIO_PATH)
public Response viewBioDetailsHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findBioDetailsFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-bio.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing only the
* Biography details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(BIO_PATH)
public Response viewBioDetailsXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findBioDetailsFromPublicCache(orcid);
}
/**
* returns a redirect to experimental rdf api
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return A 303 See Other redirect
*/
@GET
@Produces(value = { APPLICATION_RDFXML })
@Path(BIO_PATH)
public Response redirBioDetailsRdf(@PathParam("orcid") String orcid) {
URI uri = null;
try {
uri = new URI(pubBaseUri + EXPERIMENTAL_RDF_V1 + "/" + orcid);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Response.seeOther(uri).build();
}
/**
* GETs the RDF/XML representation of the ORCID record containing only the
* Biography details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the RDF/XML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { APPLICATION_RDFXML })
@Path(EXPERIMENTAL_RDF_V1 + BIO_PATH)
public Response viewBioDetailsRdf(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegatorLatest.findBioDetails(orcid);
}
/**
* returns a redirect to experimental rdf api
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return A 303 See Other redirect
*/
@GET
@Produces(value = { TEXT_N3, TEXT_TURTLE })
@Path(BIO_PATH)
public Response redirBioDetailsTurtle(@PathParam("orcid") String orcid) {
URI uri = null;
try {
uri = new URI(pubBaseUri + EXPERIMENTAL_RDF_V1 + "/" + orcid);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Response.seeOther(uri).build();
}
/**
* GETs the RDF Turtle representation of the ORCID record containing only
* the Biography details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the RDF Turtle representation of the ORCID record
*/
@GET
@Produces(value = { TEXT_N3, TEXT_TURTLE })
@Path(EXPERIMENTAL_RDF_V1 + BIO_PATH)
public Response viewBioDetailsTurtle(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegatorLatest.findBioDetails(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing only the
* Biography details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(BIO_PATH)
public Response viewBioDetailsJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findBioDetailsFromPublicCache(orcid);
}
/**
* GETs the HTML representation of the ORCID external identifiers
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(EXTERNAL_IDENTIFIER_PATH)
public Response viewExternalIdentifiersHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findExternalIdentifiersFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-external-ids.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing only the
* external identifiers
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(EXTERNAL_IDENTIFIER_PATH)
public Response viewExternalIdentifiersXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findExternalIdentifiersFromPublicCache(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing only the
* external identifiers
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(EXTERNAL_IDENTIFIER_PATH)
public Response viewExternalIdentifiersJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findExternalIdentifiersFromPublicCache(orcid);
}
/**
* GETs the HTML representation of the ORCID record containing all details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(PROFILE_GET_PATH)
public Response viewFullDetailsHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findFullDetailsFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-profile.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing all details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(PROFILE_GET_PATH)
public Response viewFullDetailsXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findFullDetailsFromPublicCache(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing all details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(PROFILE_GET_PATH)
public Response viewFullDetailsJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findFullDetailsFromPublicCache(orcid);
}
/**
* GETs the HTML representation of the ORCID record containing only
* affiliation details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(AFFILIATIONS_PATH)
public Response viewAffiliationsDetailsHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findAffiliationsDetailsFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-affiliations.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing only
* affiliation details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(AFFILIATIONS_PATH)
public Response viewAffiliationsDetailsXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findAffiliationsDetailsFromPublicCache(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing only
* affiliation details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(AFFILIATIONS_PATH)
public Response viewAffiliationsDetailsJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findAffiliationsDetailsFromPublicCache(orcid);
}
/**
* GETs the HTML representation of the ORCID record containing only funding
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(FUNDING_PATH)
public Response viewFundingDetailsHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findFundingDetailsFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-grants.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing only funding
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(FUNDING_PATH)
public Response viewFundingDetailsXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findFundingDetailsFromPublicCache(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing only funding
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(FUNDING_PATH)
public Response viewFundingDetailsJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findFundingDetailsFromPublicCache(orcid);
}
/**
* GETs the HTML representation of the ORCID record containing only work
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the HTML representation of the ORCID record
*/
@Override
@GET
@Produces(value = { MediaType.TEXT_HTML })
@Path(WORKS_PATH)
public Response viewWorksDetailsHtml(@PathParam("orcid") String orcid) {
Response response = orcidApiServiceDelegator.findWorksDetailsFromPublicCache(orcid);
return Response.fromResponse(response).header("Content-Disposition", "attachment; filename=\"" + orcid + "-works.xml\"").build();
}
/**
* GETs the XML representation of the ORCID record containing only work
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the XML representation of the ORCID record
*/
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(WORKS_PATH)
public Response viewWorksDetailsXml(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findWorksDetailsFromPublicCache(orcid);
}
/**
* GETs the JSON representation of the ORCID record containing only work
* details
*
* @param orcid
* the ORCID that corresponds to the user's record
* @return the JSON representation of the ORCID record
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(WORKS_PATH)
public Response viewWorksDetailsJson(@PathParam("orcid") String orcid) {
return orcidApiServiceDelegator.findWorksDetailsFromPublicCache(orcid);
}
/**
* Sends a redirect from the client URI to the group URI
*
* @param clientId
* the client ID that corresponds to the client
* @return a redirect to the ORCID record for the client's group
*/
@Override
@GET
@Path(CLIENT_PATH)
public Response viewClient(@PathParam("client_id") String clientId) {
return orcidApiServiceDelegator.redirectClientToGroup(clientId);
}
/**
* Gets the JSON representation any Orcid Profiles (BIO) only relevant to
* the given query
*
* @param query
* @return
*/
@Override
@GET
@Produces(value = { VND_ORCID_JSON, ORCID_JSON, MediaType.APPLICATION_JSON })
@Path(BIO_SEARCH_PATH)
public Response searchByQueryJSON(String query) {
Map<String, List<String>> queryParams = uriInfo.getQueryParameters();
Response jsonQueryResults = orcidApiServiceDelegator.publicSearchByQuery(queryParams);
registerSearchMetrics(jsonQueryResults);
return jsonQueryResults;
}
/**
* Gets the XML representation any Orcid Profiles (BIO) only relevant to the
* given query
*
* @param query
* @return
*/
@Override
@GET
@Produces(value = { VND_ORCID_XML, ORCID_XML, MediaType.APPLICATION_XML })
@Path(BIO_SEARCH_PATH)
public Response searchByQueryXML(String query) {
Map<String, List<String>> queryParams = uriInfo.getQueryParameters();
Response xmlQueryResults = orcidApiServiceDelegator.publicSearchByQuery(queryParams);
registerSearchMetrics(xmlQueryResults);
return xmlQueryResults;
}
private void registerSearchMetrics(Response results) {
OrcidMessage orcidMessage = (OrcidMessage) results.getEntity();
if (orcidMessage != null && orcidMessage.getOrcidSearchResults() != null && !orcidMessage.getOrcidSearchResults().getOrcidSearchResult().isEmpty()) {
return;
}
}
/**
* @param formParams
* @return
*/
@POST
@Path(T2OrcidApiService.OAUTH_TOKEN)
@Produces(value = { MediaType.APPLICATION_JSON })
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response obtainOauth2TokenPost(@HeaderParam("Authorization") @DefaultValue(StringUtils.EMPTY) String authorization, @FormParam("grant_type") String grantType, MultivaluedMap<String, String> formParams) {
return orcidClientCredentialEndPointDelegator.obtainOauth2Token(authorization, formParams);
}
}