view src/de/mpiwg/itgroup/annotationManager/RDFHandling/RDFSearcher.java @ 16:667d98fd28bd

working on search and update.
author casties
date Thu, 22 Mar 2012 10:54:56 +0100
parents 97f68ab3430f
children b0ef5c860464
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 org.restlet.Context;
import org.restlet.engine.component.ChildContext;

import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreSearchError;
import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreStoreError;
import de.mpiwg.itgroup.annotationManager.RDFHandling.Convert.Annotation;
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 TripleStoreHandler th;

	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 {

                List<Annotation> retAnnots = new ArrayList<Convert.Annotation>();
                ChildContext context = (ChildContext)Context.getCurrent();
                String tripleStoreUser = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUser");
                String tripleStorePW = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUserPassword");
                String connectionURL = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreConnectionURL");
                if (tripleStoreUser == null || tripleStorePW == null || connectionURL == null) {
                    logger.error(String.format("Missing triplestore parameters! (user=%s pw=%s url=%s)", tripleStoreUser, tripleStorePW, connectionURL));
                    throw new TripleStoreStoreError();
                }
                
                th = new TripleStoreHandler(connectionURL, tripleStoreUser, tripleStorePW);
                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.";
/*                String uri = null;
                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.");

/*                String user = null;
                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;
        }

        /** 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<Convert.Annotation>();
		ChildContext context = (ChildContext)Context.getCurrent();
		String tripleStoreUser = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUser");
		String tripleStorePW = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUserPassword");
                String connectionURL = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreConnectionURL");
                if (tripleStoreUser == null || tripleStorePW == null || connectionURL == null) {
                    logger.error(String.format("Missing triplestore parameters! (user=%s pw=%s url=%s)", tripleStoreUser, tripleStorePW, connectionURL));
                    throw new TripleStoreStoreError();
                }
		
		th = new TripleStoreHandler(connectionURL, tripleStoreUser, tripleStorePW);
		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;
	}

}