/**
* $Id: $
* $URL: $
* *************************************************************************
* Copyright (c) 2002-2009, DuraSpace. All rights reserved
* Licensed under the DuraSpace License.
*
* A copy of the DuraSpace License has been included in this
* distribution and is available at: http://scm.dspace.org/svn/repo/licenses/LICENSE.txt
*/
package org.dspace.app.xmlui.aspect.discovery;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.params.FacetParams;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.DSpaceValidity;
import org.dspace.app.xmlui.utils.HandleUtil;
import org.dspace.app.xmlui.utils.UIException;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.List;
import org.dspace.app.xmlui.wing.element.Options;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject;
import org.dspace.core.ConfigurationManager;
import org.dspace.discovery.SearchService;
import org.dspace.discovery.SearchServiceException;
import org.dspace.discovery.SearchUtils;
import org.dspace.discovery.SolrServiceImpl;
import org.dspace.services.ConfigurationService;
import org.dspace.utils.DSpace;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Map;
import java.util.TreeMap;
import org.dspace.app.xmlui.wing.element.Item;
import org.dspace.app.xmlui.wing.element.PageMeta;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.core.Constants;
/**
* User: @author kevinvandevelde (kevin at atmire.com)
* Date: 17-feb-2010
* Time: 14:45:25
*/
public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransformer {
private static final Logger log = Logger.getLogger(AbstractFiltersTransformer.class);
/**
* Cached query results
*/
protected QueryResponse queryResults;
protected QueryResponse queryResultsAllScope;
/**
* Cached query arguments
*/
protected SolrQuery queryArgs;
protected SolrQuery queryArgsAllScope;
/**
* Cached validity object
*/
protected SourceValidity validity;
protected SearchService getSearchService()
{
DSpace dspace = new DSpace();
org.dspace.kernel.ServiceManager manager = dspace.getServiceManager() ;
return manager.getServiceByName(SearchService.class.getName(),SearchService.class);
}
/**
* Generate the unique caching key.
* This key must be unique inside the space of this component.
*/
public Serializable getKey() {
try {
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
if (dso == null)
return "0";
return HashUtil.hash(dso.getHandle());
}
catch (SQLException sqle) {
// Ignore all errors and just return that the component is not
// cachable.
return "0";
}
}
/**
* Generate the cache validity object.
* <p/>
* The validity object will include the collection being viewed and
* all recently submitted items. This does not include the community / collection
* hierarch, when this changes they will not be reflected in the cache.
*/
public SourceValidity getValidity() {
if (this.validity == null) {
try {
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
DSpaceValidity val = new DSpaceValidity();
// add reciently submitted items, serialize solr query contents.
performSearch(dso);
// Add the actual collection;
if (dso != null)
val.add(dso);
val.add("numFound:" + queryResults.getResults().getNumFound());
for (SolrDocument doc : queryResults.getResults()) {
val.add(doc.toString());
}
// for (SolrDocument doc : queryResults.getResults()) {
// val.add(doc.toString());
// }
for (FacetField field : queryResults.getFacetFields()) {
val.add(field.getName());
for (FacetField.Count count : field.getValues()) {
val.add(count.getName() + count.getCount());
}
}
this.validity = val.complete();
}
catch (Exception e) {
log.error(e.getMessage(),e);
}
//TODO: dependent on tags as well :)
}
return this.validity;
}
public abstract void performSearch(DSpaceObject object) throws SearchServiceException, UIException;
/** Allowed Query Parameters for Search Enabled View */
protected String[] getFacetsList() {
String[] list = null;
try {
list = ObjectModelHelper.getRequest(objectModel).getParameterValues("fl");
}
catch (Exception e) {
return new String[0];
}
return list == null ? new String[0] : list;
}
protected SolrQuery prepareDefaultFilters(String scope) {
queryArgs = new SolrQuery();
/* Get Dynamic list of Facets off Request *
for(String facet : getFacetsList())
{
queryArgs.addFacetField(facet);
int max = ConfigurationManager.getIntProperty("search.facet.max", 10) + 1;
//Set the default limit to 11
queryArgs.setFacetLimit(max);
queryArgs.setFacetMinCount(1);
queryArgs.setFacet(true);
} */
String[] facets = SearchUtils.getFacetsForType(scope);
String[] dateFacets = SearchUtils.getDateFacetsForType(scope);
log.debug("facets for scope '" + scope + "': " + (facets != null ? facets.length : null));
log.debug("date facets for scope, " + scope + ": " + (dateFacets != null ? dateFacets.length : null));
if (facets != null || dateFacets != null) {
int max = ConfigurationManager.getIntProperty("search.facet.max", 10) + 1;
//Set the default limit to 11
queryArgs.setFacetLimit(max);
queryArgs.setFacetMinCount(1);
queryArgs.setFacet(true);
}
/** enable faceting of search results */
if (facets != null)
queryArgs.addFacetField(facets);
/** add any dateFacets configured */
if (dateFacets != null && 0 < dateFacets.length) {
queryArgs.setParam(FacetParams.FACET_DATE, dateFacets);
queryArgs.setParam(FacetParams.FACET_DATE_GAP, "+1YEAR");
queryArgs.setParam(FacetParams.FACET_DATE_START, "NOW/YEAR-" + SearchUtils.getConfig().getString("solr.date.gap", "10") + "YEARS");
queryArgs.setParam(FacetParams.FACET_DATE_END, "NOW");
queryArgs.setParam(FacetParams.FACET_DATE_OTHER, FacetParams.FacetDateOther.ALL.toString());
}
//Add the default filters
queryArgs.addFilterQuery(SearchUtils.getDefaultFilters(scope));
return queryArgs;
}
@Override
public void addOptions(Options options) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException {
Request request = ObjectModelHelper.getRequest(objectModel);
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
java.util.List fqs = Arrays.asList(
request.getParameterValues("fq") != null ? request.getParameterValues("fq") : new String[0]);
if (this.queryResults != null) {
java.util.List<FacetField> facetFields = this.queryResults.getFacetFields();
if (facetFields == null)
facetFields = new ArrayList<FacetField>();
if(queryResults.getFacetDates() != null)
facetFields.addAll(this.queryResults.getFacetDates());
if (facetFields.size() > 0) {
addDiscoveryLocation(options, request, fqs, dso);
////////////
List browse = options.addList("discovery");
boolean firstSubList = true;
for (FacetField field : facetFields) {
// Skip location filter, since this is handled above.
if (field.getName().equals("location")) {
continue;
}
java.util.List<FacetField.Count> values = field.getValues();
//This is needed for a dirty hack to make sure that the date filters do not remain empty
boolean valueAdded = false;
if (values != null) {
if (firstSubList) {
browse.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.filter_by.head"));
firstSubList = false;
}
List facet = browse.addList(field.getName());
facet.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.type_" + field.getName().replace("_lc", "").replace("_dt", "")));
Iterator<FacetField.Count> iter = values.iterator();
for (int i = 0; i < this.queryArgs.getFacetLimit(); i++) {
if (!iter.hasNext())
break;
FacetField.Count value = iter.next();
if (i < this.queryArgs.getFacetLimit() - 1) {
String displayedValue = value.getName();
String filterQuery = value.getAsFilterQuery();
String itemName = null;
String itemRend = null;
if (field.getName().equals("location.comm") || field.getName().equals("location.coll")) {
//We have a community/collection, resolve it to a dspaceObject
// displayedValue = SolrServiceImpl.locationToName(context, field.getName(), displayedValue);
int type = field.getName().equals("location.comm") ? Constants.COMMUNITY : Constants.COLLECTION;
DSpaceObject commColl = DSpaceObject.find(context, type, Integer.parseInt(displayedValue));
if (commColl != null) {
displayedValue = commColl.getName();
itemName = commColl.getHandle();
}
}
if (field.getGap() != null) {
//We have a date field
//Since we currently only support years, get the year
//PS: date looks something like this: 2005-01-01T00:00:00Z
displayedValue = displayedValue.split("-")[0];
filterQuery = ClientUtils.escapeQueryChars(value.getFacetField().getName()) + ":" + displayedValue + "*";
// What we do now is, if we have a date and we have selected one as a filter query, do not show the other values
// There is no need to this since we can only have one date at a time
// What we do show however is the current date.
boolean skipValue = false;
for (Object fq1 : fqs) {
String fq = (String) fq1;
if (fq.startsWith(value.getFacetField().getName() + ":") && !fq.equals(filterQuery))
skipValue = true;
}
//Skipt these vals, there are not relevant, they are required to indicate if we need a view more url
if (displayedValue.equals(FacetParams.FacetDateOther.AFTER.toString())
|| displayedValue.equals(FacetParams.FacetDateOther.BEFORE.toString())
|| displayedValue.equals(FacetParams.FacetDateOther.BETWEEN.toString()))
skipValue = true;
if(value.getCount() == 0)
skipValue = ConfigurationManager.getBooleanProperty("solr.date.skip.empty", true);
if (skipValue)
continue;
}
if (fqs.contains(filterQuery)) {
valueAdded = true;
facet.addItem(Math.random() + "", "selected").addContent(displayedValue + " (" + value.getCount() + ")");
} else {
valueAdded = true;
facet.addItem(itemName, itemRend).addXref(
contextPath +
(dso == null ? "" : "/handle/" + dso.getHandle()) +
"/search?" +
request.getQueryString() +
"&fq=" +
URLEncoder.encode(filterQuery, "UTF-8"),
displayedValue + " (" + value.getCount() + ")" // + "TESTE"
);
}
}
if (i == this.queryArgs.getFacetLimit() - 1 && field.getGap() == null) {
addViewMoreUrl(facet, dso, request, field.getName());
}
}
if (field.getGap() != null) {
if (!valueAdded) {
/** THIS IS A DIRTY HACK TO MAKE SURE WE DO NOT HAVE AN EMPTY DATE FILTER
* THIS WILL NOT WORK IF THE DATE FIELD SHOULD BE REPEATABLE ! **/
/** Add a field using this content **/
/** Locate the value in the filter **/
for (Object fq1 : fqs) {
String fq = (String) fq1;
if (fq.startsWith(field.getName() + ":")) {
String valShown = fq.substring(fq.indexOf(":") + 1);
//Remove the * at the end
valShown = valShown.substring(0, valShown.length() - 1);
facet.addItem().addContent(valShown + " (" + queryResults.getResults().getNumFound() + ")");
}
}
}
// We have a date check if we need a view more
// We need a view more if we have values that come after OR before our shown dates
boolean showMoreUrl = false;
for (FacetField.Count facetValue : values) {
if (facetValue.getName().equals(FacetParams.FacetDateOther.AFTER.toString()) || facetValue.getName().equals(FacetParams.FacetDateOther.BEFORE.toString().toString()))
if (0 < facetValue.getCount())
showMoreUrl = true;
}
// Add the _dt postfix to make sure that our browse is shown as a date
if (showMoreUrl)
addViewMoreUrl(facet, dso, request, field.getName() + "_dt");
}
// If we have no value added
}
}
}
}
}
/*
* Top level locations (communities and collections).
*/
private void addDiscoveryLocation(Options options, Request request, java.util.List fqs, DSpaceObject dso) throws NumberFormatException, SQLException, WingException {
// UPDATE: listing all locations returned by Solr is not what we want.
// We just want the selected comm/coll, its children/sibling collections, parent community, children community.
// FIXME: probably encapsulate in a new method and allow for a depth parameter like community-list.
List browseCommColl = options.addList("discovery-location");
browseCommColl.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.filter_by.head"));
if (this.queryResults != null) {
FacetField fieldLocation = this.queryResults.getFacetField("location");
if (fieldLocation != null) {
java.util.List<FacetField.Count> values = fieldLocation.getValues();
if (values != null) {
String queryString = request.getQueryString();
queryString = queryString != null ? queryString.replaceAll("&fq=location[:[%3A]+][ml][0-9]+", "") : queryString;
// Find selected community/collection.
String curCommCollSelectedName = "m1"; // Default
for (FacetField.Count v : values) {
if (fqs.contains(v.getAsFilterQuery())) {
curCommCollSelectedName = v.getName();
break;
}
int type = v.getName().startsWith("m") ? Constants.COMMUNITY : Constants.COLLECTION;
DSpaceObject commColl = DSpaceObject.find(context, type, Integer.parseInt(v.getName().substring(1)));
if (dso != null && commColl != null && dso.getHandle().equals(commColl.getHandle())) {
curCommCollSelectedName = v.getName();
break;
}
}
// UPDATE: see UPDATE above.
// Build list of locations (communities/collections) ordered by handle part after prefix.
Map<String, FacetField.Count> sortedSolrNameLocationWithValues = new TreeMap<String, FacetField.Count>();
for (FacetField.Count v : values) {
sortedSolrNameLocationWithValues.put(v.getName(), v);
}
// Default selection is "m1" (community with ID 1).
int curCommCollSelectedType = Constants.COMMUNITY;
int curCommCollSelectedID = 1;
if (curCommCollSelectedName != null) {
curCommCollSelectedType = curCommCollSelectedName.startsWith("m") ? Constants.COMMUNITY : Constants.COLLECTION;
curCommCollSelectedID = Integer.parseInt(curCommCollSelectedName.substring(1));
}
Map<Integer, String> sortedHandleWithSolrName = new TreeMap<Integer, String>();
Map<String, DSpaceObject> sortedSolrNameWithDSpaceObject = new TreeMap<String, DSpaceObject>();
int topCommID = 1;
String topCommName = "m1";
boolean curSelectedIsTop = curCommCollSelectedName.equals(topCommName) ? true : false;
Community mtop = Community.find(context, topCommID);
sortedHandleWithSolrName.put(Integer.parseInt(mtop.getHandle().split("/")[1]), topCommName);
sortedSolrNameWithDSpaceObject.put(topCommName, mtop);
Collection[] collections = mtop.getCollections();
for (Collection l : collections) {
String solrName = "l" + l.getID();
if (solrName.equals(curCommCollSelectedName))
curSelectedIsTop = true;
sortedHandleWithSolrName.put(Integer.parseInt(l.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, l);
}
Community[] communities = mtop.getSubcommunities();
for (Community mm : communities) {
String solrName = "m" + mm.getID();
if (solrName.equals(curCommCollSelectedName))
curSelectedIsTop = true;
sortedHandleWithSolrName.put(Integer.parseInt(mm.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, mm);
}
if (curSelectedIsTop == false) {
if (curCommCollSelectedType == Constants.COMMUNITY) {
Community msel = Community.find(context, curCommCollSelectedID);
Community[] parents = msel.getAllParents();
if (parents.length < 2) {
log.error("Something is wrong: this should not happen.");
}
Community topParent = parents[parents.length - 2];
curCommCollSelectedName = "m" + topParent.getID();
} else {
// Supposing Constants.COLLECTION
Collection lsel = Collection.find(context, curCommCollSelectedID);
Community firstParent = lsel.getCommunities()[0];
Community[] parents = firstParent.getAllParents();
if (parents.length == 0) {
//log.error("Something is wrong: this should not happen.");
//firstParent is a top community.
curCommCollSelectedName = "m" + firstParent.getID();
} else if (parents.length == 1) {
//firstParent is a second level community.
curCommCollSelectedName = "m" + firstParent.getID();
} else {
// get second level parent
Community topParent = parents[parents.length - 2];
curCommCollSelectedName = "m" + topParent.getID();
}
}
}
// Iterator<FacetField.Count> iter = sortedValues.values().iterator();
Iterator<String> iter = sortedHandleWithSolrName.values().iterator();
List facet = browseCommColl.addList(fieldLocation.getName());
// facet.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.type_" + fieldLocation.getName()));
facet.setHead(queryString);
for (int i = 0; i < this.queryArgs.getFacetLimit(); i++) {
if (!iter.hasNext()) {
break;
} // String displayedValue = value.getName();
String solrName = iter.next();
DSpaceObject commColl = sortedSolrNameWithDSpaceObject.get(solrName);
FacetField.Count value = sortedSolrNameLocationWithValues.get(solrName);
if (value == null) {
// This is probably due to an empty collection, which happens to not be indexed by Solr.
continue;
}
String displayedValue = commColl.getName();
String itemName = commColl.getHandle();
String itemRend = null;
//log.error("iter: solrName: " + solrName + "; " + value + "; handle: " + itemName + "; display: " + displayedValue);
//We have a community/collection, resolve it to a dspaceObject
// displayedValue = SolrServiceImpl.locationToName(context, field.getName(), displayedValue);
// int type = fieldLocation.getName().equals("location.comm") ? Constants.COMMUNITY : Constants.COLLECTION;
if (curCommCollSelectedName != null && curCommCollSelectedName.equals(solrName)) {
//facet.addItem(itemName, "selected").addContent(displayedValue + " (" + value.getCount() + ")");
itemRend = "selected";
} else if (curCommCollSelectedName == null && value.getName().equals("m1")) {
//facet.addItem(itemName, "selected").addContent(displayedValue + " (" + value.getCount() + ")");
itemRend = "selected";
}
if (value.getCount() > 0) {
String URI = null;
try {
URI = request.getSitemapURI().split("/")[request.getSitemapURI().split("/").length - 1];
if (URI.matches("[0-9]+")) {
URI = null;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
facet.addItem(itemName, itemRend).addXref(contextPath + (commColl == null ? "" : "/handle/" + commColl.getHandle()) + "/" + (URI != null ? URI : "") + (queryString != null ? "?" + queryString : ""), displayedValue + " (" + "" + value.getCount() + ")");
} else {
facet.addItem(itemName, "disabled").addContent(displayedValue + " (" + value.getCount() + ")");
}
}
}
}
}
}
/*
* This version of the method is contextual: retrieves comm/coll relative to currently selected comm/coll.
*/
/*
private void addDiscoveryLocation(Options options, Request request, java.util.List fqs, DSpaceObject dso) throws NumberFormatException, SQLException, WingException {
////////////
// UPDATE: listing all locations returned by Solr is not what we want.
// We just want the selected comm/coll, its children/sibling collections, parent community, children community.
// FIXME: probably encapsulate in a new method and allow for a depth parameter like community-list.
List browseCommColl = options.addList("discovery-location");
browseCommColl.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.filter_by.head"));
if (this.queryResults != null) {
FacetField fieldLocation = this.queryResults.getFacetField("location");
if (fieldLocation != null) {
java.util.List<FacetField.Count> values = fieldLocation.getValues();
if (values != null) {
String queryString = request.getQueryString();
queryString = queryString != null ? queryString.replaceAll("&fq=location[:[%3A]+][ml][0-9]+", "") : queryString;
// Find selected community/collection.
String curCommCollSelectedName = "m1"; // Default
for (FacetField.Count v : values) {
if (fqs.contains(v.getAsFilterQuery())) {
curCommCollSelectedName = v.getName();
break;
}
int type = v.getName().startsWith("m") ? Constants.COMMUNITY : Constants.COLLECTION;
DSpaceObject commColl = DSpaceObject.find(context, type, Integer.parseInt(v.getName().substring(1)));
if (dso != null && commColl != null && dso.getHandle().equals(commColl.getHandle())) {
curCommCollSelectedName = v.getName();
break;
}
}
// UPDATE: see UPDATE above.
// Build list of locations (communities/collections) ordered by handle part after prefix.
// Map<Integer, FacetField.Count> sortedValues = new TreeMap<Integer, FacetField.Count>();
// for (FacetField.Count v : values) {
// int type = v.getName().startsWith("m") ? Constants.COMMUNITY : Constants.COLLECTION;
// DSpaceObject commColl = DSpaceObject.find(context, type, Integer.parseInt(v.getName().substring(1)));
// if (commColl != null) {
// sortedValues.put(Integer.parseInt(commColl.getHandle().split("/")[1]), v);
// } else {
// sortedValues.put((int)(9999 + Math.ceil(100*Math.random())), v);
// }
// }
Map<String, FacetField.Count> sortedSolrNameLocationWithValues = new TreeMap<String, FacetField.Count>();
for (FacetField.Count v : values) {
sortedSolrNameLocationWithValues.put(v.getName(), v);
}
// Default selection is "m1" (community with ID 1).
int curCommCollSelectedType = Constants.COMMUNITY;
int curCommCollSelectedID = 1;
if (curCommCollSelectedName != null) {
curCommCollSelectedType = curCommCollSelectedName.startsWith("m") ? Constants.COMMUNITY : Constants.COLLECTION;
curCommCollSelectedID = Integer.parseInt(curCommCollSelectedName.substring(1));
}
Map<Integer, String> sortedHandleWithSolrName = new TreeMap<Integer, String>();
Map<String, DSpaceObject> sortedSolrNameWithDSpaceObject = new TreeMap<String, DSpaceObject>();
if (curCommCollSelectedType == Constants.COMMUNITY) {
// If selected location is a community, we want:
// - Itself;
// - It's child collections;
// - It's first level child communities;
// - It's parent community, if any.
Community m = Community.find(context, curCommCollSelectedID);
if (m != null) {
sortedHandleWithSolrName.put(Integer.parseInt(m.getHandle().split("/")[1]), curCommCollSelectedName);
sortedSolrNameWithDSpaceObject.put(curCommCollSelectedName, m);
Collection[] collections = m.getCollections();
for (Collection l : collections) {
String solrName = "l" + l.getID();
sortedHandleWithSolrName.put(Integer.parseInt(l.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, l);
}
Community[] communities = m.getSubcommunities();
for (Community mm : communities) {
String solrName = "m" + mm.getID();
sortedHandleWithSolrName.put(Integer.parseInt(mm.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, mm);
}
Community mp = m.getParentCommunity();
if (mp != null) {
String solrName = "m" + mp.getID();
sortedHandleWithSolrName.put(Integer.parseInt(mp.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, mp);
}
} else {
log.error("Invalid community id: " + curCommCollSelectedID);
}
} else {
// If selected location is a collection, we want:
// - Itself;
// - It's *first* parent community (other parents are ignored);
// - It's sibling collections;
// - It's sibling communities.
Collection l = Collection.find(context, curCommCollSelectedID);
if (l != null) {
// Probably unnecessary, since it's parent children includes it.
//sortedHandleName.put(Integer.parseInt(l.getHandle().split("/")[1]), curCommCollSelectedName);
Community mp = l.getCommunities()[0];
if (mp == null) {
mp = Community.find(context, 1);
}
sortedHandleWithSolrName.put(Integer.parseInt(mp.getHandle().split("/")[1]), "m" + mp.getID());
sortedSolrNameWithDSpaceObject.put("m" + mp.getID(), mp);
Collection[] collections = mp.getCollections();
for (Collection ll : collections) {
String solrName = "l" + ll.getID();
sortedHandleWithSolrName.put(Integer.parseInt(ll.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, ll);
}
Community[] communities = mp.getSubcommunities();
for (Community mm : communities) {
String solrName = "m" + mm.getID();
sortedHandleWithSolrName.put(Integer.parseInt(mm.getHandle().split("/")[1]), solrName);
sortedSolrNameWithDSpaceObject.put(solrName, mm);
}
} else {
log.error("Invalid community id: " + curCommCollSelectedID);
}
}
// Iterator<FacetField.Count> iter = sortedValues.values().iterator();
Iterator<String> iter = sortedHandleWithSolrName.values().iterator();
List facet = browseCommColl.addList(fieldLocation.getName());
// facet.setHead(message("xmlui.ArtifactBrowser.AdvancedSearch.type_" + fieldLocation.getName()));
facet.setHead(queryString);
for (int i = 0; i < this.queryArgs.getFacetLimit(); i++) {
if (!iter.hasNext()) {
break;
} // String displayedValue = value.getName();
String solrName = iter.next();
DSpaceObject commColl = sortedSolrNameWithDSpaceObject.get(solrName);
FacetField.Count value = sortedSolrNameLocationWithValues.get(solrName);
String displayedValue = commColl.getName();
String itemName = commColl.getHandle();
String itemRend = null;
//We have a community/collection, resolve it to a dspaceObject
// displayedValue = SolrServiceImpl.locationToName(context, field.getName(), displayedValue);
// int type = fieldLocation.getName().equals("location.comm") ? Constants.COMMUNITY : Constants.COLLECTION;
if (curCommCollSelectedName != null && curCommCollSelectedName.equals(value.getName())) {
facet.addItem(itemName, "selected").addContent(displayedValue + " (" + value.getCount() + ")");
} else if (curCommCollSelectedName == null && value.getName().equals("m1")) {
facet.addItem(itemName, "selected").addContent(displayedValue + " (" + value.getCount() + ")");
} else {
if (value.getCount() > 0) {
String URI = null;
try {
URI = request.getSitemapURI().split("/")[request.getSitemapURI().split("/").length - 1];
if (URI.matches("[0-9]+")) {
URI = null;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
facet.addItem(itemName, itemRend).addXref(contextPath + (commColl == null ? "" : "/handle/" + commColl.getHandle()) + "/" + (URI != null ? URI : "") + (queryString != null ? "?" + queryString : ""), displayedValue + " (" + "" + value.getCount() + ")");
} else {
facet.addItem(itemName, "disabled").addContent(displayedValue + " (" + value.getCount() + ")");
}
}
}
}
}
}
}
*/
private void addViewMoreUrl(List facet, DSpaceObject dso, Request request, String fieldName) throws WingException {
facet.addItem(null, "view-more").addXref(
contextPath +
(dso == null ? "" : "/handle/" + dso.getHandle()) +
"/browse?" + BrowseFacet.FACET_FIELD + "=" + fieldName +
(request.getQueryString() != null ? "&" + request.getQueryString() : ""),
message("xmlui.ArtifactBrowser.AdvancedSearch.view_more")
);
}
@Override
public void recycle() {
queryResults = null;
queryArgs = null;
}
}