/**
*
*/
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.Person;
import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
/**
* Resource class for a single person.
*
* @author casties
*
*/
public class PersonResource extends ServerResource {
public static Logger logger = Logger.getLogger(PersonResource.class);
protected AnnotationStore store;
protected String requestId;
protected Person person;
@Override
protected void doInit() throws ResourceException {
super.doInit();
// id from URI /annotations/persons/{id}
requestId = (String) getRequest().getAttributes().get("id");
logger.debug("group-id=" + requestId);
// get store instance
if (store == null) {
store = ((BaseRestlet) getApplication()).getAnnotationStore();
}
// get group from store
if (requestId != null) {
person = (Person) store.getActor(new Person(requestId));
}
}
/**
* GET with HTML content type. Shows the person.
*
* @param entity
* @return
*/
@Get("html")
public Representation doGetHTML(Representation entity) {
if (person == 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", person.getId());
result += String.format("All persons
", this.getReference().getParentRef());
// tunnel PUT method through POST
result += String.format("\n\n";
} else {
// output person content
result = "\nPerson
\n";
result += String.format("All persons
", this.getReference().getParentRef());
result += "";
result += String.format("id | %s |
\n", person.getId());
result += String.format("name | %s |
\n", person.getName());
result += String.format("uri | %s |
\n", person.getUri());
result += "
\n";
result += "Edit person
\n";
// tunnel POST as DELETE
result += String.format(
"\n",
this.getReference().getHierarchicalPart());
result += "\n";
}
return new StringRepresentation(result, MediaType.TEXT_HTML);
}
/**
* PUT updates the person.
*
* @param entity
* @return
*/
@Put
public Representation doPut(Representation entity) {
logger.debug("PersonResource.doPut!");
if (person == null) {
// invalid id
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
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()) {
person.setName(name);
}
if (uri != null && !uri.isEmpty()) {
person.setUri(uri);
}
store.storeActor(person);
// 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 person.
*
* @param entity
* @return
*/
@Delete
public Representation doDelete(Representation entity) {
logger.debug("PersonResource.doDelete!");
if (person == null) {
// invalid id
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return null;
}
// TODO: do authentication
store.deleteActor(person);
// return 303: see other
setStatus(Status.REDIRECTION_SEE_OTHER);
// go GET parent URL
Reference url = this.getReference().getParentRef();
this.getResponse().setLocationRef(url);
return null;
}
}