diff src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java @ 22:b1fb0d117877

adding and listing groups via html works now. no editing of group membership yet. no authentication yet.
author casties
date Thu, 20 Sep 2012 17:42:26 +0200
parents 1ac626309352
children
line wrap: on
line diff
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java	Fri Sep 07 18:10:18 2012 +0200
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java	Thu Sep 20 17:42:26 2012 +0200
@@ -5,22 +5,25 @@
 
 import java.util.List;
 
-import javax.servlet.ServletContext;
-
 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.Get;
+import org.restlet.resource.Post;
 import org.restlet.resource.ServerResource;
 
+import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Group;
+import de.mpiwg.itgroup.annotations.Person;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 
 /**
  * @author casties
- *
+ * 
  */
 public class AnnotationStoreGroups extends ServerResource {
 
@@ -28,35 +31,98 @@
 
     private AnnotationStore store;
 
+    /**
+     * GET with HTML content type. Lists all groups.
+     * 
+     * @param entity
+     * @return
+     */
     @Get("html")
-    public Representation doGetHTML(Representation entity){
-        Form form = getRequest().getResourceRef().getQueryAsForm();
+    public Representation doGetHTML(Representation entity) {
         // id from URI /annotations/groups/{id}
         String id = (String) getRequest().getAttributes().get("id");
         logger.debug("group-id=" + id);
-        String result="<html><body>\n<h1>Groups</h1>\n<table>";
-        result += "<tr><th>id</th><th>name</th><th>uri</th></tr>";
+        String result = null;
         store = getAnnotationStore();
         if (id == null) {
             // list all groups
-            List<Group> groups = store.getGroups("uri", "*");
-            for (Group group : groups) {
-                String groupLink = group.getId();
-                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupLink, group.getId(), group.getName(), group.getUri());
-            }
-        } else {
-            // just one group
+            result = "<html><body>\n<h1>Groups</h1>\n<table>";
+            result += "<tr><th>id</th><th>name</th><th>uri</th></tr>";
             List<Group> groups = store.getGroups("uri", "*");
             for (Group group : groups) {
-                String groupLink = group.getId();
-                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupLink, group.getId(), group.getName(), group.getUri());
+                Reference groupUrl = this.getReference();
+                groupUrl.addSegment(group.getId());
+                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupUrl,
+                        group.getId(), group.getName(), group.getUri());
             }
+            result += "</table>\n</body>\n</html>";
+        } else {
+            // just one group
+            Reference groupsUrl = this.getReference().getParentRef();
+            result = "<html><body>\n<h1>Group</h1>\n";
+            result += String.format("<p><a href=\"%s\">All groups</a></p>", groupsUrl);
+            Group group = new Group(id);
+            group = (Group) store.getActor(group);
+            result += "<table>";
+            result += String.format("<tr><td><b>id</b></td><td>%s</td></tr>\n", group.getId());
+            result += String.format("<tr><td><b>name</b></td><td>%s</td></tr>\n", group.getName());
+            result += String.format("<tr><td><b>uri</b></td><td>%s</td></tr>\n", group.getUri());
+            result += "<tr><td><b>members</b></td><td>";
+            List<Person> members = store.getMembersOfGroup(group);
+            for (Person p : members) {
+                result += String.format("%s (%s)\n", p.getName(), p.getIdString());                
+            }
+            result += "</td></tr>\n";
+            result += "</table>\n</body>\n</html>";
         }
-        result += "</table>\n</body>\n</html>";
-        
+
         logger.debug("sending:");
         logger.debug(result);
-        return new StringRepresentation(result,MediaType.TEXT_HTML);
+        return new StringRepresentation(result, MediaType.TEXT_HTML);
+    }
+
+    /**
+     * POST with HTML content-type. Creates a new Group.
+     * 
+     * @return
+     */
+    @Post
+    public Representation doPostHTML(Representation entity) {
+        logger.debug("AnnotationStoreGroups doPostHTML!");
+        // TODO: do authentication
+        Form form = new Form(entity);
+        String id = form.getFirstValue("id");
+        String name = form.getFirstValue("name");
+        if (id == null || id.isEmpty()) {
+            // invalid id
+            setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
+            return null;
+        }
+        String gid = makeGroupId(id);
+        Group newGroup = new Group(gid, null, name);
+        store = getAnnotationStore();
+        Actor storedGroup = store.storeActor(newGroup);
+        gid = storedGroup.getId();
+        // return 303: see other
+        setStatus(Status.REDIRECTION_SEE_OTHER);
+        // go GET URL for this group
+        Reference groupUrl = this.getReference();
+        groupUrl.addSegment(gid);
+        this.getResponse().setLocationRef(groupUrl);
+        return null;
+    }
+
+    /**
+     * Returns a group id based on the given id.
+     * 
+     * @param id
+     * @return
+     */
+    protected String makeGroupId(String id) {
+        // TODO: should we use different ids?
+        id = id.replaceAll("\\W", "_");
+        id = id.toLowerCase();
+        return id;
     }
 
     protected AnnotationStore getAnnotationStore() {