Changeset 4:3599b29c393f in AnnotationManagerN4J for src/main/java
- Timestamp:
- Jul 2, 2012, 8:39:46 PM (13 years ago)
- Branch:
- default
- Location:
- src/main/java/de/mpiwg/itgroup/annotations
- Files:
-
- 4 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java
r3 r4 6 6 7 7 import java.io.IOException; 8 import java.util.ArrayList;9 import java.util.List;10 8 11 9 import org.json.JSONArray; 12 10 import org.json.JSONException; 13 11 import org.json.JSONObject; 14 import org.restlet.Context;15 import org.restlet.data.Form;16 import org.restlet.data.MediaType;17 import org.restlet.data.Reference;18 12 import org.restlet.data.Status; 19 13 import org.restlet.ext.json.JsonRepresentation; 20 14 import org.restlet.representation.Representation; 21 import org.restlet.representation.StringRepresentation;22 15 import org.restlet.resource.Delete; 23 16 import org.restlet.resource.Get; 24 17 import org.restlet.resource.Post; 25 18 import org.restlet.resource.Put; 26 import org.restlet.security.User; 27 28 import de.mpiwg.itgroup.annotationManager.Constants.NS; 29 import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreSearchError; 30 import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreStoreError; 31 import de.mpiwg.itgroup.annotationManager.RDFHandling.Annotation; 32 import de.mpiwg.itgroup.annotationManager.RDFHandling.Convert; 33 import de.mpiwg.itgroup.annotationManager.RDFHandling.RDFSearcher; 34 import de.mpiwg.itgroup.annotationManager.drupal.AnnotationHandler; 35 import de.mpiwg.itgroup.annotationManager.drupal.UnknowUserException; 36 import de.mpiwg.itgroup.triplestoremanager.exceptions.TripleStoreHandlerException; 19 20 import de.mpiwg.itgroup.annotations.Annotation; 21 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; 37 22 38 23 /** 39 * Implements the "annotations" uri of the Annotator API. see <https://github.com/okfn/annotator/wiki/Storage> 24 * Implements the "annotations" uri of the Annotator API. see 25 * <https://github.com/okfn/annotator/wiki/Storage> 40 26 * 41 27 * @author dwinter, casties … … 69 55 logger.debug("request authenticated=" + authenticated); 70 56 71 RDFSearcher searcher = new RDFSearcher(NS.MPIWG_ANNOT_CTX); // TODO should ge into config file 72 73 try { 74 List<Annotation> annots = searcher.searchById(id); 75 if (annots.size() == 1) { 76 // there should be only one 77 JSONObject result = createAnnotatorJson(annots.get(0)); 78 logger.debug("sending:"); 79 logger.debug(result); 80 return new JsonRepresentation(result); 81 } else { 82 JSONArray results; 83 results = new JSONArray(); 84 for (Annotation annot : annots) { 85 JSONObject jo = createAnnotatorJson(annot); 86 if (jo != null) { 87 results.put(createAnnotatorJson(annot)); 88 } else { 89 setStatus(Status.SERVER_ERROR_INTERNAL, "JSon Error"); 90 return null; 91 } 92 } 93 // annotator read request returns a list of annotation objects 94 logger.debug("sending:"); 95 logger.debug(results); 96 return new JsonRepresentation(results); 97 } 98 } catch (TripleStoreHandlerException e) { 99 e.printStackTrace(); 100 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreHandler Error"); 101 return null; 102 } catch (TripleStoreSearchError e) { 103 e.printStackTrace(); 104 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreSearch Error"); 105 return null; 57 Annotation annots = getAnnotationStore().getAnnotationById(id); 58 if (annots != null) { 59 // there should be only one 60 JSONObject result = createAnnotatorJson(annots); 61 logger.debug("sending:"); 62 logger.debug(result); 63 return new JsonRepresentation(result); 64 } else { 65 JSONArray results = new JSONArray(); 66 // annotator read request returns a list of annotation objects 67 logger.debug("sending:"); 68 logger.debug(results); 69 return new JsonRepresentation(results); 106 70 } 107 71 } … … 110 74 * POST with JSON content-type. 111 75 * 112 * json hash: username: name des users xpointer: xpointer auf den Ausschnitt (incl. der URL des Dokumentes) text: text der 113 * annotation annoturl: url auf eine Annotation falls extern 76 * json hash: username: name des users xpointer: xpointer auf den Ausschnitt 77 * (incl. der URL des Dokumentes) text: text der annotation annoturl: url 78 * auf eine Annotation falls extern 114 79 * 115 80 * @return … … 139 104 return null; 140 105 } 141 if (annot == null || annot.xpointer == null || annot.creator == null) {106 if (annot == null) { 142 107 setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 143 108 return null; 144 109 } 145 110 Annotation storedAnnot; 146 try { 147 // store Annotation 148 storedAnnot = new Convert(NS.MPIWG_ANNOT_CTX).storeAnnotation(annot); 149 } catch (TripleStoreStoreError e) { 150 e.printStackTrace(); 151 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStore Error"); 152 return null; 153 } 154 /* according to https://github.com/okfn/annotator/wiki/Storage 155 * we should return 303: see other. 156 * For now we return the annotation. 111 // store Annotation 112 storedAnnot = getAnnotationStore().storeAnnotation(annot); 113 /* 114 * according to https://github.com/okfn/annotator/wiki/Storage we should 115 * return 303: see other. For now we return the annotation. 157 116 */ 158 117 JSONObject jo = createAnnotatorJson(storedAnnot); … … 160 119 return retRep; 161 120 } 162 163 /**164 * POST with HTML content-type.165 *166 * @param entity167 * @return168 */169 @Post("html")170 public Representation doPostHtml(Representation entity) {171 logger.debug("AnnotatorAnnotations doPostHtml!");172 Annotation annot;173 annot = handleForm(entity);174 if (annot.xpointer == null || annot.creator == null) {175 setStatus(Status.CLIENT_ERROR_BAD_REQUEST);176 177 return null;178 }179 180 Annotation retValAnnot;181 try {182 retValAnnot = new Convert(NS.MPIWG_ANNOT_CTX).storeAnnotation(annot);183 } catch (TripleStoreStoreError e) {184 e.printStackTrace();185 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStore Error");186 return null;187 }188 if (retValAnnot == null) {189 return null;190 }191 String retVal = retValAnnot.getAnnotationUri();192 if (retVal == null) {193 return null;194 }195 196 String text = String.format("<html><body><a href=\"%s\">%s</a></body></html>", retVal.replace(">", "").replace("<", ""),197 retVal.replace(">", ">").replace("<", "<"));198 Representation retRep = new StringRepresentation(text, MediaType.TEXT_HTML);199 return retRep;200 }201 202 /**203 *204 * @param entity205 * should contain a form with the parameters "username", "password", "xpointer","text","uri","type"206 *207 * username,password is optional, if not given BasicAuthentification is used.208 *209 * If username given as a URI, the username will be transformed to an URI, username will be added to the MPIWG210 * namespace defined in de.mpiwg.itgroup.annotationManager.Constants.NS211 *212 * @return213 */214 protected Annotation handleForm(Representation entity) {215 Annotation annot;216 Form form = new Form(entity);217 String username = form.getValues("username");218 String mode = form.getValues("mode");219 String password = form.getValues("password");220 String xpointer = form.getValues("xpointer");221 String text = form.getValues("text");222 String title = form.getValues("title");223 String url = form.getValues("url");224 String type = form.getValues("type");225 RestServer restServer = (RestServer) getApplication();226 227 // falls user and password nicht null sind:228 User userFromForm = null;229 if (username != null && password != null) {230 if (restServer.authenticate(username, password, getRequest())) {231 userFromForm = new User(username);232 }233 }234 User authUser = null;235 236 if (userFromForm == null) {237 authUser = getHttpAuthUser(entity);238 }239 240 // weder BasicAuth noch FormAuth241 if (authUser == null && userFromForm == null) {242 setStatus(Status.CLIENT_ERROR_FORBIDDEN);243 return null;244 }245 246 if (userFromForm != null) {247 username = userFromForm.getIdentifier();248 } else {249 username = authUser.getIdentifier();250 }251 252 // username should be a URI, if not it will set to the MPIWG namespace defined in253 // de.mpiwg.itgroup.annotationManager.Constants.NS254 String usernameOrig = username;255 if (!username.startsWith("http"))256 username = NS.MPIWG_PERSONS_URL + username;257 258 if (mode.equals("complexAnnotation")) {// Annotation mit text in externer ressource259 260 Context context = getContext();261 String drupalPath = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.drupalServer");262 263 AnnotationHandler ah = new AnnotationHandler(drupalPath);264 JSONObject newAnnot;265 try {266 newAnnot = ah.createAnnotation(title, text, usernameOrig, password);267 } catch (UnknowUserException e1) {268 setStatus(Status.CLIENT_ERROR_FORBIDDEN);269 e1.printStackTrace();270 return null;271 }272 try {273 annot = new Annotation(xpointer, username, null, text, type, newAnnot.getString("node_uri"));274 } catch (JSONException e) {275 // TODO Auto-generated catch block276 e.printStackTrace();277 setStatus(Status.SERVER_ERROR_INTERNAL);278 return null;279 }280 } else281 annot = new Annotation(xpointer, username, null, text, type, url);282 return annot;283 }284 285 121 286 122 /** … … 304 140 if (!authenticated) { 305 141 setStatus(Status.CLIENT_ERROR_FORBIDDEN, "Not Authorized!"); 306 return null; 142 return null; 307 143 } 308 144 309 145 Annotation annot = null; 146 AnnotationStore store = getAnnotationStore(); 310 147 try { 311 148 JsonRepresentation jrep = new JsonRepresentation(entity); … … 315 152 return null; 316 153 } 317 RDFSearcher searcher = new RDFSearcher(NS.MPIWG_ANNOT_CTX); // TODO should ge into config file318 154 // get stored Annotation 319 List<Annotation> annots = searcher.searchById(id);320 if ( annots.size() < 1) {155 Annotation storedAnnot = store.getAnnotationById(id); 156 if (storedAnnot == null) { 321 157 setStatus(Status.CLIENT_ERROR_NOT_FOUND); 322 158 return null; 323 159 } 324 Annotation storedAnnot = annots.get(0);325 // delete326 searcher.deleteById(id);327 160 // update from posted JSON 328 161 annot = updateAnnotation(storedAnnot, jo, entity); 329 162 // store Annotation 330 storedAnnot = new Convert(NS.MPIWG_ANNOT_CTX).storeAnnotation(annot);331 /* according to https://github.com/okfn/annotator/wiki/Storage332 * we should return 303: see other.333 * but the client doesn't like it334 setStatus(Status.REDIRECTION_SEE_OTHER);335 // go to same URL as this one336 Reference thisUrl = this.getReference();337 this.getResponse().setLocationRef(thisUrl);*/163 storedAnnot = store.storeAnnotation(annot); 164 /* 165 * according to https://github.com/okfn/annotator/wiki/Storage we 166 * should return 303: see other. but the client doesn't like it 167 * setStatus(Status.REDIRECTION_SEE_OTHER); // go to same URL as 168 * this one Reference thisUrl = this.getReference(); 169 * this.getResponse().setLocationRef(thisUrl); 170 */ 338 171 // return new annotation 339 172 jo = createAnnotatorJson(storedAnnot); 340 173 JsonRepresentation retRep = new JsonRepresentation(jo); 341 174 return retRep; 342 } catch (TripleStoreHandlerException e) {343 e.printStackTrace();344 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreHandler Error");345 } catch (TripleStoreSearchError e) {346 e.printStackTrace();347 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreSearch Error");348 175 } catch (JSONException e) { 349 176 e.printStackTrace(); … … 376 203 if (!authenticated) { 377 204 setStatus(Status.CLIENT_ERROR_FORBIDDEN, "Not Authorized!"); 378 return null; 379 } 380 381 RDFSearcher searcher = new RDFSearcher(NS.MPIWG_ANNOT_CTX); // TODO should ge into config file 382 383 try { 384 // delete annotation 385 searcher.deleteById(id); 386 setStatus(Status.SUCCESS_NO_CONTENT); 387 } catch (TripleStoreHandlerException e) { 388 e.printStackTrace(); 389 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreHandler Error"); 390 } catch (TripleStoreSearchError e) { 391 e.printStackTrace(); 392 setStatus(Status.SERVER_ERROR_INTERNAL, "TripleStoreSearch Error"); 393 } 205 return null; 206 } 207 208 // delete annotation 209 getAnnotationStore().deleteById(id); 210 setStatus(Status.SUCCESS_NO_CONTENT); 394 211 return null; 395 212 } 396 397 213 398 214 } -
src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java
r3 r4 14 14 import java.util.regex.Pattern; 15 15 16 import javax.servlet.ServletContext; 17 16 18 import net.oauth.jsontoken.Checker; 17 19 import net.oauth.jsontoken.JsonToken; … … 26 28 import org.json.JSONException; 27 29 import org.json.JSONObject; 28 import org.restlet.data.ClientInfo;29 30 import org.restlet.data.Form; 30 31 import org.restlet.data.Status; … … 32 33 import org.restlet.resource.Options; 33 34 import org.restlet.resource.ServerResource; 34 import org.restlet.security.User; 35 36 import de.mpiwg.itgroup.annotationManager.Constants.NS; 37 import de.mpiwg.itgroup.annotationManager.RDFHandling.Annotation; 35 36 import de.mpiwg.itgroup.annotations.Annotation; 37 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes; 38 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; 39 import de.mpiwg.itgroup.annotations.old.NS; 38 40 39 41 /** … … 45 47 public abstract class AnnotatorResourceImpl extends ServerResource { 46 48 47 protected Logger logger = Logger.getRootLogger(); 49 protected static Logger logger = Logger.getLogger(AnnotatorResourceImpl.class); 50 51 private AnnotationStore store; 48 52 49 53 protected String getAllowedMethodsForHeader() { 50 54 return "OPTIONS,GET,POST"; 55 } 56 57 protected AnnotationStore getAnnotationStore() { 58 if (store == null) { 59 ServletContext sc = (ServletContext) getContext().getServerDispatcher().getContext().getAttributes() 60 .get("org.restlet.ext.servlet.ServletContext"); 61 logger.debug("Getting AnnotationStore from Context"); 62 store = (AnnotationStore) sc.getAttribute(RestServer.ANNSTORE_KEY); 63 } 64 return store; 51 65 } 52 66 … … 115 129 116 130 /** 117 * checks Annotator Auth plugin authentication information from headers. returns userId if successful. 131 * checks Annotator Auth plugin authentication information from headers. 132 * returns userId if successful. 118 133 * 119 134 * @param entity … … 166 181 JSONObject jo = new JSONObject(); 167 182 try { 168 jo.put("text", annot. text);169 jo.put("uri", annot. url);183 jo.put("text", annot.getBodyText()); 184 jo.put("uri", annot.getTargetBaseUri()); 170 185 171 186 if (makeUserObject) { … … 173 188 JSONObject userObject = new JSONObject(); 174 189 // save creator as uri 175 userObject.put("uri", annot. creator);190 userObject.put("uri", annot.getCreatorUri()); 176 191 // make short user id 177 String userI D = annot.creator;178 if (userI D.startsWith(NS.MPIWG_PERSONS_URL)) {179 userI D = userID.replace(NS.MPIWG_PERSONS_URL, ""); // entferne192 String userId = annot.getCreatorUri(); 193 if (userId != null && userId.startsWith(NS.MPIWG_PERSONS_URL)) { 194 userId = userId.replace(NS.MPIWG_PERSONS_URL, ""); // entferne 180 195 // NAMESPACE 181 196 } 182 197 // save as id 183 userObject.put("id", userI D);198 userObject.put("id", userId); 184 199 // get full name 185 200 RestServer restServer = (RestServer) getApplication(); 186 String userName = restServer.getUserNameFromLdap(userI D);201 String userName = restServer.getUserNameFromLdap(userId); 187 202 userObject.put("name", userName); 188 203 // save user object … … 190 205 } else { 191 206 // save user as string 192 jo.put("user", annot.creator); 193 } 194 195 List<String> xpointers = new ArrayList<String>(); 196 if (annot.xpointers == null || annot.xpointers.size() == 0) 197 xpointers.add(annot.xpointer); 198 else { 199 for (String xpointerString : annot.xpointers) { 200 xpointers.add(xpointerString); 201 } 202 } 203 if (!xpointers.isEmpty()) { 207 jo.put("user", annot.getCreatorUri()); 208 } 209 210 if (annot.getTargetFragment() != null) { 204 211 // we only look at the first xpointer 205 String xt = getXpointerType(xpointers.get(0)); 206 if (xt == "range") { 207 jo.put("ranges", transformToRanges(xpointers)); 208 } else if (xt == "area") { 209 jo.put("areas", transformToAreas(xpointers)); 212 List<String> fragments = new ArrayList<String>(); 213 fragments.add(annot.getTargetFragment()); 214 FragmentTypes xt = annot.getFragmentType(); 215 if (xt == FragmentTypes.XPOINTER) { 216 jo.put("ranges", transformToRanges(fragments)); 217 } else if (xt == FragmentTypes.AREA) { 218 jo.put("areas", transformToAreas(fragments)); 210 219 } 211 220 } 212 221 // encode Annotation URL (=id) in base64 213 String annotUrl = annot.get AnnotationUri();222 String annotUrl = annot.getUri(); 214 223 String annotId = encodeJsonId(annotUrl); 215 224 jo.put("id", annotId); … … 222 231 } 223 232 224 private String getXpointerType(String xpointer) {225 if (xpointer.contains("#xpointer")) {226 return "range";227 } else if (xpointer.contains("#xywh")) {228 return "area";229 }230 return null;231 }232 233 233 private JSONArray transformToRanges(List<String> xpointers) { 234 234 … … 236 236 237 237 Pattern rg = Pattern 238 .compile(" #xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)");239 Pattern rg1 = Pattern.compile(" #xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)");238 .compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)"); 239 Pattern rg1 = Pattern.compile("xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)"); 240 240 241 241 try { … … 278 278 JSONArray ja = new JSONArray(); 279 279 280 Pattern rg = Pattern.compile(" #xywh=(\\w*:)([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)");280 Pattern rg = Pattern.compile("xywh=(\\w*:)([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)"); 281 281 282 282 try { … … 308 308 } 309 309 310 protected String parseArea(JSONObject area) throws JSONException, UnsupportedEncodingException { 311 String x = area.getString("x"); 312 String y = area.getString("y"); 313 String width = "0"; 314 String height = "0"; 315 if (area.has("width")) { 316 width = area.getString("width"); 317 height = area.getString("height"); 318 } 319 String fragment = URLEncoder.encode(String.format("xywh=fraction:%s,%s,%s,%s", x, y, width, height), "utf-8"); 320 return fragment; 321 } 322 323 protected String parseRange(JSONObject range) throws JSONException, UnsupportedEncodingException { 324 String start = range.getString("start"); 325 String end = range.getString("end"); 326 String startOffset = range.getString("startOffset"); 327 String endOffset = range.getString("endOffset"); 328 329 String fragment = URLEncoder.encode(String.format( 330 "xpointer(start-point(string-range(\"%s\",%s,1))/range-to(end-point(string-range(\"%s\",%s,1))))", start, 331 startOffset, end, endOffset), "utf-8"); 332 return fragment; 333 } 334 310 335 /** 311 336 * creates an Annotation object with data from JSON. 312 337 * 313 * uses the specification from the annotator project: {@link https ://github.com/okfn/annotator/wiki/Annotation-format} 314 * 315 * The username will be transformed to an URI if not given already as URI, if not it will set to the MPIWG namespace defined in 338 * uses the specification from the annotator project: {@link https 339 * ://github.com/okfn/annotator/wiki/Annotation-format} 340 * 341 * The username will be transformed to an URI if not given already as URI, 342 * if not it will set to the MPIWG namespace defined in 316 343 * de.mpiwg.itgroup.annotationManager.Constants.NS 317 344 * … … 319 346 * @return 320 347 * @throws JSONException 321 */ 322 public Annotation createAnnotation(JSONObject jo, Representation entity) throws JSONException { 348 * @throws UnsupportedEncodingException 349 */ 350 public Annotation createAnnotation(JSONObject jo, Representation entity) throws JSONException, UnsupportedEncodingException { 323 351 return updateAnnotation(new Annotation(), jo, entity); 324 352 } 325 353 326 public Annotation updateAnnotation(Annotation annot, JSONObject jo, Representation entity) throws JSONException { 354 public Annotation updateAnnotation(Annotation annot, JSONObject jo, Representation entity) throws JSONException, 355 UnsupportedEncodingException { 327 356 // annotated uri 328 String url = annot.url;329 357 if (jo.has("uri")) { 330 url = jo.getString("uri");358 annot.setTargetBaseUri(jo.getString("uri")); 331 359 } 332 360 // annotation text 333 String text = annot.text;334 361 if (jo.has("text")) { 335 text = jo.getString("text");362 annot.setBodyText(jo.getString("text")); 336 363 } 337 364 // check authentication 338 365 String authUser = checkAuthToken(entity); 339 366 if (authUser == null) { 340 // try http auth 341 User httpUser = getHttpAuthUser(entity); 342 if (httpUser == null) { 343 setStatus(Status.CLIENT_ERROR_FORBIDDEN); 344 return null; 345 } 346 authUser = httpUser.getIdentifier(); 367 /* 368 * // try http auth User httpUser = getHttpAuthUser(entity); if 369 * (httpUser == null) { 370 */ 371 setStatus(Status.CLIENT_ERROR_FORBIDDEN); 372 return null; 373 /* 374 * } authUser = httpUser.getIdentifier(); 375 */ 347 376 } 348 377 // username not required, if no username given authuser will be used 349 378 String username = null; 350 String userUri = annot. creator;379 String userUri = annot.getCreatorUri(); 351 380 if (jo.has("user")) { 352 381 if (jo.get("user") instanceof String) { … … 381 410 382 411 // create xpointer from the first range/area 383 String xpointer = annot.xpointer;384 412 if (jo.has("ranges")) { 385 413 JSONObject ranges = jo.getJSONArray("ranges").getJSONObject(0); 386 String start = ranges.getString("start"); 387 String end = ranges.getString("end"); 388 String startOffset = ranges.getString("startOffset"); 389 String endOffset = ranges.getString("endOffset"); 390 391 try { 392 xpointer = url 393 + "#" 394 + URLEncoder.encode(String.format( 395 "xpointer(start-point(string-range(\"%s\",%s,1))/range-to(end-point(string-range(\"%s\",%s,1))))", 396 start, startOffset, end, endOffset), "utf-8"); 397 } catch (UnsupportedEncodingException e) { 398 e.printStackTrace(); 399 setStatus(Status.SERVER_ERROR_INTERNAL); 400 return null; 401 } 414 annot.setFragmentType(FragmentTypes.XPOINTER); 415 String fragment = parseRange(ranges); 416 annot.setTargetFragment(fragment); 402 417 } 403 418 if (jo.has("areas")) { 404 419 JSONObject area = jo.getJSONArray("areas").getJSONObject(0); 405 String x = area.getString("x"); 406 String y = area.getString("y"); 407 String width = "0"; 408 String height = "0"; 409 if (area.has("width")) { 410 width = area.getString("width"); 411 height = area.getString("height"); 412 } 413 try { 414 xpointer = url + "#" + URLEncoder.encode(String.format("xywh=fraction:%s,%s,%s,%s", x, y, width, height), "utf-8"); 415 } catch (UnsupportedEncodingException e) { 416 e.printStackTrace(); 417 setStatus(Status.SERVER_ERROR_INTERNAL); 418 return null; 419 } 420 } 421 return new Annotation(xpointer, userUri, annot.time, text, annot.type); 422 } 423 424 /** 425 * returns the logged in User. 426 * 427 * @param entity 428 * @return 429 */ 430 protected User getHttpAuthUser(Representation entity) { 431 RestServer restServer = (RestServer) getApplication(); 432 if (!restServer.authenticate(getRequest(), getResponse())) { 433 // Not authenticated 434 return null; 435 } 436 437 ClientInfo ci = getRequest().getClientInfo(); 438 logger.debug(ci); 439 return getRequest().getClientInfo().getUser(); 440 420 annot.setFragmentType(FragmentTypes.AREA); 421 String fragment = parseArea(area); 422 annot.setTargetFragment(fragment); 423 } 424 return annot; 441 425 } 442 426 -
src/main/java/de/mpiwg/itgroup/annotations/restlet/RestServer.java
r3 r4 28 28 import org.restlet.Restlet; 29 29 import org.restlet.routing.Router; 30 import org.restlet.security.ChallengeAuthenticator; 31 32 import scala.sys.process.ProcessBuilderImpl.Dummy; 30 31 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; 33 32 34 33 public class RestServer extends Application { 35 34 36 public static Logger logger = Logger.getRootLogger(); 37 38 private ChallengeAuthenticator authenticator; 35 public static Logger logger = Logger.getLogger(RestServer.class); 39 36 40 37 /** … … 47 44 public static final String GRAPHDB_KEY = "annotationmanager.graphdb"; 48 45 public String DB_PATH = "WEB-INF/neo4j-annotation-db"; 46 47 private WrappingNeoServerBootstrapper srv; 48 public static final String GRAPHDBSRV_KEY = "annotationmanager.graphdb.srv"; 49 50 private AnnotationStore store; 51 public static final String ANNSTORE_KEY = "annotationmanager.store"; 49 52 50 53 /** … … 71 74 logger.debug("opening DB " + dbFn); 72 75 graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(dbFn); 76 registerShutdownHook(graphDb); 73 77 // store in context 74 78 sc.setAttribute(GRAPHDB_KEY, graphDb); 75 WrappingNeoServerBootstrapper srv = new WrappingNeoServerBootstrapper((AbstractGraphDatabase) graphDb); 79 // AnnotationStore 80 store = new AnnotationStore(graphDb); 81 sc.setAttribute(ANNSTORE_KEY, store); 82 // admin server 83 srv = new WrappingNeoServerBootstrapper((AbstractGraphDatabase) graphDb); 76 84 logger.debug("Starting DB admin server..."); 85 // store in context 86 sc.setAttribute(GRAPHDBSRV_KEY, srv); 77 87 srv.start(); 78 88 } else { … … 127 137 router.attach("/annotator/annotations", AnnotatorAnnotations.class); 128 138 router.attach("/annotator/annotations/{id}", AnnotatorAnnotations.class); 129 //router.attach("/annotator/search", AnnotatorSearch.class);139 router.attach("/annotator/search", AnnotatorSearch.class); 130 140 131 141 // router.attach("",redirector); router.attach("/annotator", … … 241 251 } 242 252 253 /* (non-Javadoc) 254 * @see org.restlet.Application#stop() 255 */ 256 @Override 257 public synchronized void stop() throws Exception { 258 /* 259 * trying to clean up databases, nur sure if this is the right way... 260 */ 261 if (srv != null) { 262 logger.debug("Stopping DB admin server..."); 263 srv.stop(); 264 srv = null; 265 } 266 if (graphDb != null) { 267 logger.debug("Stopping DB..."); 268 graphDb.shutdown(); 269 graphDb = null; 270 } 271 super.stop(); 272 } 273 274 private static void registerShutdownHook(final GraphDatabaseService graphDb) { 275 // Registers a shutdown hook for the Neo4j instance so that it 276 // shuts down nicely when the VM exits (even if you "Ctrl-C" the 277 // running example before it's completed) 278 Runtime.getRuntime().addShutdownHook(new Thread() { 279 @Override 280 public void run() { 281 graphDb.shutdown(); 282 } 283 }); 284 } 285 286 243 287 }
Note: See TracChangeset
for help on using the changeset viewer.