changeset 50:64aa756c60cc

annotations ui can show and delete annotations now.
author casties
date Thu, 27 Sep 2012 17:12:08 +0200
parents f30f42080711
children d99b915c6ed0
files src/main/java/de/mpiwg/itgroup/annotations/Annotation.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResources.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorTags.java src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationResource.java src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsResource.java src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsUiRestlet.java src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/GroupMembersResource.java src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/PersonsResource.java
diffstat 11 files changed, 279 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/de/mpiwg/itgroup/annotations/Annotation.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/Annotation.java	Thu Sep 27 17:12:08 2012 +0200
@@ -3,8 +3,11 @@
  */
 package de.mpiwg.itgroup.annotations;
 
+import java.io.UnsupportedEncodingException;
 import java.util.Set;
 
+import org.apache.commons.codec.binary.Base64;
+
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 
 /**
@@ -160,6 +163,29 @@
     }
 
     /**
+     * Returns an URL-compatible id.
+     * Currently the uri as base64 encoded string.
+     * @return
+     */
+    public String getUrlId() {
+        if (uri == null) return null;
+        try {
+            return Base64.encodeBase64URLSafeString(uri.getBytes("UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+            return null;
+        }
+    }
+
+    public static String decodeId(String id) {
+        if (id == null) return null;
+        try {
+            return new String(Base64.decodeBase64(id), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            return null;
+        }
+    }
+
+    /**
      * @return the bodyText
      */
     public String getBodyText() {
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java	Thu Sep 27 17:12:08 2012 +0200
@@ -6,19 +6,15 @@
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.neo4j.graphdb.Node;
 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;
 import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
 
 import de.mpiwg.itgroup.annotations.Annotation;
-import de.mpiwg.itgroup.annotations.NS;
 import de.mpiwg.itgroup.annotations.Person;
-import de.mpiwg.itgroup.annotations.Tag;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 import de.mpiwg.itgroup.annotations.restlet.utils.JSONObjectComparator;
 
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java	Thu Sep 27 17:12:08 2012 +0200
@@ -6,19 +6,16 @@
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.neo4j.graphdb.Node;
 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;
 import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
 
 import de.mpiwg.itgroup.annotations.Annotation;
 import de.mpiwg.itgroup.annotations.NS;
 import de.mpiwg.itgroup.annotations.Person;
-import de.mpiwg.itgroup.annotations.Tag;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 import de.mpiwg.itgroup.annotations.restlet.utils.JSONObjectComparator;
 
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResources.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResources.java	Thu Sep 27 17:12:08 2012 +0200
@@ -9,19 +9,13 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.neo4j.graphdb.Node;
-import org.restlet.data.Form;
 import org.restlet.data.Status;
 import org.restlet.ext.json.JsonRepresentation;
 import org.restlet.representation.Representation;
 import org.restlet.resource.Get;
 
-import de.mpiwg.itgroup.annotations.Actor;
-import de.mpiwg.itgroup.annotations.Group;
-import de.mpiwg.itgroup.annotations.NS;
 import de.mpiwg.itgroup.annotations.Resource;
-import de.mpiwg.itgroup.annotations.Tag;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
-import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore.NodeTypes;
 
 
 /**
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorTags.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorTags.java	Thu Sep 27 17:12:08 2012 +0200
@@ -9,18 +9,14 @@
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.neo4j.graphdb.Node;
-import org.restlet.data.Form;
 import org.restlet.data.Status;
 import org.restlet.ext.json.JsonRepresentation;
 import org.restlet.representation.Representation;
 import org.restlet.resource.Get;
 
-import de.mpiwg.itgroup.annotations.Actor;
-import de.mpiwg.itgroup.annotations.Group;
 import de.mpiwg.itgroup.annotations.NS;
 import de.mpiwg.itgroup.annotations.Tag;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
-import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore.NodeTypes;
 
 
 /**
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	Thu Sep 27 17:12:08 2012 +0200
@@ -57,6 +57,9 @@
     protected String ldapServerUrl;
     public static final String LDAP_SERVER_KEY = "annotationmanager.ldapserver.url";
 
+    public static final String ADMIN_USER_KEY = "annotationmanager.admin.user";
+    public static final String ADMIN_PASSWORD_KEY = "annotationmanager.admin.password";
+
     /**
      * constructor
      * 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationResource.java	Thu Sep 27 17:12:08 2012 +0200
@@ -0,0 +1,172 @@
+/**
+ * 
+ */
+package de.mpiwg.itgroup.annotations.restlet.annotations_ui;
+
+import org.apache.log4j.Logger;
+import org.restlet.data.Form;
+import org.restlet.data.MediaType;
+import org.restlet.data.Reference;
+import org.restlet.data.Status;
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.Delete;
+import org.restlet.resource.Get;
+import org.restlet.resource.Put;
+import org.restlet.resource.ResourceException;
+import org.restlet.resource.ServerResource;
+
+import de.mpiwg.itgroup.annotations.Annotation;
+import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
+import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
+
+/**
+ * Resource class for a single annotation.
+ * 
+ * @author casties
+ * 
+ */
+public class AnnotationResource extends ServerResource {
+
+    public static Logger logger = Logger.getLogger(AnnotationResource.class);
+
+    protected AnnotationStore store;
+
+    protected String requestId;
+
+    protected Annotation annotation;
+
+    @Override
+    protected void doInit() throws ResourceException {
+        super.doInit();
+        // id from URI /annotations/persons/{id}
+        requestId = (String) getRequest().getAttributes().get("id");
+        logger.debug("annoation-id=" + requestId);
+        // get store instance
+        if (store == null) {
+            store = ((BaseRestlet) getApplication()).getAnnotationStore();
+        }
+        // get annotation from store
+        if (requestId != null) {
+            // the ID in the path is encoded
+            String id = Annotation.decodeId(requestId);
+            annotation = store.getAnnotationById(id);
+        }
+    }
+
+    /**
+     * GET with HTML content type. Shows the person.
+     * 
+     * @param entity
+     * @return
+     */
+    @Get("html")
+    public Representation doGetHTML(Representation entity) {
+        if (annotation == null) {
+            // invalid id
+            setStatus(Status.CLIENT_ERROR_NOT_FOUND);
+            return null;
+        }
+        String result = null;
+        // get form parameter
+        Form f = this.getQuery();
+        String form = f.getFirstValue("form");
+        if (form != null && form.equals("edit")) {
+            /*
+            // output edit form
+            result = "<html><body>\n";
+            result += String.format("<h1>Edit person %s</h1>\n", annotation.getId());
+            result += String.format("<p><a href=\"%s\">All persons</a></p>", this.getReference().getParentRef());
+            // tunnel PUT method through POST
+            result += String.format("<form method=\"post\" action=\"%s?method=PUT\">\n", this.getReference().getHierarchicalPart());
+            result += "<table>";
+            result += String.format("<tr><td><b>name</b></td><td><input type=\"text\" name=\"name\" value=\"%s\"/></td></tr>\n",
+                    annotation.getName());
+            result += String.format("<tr><td><b>uri</b></td><td><input type=\"text\" name=\"uri\" value=\"%s\"/></td></tr>\n",
+                    annotation.getUriString());
+            result += "</table>\n";
+            result += "<p><input type=\"submit\"/></p>";
+            result += "</table>\n</form>\n</body>\n</html>";
+            */
+        } else {
+            // output person content
+            result = "<html><body>\n<h1>Annotation</h1>\n";
+            result += String.format("<p><a href=\"%s\">All annotations</a></p>", this.getReference().getParentRef());
+            result += "<table>";
+            result += String.format("<tr><td><b>uri</b></td><td>%s</td></tr>\n", annotation.getUri());
+            result += String.format("<tr><td><b>text</b></td><td>%s</td></tr>\n", annotation.getBodyText());
+            result += String.format("<tr><td><b>target</b></td><td>%s</td></tr>\n", annotation.getTargetBaseUri());
+            result += String.format("<tr><td><b>fragment</b></td><td>%s</td></tr>\n", annotation.getTargetFragment());
+            result += String.format("<tr><td><b>creator</b></td><td>%s</td></tr>\n", annotation.getCreatorName());
+            result += "</table>\n";
+            //result += "<p><a href=\"?form=edit\">Edit annotation</a></p>\n";
+            // tunnel POST as DELETE
+            result += String.format(
+                    "<form method=\"post\" action=\"%s?method=DELETE\"><input type=\"submit\" value=\"Delete annotation\"/></form>\n",
+                    this.getReference().getHierarchicalPart());
+            result += "</body>\n</html>";
+        }
+        return new StringRepresentation(result, MediaType.TEXT_HTML);
+    }
+
+    /**
+     * PUT updates the annotation.
+     * 
+     * @param entity
+     * @return
+     */
+    @Put
+    public Representation doPut(Representation entity) {
+        logger.debug("AnnotationResource.doPut!");
+        if (annotation == null) {
+            // invalid id
+            setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
+            return null;
+        }
+        // NOT YET
+        return null;
+        /*
+        // TODO: do authentication
+        Form form = new Form(entity);
+        String name = form.getFirstValue("name");
+        String uri = form.getFirstValue("uri");
+        if (name != null && !name.isEmpty()) {
+            annotation.setName(name);
+        }
+        if (uri != null && !uri.isEmpty()) {
+            annotation.setUri(uri);
+        }
+        store.storeActor(annotation);
+        // return 303: see other
+        setStatus(Status.REDIRECTION_SEE_OTHER);
+        // go GET same URL
+        Reference url = this.getReference();
+        this.getResponse().setLocationRef(url);
+        return null;
+        */
+    }
+
+    /**
+     * DELETE deletes the annotation.
+     * 
+     * @param entity
+     * @return
+     */
+    @Delete
+    public Representation doDelete(Representation entity) {
+        logger.debug("AnnotationResource.doDelete!");
+        if (annotation == null) {
+            // invalid id
+            setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
+            return null;
+        }
+        // TODO: do authentication
+        store.deleteAnnotationById(annotation.getUri());
+        // return 303: see other
+        setStatus(Status.REDIRECTION_SEE_OTHER);
+        // go GET parent URL
+        Reference url = this.getReference().getParentRef();
+        this.getResponse().setLocationRef(url);
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsResource.java	Thu Sep 27 17:12:08 2012 +0200
@@ -0,0 +1,67 @@
+/**
+ * 
+ */
+package de.mpiwg.itgroup.annotations.restlet.annotations_ui;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.restlet.data.MediaType;
+import org.restlet.data.Reference;
+import org.restlet.representation.Representation;
+import org.restlet.representation.StringRepresentation;
+import org.restlet.resource.Get;
+import org.restlet.resource.ResourceException;
+import org.restlet.resource.ServerResource;
+
+import de.mpiwg.itgroup.annotations.Annotation;
+import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
+import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
+
+/**
+ * Resource class for the list of annotations.
+ * 
+ * @author casties
+ * 
+ */
+public class AnnotationsResource extends ServerResource {
+
+    public static Logger logger = Logger.getLogger(AnnotationsResource.class);
+
+    private AnnotationStore store;
+
+    @Override
+    protected void doInit() throws ResourceException {
+        super.doInit();
+        // get store instance
+        if (store == null) {
+            store = ((BaseRestlet) getApplication()).getAnnotationStore();
+        }
+    }
+
+    /**
+     * GET with HTML content type. Lists all annotations.
+     * 
+     * @param entity
+     * @return
+     */
+    @Get("html")
+    public Representation doGetHTML(Representation entity) {
+        String result = null;
+        // list all annotations
+        result = "<html><body>\n<h1>Annotations</h1>\n<table>";
+        result += "<tr><th>uri</th><th>text</th><th>target</th><th>fragment</th><th>creator</th></tr>";
+        List<Annotation> annotations = store.getAnnotations("id", "*");
+        for (Annotation annotation : annotations) {
+            Reference url = this.getReference().clone();
+            url.addSegment(annotation.getUrlId());
+            result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", url,
+                    annotation.getUri(), annotation.getBodyText(), annotation.getTargetBaseUri(), annotation.getTargetFragment(),
+                    annotation.getCreatorName());
+        }
+        result += "</table>\n";
+        result += "</body>\n</html>";
+        return new StringRepresentation(result, MediaType.TEXT_HTML);
+    }
+
+}
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsUiRestlet.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsUiRestlet.java	Thu Sep 27 17:12:08 2012 +0200
@@ -19,13 +19,13 @@
  */
 public class AnnotationsUiRestlet extends BaseRestlet {
 
-    public final String version = "AnnotationManagerN4J/AnnotationsUI 0.2";
+    public final String version = "AnnotationManagerN4J/AnnotationsUI 0.3";
 
     public static Logger logger = Logger.getLogger(AnnotationsUiRestlet.class);
 
     public AnnotationsUiRestlet(Context context) {
         super(context);
-        logger.debug("StoreRestlet!");
+        logger.info(version);
     }
 
     /*
@@ -48,12 +48,19 @@
         router.attach("/persons/", PersonsResource.class);
         router.attach("/persons/{id}", PersonResource.class);
         router.attach("/persons/{id}/", PersonResource.class);
+        router.attach("/annotations", AnnotationsResource.class);
+        router.attach("/annotations/", AnnotationsResource.class);
+        router.attach("/annotations/{id}", AnnotationResource.class);
+        router.attach("/annotations/{id}/", AnnotationResource.class);
 
         router.attach("/", InfoResource.class);
 
-        // Create a simple password verifier
+        // use simple password verifier
         MapVerifier verifier = new MapVerifier();
-        verifier.getLocalSecrets().put("scott", "tiger".toCharArray());
+        // get user name and password
+        String user = serverConfig.getProperty(BaseRestlet.ADMIN_USER_KEY);
+        String pw = serverConfig.getProperty(BaseRestlet.ADMIN_PASSWORD_KEY);
+        verifier.getLocalSecrets().put(user, pw.toCharArray());
         // Create a Guard
         ChallengeAuthenticator guard = new ChallengeAuthenticator(getContext(), ChallengeScheme.HTTP_BASIC, "Tutorial");
         guard.setVerifier(verifier);
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/GroupMembersResource.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/GroupMembersResource.java	Thu Sep 27 17:12:08 2012 +0200
@@ -14,9 +14,7 @@
 import org.restlet.resource.Get;
 import org.restlet.resource.Post;
 
-import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Person;
-import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore.NodeTypes;
 
 /**
  * Resource class for the members of an annotation group.
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/PersonsResource.java	Thu Sep 27 12:39:15 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/PersonsResource.java	Thu Sep 27 17:12:08 2012 +0200
@@ -20,7 +20,6 @@
 import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Person;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
-import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore.NodeTypes;
 import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
 
 /**