Changeset 34:8427930c5f88 in AnnotationManagerN4J
- Timestamp:
- Sep 25, 2012, 8:20:17 PM (13 years ago)
- Branch:
- default
- Parents:
- 33:86bb29132ba6 (diff), 31:9f653697437e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/main
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java
r31 r34 5 5 6 6 import java.util.ArrayList; 7 import java.util.Arrays; 7 8 import java.util.Calendar; 8 9 import java.util.HashSet; … … 28 29 29 30 /** 31 * Neo4J based Annotation store. 32 * 30 33 * @author casties 31 34 * … … 40 43 ANNOTATION, PERSON, TARGET, GROUP, TAG 41 44 } 45 46 // types of nodes that should not be automatically deleted. 47 public Set<String> permanentNodeTypes = new HashSet<String>(Arrays.asList("PERSON", "GROUP", "TAG")); 42 48 43 49 protected List<Index<Node>> nodeIndexes; … … 85 91 } 86 92 87 88 89 93 public List<Actor> getActors(String key, String query, NodeTypes type) { 90 94 ArrayList<Actor> actors = new ArrayList<Actor>(); … … 124 128 return groups; 125 129 } 126 127 130 128 131 /** 129 132 * Returns List of Annotations. … … 174 177 } 175 178 176 177 /** 179 /** 178 180 * Returns List of Groups the person is member of. 179 181 * … … 240 242 return members; 241 243 } 242 244 243 245 /** 244 246 * Add Person newMember to Group group. … … 257 259 return addedMember; 258 260 } 259 261 260 262 /** 261 263 * Delete Person oldMember from Group group. … … 266 268 public void deleteGroupMember(Group group, Person member) { 267 269 Node gn = getActorNode(group); 270 Node pn = getActorNode(member); 268 271 Iterable<Relationship> rels = gn.getRelationships(RelationTypes.MEMBER_OF); 269 272 for (Relationship rel : rels) { 270 273 Node mn = rel.getStartNode(); 271 if (mn.equals(member)) { 272 rel.delete(); 274 if (mn.equals(pn)) { 275 Transaction tx = graphDb.beginTx(); 276 try { 277 rel.delete(); 278 tx.success(); 279 } finally { 280 tx.finish(); 281 } 273 282 // there should be only one 274 283 break; 275 284 } 276 } 277 } 278 285 } 286 } 287 279 288 /** 280 289 * Returns the stored Actor matching the given one. … … 284 293 */ 285 294 public Actor getActor(Actor actor) { 286 Node actorNode = getActorNode(actor); 287 Actor storedActor = createActorFromNode(actorNode); 288 return storedActor; 289 } 290 291 /** 292 * Stores an Actor (Person or Group). Creates a new actor Node or returns an existing one. 295 Node actorNode = getActorNode(actor); 296 Actor storedActor = createActorFromNode(actorNode); 297 return storedActor; 298 } 299 300 /** 301 * Stores an Actor (Person or Group). Creates a new actor Node or update an 302 * existing one. 293 303 * 294 304 * @param actor … … 296 306 */ 297 307 public Actor storeActor(Actor actor) { 298 Node actorNode = getOrCreateActorNode(actor); 299 Actor storedActor = createActorFromNode(actorNode); 300 return storedActor; 301 } 302 308 Node actorNode = getOrCreateActorNode(actor); 309 Transaction tx = graphDb.beginTx(); 310 try { 311 // id 312 String id = actor.getId(); 313 if (id != null) { 314 actorNode.setProperty("id", id); 315 } 316 // name 317 String name = actor.getName(); 318 if (name != null) { 319 actorNode.setProperty("name", name); 320 } 321 // uri 322 String uri = actor.getUri(); 323 if (uri != null) { 324 actorNode.setProperty("uri", uri); 325 } 326 tx.success(); 327 } finally { 328 tx.finish(); 329 } 330 Actor storedActor = createActorFromNode(actorNode); 331 return storedActor; 332 } 333 334 /** 335 * Deletes the given Actor. 336 * 337 * @param actor 338 */ 339 public void deleteActor(Actor actor) { 340 String uri = actor.getUriString(); 341 Index<Node> idx; 342 if (actor.isGroup()) { 343 idx = getNodeIndex(NodeTypes.GROUP); 344 } else { 345 idx = getNodeIndex(NodeTypes.PERSON); 346 } 347 Node actorNode = idx.get("uri", uri).getSingle(); 348 if (actorNode != null) { 349 // delete relations 350 Transaction tx = graphDb.beginTx(); 351 try { 352 for (Relationship rel : actorNode.getRelationships()) { 353 rel.delete(); 354 } 355 if (!actorNode.hasRelationship()) { 356 // this shouldn't happen 357 deleteNode(actorNode); 358 } else { 359 logger.error("deleteActor: unable to delete: Node still has relations."); 360 } 361 tx.success(); 362 } finally { 363 tx.finish(); 364 } 365 } 366 } 367 303 368 /** 304 369 * Returns the Annotation with the given id. … … 403 468 */ 404 469 protected Actor createActorFromNode(Node actorNode) { 470 if (actorNode == null) return null; 405 471 String id = (String) actorNode.getProperty("id", null); 406 472 String uri = (String) actorNode.getProperty("uri", null); … … 414 480 return null; 415 481 } 416 482 417 483 public Tag createTagFromNode(Node tagNode) { 418 String name = (String) tagNode.getProperty("name", null);419 String uri = (String) tagNode.getProperty("uri", null);420 String id = (String) tagNode.getProperty("id", null);421 422 return new Tag(id, uri, name); 423 424 } 425 484 if (tagNode == null) return null; 485 String name = (String) tagNode.getProperty("name", null); 486 String uri = (String) tagNode.getProperty("uri", null); 487 String id = (String) tagNode.getProperty("id", null); 488 489 return new Tag(id, uri, name); 490 491 } 426 492 427 493 /** … … 539 605 for (String tag : newTags) { 540 606 // create new tag 541 Node tagNode = getOrCreateTagNode(new Tag(null, null,tag));607 Node tagNode = getOrCreateTagNode(new Tag(null, null, tag)); 542 608 getOrCreateRelation(annotNode, RelationTypes.HAS_TAG, tagNode); 543 609 } … … 561 627 * @param id 562 628 */ 563 public void delete ById(String id) {629 public void deleteAnnotationById(String id) { 564 630 Node annotNode = getNodeIndex(NodeTypes.ANNOTATION).get("id", id).getSingle(); 565 631 if (annotNode != null) { … … 569 635 for (Relationship rel : annotNode.getRelationships()) { 570 636 // delete relation and the related node if it has no other 571 // relations 637 // relations and is not permanent 572 638 Node other = rel.getOtherNode(annotNode); 573 639 rel.delete(); 574 if (! other.hasRelationship()) {640 if (!(other.hasRelationship() || permanentNodeTypes.contains(other.getProperty("TYPE", null)))) { 575 641 deleteNode(other); 576 642 } … … 597 663 * @return 598 664 */ 599 public List<Annotation> search ByUriUser(String targetUri, String userUri, String limit, String offset) {665 public List<Annotation> searchAnnotationByUriUser(String targetUri, String userUri, String limit, String offset) { 600 666 List<Annotation> annotations = new ArrayList<Annotation>(); 601 667 if (targetUri != null) { … … 720 786 return person; 721 787 } 722 788 723 789 protected Node getOrCreateActorNode(Actor actor) { 724 790 // Person/Group is identified by URI or id … … 773 839 tag.setProperty("name", tagname); 774 840 idx.add(tag, "name", tagname); 775 841 776 842 tag.setProperty("id", inTag.getId()); 777 843 tag.setProperty("uri", inTag.getUri()); 778 844 idx.add(tag, "uri", inTag.getUri()); 779 845 780 846 tx.success(); 781 847 } finally { … … 804 870 if (!oldActorNode.equals(newActorNode)) { 805 871 // new admin is different 806 rel.delete(); 872 Transaction tx = graphDb.beginTx(); 873 try { 874 rel.delete(); 875 tx.success(); 876 } finally { 877 tx.finish(); 878 } 807 879 if (newActorNode != null) { 808 880 rel = getOrCreateRelation(annotNode, type, newActorNode); … … 881 953 } 882 954 883 public List<Annotation> getAnnotationsByTag(String tagUri) { 884 885 ArrayList<Annotation> ret = new ArrayList<Annotation>(); 886 Node tag = getTagNodeByUri(tagUri); 887 888 889 Iterable<Relationship> rels = tag.getRelationships(Direction.INCOMING,RelationTypes.HAS_TAG); 890 891 for (Relationship rel:rels){ 892 Node node = rel.getStartNode(); 893 ret.add(createAnnotationFromNode(node)); 894 895 } 896 return ret; 897 } 955 public List<Annotation> getAnnotationsByTag(String tagUri) { 956 957 ArrayList<Annotation> ret = new ArrayList<Annotation>(); 958 Node tag = getTagNodeByUri(tagUri); 959 960 Iterable<Relationship> rels = tag.getRelationships(Direction.INCOMING, RelationTypes.HAS_TAG); 961 962 for (Relationship rel : rels) { 963 Node node = rel.getStartNode(); 964 ret.add(createAnnotationFromNode(node)); 965 966 } 967 return ret; 968 } 898 969 899 970 } -
src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java
r33 r34 107 107 108 108 /** 109 * Returns List of Groups. Key has to be indexed. 109 * Returns List of Groups. 110 * Key has to be indexed. 110 111 * 111 112 * @param key … … 129 130 130 131 /** 131 * Returns List of Tags. Key has to be indexed. 132 * Returns List of Annotations. 133 * Key has to be indexed. 134 * 135 * @param key 136 * @param query 137 * @return 138 */ 139 public List<Annotation> getAnnotations(String key, String query) { 140 ArrayList<Annotation> annotations = new ArrayList<Annotation>(); 141 Index<Node> idx = getNodeIndex(NodeTypes.ANNOTATION); 142 if (key == null) { 143 key = "id"; 144 query = "*"; 145 } 146 IndexHits<Node> annotNodes = idx.query(key, query); 147 for (Node annotNode : annotNodes) { 148 Annotation annotation = createAnnotationFromNode(annotNode); 149 annotations.add(annotation); 150 } 151 return annotations; 152 } 153 154 155 156 /** 157 * Returns List of Tags. 158 * Key has to be indexed. 132 159 * 133 160 * @param key -
src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java
r31 r34 276 276 277 277 // delete annotation 278 store.delete ById(id);278 store.deleteAnnotationById(id); 279 279 setStatus(Status.SUCCESS_NO_CONTENT); 280 280 return null; -
src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java
r32 r34 6 6 7 7 import java.io.IOException; 8 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import org.json.JSONArray; 9 12 import org.json.JSONException; 10 13 import org.json.JSONObject; 14 import org.restlet.data.Form; 15 import org.restlet.data.Parameter; 11 16 import org.restlet.data.Status; 12 17 import org.restlet.ext.json.JsonRepresentation; … … 19 24 import de.mpiwg.itgroup.annotations.Annotation; 20 25 import de.mpiwg.itgroup.annotations.Person; 26 import de.mpiwg.itgroup.annotations.Tag; 21 27 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore; 28 import de.mpiwg.itgroup.annotations.restlet.utils.JSONObjectComparator; 22 29 23 30 /** … … 50 57 51 58 if (id == null) { 52 // TODO: what to return without id - list all annotations? 53 setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 54 return null; 59 60 return getAllAnnotations(); 55 61 } 56 62 … … 77 83 } 78 84 79 /** 85 private Representation getAllAnnotations() { 86 87 Form form = getRequest().getResourceRef().getQueryAsForm(); 88 String sortBy=null; 89 for (Parameter parameter : form) { 90 if (parameter.getName().equals("sortBy")){ 91 sortBy = parameter.getValue(); 92 } 93 } 94 95 AnnotationStore store = getAnnotationStore(); 96 ArrayList<JSONObject> results = new ArrayList<JSONObject>(); 97 98 List<Annotation> annotations = store.getAnnotations(null, null); 99 for (Annotation annotation : annotations) { 100 101 JSONObject jo = createAnnotatorJson(annotation,false); 102 results.add(jo); 103 104 } 105 106 if (sortBy!=null){ 107 JSONObjectComparator.sortAnnotations(results,sortBy); 108 } 109 110 JSONArray resultsJa = new JSONArray(); 111 for (JSONObject result:results){ 112 resultsJa.put(result); 113 } 114 115 // assemble result object 116 JSONObject result = new JSONObject(); 117 try { 118 result.put("rows", resultsJa); 119 result.put("total", resultsJa.length()); 120 } catch (JSONException e) { 121 setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error"); 122 return null; 123 } 124 logger.debug("sending:"); 125 logger.debug(result); 126 return new JsonRepresentation(result); 127 } 128 129 130 131 132 133 /** 80 134 * POST with JSON content-type. Creates a new Annotation. 81 135 * -
src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsUiRestlet.java
r31 r34 17 17 public class AnnotationsUiRestlet extends BaseRestlet { 18 18 19 public final String version = "AnnotationManagerN4J/Annotation Store 0.1";19 public final String version = "AnnotationManagerN4J/AnnotationsUI 0.2"; 20 20 21 21 public static Logger logger = Logger.getLogger(AnnotationsUiRestlet.class); … … 42 42 router.attach("/groups/{id}/", GroupResource.class); 43 43 router.attach("/groups/{id}/members", GroupMembersResource.class); 44 44 router.attach("/persons", PersonsResource.class); 45 router.attach("/persons/", PersonsResource.class); 46 router.attach("/persons/{id}", PersonResource.class); 47 router.attach("/persons/{id}/", PersonResource.class); 48 45 49 router.attach("/", InfoResource.class); 46 50 // authenticator.setNext(router); -
src/main/webapp/index.html
r31 r34 11 11 12 12 <body> 13 <h1>Annotation Server</h1> 13 <h1>Annotation Server</h1> 14 <h2>View</h2> 15 <ul> 16 <li><a href="tags">View tags</a></li> 17 <li><a href="annotationBrowser">All Annotations</a></li> 18 </ul> 19 <h2>Admin</h2> 14 20 <ul> 15 <li><a href="groups">View and edit groups</a></li> 16 <li><a href="tags">Browse by Tags</a></li> 17 <li><a href="annotationBrowser">All Annotations</a></li> 18 21 <li><a href="annotations/groups">View and edit groups</a></li> 22 <li><a href="annotations/persons">View and edit persons</a></li> 19 23 </ul> 20 24 </body> -
src/main/webapp/index.html
r32 r34 11 11 12 12 <body> 13 14 13 <h1>Annotation Server</h1> 14 <h2>View</h2> 15 15 <ul> 16 16 <li><a href="tags">View tags</a></li> 17 <li><a href="annotationBrowser">All Annotations</a></li> 17 18 </ul> 18 19 <h2>Admin</h2>
Note: See TracChangeset
for help on using the changeset viewer.