/* * OWLIMOntologyLR.java * * Niraj Aswani, 09/March/07 * * $Id: OWLIMOntologyLR.java 11600 2009-10-13 17:13:22Z johann_p $ */ package gate.creole.ontology.owlim; import gate.Gate; import gate.Resource; import gate.creole.ResourceData; import gate.creole.ResourceInstantiationException; import gate.creole.ontology.OConstants; import gate.event.CreoleEvent; import gate.event.CreoleListener; import gate.gui.ActionsPublisher; import gate.gui.MainFrame; import gate.util.Files; import gate.util.GateRuntimeException; import gate.util.Out; import java.awt.event.ActionEvent; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; import java.io.Reader; import java.io.StringReader; import java.io.Writer; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import org.openrdf.sesame.config.SystemConfig; import org.openrdf.sesame.config.handlers.SystemConfigFileHandler; import org.openrdf.sesame.repository.SesameRepository; import org.openrdf.sesame.repository.local.LocalService; /** * This LR provides an implementation of Ontology interface and uses * OWLIM as a SAIL to store and interact with SESAME. All data is stored * in Memory, unless asked to persist in a file. If so, it stores * everything in ntripples format. This implementation supports four * different formats including RDF/XML, NTRIPPLES, N3 and TURTLE. * * @author niraj * */ public class OWLIMOntologyLR extends AbstractOWLIMOntologyImpl implements ActionsPublisher, CreoleListener { private static final long serialVersionUID = 3761129327521051696L; /** * If true, the debug information is printed. */ private final static boolean DEBUG = false; /** * URL for the RDF/XML ontology. */ protected URL rdfXmlURL; /** * URL for the NTripples ontology. */ protected URL ntriplesURL; /** * URL for the N3 ontology. */ protected URL n3URL; /** * URL for the Turtle ontology. */ protected URL turtleURL; /** * Location where the repository should be persisted */ protected URL persistLocation; /** * Actions for the remote ontology LR. */ protected List<AbstractAction> actionsList; /** * Constructor */ public OWLIMOntologyLR() throws ResourceInstantiationException { super(); actionsList = new ArrayList<AbstractAction>(); actionsList.add(new SaveAsNTRIPLESAction("Save in NTRIPLES format")); actionsList.add(new SaveAsRDFXMLAction("Save in RDFXML format")); //actionsList.add(new SaveAsN3Action("Save in N3 format")); actionsList.add(new SaveAsTURTLEAction("Save in TURTLE format")); actionsList.add(new SaveOntologyEventLogAction("Save Ontology Event Log")); actionsList.add(new LoadOntologyEventLogAction("Load Ontology Event Log")); } /** Initialises this resource, and returns it. */ public Resource init() throws ResourceInstantiationException { load(); Gate.getCreoleRegister().addCreoleListener(this); // just a quick hack to see if this works at all ... return this; } /** * Loads this ontology. */ public void load() throws ResourceInstantiationException { try { if(defaultNameSpace == null || defaultNameSpace.trim().length() == 0) defaultNameSpace = "http://gate.ac.uk/owlim#"; byte type = OConstants.ONTOLOGY_FORMAT_RDFXML; if(rdfXmlURL != null && rdfXmlURL.toString().trim().length() > 0) { ontologyURL = rdfXmlURL; } else if(ntriplesURL != null && ntriplesURL.toString().trim().length() > 0) { ontologyURL = ntriplesURL; type = OConstants.ONTOLOGY_FORMAT_NTRIPLES; } else if(n3URL != null && n3URL.toString().trim().length() > 0) { ontologyURL = n3URL; type = OConstants.ONTOLOGY_FORMAT_N3; } else if(turtleURL != null && turtleURL.toString().trim().length() > 0) { ontologyURL = turtleURL; type = OConstants.ONTOLOGY_FORMAT_TURTLE; } else { ontologyURL = null; type = OConstants.ONTOLOGY_FORMAT_RDFXML; } if(DEBUG) System.out.println("Creating repository"); String ontoURLString = ontologyURL == null ? "" : ontologyURL .toExternalForm(); // determine the URL to the Ontology_Tools plugin directory ResourceData myResourceData = (ResourceData)Gate.getCreoleRegister().get( this.getClass().getName()); URL creoleXml = myResourceData.getXmlFileUrl(); URL gosHomeURL = new URL(creoleXml, "."); // create a standalone OWLIMServiceImpl OWLIMServiceImpl owlimService = new OWLIMServiceImpl(); owlimService.setGosHomeURL(gosHomeURL); SystemConfig sesameConfig = createStandaloneConfiguration(); LocalService sesameService = new LocalService(sesameConfig); owlimService.setSesameLocalService(sesameService); owlimService.setSystemConfLocation(null); owlimService.setShutDownOnLogout(true); owlimService.init(); owlimService.login("admin", "admin"); owlim = owlimService; String persistLocationPath = null; if(persistLocation != null && persistLocation.toString().trim().length() != 0) { persistLocationPath = Files.fileFromURL(persistLocation).getAbsolutePath(); } else if(persistRepository.booleanValue()) { throw new ResourceInstantiationException( "As you've set the parameter 'persistRepository' to 'true', you must provide a valid path for where you want to preserve your data!"); } else { persistLocationPath = File.createTempFile("abc", "abc").getParentFile() .getAbsolutePath(); } if(ontoURLString.length() == 0) { sesameRepositoryID = owlim.createRepository("owlim" + this.hashCode(), "admin", "admin", "", defaultNameSpace, type, persistLocationPath, persistRepository.booleanValue(), false); } else { sesameRepositoryID = owlim.createRepositoryFromUrl("owlim" + this.hashCode(), "admin", "admin", ontoURLString, defaultNameSpace, type, persistLocationPath, persistRepository .booleanValue(), false); } if(sesameRepositoryID == null) { throw new ResourceInstantiationException( "repository cannot be created!"); } // we need to populate all our maps with the resources available // in repository // the following methods should do so getOClasses(false); getOInstances(); getPropertyDefinitions(); } catch(IOException ioe) { throw new ResourceInstantiationException(ioe); } } /** * Create a fixed sesame system configuration for the standalone OWLIM service. */ private SystemConfig createStandaloneConfiguration() throws ResourceInstantiationException { String s = "<?xml version='1.0'?>" + "<system-conf>" + "<admin password=''/>" + "<log dir='plugins/Ontology_Tools/logs' level='3'/>" + "<tmp dir='plugins/Ontology_Tools/tmp'/>" + "<rmi-factory enabled='false' class='com.ontotext.util.rmi.CustomRMIFactory' port='1099'/>" + "<userlist>" + "<user id='1' login='admin'><fullname>Admin</fullname><password>admin</password></user>" + "<user id='3' login='guest'><fullname>Guest</fullname><password>guest</password></user>" + "</userlist>" + "<repositorylist></repositorylist></system-conf>"; try { Reader reader = new StringReader(s); SystemConfig config = SystemConfigFileHandler.readConfiguration(reader); reader.close(); return config; } catch(IOException e) { throw new ResourceInstantiationException("Error loading sesame configuration", e); } } /** * This method is invoked at the time of resource unloading */ public void cleanup() { super.cleanup(); } /* * (non-Javadoc) * * @see gate.gui.ActionsPublisher#getActions() */ public List getActions() { return actionsList; } // ************ Creole Listener Methods ************ public void resourceLoaded(CreoleEvent ce) { // do nothing } public void datastoreClosed(CreoleEvent ce) { } public void resourceRenamed(Resource resource, String oldname, String newname) { } public void datastoreOpened(CreoleEvent ce) { } public void datastoreCreated(CreoleEvent ce) { } /** * This method removes the repository, provided that user has decided * not to persist this, when this resource is unloaded */ public void resourceUnloaded(CreoleEvent ce) { if(ce.getResource() == this) { unload(); Gate.getCreoleRegister().removeCreoleListener(this); } } /** * This method deletes the repository from memory and releases all * resources occupied by the ontology. Please note that after calling * this method, any call to any method of the ontology will throw an * exception complaining that the repository does not exist. So this * should be the last call to this ontology when you decide to discard * this instance of ontology. */ public void unload() { if(!getPersistRepository().booleanValue()) { owlim.removeRepository(getSesameRepositoryID(), getPersistRepository() .booleanValue()); owlim.logout(sesameRepositoryID); owlim = null; } } /** * Export Results in NTRIPLE Format * * @author niraj */ public class SaveAsNTRIPLESAction extends AbstractAction { private static final long serialVersionUID = 3257002159693444913L; public SaveAsNTRIPLESAction(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { File selectedFile = askForFile(); if(selectedFile == null) return; try { MainFrame.lockGUI("Saving..."); BufferedWriter writer = new BufferedWriter(new FileWriter( selectedFile)); String output = owlim.getOntologyData(sesameRepositoryID, OConstants.ONTOLOGY_FORMAT_NTRIPLES); writer.write(output); writer.flush(); writer.close(); } catch(Exception ex) { ex.printStackTrace(Out.getPrintWriter()); } finally { MainFrame.unlockGUI(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Export Results in RDFXML Format * * @author niraj */ public class SaveAsRDFXMLAction extends AbstractAction { private static final long serialVersionUID = 3834305146426570290L; public SaveAsRDFXMLAction(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { File selectedFile = askForFile(); if(selectedFile == null) return; try { MainFrame.lockGUI("Saving..."); String output = owlim.getOntologyData(sesameRepositoryID, OConstants.ONTOLOGY_FORMAT_RDFXML); BufferedWriter writer = new BufferedWriter(new FileWriter( selectedFile)); writer.write(output); writer.flush(); writer.close(); } catch(Exception ex) { ex.printStackTrace(Out.getPrintWriter()); } finally { MainFrame.unlockGUI(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Export Results in TURTLE Format * * @author niraj */ public class SaveAsTURTLEAction extends AbstractAction { private static final long serialVersionUID = 3905801980944136247L; public SaveAsTURTLEAction(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { File selectedFile = askForFile(); if(selectedFile == null) return; try { MainFrame.lockGUI("Saving..."); String output = owlim.getOntologyData(sesameRepositoryID, OConstants.ONTOLOGY_FORMAT_TURTLE); BufferedWriter writer = new BufferedWriter(new FileWriter( selectedFile)); writer.write(output); writer.flush(); writer.close(); } catch(Exception ex) { ex.printStackTrace(Out.getPrintWriter()); } finally { MainFrame.unlockGUI(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Export Results in N3 Format * * @author niraj */ public class SaveAsN3Action extends AbstractAction { private static final long serialVersionUID = 4051328924770382905L; public SaveAsN3Action(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { File selectedFile = askForFile(); if(selectedFile == null) return; try { MainFrame.lockGUI("Saving..."); String output = owlim.getOntologyData(sesameRepositoryID, OConstants.ONTOLOGY_FORMAT_N3); BufferedWriter writer = new BufferedWriter(new FileWriter( selectedFile)); writer.write(output); writer.flush(); writer.close(); } catch(Exception ex) { ex.printStackTrace(Out.getPrintWriter()); } finally { MainFrame.unlockGUI(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Opens a JFileChooser to ask user for an output file * * @return */ private File askForFile() { JFileChooser fileChooser = MainFrame.getFileChooser(); fileChooser.setMultiSelectionEnabled(false); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setDialogTitle("Select document to save ..."); fileChooser.setSelectedFiles(null); int res = fileChooser.showDialog(null, "Save"); if(res == JFileChooser.APPROVE_OPTION) { return fileChooser.getSelectedFile(); } return null; } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#startTransaction() */ public void startTransaction() { try { ((OWLIMServiceImpl)owlim).startTransaction(this.sesameRepositoryID); } catch(Exception re) { throw new GateRuntimeException(re); } } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#commitTransaction() */ public void commitTransaction() { try { ((OWLIMServiceImpl)owlim).commitTransaction(this.sesameRepositoryID); } catch(Exception re) { throw new GateRuntimeException(re); } } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#transationStarted() */ public boolean transationStarted() { try { return ((OWLIMServiceImpl)owlim) .transactionStarted(this.sesameRepositoryID); } catch(Exception re) { throw new GateRuntimeException(re); } } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#writeOntologyData(java.io.OutputStream, * byte) */ public void writeOntologyData(OutputStream out, byte format) { try { ((OWLIMServiceImpl)owlim).writeOntologyData(this.sesameRepositoryID, out, format); } catch(Exception re) { throw new GateRuntimeException(re); } } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#writeOntologyData(java.io.Writer, * byte) */ public void writeOntologyData(Writer out, byte format) { try { ((OWLIMServiceImpl)owlim).writeOntologyData(this.sesameRepositoryID, out, format); } catch(Exception re) { throw new GateRuntimeException(re); } } /* * (non-Javadoc) * * @see gate.creole.ontology.Ontology#getSesameRepository() */ public SesameRepository getSesameRepository() { return ((OWLIMServiceImpl)owlim) .getSesameRepository(this.sesameRepositoryID); } /** * URL for the NTripples File * * @return */ public URL getNtriplesURL() { return ntriplesURL; } /** * Sets the URL for NTripples File * * @return */ public void setNtriplesURL(URL ntriplesURL) { this.ntriplesURL = ntriplesURL; } /** * URL for the RDFXML File * * @return */ public URL getRdfXmlURL() { return rdfXmlURL; } /** * Sets the URL for RDFXML File * * @param rdfXmlURL */ public void setRdfXmlURL(URL rdfXmlURL) { this.rdfXmlURL = rdfXmlURL; } /** * URL for the N3 File * * @return */ public URL getN3URL() { return n3URL; } /** * Sets the URL for the N3 File * * @param n3url */ public void setN3URL(URL n3url) { n3URL = n3url; } /** * URL for the Turtle File * * @return */ public URL getTurtleURL() { return turtleURL; } /** * Sets the URL for the Turtle file * * @param turtleURL */ public void setTurtleURL(URL turtleURL) { this.turtleURL = turtleURL; } /** * Gets the location, where user has decided to store the data. If * user didn't provide anything, this method returns the location that * system has automatically decided to use to store the temporary * data. * * @return */ public URL getPersistLocation() { return persistLocation; } /** * Allows users to specify where to store the repository data. * * @param persistLocation */ public void setPersistLocation(URL persistLocation) { this.persistLocation = persistLocation; } /** * This method returns the ontology output in ntripples format. */ public String toString() { String output = owlim.getOntologyData(sesameRepositoryID, OConstants.ONTOLOGY_FORMAT_NTRIPLES); List<String> outputList = Arrays.asList(output.split(System .getProperty("line.separator"))); Collections.sort(outputList); output = null; StringBuffer toReturn = new StringBuffer(); for(String line : outputList) { toReturn = toReturn.append(line).append( System.getProperty("line.separator")); } return toReturn.toString(); } /** * Export Results in N3 Format * * @author niraj */ public class SaveOntologyEventLogAction extends AbstractAction { private static final long serialVersionUID = 4051328924770382905L; public SaveOntologyEventLogAction(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { File selectedFile = askForFile(); if (selectedFile == null) return; try { MainFrame.lockGUI("Saving..."); OntologyEventsLog.exportLog(owlim.getEventsLog(getSesameRepositoryID()), selectedFile); } catch (Exception ex) { ex.printStackTrace(Out.getPrintWriter()); } finally { MainFrame.unlockGUI(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } /** * Export Results in N3 Format * * @author niraj */ public class LoadOntologyEventLogAction extends AbstractAction { private static final long serialVersionUID = 4051328924770382905L; public LoadOntologyEventLogAction(String label) { super(label); } public void actionPerformed(ActionEvent ae) { Runnable runableAction = new Runnable() { public void run() { JFileChooser fileChooser = MainFrame.getFileChooser(); fileChooser.setMultiSelectionEnabled(false); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setDialogTitle("Select event log to load..."); fileChooser.setSelectedFiles(null); int res = fileChooser.showDialog(null, "Load"); File selectedFile = null; if (res == JFileChooser.APPROVE_OPTION) { selectedFile = fileChooser.getSelectedFile(); } if (selectedFile == null) return; try { MainFrame.lockGUI("Loading..."); List<OEvent> events = OntologyEventsLog .importLog(selectedFile); MainFrame.lockGUI("Applying changes..."); for (OEvent e : events) { if (e.getToAdd()) { if (e.getDatatype() == null) { // this is the UUU statement owlim.addStatement(getSesameRepositoryID(), e.getSubject(), e.getPredicate(), e .getObject()); } else { owlim.addStatement(getSesameRepositoryID(), e.getSubject(), e.getPredicate(), e .getObject(), e .getDatatype()); } } else { String subject = e.getSubject(); String predicate = e.getPredicate(); String object = e.getObject(); subject = subject.equals("*") ? null : subject; object = object.equals("*") ? null : object; predicate = predicate.equals("*") ? null : predicate; if (e.getDatatype() == null) { owlim.removeStatement( getSesameRepositoryID(), subject, predicate, object); } else { owlim.removeStatement( getSesameRepositoryID(), subject, predicate, object, e.getDatatype()); } } } } catch (Exception ex) { ex.printStackTrace(); } finally { MainFrame.unlockGUI(); fireOntologyReset(); } } }; Thread thread = new Thread(runableAction, ""); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } } }