# HG changeset patch # User casties # Date 1353689704 -3600 # Node ID 9f8c9611848ad93b6736829fab2c679b8452fc06 # Parent 15569aa35d6292974b6317e93824484531e0e7ce fixed bug with new rectangle shapes. added limit, offset and sortBy parameters to annotator/ and annotator/search. diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java --- a/src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java Fri Nov 23 17:55:04 2012 +0100 @@ -789,15 +789,13 @@ * * @param uri * @param userUri - * @param limit - * @param offset * @return */ - public List searchAnnotationByUriUser(String targetUri, String userUri, String limit, String offset) { + public List searchAnnotationByUriUser(String targetUri, String userUri) { List annotations = new ArrayList(); if (targetUri != null) { // there should be only one - Node target = getNodeIndex(NodeTypes.TARGET).get("uri", targetUri).getSingle(); + Node target = getNodeFromIndex("uri", targetUri, NodeTypes.TARGET); if (target != null) { Iterable relations = target.getRelationships(RelationTypes.ANNOTATES); for (Relationship relation : relations) { @@ -828,6 +826,7 @@ } } // TODO: if both uri and user are given we should intersect + return annotations; } diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java --- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java Fri Nov 23 17:55:04 2012 +0100 @@ -12,7 +12,6 @@ import org.json.JSONException; import org.json.JSONObject; import org.restlet.data.Form; -import org.restlet.data.Parameter; import org.restlet.data.Status; import org.restlet.ext.json.JsonRepresentation; import org.restlet.representation.Representation; @@ -59,9 +58,15 @@ logger.debug("request authenticated=" + authUser); if (id == null) { - return getAllAnnotations(authUser); + // no id -- send all annotations + Form form = getRequest().getResourceRef().getQueryAsForm(); + int limit = getInt(form.getFirstValue("limit")); + int offset = getInt(form.getFirstValue("offset")); + String sortBy = form.getFirstValue("sortBy"); + return getAllAnnotations(authUser, limit, offset, sortBy); } + // send annotation with id AnnotationStore store = getAnnotationStore(); Annotation annot = store.getAnnotationById(id); if (annot != null) { @@ -70,8 +75,6 @@ return null; } JSONObject result = createAnnotatorJson(annot, (authUser == null)); - logger.debug("sending:"); - logger.debug(result); return new JsonRepresentation(result); } else { // not found @@ -80,48 +83,44 @@ } } - private Representation getAllAnnotations(Person authUser) { - - Form form = getRequest().getResourceRef().getQueryAsForm(); - String sortBy = null; - for (Parameter parameter : form) { - if (parameter.getName().equals("sortBy")) { - sortBy = parameter.getValue(); - } - } - + private Representation getAllAnnotations(Person authUser, int limit, int offset, String sortBy) { AnnotationStore store = getAnnotationStore(); ArrayList results = new ArrayList(); - + + // read all annotations List annotations = store.getAnnotations(null, null); for (Annotation annotation : annotations) { // check permission if (!annotation.isActionAllowed("read", authUser, store)) continue; - + // add annotation to list JSONObject jo = createAnnotatorJson(annotation, false); results.add(jo); } + // sort if necessary if (sortBy != null) { JSONObjectComparator.sortAnnotations(results, sortBy); } - - JSONArray resultsJa = new JSONArray(); + + // put in JSON list + JSONArray rows = new JSONArray(); + int cnt = 0; for (JSONObject result : results) { - resultsJa.put(result); + cnt += 1; + if (offset > 0 && cnt < offset) continue; + rows.put(result); + if (limit > 0 && cnt >= limit) break; } // assemble result object JSONObject result = new JSONObject(); try { - result.put("rows", resultsJa); - result.put("total", resultsJa.length()); + result.put("rows", rows); + result.put("total", rows.length()); } catch (JSONException e) { setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error"); return null; } - logger.debug("sending:"); - logger.debug(result); return new JsonRepresentation(result); } @@ -233,10 +232,10 @@ JsonRepresentation retRep = new JsonRepresentation(jo); return retRep; } catch (JSONException e) { - e.printStackTrace(); + logger.error("Error in doPutJSON", e); setStatus(Status.CLIENT_ERROR_BAD_REQUEST); } catch (IOException e) { - e.printStackTrace(); + logger.error("Error in doPutJSON", e); setStatus(Status.SERVER_ERROR_INTERNAL, "Other Error"); } return null; @@ -268,7 +267,6 @@ return null; } } - // delete annotation store.deleteAnnotationById(id); setStatus(Status.SUCCESS_NO_CONTENT); diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java --- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java Fri Nov 23 17:55:04 2012 +0100 @@ -386,11 +386,11 @@ String x = geom.getString("x"); String y = geom.getString("y"); fragment = String.format("xywh=fraction:%s,%s,0,0", x, y); - } else if (type.equalsIgnoreCase("point")) { + } else if (type.equalsIgnoreCase("rectangle")) { String x = geom.getString("x"); String y = geom.getString("y"); - String width = shape.getString("width"); - String height = shape.getString("height"); + String width = geom.getString("width"); + String height = geom.getString("height"); fragment = String.format("xywh=fraction:%s,%s,%s,%s", x, y, width, height); } else { logger.error("Unable to parse this shape: " + shape); @@ -416,7 +416,6 @@ String end = range.getString("end"); String startOffset = range.getString("startOffset"); String endOffset = range.getString("endOffset"); - String fragment = String.format( "xpointer(start-point(string-range(\"%s\",%s,1))/range-to(end-point(string-range(\"%s\",%s,1))))", start, startOffset, end, endOffset); @@ -559,20 +558,26 @@ */ try { if (jo.has("ranges")) { - JSONObject ranges = jo.getJSONArray("ranges").getJSONObject(0); - annot.setFragmentType(FragmentTypes.XPOINTER); - String fragment = parseRange(ranges); - annot.setTargetFragment(fragment); + JSONArray ranges = jo.getJSONArray("ranges"); + if (ranges.length() > 0) { + JSONObject range = ranges.getJSONObject(0); + annot.setFragmentType(FragmentTypes.XPOINTER); + String fragment = parseRange(range); + annot.setTargetFragment(fragment); + } } } catch (JSONException e) { // nothing to do } try { if (jo.has("shapes")) { - JSONObject shapes = jo.getJSONArray("shapes").getJSONObject(0); - annot.setFragmentType(FragmentTypes.AREA); - String fragment = parseShape(shapes); - annot.setTargetFragment(fragment); + JSONArray shapes = jo.getJSONArray("shapes"); + if (shapes.length() > 0) { + JSONObject shape = shapes.getJSONObject(0); + annot.setFragmentType(FragmentTypes.AREA); + String fragment = parseShape(shape); + annot.setTargetFragment(fragment); + } } } catch (JSONException e) { // nothing to do @@ -580,15 +585,22 @@ // deprecated areas type try { if (jo.has("areas")) { - JSONObject area = jo.getJSONArray("areas").getJSONObject(0); - annot.setFragmentType(FragmentTypes.AREA); - String fragment = parseArea(area); - annot.setTargetFragment(fragment); + JSONArray areas = jo.getJSONArray("areas"); + if (areas.length() > 0) { + JSONObject area = areas.getJSONObject(0); + annot.setFragmentType(FragmentTypes.AREA); + String fragment = parseArea(area); + annot.setTargetFragment(fragment); + } } } catch (JSONException e) { // nothing to do } - + // no fragment is an error + if (annot.getFragmentType() == null || annot.getTargetFragment() == null) { + throw new JSONException("Annotation has no valid target fragment!"); + } + /* * permissions */ @@ -649,11 +661,19 @@ return actor; } - public float getFloat(String s) { + public static float getFloat(String s) { try { return Float.parseFloat(s); } catch (NumberFormatException e) { } return 0f; } + + public static int getInt(String s) { + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + } + return 0; + } } diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java --- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java Fri Nov 23 17:55:04 2012 +0100 @@ -14,7 +14,7 @@ */ public class AnnotatorRestlet extends BaseRestlet { - public final String version = "AnnotationManagerN4J/Annotator 0.3.0"; + public final String version = "AnnotationManagerN4J/Annotator 0.3.1"; public static Logger logger = Logger.getLogger(AnnotatorRestlet.class); diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java --- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java Fri Nov 23 17:55:04 2012 +0100 @@ -3,6 +3,7 @@ */ package de.mpiwg.itgroup.annotations.restlet; +import java.util.ArrayList; import java.util.List; import org.json.JSONArray; @@ -17,6 +18,7 @@ import de.mpiwg.itgroup.annotations.Annotation; import de.mpiwg.itgroup.annotations.Person; import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; +import de.mpiwg.itgroup.annotations.restlet.utils.JSONObjectComparator; /** * Implements the "search" uri of the Annotator API. see @@ -33,7 +35,7 @@ /** * result for JSON content-type. optional search parameters: uri, user, limit, - * offset. + * offset, sortBy. * * @param entity * @return @@ -49,30 +51,47 @@ Form form = getRequest().getResourceRef().getQueryAsForm(); String uri = form.getFirstValue("uri"); String user = form.getFirstValue("user"); - String limit = form.getFirstValue("limit"); - String offset = form.getFirstValue("offset"); + int limit = getInt(form.getFirstValue("limit")); + int offset = getInt(form.getFirstValue("offset")); + String sortBy = form.getFirstValue("sortBy"); - JSONArray results = new JSONArray(); // do search + ArrayList results = new ArrayList(); logger.debug(String.format("searching for uri=%s user=%s", uri, user)); AnnotationStore store = getAnnotationStore(); - List annots = store.searchAnnotationByUriUser(uri, user, limit, offset); + List annots = store.searchAnnotationByUriUser(uri, user); for (Annotation annot : annots) { // check permission if (!annot.isActionAllowed("read", authUser, store)) continue; JSONObject jo = createAnnotatorJson(annot, (authUser == null)); if (jo != null) { - results.put(jo); + results.add(jo); } else { setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error"); return null; } } + + // sort if necessary + if (sortBy != null) { + JSONObjectComparator.sortAnnotations(results, sortBy); + } + + // put in JSON list + JSONArray rows = new JSONArray(); + int cnt = 0; + for (JSONObject result : results) { + cnt += 1; + if (offset > 0 && cnt < offset) continue; + rows.put(result); + if (limit > 0 && cnt >= limit) break; + } + // assemble result object JSONObject result = new JSONObject(); try { - result.put("rows", results); - result.put("total", results.length()); + result.put("rows", rows); + result.put("total", rows.length()); } catch (JSONException e) { setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error"); return null; diff -r 15569aa35d62 -r 9f8c9611848a src/main/java/de/mpiwg/itgroup/annotations/restlet/utils/JSONObjectComparator.java --- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/utils/JSONObjectComparator.java Thu Nov 22 17:45:23 2012 +0100 +++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/utils/JSONObjectComparator.java Fri Nov 23 17:55:04 2012 +0100 @@ -3,8 +3,6 @@ import java.util.Comparator; import java.util.List; -import de.mpiwg.itgroup.annotations.Annotation; - import org.json.JSONException; import org.json.JSONObject;