/** * 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.discovery; import java.util.List; import org.apache.solr.common.SolrInputDocument; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.core.Context; /** * This plugin adds three fields to the solr index to make a facet with/without * content in the ORIGINAL Bundle possible (like full text, images...). It is * activated simply by adding this class as a bean to discovery.xml. * * The facet is added to Discovery in the usual way (create a searchFilter bean * and add it to the expected place) just with an empty list of used metadata * fields because there are none. * * @author Christian Scheible christian.scheible@uni-konstanz.de * */ public class SolrServiceContentInOriginalBundleFilterPlugin implements SolrServiceIndexPlugin { @Override public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) { if (dso instanceof Item) { Item item = (Item) dso; boolean hasOriginalBundleWithContent = hasOriginalBundleWithContent(item); // _keyword and _filter because // they are needed in order to work as a facet and filter. if (!hasOriginalBundleWithContent) { // no content in the original bundle document.addField("has_content_in_original_bundle", false); document.addField("has_content_in_original_bundle_keyword", false); document.addField("has_content_in_original_bundle_filter", false); } else { document.addField("has_content_in_original_bundle", true); document.addField("has_content_in_original_bundle_keyword", true); document.addField("has_content_in_original_bundle_filter", true); } } } /** * Checks whether the given item has a bundle with the name ORIGINAL * containing at least one bitstream. * * @param item * to check * @return true if there is at least on bitstream in the bundle named * ORIGINAL, otherwise false */ private boolean hasOriginalBundleWithContent(Item item) { List<Bundle> bundles; bundles = item.getBundles(); if (bundles != null) { for (Bundle curBundle : bundles) { String bName = curBundle.getName(); if ((bName != null) && bName.equals("ORIGINAL")) { List<Bitstream> bitstreams = curBundle.getBitstreams(); if (bitstreams != null && bitstreams.size() > 0) { return true; } } } } return false; } }