/**
*
*/
package de.mpiwg.itgroup.annotations.restlet.annotations_ui;
import java.util.List;
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.ResourceException;
import org.restlet.resource.ServerResource;
import de.mpiwg.itgroup.annotations.Actor;
import de.mpiwg.itgroup.annotations.Group;
import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
/**
* Resource class for the list of annotation groups.
*
* @author casties
*
*/
public class GroupsResource extends ServerResource {
public static Logger logger = Logger.getLogger(GroupsResource.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 groups.
*
* @param entity
* @return
*/
@Get("html")
public Representation doGetHTML(Representation entity) {
String result = null;
// get form parameter
Form f = this.getQuery();
String form = f.getFirstValue("form");
if (form != null && form.equals("new_group")) {
// output new group form
result = "
\n";
result += "New group
\n";
result += String.format("All groups
", this.getReference());
result += String.format("\n\n";
} else {
// list all groups
result = "\nGroups
\n";
result += "\n";
result += "id | name | uri |
";
List groups = store.getGroups("uri", "*");
for (Group group : groups) {
Reference groupUrl = this.getReference().clone();
groupUrl.addSegment(group.getId());
result += String.format("%s | %s | %s |
\n", groupUrl, group.getId(),
group.getName(), group.getUri());
}
result += "
\n";
result += "Add new group
\n";
result += "\n";
}
return new StringRepresentation(result, MediaType.TEXT_HTML);
}
/**
* POST creates a new Group.
*
* @return
*/
@Post
public Representation doPost(Representation entity) {
logger.debug("AnnotationsUiGroups doPost!");
// 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);
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() {
if (store == null) {
store = ((BaseRestlet) getApplication()).getAnnotationStore();
}
return store;
}
}