/** * 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.xoai.filter; import java.util.ArrayList; import java.util.List; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.dspace.xoai.data.DSpaceItem; import org.dspace.xoai.filter.results.SolrFilterResult; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType; /** * This filter allows one to retrieve (from the data source) those items * which contains at least one metadata field value defined, it allows * one to define multiple metadata fields to check against. * <p> * One line summary: At least one metadata field defined * * @author Ariel J. Lira (arieljlira at gmail dot com) * @author Lyncode Development Team (dspace at lyncode dot com) */ public class DSpaceMetadataExistsFilter extends DSpaceFilter { private static final Logger log = LogManager .getLogger(DSpaceMetadataExistsFilter.class); private List<String> fields; private List<String> getFields() { if (this.fields == null) { ParameterValue fields = getConfiguration().get("fields"); if (fields == null) fields = getConfiguration().get("field"); if (fields instanceof SimpleType) { this.fields = new ArrayList<String>(); this.fields.add(((SimpleType) fields).asString()); } else { this.fields = new ArrayList<String>(); for (ParameterValue val : fields.asParameterList().getValues()) this.fields.add(val.asSimpleType().asString()); } } return fields; } @Override public boolean isShown(DSpaceItem item) { for (String field : this.getFields()) { //do we have a match? if yes, our job is done if (item.getMetadata(field).size() > 0) return true; } return false; } @Override public SolrFilterResult buildSolrQuery() { StringBuilder cond = new StringBuilder("("); List<String> fields = this.getFields(); for (int i = 0; i < fields.size(); i++) { cond.append("metadata.").append(fields.get(i)).append(":[* TO *]"); if (i < fields.size() - 1) cond.append(" OR "); } cond.append(")"); return new SolrFilterResult(cond.toString()); } }