package org.ariadne_eu.utils.rest; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class Query { public InMemoryEngine searchEngine; public String[][] searchTerms; //Conjunction of disjunction public String[] exclusionTerms; //Disjunction of terms to be excluded public String[] rankingTerms; //These are terms that should be considered in the ranking; e.g. "cny=BE" public String sortKey; //By which key the results should be sorted public String[] facets = new String[0]; //Which facets to count public QueryResult result; //QueryResult, consolidated from the nodes //public int maxResults = 0; //Maximum number of results public int resultListOffset = 0; public int resultListSize = 12; public int idListOffset = 0; public int idListSize = 12; public int maxCntFacets = 0; //Maximum number of results that will be counted for the facets public void parseTerms(String inp){ inp = inp.substring(inp.indexOf("{")+1, inp.lastIndexOf("}")); String regex = "\\{(.*?)\\}"; //System.out.println(regex + " IN "+inp); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(inp); ArrayList<ArrayList<String>> conjList = new ArrayList<ArrayList<String>>(); ArrayList<String> disjList; while (matcher.find()) { StringTokenizer st = new StringTokenizer(matcher.group(1),","); disjList = new ArrayList<String>(); while(st.hasMoreTokens()) { String s = st.nextToken().trim().toLowerCase(); s = s.substring(1, s.length()-1).trim(); //System.out.println(s); disjList.add(s); } conjList.add(disjList); } searchTerms = new String[conjList.size()][]; for (int i=0;i<conjList.size();i++){ String disj[] = new String[conjList.get(i).size()]; conjList.get(i).toArray(disj); searchTerms[i] = disj; } } public void parseJson(JSONObject jo){ try { String expression = ""; String language = ""; ArrayList<String[]> stList = new ArrayList<String[]>(); JSONArray clause = new JSONArray(); if (jo.has("clause")) clause = jo.getJSONArray("clause"); for (int i=0;i<clause.length();i++){ JSONObject thisClause = clause.getJSONObject(i); if (thisClause.has("language")) language = thisClause.getString("language").trim(); if (thisClause.has("expression")) expression = thisClause.getString("expression").trim();; if (language.equalsIgnoreCase("vsql")){ stList.addAll(parseVSQL(expression)); } else if (language.equalsIgnoreCase("anyOfFacet")){ String[] parts = expression.split(":"); stList.add(parseFacet(parts[0],parts[1],"|")); } } searchTerms = new String[stList.size()][]; for (int i=0;i<stList.size();i++) searchTerms[i] = stList.get(i); //System.out.println(toString()); //Set facets to report the numbers on if (jo.has("facets")) { JSONArray myFacets = jo.getJSONArray("facets"); facets = new String[myFacets.length()]; for (int i=0;i<myFacets.length();i++){ facets[i] = myFacets.getString(i); } } if (jo.has("resultListOffset")) resultListOffset = jo.getInt("resultListOffset"); if (jo.has("resultListSize")) resultListSize = jo.getInt("resultListSize"); //Set IDsFrom and IDsTo to default values idListOffset = resultListOffset; idListSize = resultListSize; if (jo.has("idListOffset")) idListOffset = jo.getInt("idListOffset"); if (jo.has("idListSize")) idListSize = jo.getInt("idListSize"); } catch (Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace (); } } public void parseURL(HttpServletRequest request){ try { Map<String,String[]> parMap = request.getParameterMap(); Set<String> parKeys = parMap.keySet(); String[] keys = new String[parKeys.size()]; parKeys.toArray(keys); for (int i=0; i<keys.length;i++){ if (keys[i].equalsIgnoreCase("clause")){ parseURLclauses(parMap.get(keys[i])); } else if (keys[i].equalsIgnoreCase("info")){ parseURLinfo(parMap.get(keys[i])); } else if (keys[i].equalsIgnoreCase("offset")){ resultListOffset = Integer.parseInt(parMap.get(keys[i])[0]); } else if (keys[i].equalsIgnoreCase("limit")){ resultListSize = Integer.parseInt(parMap.get(keys[i])[0]); } } //Set idListOffset and idListSize to default values idListOffset = resultListOffset; idListSize = resultListSize; } catch (Exception ex) { System.out.println(ex.getMessage()); ex.printStackTrace (); } } public void parseURLclauses(String[] values){ ArrayList<String[]> stList = new ArrayList<String[]>(); for (int i=0;i<values.length;i++){ String[] parts = values[i].split(":"); if (parts[0].equalsIgnoreCase("VSQL")){ stList.addAll(parseVSQL(parts[1])); } else if (parts[0].equalsIgnoreCase("facet")){ stList.add(parseFacet(parts[1],parts[2],"|")); } } searchTerms = new String[stList.size()][]; stList.toArray(searchTerms); } public void parseURLinfo(String[] values){ ArrayList<String> facetList = new ArrayList<String>(); for (int i=0;i<values.length;i++){ String[] parts = values[i].split(":"); if (parts[0].equalsIgnoreCase("elementset")){ //TODO } else if (parts[0].equalsIgnoreCase("facet")){ facetList.add(parts[1]); } } facets = new String[facetList.size()]; facetList.toArray(facets); for (int i=0;i<facets.length;i++) System.out.print(" "+facets[i]);System.out.println(); } public List<String[]> parseVSQL(String content){ List<String[]> result = new ArrayList<String[]>(); StringTokenizer st = new StringTokenizer(content, " "); List<String> subject = new ArrayList<String>(); while(st.hasMoreTokens()) { subject.add(st.nextToken().trim().toLowerCase()); } for (int j=0;j<subject.size();j++){ String[] disjunction = new String[1]; disjunction[0] = "contents:\""+subject.get(j)+"\""; // disjunction[0] = "subject:"+subject.get(j); result.add(disjunction); } return result; } /* public List<String> parseFacet(String content){ StringTokenizer st = new StringTokenizer(content.substring(1, content.length()-1), ","); List<String> result = new ArrayList<String>(); while(st.hasMoreTokens()) { String f = st.nextToken().trim().toLowerCase(); result.add(f.substring(1, f.length() - 1).trim()); } return result; } */ public String[] parseFacet(String facet, String content, String delim){ StringTokenizer st = new StringTokenizer(content, delim); List<String> parsedFacets = new ArrayList<String>(); while(st.hasMoreTokens()) { String f = st.nextToken().trim().toLowerCase(); if (facet.equalsIgnoreCase("language")) { facet = "lom.general.language"; }else if (facet.equalsIgnoreCase("lrt")) { facet = "lom.educational.learningresourcetype.value"; }else if (facet.equalsIgnoreCase("context")) { facet = "lom.educational.context.value"; }else if (facet.equalsIgnoreCase("format")) { facet = "lom.technical.format"; }else if (facet.equalsIgnoreCase("provider")) { facet = "collection"; }else if (facet.equalsIgnoreCase("keyword")) { facet = "lom.general.keyword.string"; } parsedFacets.add(facet+":\""+f.trim()+"\""); } String[] facetArray = new String[parsedFacets.size()]; parsedFacets.toArray(facetArray); return facetArray; } public String toString(){ String result = "{"; for (int i=0;i<searchTerms.length;i++){ result = result+"{"; for (int j=0;j<searchTerms[i].length;j++) { result = result+"\""+searchTerms[i][j]+"\""; if (j!=searchTerms[i].length - 1) result = result+","; } result = result+"}"; if (i!=searchTerms.length - 1) result = result+","; } result = result+"}"; return result; } public static void main(String[] args) throws JSONException { String sq = "{\"clause\":[{\"language\":\"VSQL\",\"expression\":\"university\"},{\"language\":\"anyOfFacet\",\"expression\":\"language:de|es\"},{\"language\":\"anyOfFacet\",\"expression\":\"lrt:simulation\"}],\"uiLanguage\":\"en\",\"preferredLanguages\":[],\"facets\":[\"language\",\"format\",\"context\",\"lrt\"],\"resultInfo\":\"display\",\"resultListOffset\":0,\"resultListSize\":12,\"idListOffset\":0,\"idListSize\":12,\"resultFormat\":\"json\",\"resultSortkey\":\"\"}"; Query q = new Query(); JSONObject jo = new JSONObject(); jo = new JSONObject(sq); q.parseJson(jo); } }