/** * ============================================================================= * * 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.listener.solr; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import javax.annotation.Resource; import javax.xml.bind.JAXBException; import org.orcid.jaxb.model.record.summary_v2.FundingGroup; import org.orcid.jaxb.model.record.summary_v2.FundingSummary; import org.orcid.jaxb.model.record_v2.Funding; import org.orcid.listener.exception.DeprecatedRecordException; import org.orcid.listener.exception.LockedRecordException; import org.orcid.listener.orcid.Orcid20APIClient; import org.orcid.listener.persistence.managers.RecordStatusManager; import org.orcid.listener.persistence.util.AvailableBroker; import org.orcid.utils.listener.LastModifiedMessage; import org.orcid.utils.listener.RetryMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SolrMessageProcessor implements Consumer<LastModifiedMessage>{ Logger LOG = LoggerFactory.getLogger(SolrMessageProcessor.class); @Value("${org.orcid.persistence.messaging.solr_indexing.enabled}") private boolean isSolrIndexingEnabled; @Resource private Orcid20APIClient orcid20ApiClient; @Resource private SolrIndexUpdater solrUpdater; @Resource private RecordStatusManager recordStatusManager; private OrcidRecordToSolrDocument recordConv; @Autowired public SolrMessageProcessor( @Value("${org.orcid.persistence.messaging.solr_indexing.enabled}") boolean isSolrIndexingEnabled, @Value("${org.orcid.core.indexPublicProfile}") boolean indexPublicProfile) throws JAXBException{ this.isSolrIndexingEnabled = isSolrIndexingEnabled; recordConv = new OrcidRecordToSolrDocument(indexPublicProfile); } @Override public void accept(LastModifiedMessage t) { updateSolrIndex(t.getOrcid()); } public void accept(RetryMessage m) { updateSolrIndex(m.getOrcid()); } private void updateSolrIndex(String orcid) { LOG.info("Updating using Record " + orcid + " in SOLR index"); if(!isSolrIndexingEnabled) { LOG.info("Solr indexing is disabled"); return; } try{ org.orcid.jaxb.model.record_v2.Record record = orcid20ApiClient.fetchPublicProfile(orcid); //get detailed funding so we can discover org name and id List<Funding> fundings = new ArrayList<Funding>(); if (record.getActivitiesSummary() != null && record.getActivitiesSummary().getFundings() != null && record.getActivitiesSummary().getFundings().getFundingGroup() != null){ for (FundingGroup group : record.getActivitiesSummary().getFundings().getFundingGroup()){ if (group.getFundingSummary() !=null){ for (FundingSummary f : group.getFundingSummary()){ fundings.add(orcid20ApiClient.fetchFunding(record.getOrcidIdentifier().getPath(), f.getPutCode())); } } } } solrUpdater.persist(recordConv.convert(record,fundings)); recordStatusManager.markAsSent(orcid, AvailableBroker.SOLR); } catch(LockedRecordException lre) { LOG.error("Record " + orcid + " is locked"); solrUpdater.updateSolrIndexForLockedOrDeprecatedRecord(orcid, solrUpdater.retrieveLastModified(orcid)); recordStatusManager.markAsSent(orcid, AvailableBroker.SOLR); } catch(DeprecatedRecordException dre) { LOG.error("Record " + orcid + " is deprecated"); solrUpdater.updateSolrIndexForLockedOrDeprecatedRecord(orcid, solrUpdater.retrieveLastModified(orcid)); recordStatusManager.markAsSent(orcid, AvailableBroker.SOLR); } catch (Exception e){ LOG.error("Unable to fetch record " + orcid + " for SOLR"); LOG.error(e.getMessage(), e); recordStatusManager.markAsFailed(orcid, AvailableBroker.SOLR); } } }