Mercurial > hg > AnnotationManagerN4J
changeset 50:64aa756c60cc
annotations ui can show and delete annotations now.
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; /**