package org.ariadne_eu.metadata.resultsformat; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Vector; import net.sourceforge.minor.lucene.core.searcher.IndexSearchDelegate; import org.apache.log4j.Logger; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.TopDocs; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.FacetField; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.FacetField.Count; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.params.FacetParams; import org.ariadne.config.PropertiesManager; import org.ariadne_eu.utils.config.RepositoryConstants; import org.ariadne_eu.utils.solr.SolrServerManagement; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; public class ResultDelegateARIADNERFJS implements IndexSearchDelegate { private static Logger log = Logger.getLogger(ResultDelegateARIADNERFJS.class); private int start; private int max; private String lQuery; private static Vector<String> facetFields; static { try { facetFields = new Vector<String>(); Collection solrs = PropertiesManager.getInstance().getPropertyStartingWith(RepositoryConstants.getInstance().SR_SOLR_FACETFIELD + ".").values(); for (Object object : solrs) { facetFields.add((String) object); } if (!(facetFields.size() > 0)) { log.error("initialize:property \"" + RepositoryConstants.getInstance().SR_SOLR_FACETFIELD + ".n\" not defined"); } } catch (Throwable t) { log.error("initialize: ", t); } } public ResultDelegateARIADNERFJS(int start, int max, String lQuery) { this.start = start; this.max = max; this.lQuery = lQuery; } public String result(TopDocs topDocs, IndexSearcher searcher) throws JSONException, CorruptIndexException, IOException { SolrDocument doc; QueryResponse response = getSolrResponse(); JSONObject resultsJson = new JSONObject(); JSONObject resultJson = new JSONObject(); JSONArray idArrayJson = new JSONArray(); JSONArray metadataArrayJson = new JSONArray(); resultJson.put("error", ""); resultJson.put("errorMessage", ""); resultJson.put("facets", getFacets(response.getFacetFields())); int size = (int)response.getResults().getNumFound(); if (size == -1) size = Integer.MAX_VALUE; // for (int i = start; i < size && (max < 0 || i < start + max); i++) { for (int i = 0; i < max && (max < 0 || i < size - start) ; i++) { JSONObject json = new JSONObject(); doc = response.getResults().get(i); try { idArrayJson.put(doc.get("lom.general.identifier.entry")); json.put("title", doc.get("lom.general.title.string")); json.put("description", doc.get("lom.general.description.string")); json.put("keywords", doc.get("lom.general.keyword.string")); json.put("location", doc.get("lom.technical.location")); json.put("identifier", doc.get("lom.general.identifier.entry")); } catch (JSONException ex) { log.error(ex); } metadataArrayJson.put(json); } resultJson.put("id", idArrayJson); resultJson.put("metadata", metadataArrayJson); resultJson.put("nrOfResults", size); resultsJson.put("result", resultJson); return resultsJson.toString(); } private QueryResponse getSolrResponse() { SolrServerManagement serverMgt = SolrServerManagement.getInstance(); SolrQuery solrQuery = new SolrQuery().setQuery(lQuery).setFacet(true).setFacetLimit(-1).setFacetMinCount(0).setFacetSort(FacetParams.FACET_SORT_COUNT).setParam("rows", Integer.toString(max)).setParam("start", Integer.toString(start)); for (Iterator<String> iterator = facetFields.iterator(); iterator.hasNext();) { String facetField = (String) iterator.next(); solrQuery.addFacetField(facetField); } QueryResponse rsp = null; try { rsp = serverMgt.getServer().query(solrQuery); } catch (SolrServerException e) { log.error("getFacets: Solr server error", e); } return rsp; } private JSONArray getFacets(List facetsFields) { JSONArray facetsJson = new JSONArray(); try { if (facetsFields.size() > 0) { List<Count> facetValues; FacetField facetField; FacetField.Count innerFacetField; for (Iterator facetIterator = facetsFields.iterator(); facetIterator.hasNext();) { JSONObject facetJson = new JSONObject(); facetField = (FacetField) facetIterator.next(); facetJson.put("field", changeFacetName(facetField.getName())); facetValues = facetField.getValues(); if (facetValues != null) { JSONArray valuesJson = new JSONArray(); for (Iterator ifacetIterator = facetValues.iterator(); ifacetIterator.hasNext();) { JSONObject value = new JSONObject(); innerFacetField = (FacetField.Count) ifacetIterator.next(); value.put("val", innerFacetField.getName()); value.put("count", innerFacetField.getCount()); valuesJson.put(value); } facetJson.put("numbers", valuesJson); } facetsJson.put(facetJson); } } } catch (JSONException e) { log.error("getFacets: JSON format error", e); } return facetsJson; } private String changeFacetName(String internalName) { if (internalName.equalsIgnoreCase("lom.educational.learningresourcetype.value")) return "lrt"; else if (internalName.equalsIgnoreCase("lom.educational.context.value")) return "context"; else if (internalName.equalsIgnoreCase("lom.technical.format")) return "format"; else if (internalName.equalsIgnoreCase("lom.general.language")) return "language"; else if (internalName.equalsIgnoreCase("collection")) return "provider"; else return internalName; } }