package edu.tufts.vue.zotero;
/*
* Copyright 2003-2008 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
import java.beans.Statement;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import tufts.Util;
import tufts.vue.LWComponent;
import tufts.vue.LWLink;
import tufts.vue.LWMap;
import tufts.vue.LWNode;
import tufts.vue.MapViewer;
import tufts.vue.Resource;
import tufts.vue.VUE;
import com.hp.hpl.jena.graph.query.Query;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.sparql.core.ResultBinding;
import com.hp.hpl.jena.util.FileManager;
public class ZoteroAction {
private static String ONTOLOGY_SEPERATOR = "#";
private static String ZOTERO_ONTOLOGY="http://www.zotero.org/namespaces/export";
private static String DC_TERMS ="http://purl.org/dc/terms/";
private static String DC_ELEMENTS = "http://purl.org/dc/elements/1.1/";
private static String RDF_NAMESPACE="http://www.w3.org/1999/02/22-rdf-syntax-ns";
private static String BIBLIO = "http://purl.org/net/biblio";
private final static String RANDOM = "random";
private final static String SEARCH = "search";
public static void importZotero(File file) {
java.util.List<LWComponent> comps = new ArrayList<LWComponent>();
LWMap map = VUE.getActiveMap();
MapViewer viewer = VUE.getActiveViewer();
// create an empty model
Model model = ModelFactory.createDefaultModel();
// use the FileManager to find the input file
InputStream in = FileManager.get().open(file.getAbsolutePath());
if (in == null) {
throw new IllegalArgumentException(
"File: " + file.getAbsolutePath() + " not found");
}
// read the RDF/XML file
model.read(in, "http://www.zotero.org/namespaces/export");
// write it to standard out
//model.write(System.out);
List<ZoteroItem> zoteroItems = getZoteroItems(model);
//scatter no subject items on map.
scatterKeywordlessItems(comps,zoteroItems);
addComponentsToMap(comps,RANDOM);
ResultSet results = getKeywordNodes(model);
/* while(results.hasNext())
{
QuerySolution qs = results.nextSolution();
String subject = qs.get("subject").toString();
//System.out.println(qs.toString());
if (subject !=null && subject.length() > 0)
{ //System.out.println(resourceList.get(p).toString());
comps.clear();
tufts.vue.LWNode keywordNode = new tufts.vue.LWNode(subject);
String label = keywordNode.getLabel();
label = Util.formatLines(label, Util.getMaxLabelLineLength());
keywordNode.setLabel(label);
keywordNode.layout();
comps.add(keywordNode);
addComponentsToMap(comps,RANDOM);
//recreated for next layout
comps.clear();
for (int i = 0; i < zoteroItems.size(); i++)
{
//System.out.println("NEXT " + i + "," + zoteroItems.get(i).getSubject());
if (zoteroItems.get(i).getSubject() !=null && zoteroItems.get(i).getSubject().equals(subject))
{
//System.out.println("ADD : " + subject);
String itemLabel = Util.formatLines(zoteroItems.get(i).getTitle(), Util.getMaxLabelLineLength());
LWNode itemNode = new LWNode(itemLabel);
String ref = zoteroItems.get(i).getReference();
String item = zoteroItems.get(i).getItem();
String notes = null;
if (ref !=null)
notes = getZoteroNotes(ref,item, model);
Resource r = Resource.instance(item);
itemNode.setResource(r);
itemNode.setNotes(notes);
itemNode.setLocation(keywordNode.getLocation());
comps.add(itemNode);
LWLink link = new LWLink(keywordNode,itemNode);
comps.add(link);
}
}
addComponentsToMap(comps,SEARCH);
}
}//end while results
*/
//}
/*
*CODE TO DUMP TRIPLES TO A FILE.
*
*/
StmtIterator stmt = model.listStatements();
try {
BufferedWriter out = new BufferedWriter(new FileWriter("/Users/mkorcy01/Desktop/triples.txt"));
while (stmt.hasNext())
{
com.hp.hpl.jena.rdf.model.Statement s = stmt.nextStatement();
out.write(s.toString()+"\n");
}
out.close();
} catch (IOException e) { e.printStackTrace();
}
}
private static void addComponentsToMap(List<LWComponent> comps,
String layout) {
LWMap map = VUE.getActiveMap();
if (map!=null)
{
map.addChildren(comps);
if (layout.equals(RANDOM))
tufts.vue.LayoutAction.random.act(comps);
else if (layout.equals(SEARCH))
tufts.vue.LayoutAction.search.act(comps);
}
}
private static ResultSet getKeywordNodes(Model model) {
String queryString =
"PREFIX z: <"+ ZOTERO_ONTOLOGY + ONTOLOGY_SEPERATOR+">"+
"PREFIX dcterms: <"+DC_TERMS+">"+
"PREFIX dcelements: <"+DC_ELEMENTS+">"+
"PREFIX rdf: <"+RDF_NAMESPACE + ONTOLOGY_SEPERATOR+">"+
"PREFIX biblio: <"+BIBLIO + ONTOLOGY_SEPERATOR+">"+
"SELECT DISTINCT ?subject " +
"WHERE { ?item dcelements:subject ?subject}";
ResultSet results = SparqlQuery.executeQuery(queryString, model);
return results;
}
private static void scatterKeywordlessItems(List<LWComponent> comps,
List<ZoteroItem> zoteroItems) {
comps.clear();
for (int i = 0; i < zoteroItems.size(); i++)
{
//System.out.println("NEXT " + i + "," + zoteroItems.get(i).getSubject());
/* if (zoteroItems.get(i).getSubject() ==null)
{
//System.out.println("ADD : " + subject);
String itemLabel = Util.formatLines(zoteroItems.get(i).getTitle(), Util.getMaxLabelLineLength());
LWNode itemNode = new LWNode(itemLabel);
comps.add(itemNode);
}*/
}
}
private static String getZoteroNotes(String item, String itemId, Model model) {
//[http://www.zotero.org/namespaces/export#item_46, http://www.w3.org/1999/02/22-rdf-syntax-ns#value, "<p>Some NOtes</p>"]
// [http://www.zotero.org/namespaces/export#item_46, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://purl.org/net/biblio#Memo]
//[http://vue.tufts.edu/, http://purl.org/dc/terms/isReferencedBy, http://www.zotero.org/namespaces/export#item_46]
// [http://www.zotero.org/namespaces/export#item_46, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://purl.org/net/biblio#Memo]
String queryString =
"PREFIX z: <"+ ZOTERO_ONTOLOGY + ONTOLOGY_SEPERATOR+">"+
"PREFIX dcterms: <"+DC_TERMS+">"+
"PREFIX dcelements: <"+DC_ELEMENTS+">"+
"PREFIX rdf: <"+RDF_NAMESPACE + ONTOLOGY_SEPERATOR+">"+
"PREFIX biblio: <"+BIBLIO + ONTOLOGY_SEPERATOR+">"+
"SELECT ?notes " +
"WHERE {<"+item+"> rdf:value ?notes ." +
" <"+item+"> rdf:type biblio:Memo . "+
" <"+itemId+"> dcterms:isReferencedBy <"+item+">}";
//System.out.println("QS : " + queryString);
//System.out.println("ITEM ID : " + itemId);
ResultSet results2 = SparqlQuery.executeQuery(queryString, model);
// List<ZoteroItem> l = new ArrayList();
String memo = null;
if (results2.hasNext())
{
QuerySolution qs2 = results2.nextSolution();
//System.out.println("QS2 : " + qs2.toString());
memo = qs2.getLiteral("notes").toString();
}
//System.out.println("memo : " + memo);
return memo;
}
private static List getZoteroItems(Model model) {
String queryString =
"PREFIX z: <"+ ZOTERO_ONTOLOGY + ONTOLOGY_SEPERATOR+">"+
"PREFIX dcterms: <"+DC_TERMS+">"+
"PREFIX dcelements: <"+DC_ELEMENTS+">"+
"PREFIX rdf: <"+RDF_NAMESPACE + ONTOLOGY_SEPERATOR+">"+
"PREFIX biblio: <"+BIBLIO + ONTOLOGY_SEPERATOR+">"+
"SELECT ?item ?title ?subject ?ref " +
"WHERE {?item rdf:type ?docType ." +
" ?item dcelements:title ?title ." +
"OPTIONAL {?item dcelements:subject ?subject} " +
"OPTIONAL {?item dcterms:isReferencedBy ?ref}}";
// " ?item dcelements:subject ?"+subject+"}";
ResultSet results2 = SparqlQuery.executeQuery(queryString, model);
List<ZoteroItem> l = new ArrayList();
while(results2.hasNext())
{
QuerySolution qs2 = results2.nextSolution();
String title = qs2.get("title").toString();
System.out.println(qs2.toString());
String subject = null;
if (qs2.getLiteral("subject") !=null)
subject= qs2.getLiteral("subject").toString();
String item = qs2.get("item").toString();
String reference = null;
if (qs2.get("ref") != null)
reference = qs2.get("ref").toString();
//System.out.println("ref : " + reference);
l.add(new ZoteroItem());
//System.out.println(qs2.toString());
}
return l;
}
public static void main(String[] args)
{
importZotero(new File("/Users/mkorcy01/Desktop/Simple.rdf"));
// importZotero(new File("/Users/mkorcy01/Desktop/My Library.rdf"));
}
}