package org.ariadne_eu.service; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import org.apache.log4j.Logger; import org.ariadne.util.Stopwatch; import org.ariadne_eu.metadata.query.QueryMetadataException; import org.ariadne_eu.metadata.query.QueryMetadataFactory; import org.ariadne_eu.metadata.query.language.QueryTranslationException; import org.ariadne_eu.metadata.query.language.TranslateLanguage; import org.ariadne_eu.metadata.resultsformat.TranslateResultsformat; import org.ariadne_eu.utils.rest.Query; import org.json.JSONException; import org.json.JSONObject; import com.sun.jersey.spi.resource.Singleton; import com.sun.jersey.api.json.JSONWithPadding; @Singleton @Path("/ariadne") public class ARIADNEImplementation { private static Logger log = Logger.getLogger(ARIADNEImplementation.class); @GET @Path("/rest") @Produces("application/json") public String query(@QueryParam("json") String json) { Stopwatch sw = new Stopwatch(); sw.start(); String query = ""; Query qry = new Query(); JSONObject jo; log.debug("query:json=" + json); try { jo = new JSONObject(json); qry.parseJson(jo); //CNF :: ((a OR b) AND (c OR d)) if (qry.searchTerms != null) { for (int i = 0; i < qry.searchTerms.length; i++) { if (i > 0) query = query.concat(" AND "); for (int j = 0; j < qry.searchTerms[i].length; j++) { if (j > 0) query = query.concat(" OR "); if (qry.searchTerms[i].length > 1 && j == 0 ) query = query.concat(" ( "); query = query.concat(qry.searchTerms[i][j]); if (qry.searchTerms[i].length > 1 && j == (qry.searchTerms[i].length - 1) ) query = query.concat(" ) "); } } } query = changeFacetName(query); if (qry.exclusionTerms != null) { for (int i = 0; i < qry.exclusionTerms.length; i++) { // System.out.println(qry.exclusionTerms[i]); } } if (qry.facets != null) { for (int i = 0; i < qry.facets.length; i++) { // System.out.println(qry.facets[i]); } } // System.out.println(qry.idListOffset); // System.out.println(qry.idListSize); // System.out.println(qry.maxCntFacets); // System.out.println(qry.sortKey); if (qry.rankingTerms != null) { for (int i = 0; i < qry.rankingTerms.length; i++) { System.out.println(qry.rankingTerms[i]); } } log.info("query:query="+query); String result = QueryMetadataFactory.getQueryImpl(TranslateLanguage.LUCENE).query(query, qry.resultListOffset, qry.resultListSize, TranslateResultsformat.ARFJS); JSONObject jResults = new JSONObject(result); JSONObject jResult = jResults.getJSONObject("result"); jResult.put("processingTime", sw.stop()); return jResults.toString(); } catch (JSONException e) { log.error("synchronousQuery: QueryTranslationException", e); } catch (QueryTranslationException e) { log.error("synchronousQuery: QueryTranslationException", e); } catch (QueryMetadataException e) { log.error("synchronousQuery: QueryMetadataException", e); } return ""; } @GET @Path("/restp") @Produces({ "application/x-javascript", MediaType.APPLICATION_JSON }) public JSONWithPadding querywithPadding(@QueryParam("callback") @DefaultValue("fn") String callback,@QueryParam("json") String json) { Stopwatch sw = new Stopwatch(); sw.start(); String query = ""; Query qry = new Query(); JSONObject jo; log.debug("query:json=" + json + ",callback:"+callback); try { jo = new JSONObject(json); qry.parseJson(jo); //CNF :: ((a OR b) AND (c OR d)) if (qry.searchTerms != null) { for (int i = 0; i < qry.searchTerms.length; i++) { if (i > 0) query = query.concat(" AND "); for (int j = 0; j < qry.searchTerms[i].length; j++) { if (j > 0) query = query.concat(" OR "); if (qry.searchTerms[i].length > 1 && j == 0 ) query = query.concat(" ( "); query = query.concat(qry.searchTerms[i][j]); if (qry.searchTerms[i].length > 1 && j == (qry.searchTerms[i].length - 1) ) query = query.concat(" ) "); } } } query = changeFacetName(query); if (qry.exclusionTerms != null) { for (int i = 0; i < qry.exclusionTerms.length; i++) { // System.out.println(qry.exclusionTerms[i]); } } if (qry.facets != null) { for (int i = 0; i < qry.facets.length; i++) { // System.out.println(qry.facets[i]); } } // System.out.println(qry.idListOffset); // System.out.println(qry.idListSize); // System.out.println(qry.maxCntFacets); // System.out.println(qry.sortKey); if (qry.rankingTerms != null) { for (int i = 0; i < qry.rankingTerms.length; i++) { System.out.println(qry.rankingTerms[i]); } } log.info("querywithPadding:query="+query); String result = QueryMetadataFactory.getQueryImpl(TranslateLanguage.LUCENE).query(query, qry.resultListOffset, qry.resultListSize, TranslateResultsformat.ARFJS); JSONObject jResults = new JSONObject(result); JSONObject jResult = jResults.getJSONObject("result"); jResult.put("processingTime", sw.stop()); return new JSONWithPadding(jResults.toString(),callback); } catch (JSONException e) { log.error("synchronousQuery: QueryTranslationException", e); } catch (QueryTranslationException e) { log.error("synchronousQuery: QueryTranslationException", e); } catch (QueryMetadataException e) { log.error("synchronousQuery: QueryMetadataException", e); } return new JSONWithPadding(""); } private String changeFacetName(String expression) { if (expression.contains("lrt:")) expression = expression.replace("lrt:", "lom.educational.learningresourcetype.value:"); if (expression.contains("context:")) expression = expression.replace("context:", "lom.educational.context.value:"); if (expression.contains("format:")) expression = expression.replace("format:", "lom.technical.format:"); if (expression.contains("language:")) expression = expression.replace("language:", "lom.general.language:"); if (expression.contains("provider:")) expression = expression.replace("provider:", "collection:"); if (expression.contains("it:")) expression = expression.replace("it:", "lom.educational.interactivitytype.value:"); if (expression.contains("il:")) expression = expression.replace("il:", "lom.educational.interactivitylevel.value:"); if (expression.contains("iur:")) expression = expression.replace("iur:", "lom.educational.intendedenduserrole.value:"); if (expression.contains("tagr:")) expression = expression.replace("tagr:", "lom.educational.typicalagerange.string:"); if (expression.contains("collection:\"*\"")) expression = expression.replace("collection:\"*\"", "lom.solr:\"all\""); if (expression.contains("keyword:")) expression = expression.replace("keyword:", "lom.general.keyword.string:"); if (expression.contains("rights:")) expression = expression.replace("rights:", "lom.rights.description.string:"); if (expression.contains("licenses:")) expression = expression.replace("licences:","lom.rights.copyrightandotherrestrictions.string:"); if (expression.contains("classification:")) expression = expression.replace("classification:","lom.classification.taxonpath.taxon.entry.string:"); if (expression.contains("temporal:")) expression = expression.replace("temporal:","lom.educational.typicalagerange.string:"); if (expression.contains("spatial:")) expression = expression.replace("coverage:","lom.general.coverage.string:"); if (expression.contains("common:")) expression = expression.replace("common:","lom.classification.description.string:"); return expression; } }