view src/main/java/de/mpiwg/itgroup/annotationManager/RDFHandling/RDFSearcher.java @ 23:a3e324009990

now Mavenified! removed tiny-mce javascript from html frontend. still needs TripleStoreManager project in Eclipse. jsontoken 1.1 has to be built manually.
author casties
date Tue, 03 Apr 2012 13:05:05 +0200
parents src/de/mpiwg/itgroup/annotationManager/RDFHandling/RDFSearcher.java@b0ef5c860464
children b37487b756ac
line wrap: on
line source

package de.mpiwg.itgroup.annotationManager.RDFHandling;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.openrdf.query.BindingSet;
import org.openrdf.query.TupleQueryResult;

import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreSearchError;
import de.mpiwg.itgroup.triplestoremanager.exceptions.TripleStoreHandlerException;
import de.mpiwg.itgroup.triplestoremanager.owl.TripleStoreHandler;

public class RDFSearcher {

    private String urlBase = "http://ontologies.mpiwg-berlin.mpg.de/annotations/"; // TODO should go into config

    private String context;

    private Logger logger = Logger.getRootLogger();

    public RDFSearcher(String context) {
        this.context = context;
    }

    /**
     * Sucht im Triplestore nach Annotationen.
     * 
     * @param id
     *            id der Annotation
     * @return
     * @throws TripleStoreHandlerException
     * @throws TripleStoreSearchError
     */
    public List<Annotation> searchById(String id) throws TripleStoreHandlerException, TripleStoreSearchError {
        if (id == null) {
            return null;
        }
        List<Annotation> retAnnots = new ArrayList<Annotation>();
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        String queryString = "";
        // query for tuples with id as subject
        StringBuilder whereString = new StringBuilder(String.format("<%s> ?p <http://www.w3.org/2000/10/annotationType#Comment>.", id));
        whereString.append(String.format("<%s> <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> ?uri.", id));
        whereString.append(String.format("<%s> <http://ontologies.mpiwg-berlin.mpg.de/annotations/textSelection> ?xpointer.", id));
        whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#body> ?annotText.", id));
        whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#author> ?author.", id));
        whereString.append(String.format("<%s> <http://www.w3.org/2000/10/annotation-ns#created> ?created.", id));
        whereString.append(" OPTIONAL {?annotText <http://ontologies.mpiwg-berlin.mpg.de/annotations/containsText> ?text.}");

        queryString = String.format("select distinct * where {%s}", whereString);

        logger.debug("RDFSearcher:" + queryString);

        try {
            TupleQueryResult results = th.querySPARQL(queryString);
            while (results.hasNext()) {
                BindingSet result = results.next();
                String annotUri = result.getBinding("uri").getValue().stringValue();
                String annotUser = result.getBinding("author").getValue().stringValue();
                String textString = "";
                if (result.getBinding("text") != null) {
                    textString = result.getBinding("text").getValue().stringValue();
                }
      
                String xpointer = result.getBinding("xpointer").getValue().stringValue();
                String created = result
                        .getBinding("created").getValue().stringValue();
                Annotation annot = new Annotation(xpointer, annotUser, created, textString, null, annotUri, id);
                retAnnots.add(annot);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
        // TODO Auto-generated method stub
        return retAnnots;
    }

    /**
     * Sucht im Triplestore nach Annotationen
     * 
     * @param uri
     *            Adresse der Annotierten Ressource, in der Regel nicht mit dem xpointer, sonder die URI der kompletten Ressource
     *            oder NULL oder leer
     * @param user
     *            Author der Annotationen, entweder als uri der Person oder ein Username, je nachdem wie die Annotatinen angelegt
     *            wurden.
     * @param limit
     * @param offset
     * @return
     * @throws TripleStoreHandlerException
     * @throws TripleStoreSearchError
     */
    public List<Annotation> searchByUriUser(String uri, String user, String limit, String offset)
            throws TripleStoreHandlerException, TripleStoreSearchError {

        List<Annotation> retAnnots = new ArrayList<Annotation>();
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        String queryString = "";

        String whereString = "?s ?p <http://www.w3.org/2000/10/annotationType#Comment>.";
        // whereString +="?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/docuviewerText> ?link.";

        if (uri != null && !uri.equals("")) {
            whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> <%s>.",
                    uri);
        } else {
            whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/annotatesDocuviewerText> ?uri.");
        }
        whereString += String.format("?s <http://ontologies.mpiwg-berlin.mpg.de/annotations/textSelection> ?xpointer.");
        whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#body> ?annotText.");

        if (user != null && !user.equals("")) {
            if (user.startsWith("http")) {
                whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> <%s>.", user);
            } else {
                whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> \"%s\".", user);
            }
        } else {
            whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#author> ?author.");
        }

        whereString += String.format("?s <http://www.w3.org/2000/10/annotation-ns#created> ?created.");

        whereString += String
                .format(" OPTIONAL {?annotText <http://ontologies.mpiwg-berlin.mpg.de/annotations/containsText> ?text.}");

        queryString = String.format("select distinct * where {%s}", whereString);

        logger.debug("RDFSearcher:" + queryString);

        try {
            TupleQueryResult results = th.querySPARQL(queryString);

            while (results.hasNext()) {
                BindingSet result = results.next();
                String annotUri;
                if (uri != null && !uri.equals("")) {
                    annotUri = uri;
                } else {
                    annotUri = result.getBinding("uri").getValue().stringValue();
                }

                String annotUser;
                if (user != null && !user.equals("")) {
                    annotUser = user;
                } else {
                    annotUser = result.getBinding("author").getValue().stringValue();
                }

                String textString = "";
                if (result.getBinding("text") != null) {
                    textString = result.getBinding("text").getValue().stringValue();
                }
                Annotation annot = new Annotation(result.getBinding("xpointer").getValue().stringValue(), annotUser, result
                        .getBinding("created").getValue().stringValue(), textString, null, annotUri, result.getBinding("s")
                        .getValue().stringValue());
                retAnnots.add(annot);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
        // TODO Auto-generated method stub
        return retAnnots;
    }

    public void deleteById(String id) throws TripleStoreHandlerException, TripleStoreSearchError {
        if (id == null) {
            return;
        }
        TripleStoreHandler th = TripleStoreConnection.newTripleStoreHandler();
        // delete triples with id as subject
        /* wish Virtuoso would speak SparQL1.1...
        String queryString = String.format("WITH <%s> DELETE { <%s> ?p ?o } WHERE { <%s> ?p ?o }", context, id, id);
        */
        String queryString = String.format("DELETE FROM <%s> { <%s> ?p ?o } WHERE { <%s> ?p ?o }", context, id, id);

        logger.debug("RDFSearcher:" + queryString);

        try {
            th.querySPARQL(queryString);
       } catch (Exception e) {
            e.printStackTrace();
            throw new TripleStoreSearchError();
        }
    }
}