/** * 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.authority; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.dspace.content.authority.SolrAuthority; import org.dspace.core.Context; import org.dspace.core.LogManager; import java.util.ArrayList; import java.util.List; /** * * @author Antoine Snyers (antoine at atmire.com) * @author Kevin Van de Velde (kevin at atmire dot com) * @author Ben Bosman (ben at atmire dot com) * @author Mark Diggory (markd at atmire dot com) */ public class AuthorityValueFinder { /** * log4j logger */ private static Logger log = Logger.getLogger(AuthorityValueFinder.class); /** * Item.ANY does not work here. */ public AuthorityValue findByUID(Context context, String authorityID) { //Ensure that if we use the full identifier to match on String queryString = "id:\"" + authorityID + "\""; List<AuthorityValue> findings = find(context, queryString); return findings.size() > 0 ? findings.get(0) : null; } public List<AuthorityValue> findByExactValue(Context context, String field, String value) { String queryString = "value:\"" + value + "\" AND field:" + field; return find(context, queryString); } public List<AuthorityValue> findByValue(Context context, String field, String value) { String queryString = "value:" + value + " AND field:" + field; return find(context, queryString); } public List<AuthorityValue> findByValue(Context context, String schema, String element, String qualifier, String value) { String field = fieldParameter(schema, element, qualifier); return findByValue(context, field, qualifier); } public AuthorityValue findByOrcidID(Context context, String orcid_id) { String queryString = "orcid_id:" + orcid_id; List<AuthorityValue> findings = find(context, queryString); return findings.size() > 0 ? findings.get(0) : null; } public List<AuthorityValue> findByName(Context context, String schema, String element, String qualifier, String name) { String field = fieldParameter(schema, element, qualifier); String queryString = "first_name:" + name + " OR last_name:" + name + " OR name_variant:" + name + " AND field:" + field; return find(context, queryString); } public List<AuthorityValue> findByAuthorityMetadata(Context context, String schema, String element, String qualifier, String value) { String field = fieldParameter(schema, element, qualifier); String queryString = "all_Labels:" + value + " AND field:" + field; return find(context, queryString); } public List<AuthorityValue> findOrcidHolders(Context context) { String queryString = "orcid_id:*"; return find(context, queryString); } public List<AuthorityValue> findAll(Context context) { String queryString = "*:*"; return find(context, queryString); } private List<AuthorityValue> find(Context context, String queryString) { List<AuthorityValue> findings = new ArrayList<AuthorityValue>(); try { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery(filtered(queryString)); log.debug("AuthorityValueFinder makes the query: " + queryString); QueryResponse queryResponse = SolrAuthority.getSearchService().search(solrQuery); if (queryResponse != null && queryResponse.getResults() != null && 0 < queryResponse.getResults().getNumFound()) { for (SolrDocument document : queryResponse.getResults()) { AuthorityValue authorityValue = AuthorityValue.fromSolr(document); findings.add(authorityValue); log.debug("AuthorityValueFinder found: " + authorityValue.getValue()); } } } catch (Exception e) { log.error(LogManager.getHeader(context, "Error while retrieving AuthorityValue from solr", "query: " + queryString),e); } return findings; } private String filtered(String queryString) throws InstantiationException, IllegalAccessException { String instanceFilter = "-deleted:true"; if (StringUtils.isNotBlank(instanceFilter)) { queryString += " AND " + instanceFilter; } return queryString; } private String fieldParameter(String schema, String element, String qualifier) { return schema + "_" + element + ((qualifier != null) ? "_" + qualifier : ""); } }