# HG changeset patch # User casties # Date 1348758728 -7200 # Node ID 64aa756c60cc152e634d18da93accc03ef8db602 # Parent f30f4208071135a160fe23a810b3de1cd3e8885f annotations ui can show and delete annotations now. diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/Annotation.java --- 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() { diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java --- 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; diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java --- 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; diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResources.java --- 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; /** diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorTags.java --- 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; /** diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java --- 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 * diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationResource.java --- /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 = "\n"; + result += String.format("

Edit person %s

\n", annotation.getId()); + result += String.format("

All persons

", this.getReference().getParentRef()); + // tunnel PUT method through POST + result += String.format("
\n", this.getReference().getHierarchicalPart()); + result += ""; + result += String.format("\n", + annotation.getName()); + result += String.format("\n", + annotation.getUriString()); + result += "
name
uri
\n"; + result += "

"; + result += "\n
\n\n"; + */ + } else { + // output person content + result = "\n

Annotation

\n"; + result += String.format("

All annotations

", this.getReference().getParentRef()); + result += ""; + result += String.format("\n", annotation.getUri()); + result += String.format("\n", annotation.getBodyText()); + result += String.format("\n", annotation.getTargetBaseUri()); + result += String.format("\n", annotation.getTargetFragment()); + result += String.format("\n", annotation.getCreatorName()); + result += "
uri%s
text%s
target%s
fragment%s
creator%s
\n"; + //result += "

Edit annotation

\n"; + // tunnel POST as DELETE + result += String.format( + "
\n", + this.getReference().getHierarchicalPart()); + result += "\n"; + } + 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; + } +} diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsResource.java --- /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 = "\n

Annotations

\n"; + result += ""; + List annotations = store.getAnnotations("id", "*"); + for (Annotation annotation : annotations) { + Reference url = this.getReference().clone(); + url.addSegment(annotation.getUrlId()); + result += String.format("\n", url, + annotation.getUri(), annotation.getBodyText(), annotation.getTargetBaseUri(), annotation.getTargetFragment(), + annotation.getCreatorName()); + } + result += "
uritexttargetfragmentcreator
%s%s%s%s%s
\n"; + result += "\n"; + return new StringRepresentation(result, MediaType.TEXT_HTML); + } + +} diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationsUiRestlet.java --- 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); diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/GroupMembersResource.java --- 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. diff -r f30f42080711 -r 64aa756c60cc src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/PersonsResource.java --- 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; /**