view src/main/java/de/mpiwg/itgroup/annotations/restlet/annotations_ui/AnnotationResource.java @ 50:64aa756c60cc

annotations ui can show and delete annotations now.
author casties
date Thu, 27 Sep 2012 17:12:08 +0200
parents
children c0dd5314bada
line wrap: on
line source

/**
 * 
 */
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;
    }
}