labelingsystem-server  Version 0.1.0.0
SearchResource Class Reference

Public Member Functions

Response getResultsLabelingSystem ( @HeaderParam("Accept-Encoding") String acceptEncoding, @QueryParam("query") String searchword, @QueryParam("vocab") String vocabulary, @QueryParam("lookup") String fields, @QueryParam("maxhits") String maxhits, @QueryParam("draft") String draft)
 

Static Private Member Functions

static OutputStream GZIP (String input, OutputStream baos) throws IOException
 

Member Function Documentation

◆ getResultsLabelingSystem()

Response getResultsLabelingSystem ( @HeaderParam("Accept-Encoding") String  acceptEncoding,
@QueryParam("query") String  searchword,
@QueryParam("vocab") String  vocabulary,
@QueryParam("lookup") String  fields,
@QueryParam("maxhits") String  maxhits,
@QueryParam("draft") String  draft 
)
48  {
49  try {
50  String OUTSTRING = "";
51  int limit = 20;
52  if (maxhits != null) {
53  limit = Integer.parseInt(maxhits);
54  }
55  String url = ConfigProperties.getPropertyParam("api") + "/v1/sparql";
56  String sparql = "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX ls: <http://labeling.link/docs/ls/core#> PREFIX dc: <http://purl.org/dc/elements/1.1/> "
57  + "SELECT ?Subject ?id ?prefLabels ?scopeNote ?BroaderPreferredTerm ?BroaderPreferred ?NarrowerPreferredTerm ?NarrowerPreferred ?schemeTitle ?scheme WHERE { "
58  //+ "SELECT ?Subject ?id ?prefLabel WHERE { "
59  + "?Subject dc:identifier ?id . "
60  + "?Subject skos:inScheme ?scheme . "
61  + "?scheme dc:title ?schemeTitle . "
62  + "?Subject skos:prefLabel ?prefLabel . "
63  + "?Subject skos:prefLabel ?prefLabels . "
64  + "?Subject ls:thumbnail ?preferredLabel . "
65  + "OPTIONAL { ?Subject skos:scopeNote ?scopeNote . } "
66  + "OPTIONAL {?Subject skos:broader ?BroaderPreferred . ?BroaderPreferred ls:thumbnail ?BroaderPreferredTerm.} "
67  + "OPTIONAL {?Subject skos:narrower ?NarrowerPreferred . ?NarrowerPreferred ls:thumbnail ?NarrowerPreferredTerm .} ";
68  if (fields != null) {
69  if (fields.contains("prefLabel")) {
70  sparql += "FILTER(regex(?prefLabel, '" + searchword + "', 'i')) ";
71  } else if (fields.contains("scopeNote")) {
72  sparql += "FILTER(regex(?scopeNote, '" + searchword + "', 'i')) ";
73  } else {
74  sparql += "FILTER(regex(?prefLabel, '" + searchword + "', 'i') || regex(?scopeNote, '" + searchword + "', 'i')) ";
75  }
76  } else {
77  sparql += "FILTER(regex(?prefLabel, '" + searchword + "', 'i') || regex(?scopeNote, '" + searchword + "', 'i')) ";
78  }
79  if (vocabulary != null) {
80  sparql += "FILTER(?scheme=<http://" + ConfigProperties.getPropertyParam("host") + "/item/vocabulary/" + vocabulary + ">) ";
81  }
82  if (draft == null) {
83  sparql += "?scheme ls:hasReleaseType ls:Public . ";
84  }
85  sparql += "} ORDER BY ASC(?preferredLabel)";
86  URL obj = new URL(url);
87  HttpURLConnection con = (HttpURLConnection) obj.openConnection();
88  con.setRequestMethod("GET");
89  con.setRequestProperty("Accept", "application/sparql-results+json");
90  String urlParameters = "query=" + sparql;
91  //byte[] bytes = urlParameters.getBytes(StandardCharsets.UTF_8);
92  //urlParameters = new String(bytes, StandardCharsets.ISO_8859_1);
93  con.setDoOutput(true);
94  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
95  wr.writeBytes(urlParameters);
96  wr.flush();
97  wr.close();
98  BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF8"));
99  String inputLine;
100  StringBuilder response = new StringBuilder();
101  while ((inputLine = in.readLine()) != null) {
102  response.append(inputLine);
103  }
104  in.close();
105  // init output
106  JSONArray outArray = new JSONArray();
107  // parse SPARQL results json
108  JSONObject jsonObject = (JSONObject) new JSONParser().parse(response.toString());
109  JSONObject resultsObject = (JSONObject) jsonObject.get("results");
110  JSONArray bindingsArray = (JSONArray) resultsObject.get("bindings");
111  // create unique list of ids
112  HashSet<String> uris = new HashSet<String>();
113  for (Object element : bindingsArray) {
114  JSONObject tmpElement = (JSONObject) element;
115  JSONObject subject = (JSONObject) tmpElement.get("Subject");
116  String subjectValue = (String) subject.get("value");
117  uris.add(subjectValue);
118  }
119  // create list of autosuggest objects
120  Map<String, SuggestionItem> autosuggests = new HashMap<String, SuggestionItem>();
121  for (String element : uris) {
122  autosuggests.put(element, new SuggestionItem(element));
123  }
124  // fill objects
125  for (Object element : bindingsArray) {
126  JSONObject tmpElement = (JSONObject) element;
127  // get Subject
128  JSONObject subject = (JSONObject) tmpElement.get("Subject");
129  String subjectValue = (String) subject.get("value");
130  // for every subject value get object from list and write values in it
131  SuggestionItem tmpAutosuggest = autosuggests.get(subjectValue);
132  // get id
133  JSONObject idObject = (JSONObject) tmpElement.get("id");
134  String idValue = (String) idObject.get("value");
135  tmpAutosuggest.setId(idValue);
136  // get Label
137  JSONObject labelObject = (JSONObject) tmpElement.get("prefLabels");
138  String labelValue = (String) labelObject.get("value");
139  String labelLang = (String) labelObject.get("xml:lang");
140  tmpAutosuggest.setLabel(labelValue + "@" + labelLang);
141  // get Scheme
142  JSONObject schemeObject = (JSONObject) tmpElement.get("schemeTitle");
143  String schemeValue = (String) schemeObject.get("value");
144  String schemeLang = (String) schemeObject.get("xml:lang");
145  tmpAutosuggest.setSchemeTitle(schemeValue + "@" + schemeLang);
146  JSONObject schemeURIObject = (JSONObject) tmpElement.get("scheme");
147  String schemeURIValue = (String) schemeURIObject.get("value");
148  tmpAutosuggest.setSchemeURI(schemeURIValue);
149  // get scopeNote
150  JSONObject scopeNoteObject = (JSONObject) tmpElement.get("scopeNote");
151  if (scopeNoteObject != null) {
152  String scopeNoteValue = (String) scopeNoteObject.get("value");
153  String scopeNoteLang = (String) scopeNoteObject.get("xml:lang");
154  tmpAutosuggest.setDescription(scopeNoteValue + "@" + scopeNoteLang);
155  }
156  // get broader
157  String broaderVL = "";
158  String broaderURI = "";
159  JSONObject broaderObject = (JSONObject) tmpElement.get("BroaderPreferredTerm");
160  if (broaderObject != null) {
161  String broaderValue = (String) broaderObject.get("value");
162  String broaderLang = (String) broaderObject.get("xml:lang");
163  broaderVL = broaderValue.replace("<", "").replace(">", "") + "@" + broaderLang.replace("<", "").replace(">", "");
164  }
165  JSONObject broaderURIObject = (JSONObject) tmpElement.get("BroaderPreferred");
166  if (broaderURIObject != null) {
167  broaderURI = (String) broaderURIObject.get("value");
168  }
169  if (!broaderURI.equals("")) {
170  HashMap<String, String> hstmpBroader = new HashMap<String, String>();
171  hstmpBroader.put(broaderURI, broaderVL);
172  tmpAutosuggest.setBroaderTerm(hstmpBroader);
173  }
174  // get narrower
175  String narrowerVL = "";
176  String narrowerURI = "";
177  JSONObject narrowerObject = (JSONObject) tmpElement.get("NarrowerPreferredTerm");
178  if (narrowerObject != null) {
179  String narrowerValue = (String) narrowerObject.get("value");
180  String narrowerLang = (String) narrowerObject.get("xml:lang");
181  narrowerVL = narrowerValue.replace("<", "").replace(">", "") + "@" + narrowerLang.replace("<", "").replace(">", "");
182  }
183  JSONObject narrowerURIObject = (JSONObject) tmpElement.get("NarrowerPreferred");
184  if (narrowerURIObject != null) {
185  narrowerURI = (String) narrowerURIObject.get("value");
186  }
187  if (!narrowerURI.equals("")) {
188  HashMap<String, String> hstmpNarrower = new HashMap<String, String>();
189  hstmpNarrower.put(narrowerURI, narrowerVL);
190  tmpAutosuggest.setNarrowerTerm(hstmpNarrower);
191  }
192  }
193  // fill output json
194  int i = 0;
195  for (Map.Entry<String, SuggestionItem> entry : autosuggests.entrySet()) {
196  if (i < limit) {
197  JSONObject similarityObject = new JSONObject();
198  SuggestionItem tmpAS = entry.getValue();
199  JSONObject suggestionObject = new JSONObject();
200  // url
201  suggestionObject.put("uri", tmpAS.getURL());
202  suggestionObject.put("id", tmpAS.getId());
203  // prefLabels
204  JSONArray prefLabelArray = new JSONArray();
205  List<Double> prefLabelSimilarity = new ArrayList();
206  for (String item : tmpAS.getLabels()) {
207  String[] splitItem = item.split("@");
208  JSONObject jo = new JSONObject();
209  jo.put("label", splitItem[0]);
210  jo.put("lang", splitItem[1]);
211  prefLabelArray.add(jo);
212  prefLabelSimilarity.add(Similarity.NormalizedLevenshtein(searchword, splitItem[0]));
213  }
214  suggestionObject.put("prefLabels", prefLabelArray);
215  similarityObject.put("label", Collections.min(prefLabelSimilarity));
216  // scheme
217  String[] splitVocabItem = tmpAS.getSchemeTitle().split("@");
218  if (splitVocabItem.length > 1) {
219  JSONObject joVoc = new JSONObject();
220  joVoc.put("label", splitVocabItem[0]);
221  joVoc.put("lang", splitVocabItem[1]);
222  joVoc.put("uri", tmpAS.getSchemeURI());
223  suggestionObject.put("vocab", joVoc);
224  }
225  // scopeNote
226  for (String item : tmpAS.getDescriptions()) {
227  String[] splitItem = item.split("@");
228  JSONObject jo = new JSONObject();
229  jo.put("note", splitItem[0]);
230  jo.put("lang", splitItem[1]);
231  suggestionObject.put("scopeNote", jo);
232  similarityObject.put("scopeNote", Similarity.NormalizedLevenshtein(searchword, splitItem[0]));
233  }
234  // broader
235  Set broaderTerms = tmpAS.getBroaderTerms();
236  JSONArray broaderArrayNew = new JSONArray();
237  if (broaderTerms.size() > 0) {
238  for (Object element : broaderTerms) {
239  Map hm = (Map) element;
240  Iterator entries = hm.entrySet().iterator();
241  while (entries.hasNext()) {
242  Map.Entry thisEntry = (Map.Entry) entries.next();
243  String key = (String) thisEntry.getKey();
244  String value = (String) thisEntry.getValue();
245  JSONObject broaderObjectTmp = new JSONObject();
246  broaderObjectTmp.put("uri", key);
247  broaderObjectTmp.put("label", value);
248  broaderArrayNew.add(broaderObjectTmp);
249  }
250  }
251  }
252  suggestionObject.put("broaderTerms", broaderArrayNew);
253  // narrower
254  Set narrowerTerms = tmpAS.getNarrowerTerms();
255  JSONArray narrowerArrayNew = new JSONArray();
256  if (narrowerTerms.size() > 0) {
257  for (Object element : narrowerTerms) {
258  Map hm = (Map) element;
259  Iterator entries = hm.entrySet().iterator();
260  while (entries.hasNext()) {
261  Map.Entry thisEntry = (Map.Entry) entries.next();
262  String key = (String) thisEntry.getKey();
263  String value = (String) thisEntry.getValue();
264  JSONObject narrowerObjectTmp = new JSONObject();
265  narrowerObjectTmp.put("uri", key);
266  narrowerObjectTmp.put("label", value);
267  narrowerArrayNew.add(narrowerObjectTmp);
268  }
269  }
270  }
271  suggestionObject.put("narrowerTerms", narrowerArrayNew);
272  // add similarity
273  suggestionObject.put("similarityNormalizedLevenshtein", similarityObject);
274  // add information to output
275  outArray.add(suggestionObject);
276  }
277  i++;
278  }
279  OUTSTRING = outArray.toString();
280  if (acceptEncoding.contains("gzip")) {
281  // set outputstream
282  final String OUTSTRING_FINAL = OUTSTRING;
283  StreamingOutput stream;
284  stream = new StreamingOutput() {
285  @Override
286  public void write(OutputStream output) throws IOException, WebApplicationException {
287  try {
288  output = GZIP(OUTSTRING_FINAL, output);
289  } catch (Exception e) {
290  System.out.println(e.toString());
291  }
292  }
293  };
294  return Response.ok(stream).header("Content-Type", "application/json;charset=UTF-8").header("Content-Encoding", "gzip").build();
295  } else {
296  return Response.ok(OUTSTRING).header("Content-Type", "application/json;charset=UTF-8").build();
297  }
298  } catch (Exception e) {
299  return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(Logging.getMessageJSON(e, "v1.rest.SearchResource"))
300  .header("Content-Type", "application/json;charset=UTF-8").build();
301  }
302  }

References Logging.getMessageJSON(), ConfigProperties.getPropertyParam(), and Similarity.NormalizedLevenshtein().

◆ GZIP()

static OutputStream GZIP ( String  input,
OutputStream  baos 
) throws IOException
staticprivate
304  {
305  try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) {
306  gzos.write(input.getBytes("UTF-8"));
307  } catch (Exception e) {
308  System.out.println(e.toString());
309  }
310  return baos;
311  }
Exception
v1.rest.SearchResource.GZIP
static OutputStream GZIP(String input, OutputStream baos)
Definition: SearchResource.java:304