/** * ============================================================================= * * 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.common.delegator.impl; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.ws.rs.core.Response; import org.orcid.api.common.delegator.OrcidApiServiceDelegator; import org.orcid.core.manager.ValidationManager; import org.orcid.core.manager.impl.ValidationManagerImpl; import org.orcid.core.version.OrcidMessageVersionConverterChain; import org.orcid.jaxb.model.message.OrcidMessage; import org.springframework.beans.factory.InitializingBean; /** * * @author Will Simpson * */ public class OrcidApiServiceVersionedDelegatorImpl implements OrcidApiServiceDelegator, InitializingBean { @Resource(name = "orcidApiServiceDelegator") private OrcidApiServiceDelegator orcidApiServiceDelegator; @Resource private OrcidMessageVersionConverterChain orcidMessageVersionConverterChain; private ValidationManager outgoingValidationManager; private String externalVersion = OrcidMessage.DEFAULT_VERSION; public void setExternalVersion(String externalVersion) { this.externalVersion = externalVersion; } public void setOutgoingValidationManager(ValidationManager outgoingValidationManager) { this.outgoingValidationManager = outgoingValidationManager; } @Override public void afterPropertiesSet() throws Exception { autoConfigureValidators(); } public void autoConfigureValidators() { if (outgoingValidationManager == null) { ValidationManagerImpl outgoingValidationManagerImpl = new ValidationManagerImpl(); outgoingValidationManagerImpl.setVersion(externalVersion); setOutgoingValidationManager(outgoingValidationManagerImpl); } } @Override public Response viewStatusText() { return orcidApiServiceDelegator.viewStatusText(); } @Override public Response findBioDetails(String orcid) { Response response = orcidApiServiceDelegator.findBioDetails(orcid); return regradeAndValidateResponse(response); } @Override public Response findBioDetailsFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findBioDetailsFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response findExternalIdentifiers(String orcid) { Response response = orcidApiServiceDelegator.findExternalIdentifiers(orcid); return regradeAndValidateResponse(response); } @Override public Response findExternalIdentifiersFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findExternalIdentifiersFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response findFullDetails(String orcid) { Response response = orcidApiServiceDelegator.findFullDetails(orcid); return regradeAndValidateResponse(response); } @Override public Response findFullDetailsFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findFullDetailsFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response findAffiliationsDetails(String orcid) { Response response = orcidApiServiceDelegator.findAffiliationsDetails(orcid); return regradeAndValidateResponse(response); } @Override public Response findAffiliationsDetailsFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findAffiliationsDetailsFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response findFundingDetails(String orcid) { Response response = orcidApiServiceDelegator.findFundingDetails(orcid); return regradeAndValidateResponse(response); } @Override public Response findFundingDetailsFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findFundingDetailsFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response findWorksDetails(String orcid) { Response response = orcidApiServiceDelegator.findWorksDetails(orcid); return regradeAndValidateResponse(response); } @Override public Response findWorksDetailsFromPublicCache(String orcid) { Response response = orcidApiServiceDelegator.findWorksDetailsFromPublicCache(orcid); return regradeAndValidateResponse(response); } @Override public Response redirectClientToGroup(String clientId) { return orcidApiServiceDelegator.redirectClientToGroup(clientId); } @Override public Response searchByQuery(Map<String, List<String>> queryMap) { Response response = orcidApiServiceDelegator.searchByQuery(queryMap); return regradeAndValidateResponse(response); } @Override public Response publicSearchByQuery(Map<String, List<String>> queryMap) { Response response = orcidApiServiceDelegator.publicSearchByQuery(queryMap); return regradeAndValidateResponse(response); } private Response regradeResponse(Response response) { OrcidMessage orcidMessage = (OrcidMessage) response.getEntity(); if (orcidMessage != null) { String messageVersion = orcidMessage.getMessageVersion(); int comparision = orcidMessageVersionConverterChain.compareVersion(externalVersion,messageVersion); if (comparision == 0) { return response; } if (comparision > 0) { orcidMessageVersionConverterChain.upgradeMessage(orcidMessage, externalVersion); } else { orcidMessageVersionConverterChain.downgradeMessage(orcidMessage, externalVersion); } } return Response.fromResponse(response).entity(orcidMessage).build(); } private void validateOutgoingResponse(Response response) { OrcidMessage orcidMessage = (OrcidMessage) response.getEntity(); outgoingValidationManager.validateMessage(orcidMessage); } private Response regradeAndValidateResponse(Response response) { Response regradedResponse = regradeResponse(response); validateOutgoingResponse(regradedResponse); return regradedResponse; } }