diff src/de/mpiwg/itgroup/annotationManager/RDFHandling/Convert.java @ 0:77530be3c747

intial
author dwinter
date Tue, 22 Nov 2011 15:47:57 +0100
parents
children 6888ae3287b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/mpiwg/itgroup/annotationManager/RDFHandling/Convert.java	Tue Nov 22 15:47:57 2011 +0100
@@ -0,0 +1,239 @@
+package de.mpiwg.itgroup.annotationManager.RDFHandling;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.openrdf.repository.RepositoryException;
+import org.restlet.Context;
+import org.restlet.engine.component.ChildContext;
+
+import de.mpiwg.itgroup.annotationManager.Constants.NS;
+import de.mpiwg.itgroup.annotationManager.Errors.TripleStoreStoreError;
+import de.mpiwg.itgroup.annotationManager.Errors.XPointerError;
+import de.mpiwg.itgroup.nimanager.exceptions.TripleStoreHandlerException;
+import de.mpiwg.itgroup.nimanager.owl.TripleStoreHandler;
+import de.mpiwg.itgroup.nimanager.owl.TripleStoreHandler.Quadruple;
+import de.mpiwg.itgroup.nimanager.owl.TripleStoreHandler.LiteralQuadruple;
+
+/**
+ * @author dwinter
+ *
+ * Klasse zum Konvertieren von Annotationen zum mpiwg RDF-Format:
+ * http://ontologies.mpiwg-berlin.mpg.de/annotations/
+ */
+
+public class Convert {
+	private String ctx;
+	private Logger logger = Logger.getRootLogger();
+	private String urlBase="http://ontologies.mpiwg-berlin.mpg.de/annotations/"; //TODO should go into config
+	public Convert(String c){
+		ctx=c;
+	}
+	
+	/**
+	 * Fasst alle Parameter zusammen, die eine Annotation bilden
+	 * @author dwinter
+	 *
+	 */
+	static public class Annotation {
+		public String xpointer=null; //if queried xpointer should contain the first xpointer in the xpointers list, if there is more than one.
+		public String creator=null;
+		public String time=null;
+		public String text=null;
+		public String type=null;
+		public String url;
+		public List<String> xpointers=null; // list of xpointers on the page url, can be empty or null if there is only one.
+		
+		/**
+		 * @param xpointer Beschreibt die Annotation
+		 * @param creator Username des Creators
+		 * @param time Erstellungszeit, wenn null wird das aktuelle Datum verwenden beim Konvertieren
+		 * @param text der Annotation
+		 * @param type Annotationstype (Entsprechend den in http://www.w3.org/2000/10/annotationType# definierten.)
+		 * @param url Url einer Annotation
+		 */
+		public Annotation(String xpointer, String creator, String time, String text, String type, String url){
+			this.xpointer=xpointer;
+			this.creator=creator;
+			this.time=time;
+			this.text=text;
+			this.type=type;
+			this.url=url;
+		}
+		
+		/**
+		 * @param xpointer Beschreibt die Annotation
+		 * @param creator Username des Creators
+		 * @param time Erstellungszeit, wenn null wird das aktuelle Datum verwenden beim Konvertieren
+		 * @param text der Annotation
+		 * @param type Annotationstype (Entsprechend den in http://www.w3.org/2000/10/annotationType# definierten.)
+		 */
+		public Annotation(String xpointer, String creator, String time, String annot, String type){
+			this.xpointer=xpointer;
+			this.creator=creator;
+			this.time=time;
+			this.text=annot;
+			this.type=type;
+			this.url=null;
+			}
+		
+		
+	}
+	private String annotUrl=null;
+	
+	/**
+	 * 
+	 * @param xpointer Beschreibt die Annotation
+	 * @param creator Username des Creators
+	 * @param time Erstellungszeit, wenn null wird das aktuelle Datum verwenden beim Konvertieren
+	 * @param text der Annotation
+	 * @param type Annotationstype (Entsprechend den in http://www.w3.org/2000/10/annotationType# definierten.)
+	  * @return
+	 */
+	 
+	private List<Quadruple> annot2quadruple(String xpointer, String creator, String time, String annot, String type){
+		return annot2quadruple(new Annotation(xpointer, creator, time, annot, type));
+	}
+	
+	
+	/**
+	 * @param annot
+	 * @return
+	 */
+	public List<Quadruple> annot2quadruple(Annotation annot){
+		List<Quadruple> retQuad = new ArrayList<Quadruple>();
+		
+		String annotation = createRessourceURL("annot:");
+		
+		if (annot.time==null){
+			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
+			annot.time=format.format(Calendar.getInstance().getTime());
+			
+		}
+		
+		//TODO: check type
+		retQuad.add(new Quadruple(annotation, NS.RDF+"type", NS.ANNOTATION_TYPE+annot.type, ctx));
+		
+		//add author
+		retQuad.add(new LiteralQuadruple(annotation, NS.ANNOTATION_NS+"author", annot.creator, ctx));
+		
+		// creation time
+		retQuad.add(new LiteralQuadruple(annotation, NS.ANNOTATION_NS+"created", annot.time, ctx));
+		
+		String[] xpointerSplitted = annot.xpointer.split("#");
+		
+		if (xpointerSplitted.length>2){
+			annotUrl=null;
+			throw new XPointerError();
+		}
+		
+		// now add the xpointers 
+		retQuad.add(new Quadruple(annotation, NS.MPIWG_annot+"docuviewerText", xpointerSplitted[0], ctx));
+		retQuad.add(new Quadruple(annotation, NS.MPIWG_annot+"textSelection", annot.xpointer, ctx));
+		
+		String annotationtext =createRessourceURL("annotText:");
+		
+		retQuad.add(new Quadruple(annotation, NS.ANNOTATION_NS+"body", annotationtext, ctx));
+		
+		retQuad.add(new Quadruple(annotationtext, NS.RDF+"type", NS.MPIWG_annot+"StandardTextNote", ctx));
+		
+		retQuad.add(new LiteralQuadruple(annotationtext, NS.MPIWG_annot+"containsText", annot.text, ctx));
+		
+		for (Quadruple ret:retQuad){
+			logger.debug(ret.toString());
+		}
+		
+		annotUrl=annotation;
+		return retQuad;
+	}
+	
+	/**
+	 * Erzeuge eine urn aus der aktullen Zeit in millis
+	 * @return
+	 */
+	private String createRessourceURL(String prefix) {
+		
+		Calendar cal = Calendar.getInstance();
+
+		long time = cal.getTimeInMillis();
+		
+		return String.format("%s%s%s", urlBase,prefix,time);
+		
+
+		
+	}
+
+	/** 
+	 * gibt nach die nach aufruf eines Converters erzeuge aktuelle url der annotation zurueck 
+	 * @return
+	 */
+	public String getAnnotUrl() {
+		
+		return annotUrl;
+	}
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		Convert myConvert = new Convert("http://annotations.rdf");
+		List<Quadruple> rets = myConvert.annot2quadruple("http://mpdl-dev.mpiwg-berlin.mpg.de/ECHOdocuViewfullTest?url=/mpiwg/online/permanent/library/163127KK&amp;viewMode=text&amp;pn=7#xpointer(string-range(id(&quot;s1&quot;), &quot;&quot;, 66, 12))", "mbuchman", null, "myannot", "Example");
+		for (Quadruple ret:rets){
+			System.out.println(ret.toString());
+		}
+
+	}
+
+	
+	public String storeAnnotation(Convert.Annotation annot) throws TripleStoreStoreError {
+		
+		//Convert convert = new Convert("<file:///annotations>");
+		
+
+		if ((annot.type==null) || annot.type.equals("")){
+			annot.type="Comment";
+		}
+		
+		List<Quadruple> annots = new ArrayList<Quadruple>();
+		if (annot.text!=null && !annot.text.equals(""))
+			annots=annot2quadruple(annot);
+		if (annot.url!=null && !annot.url.equals(""))
+			annots.addAll(rel2quadruple(annot));
+
+		
+		
+		try {
+			ChildContext context = (ChildContext)Context.getCurrent();
+			String user = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUser");
+			String pw = context.getParameters().getFirstValue("de.mpiwg.itgroup.annotationManager.virtuoso.tripleStoreUserPassword");
+			
+			TripleStoreHandler th = new TripleStoreHandler("jdbc:virtuoso://virtuoso.mpiwg-berlin.mpg.de:1111", user, pw);
+				
+			th.write(annots);
+		} catch (RepositoryException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new TripleStoreStoreError();
+		} catch (TripleStoreHandlerException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			throw new TripleStoreStoreError();
+		}
+		
+		
+		
+		return getAnnotUrl();
+}
+
+
+	private List<Quadruple> rel2quadruple(Annotation annot) {
+		// TODO Auto-generated method stub
+		return new ArrayList<TripleStoreHandler.Quadruple>();
+	}
+
+}