view src/de/mpiwg/itgroup/annotationManager/restlet/AnnotatorResourceImpl.java @ 8:11baadcdd2c8

start of new Annotator API implementation.
author casties
date Mon, 19 Mar 2012 14:50:28 +0100
parents
children 0bdfe01e30b5
line wrap: on
line source

/**
 * Base class for Annotator resource classes.
 */
package de.mpiwg.itgroup.annotationManager.restlet;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.restlet.data.Form;
import org.restlet.representation.Representation;
import org.restlet.resource.Options;
import org.restlet.resource.ServerResource;

import de.mpiwg.itgroup.annotationManager.Constants.NS;
import de.mpiwg.itgroup.annotationManager.RDFHandling.Convert;

/**
 * Base class for Annotator resource classes.
 * 
 * @author dwinter, casties
 * 
 */
public abstract class AnnotatorResourceImpl extends ServerResource {

    protected String getAllowedMethodsForHeader() {
        return "OPTIONS,GET,POST";
    }

    /**
     * Handle options request to allow CORS for AJAX.
     * 
     * @param entity
     */
    @Options
    public void doOptions(Representation entity) {
        Form responseHeaders = (Form) getResponse().getAttributes().get(
                "org.restlet.http.headers");
        if (responseHeaders == null) {
            responseHeaders = new Form();
            getResponse().getAttributes().put("org.restlet.http.headers",
                    responseHeaders);
        }
        responseHeaders.add("Access-Control-Allow-Methods",
                getAllowedMethodsForHeader());
        // echo back Origin and Request-Headers
        Form requestHeaders = (Form) getRequest().getAttributes().get(
                "org.restlet.http.headers");
        String origin = requestHeaders.getFirstValue("Origin", true);
        if (origin == null) {
            responseHeaders.add("Access-Control-Allow-Origin", "*");
        } else {
            responseHeaders.add("Access-Control-Allow-Origin", origin);
        }
        String allowHeaders = requestHeaders.getFirstValue(
                "Access-Control-Request-Headers", true);
        if (allowHeaders != null) {
            responseHeaders.add("Access-Control-Allow-Headers", allowHeaders);
        }
        responseHeaders.add("Access-Control-Allow-Credentials", "true");
        responseHeaders.add("Access-Control-Max-Age", "60");
    }

    /**
     * Erzeugt aus einer Annotation, das fuer den Annotator notwendige
     * JSON-Format
     * 
     * @param annot
     * @return
     */
    protected JSONObject annot2AnnotatorJSON(Convert.Annotation annot) {
        JSONObject jo = new JSONObject();
        try {
            jo.put("text", annot.text);
            jo.put("uri", annot.url);

            JSONObject userObject = new JSONObject();
            userObject.put("id", annot.creator);

            RestServer restServer = (RestServer) getApplication();

            String userID = annot.creator;
            if (userID.startsWith(NS.MPIWG_PERSONS)) {
                userID = userID.replace(NS.MPIWG_PERSONS, ""); // entferne
                                                               // NAMESPACE
            }
            String userName = restServer.getUserNameFromLdap(userID);
            userObject.put("name", userName);

            jo.put("user", userObject);

            List<String> xpointer = new ArrayList<String>();

            if (annot.xpointers == null || annot.xpointers.size() == 0)
                xpointer.add(annot.xpointer);
            else {
                for (String xpointerString : annot.xpointers) {
                    xpointer.add(xpointerString);
                }
            }
            jo.put("ranges", transformToRanges(xpointer));
            jo.put("id", annot.annotationUri);
            return jo;
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }

    private JSONArray transformToRanges(List<String> xpointers) {

        JSONArray ja = new JSONArray();

        Pattern rg = Pattern
                .compile("#xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)/range-to\\(end-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)\\)");
        Pattern rg1 = Pattern
                .compile("#xpointer\\(start-point\\(string-range\\(\"([^\"]*)\",([^,]*),1\\)\\)\\)");

        try {
            for (String xpointer : xpointers) {
                String decoded = URLDecoder.decode(xpointer, "utf-8");
                Matcher m = rg.matcher(decoded);

                if (m.find()) {
                    {
                        JSONObject jo = new JSONObject();
                        jo.put("start", m.group(1));
                        jo.put("startOffset", m.group(2));
                        jo.put("end", m.group(3));
                        jo.put("endOffset", m.group(4));
                        ja.put(jo);
                    }
                }
                m = rg1.matcher(xpointer);
                if (m.find()) {
                    JSONObject jo = new JSONObject();
                    jo.put("start", m.group(1));
                    jo.put("startOffset", m.group(2));

                    ja.put(jo);
                }
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return ja;
    }

}