From 66a70425069c147bc28ad0c8e77a34b1e96490d3 Mon Sep 17 00:00:00 2001 From: bjl23 Date: Wed, 31 Mar 2010 14:48:44 +0000 Subject: [PATCH] work on NIHVIVO-205 ontology upgrade --- webapp/config/web.xml | 6 ++ .../update/OntologyUpdateSettings.java | 72 +++++++++++++++++++ .../ontology/update/OntologyUpdater.java | 58 +++++++-------- .../servlet/setup/UpdateKnowledgeBase.java | 31 +++++++- 4 files changed, 134 insertions(+), 33 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java diff --git a/webapp/config/web.xml b/webapp/config/web.xml index 271dd8b68..7e2863c67 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -78,6 +78,12 @@ edu.cornell.mannlib.vitro.webapp.servlet.setup.AttachSubmodels + + + + edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase + + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java new file mode 100644 index 000000000..3521d84c9 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java @@ -0,0 +1,72 @@ +package edu.cornell.mannlib.vitro.webapp.ontology.update; + +import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; + +public class OntologyUpdateSettings { + + private String dataDir; + private String askQueryFile; + private String successAssertionsFile; + private String successRDFFormat = "N3"; + private String diffFile; + private String logFile; + private String errorLogFile; + private String removedDataFile; + private OntModelSelector ontModelSelector; + + public String getDataDir() { + return dataDir; + } + public void setDataDir(String dataDir) { + this.dataDir = dataDir; + } + public String getAskQueryFile() { + return askQueryFile; + } + public void setAskQueryFile(String askQueryFile) { + this.askQueryFile = askQueryFile; + } + public String getSuccessAssertionsFile() { + return successAssertionsFile; + } + public void setSuccessAssertionsFile(String successAssertionsFile) { + this.successAssertionsFile = successAssertionsFile; + } + public String getSuccessRDFFormat() { + return successRDFFormat; + } + public void setSuccessRDFFormat(String successRDFFormat) { + this.successRDFFormat = successRDFFormat; + } + public String getDiffFile() { + return diffFile; + } + public void setDiffFile(String diffFile) { + this.diffFile = diffFile; + } + public OntModelSelector getOntModelSelector() { + return ontModelSelector; + } + public String getLogFile() { + return logFile; + } + public void setLogFile(String logFile) { + this.logFile = logFile; + } + public String getErrorLogFile() { + return errorLogFile; + } + public void setErrorLogFile(String errorLogFile) { + this.errorLogFile = errorLogFile; + } + public String getRemovedDataFile() { + return removedDataFile; + } + public void setRemovedDataFile(String removedDataFile) { + this.removedDataFile = removedDataFile; + } + public void setOntModelSelector(OntModelSelector ontModelSelector) { + this.ontModelSelector = ontModelSelector; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java index 736c3ddf9..f057f99e6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java @@ -4,14 +4,13 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.List; -import javax.servlet.ServletContext; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -19,12 +18,9 @@ import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; -import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.shared.Lock; -import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; - /** * Performs knowledge base updates if necessary to align with a * new ontology version. @@ -37,21 +33,14 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; */ public class OntologyUpdater { - private final String DATA_DIR = "/WEB-INF/ontologies/update/"; - private final String ASK_QUERY_FILE = DATA_DIR + "ask.sparql"; - private final String SUCCESS_ASSERTIONS_FILE = DATA_DIR + "success.n3"; - private final String SUCCESS_RDF_FORMAT = "N3"; - private final String DIFF_FILE = DATA_DIR + "diff.tab.txt"; + private final Log log = LogFactory.getLog(OntologyUpdater.class); - private ServletContext context; - private OntModelSelector ontModelSelector; + private OntologyUpdateSettings settings; - public OntologyUpdater(ServletContext context, - OntModelSelector ontModelSelector) { - this.context = context; - this.ontModelSelector = ontModelSelector; + public OntologyUpdater(OntologyUpdateSettings settings) { + this.settings = settings; } public void update() throws IOException { @@ -67,12 +56,12 @@ public class OntologyUpdater { private void performUpdate() { List changes = getAtomicOntologyChanges(); - //preprocessChanges(changes); //updateTBox(changes); + //preprocessChanges(changes); updateABox(changes); - updateAnnotations(); + updateTBoxAnnotations(); // perform additional additions and retractions } @@ -84,10 +73,9 @@ public class OntologyUpdater { private void updateABox(List changes) { // perform operations based on change objects // run additional SPARQL CONSTRUCTS - } - private void updateAnnotations() { + private void updateTBoxAnnotations() { // Stella's code is called here } @@ -96,11 +84,11 @@ public class OntologyUpdater { * needs to be updated to conform to a new ontology version */ private boolean updateRequired() throws IOException { - String sparqlQueryStr = loadSparqlQuery(ASK_QUERY_FILE); + String sparqlQueryStr = loadSparqlQuery(settings.getAskQueryFile()); if (sparqlQueryStr == null) { return false; } - Model m = ontModelSelector.getApplicationMetadataModel(); + Model m = settings.getOntModelSelector().getApplicationMetadataModel(); Query query = QueryFactory.create(sparqlQueryStr); QueryExecution qexec = QueryExecutionFactory.create(query, m); @@ -117,7 +105,7 @@ public class OntologyUpdater { * @return the query string or null if file not found */ private String loadSparqlQuery(String filePath) throws IOException { - File file = new File(context.getRealPath(filePath)); + File file = new File(settings.getAskQueryFile()); if (!file.exists()) { return null; } @@ -130,15 +118,21 @@ public class OntologyUpdater { return fileContents.toString(); } - private void assertSuccess() { - Model m = ontModelSelector.getApplicationMetadataModel(); - InputStream inStream = context.getResourceAsStream(SUCCESS_ASSERTIONS_FILE); - m.enterCriticalSection(Lock.WRITE); - try { - m.read(inStream, SUCCESS_RDF_FORMAT); - } finally { - m.leaveCriticalSection(); - } + private void assertSuccess() throws FileNotFoundException { + try { + Model m = settings.getOntModelSelector().getApplicationMetadataModel(); + File successAssertionsFile = + new File(settings.getSuccessAssertionsFile()); + InputStream inStream = new FileInputStream(successAssertionsFile); + m.enterCriticalSection(Lock.WRITE); + try { + m.read(inStream, settings.getSuccessRDFFormat()); + } finally { + m.leaveCriticalSection(); + } + } catch (Exception e) { + // TODO: log something to the error log + } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java index 40be8b5b8..e2ecbbe63 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java @@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.servlet.setup; import java.io.IOException; +import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -12,6 +13,7 @@ import com.hp.hpl.jena.ontology.OntModel; import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDao; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector; +import edu.cornell.mannlib.vitro.webapp.ontology.update.OntologyUpdateSettings; import edu.cornell.mannlib.vitro.webapp.ontology.update.OntologyUpdater; /** @@ -22,14 +24,41 @@ import edu.cornell.mannlib.vitro.webapp.ontology.update.OntologyUpdater; */ public class UpdateKnowledgeBase implements ServletContextListener { + private final String DATA_DIR = "/WEB-INF/ontologies/update/"; + private final String LOG_DIR = "logs/"; + private final String REMOVED_DATA_DIR = "removedData/"; + private final String ASK_QUERY_FILE = DATA_DIR + "ask.sparql"; + private final String SUCCESS_ASSERTIONS_FILE = DATA_DIR + "success.n3"; + private final String SUCCESS_RDF_FORMAT = "N3"; + private final String DIFF_FILE = DATA_DIR + "diff.tab.txt"; + private final String LOG_FILE = DATA_DIR + LOG_DIR + + "knowledgeBaseUpdate.log"; + private final String ERROR_LOG_FILE = DATA_DIR + LOG_DIR + + "knowledgeBaseUpdate.error.log"; + private final String REMOVED_DATA_FILE = DATA_DIR + REMOVED_DATA_DIR + + "removedData.rdf"; + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + OntModelSelector oms = new SimpleOntModelSelector( (OntModel) sce.getServletContext().getAttribute( JenaBaseDao.ASSERTIONS_ONT_MODEL_ATTRIBUTE_NAME)); + OntologyUpdateSettings settings = new OntologyUpdateSettings(); + settings.setAskQueryFile(ctx.getRealPath(ASK_QUERY_FILE)); + settings.setDataDir(ctx.getRealPath(DATA_DIR)); + settings.setDiffFile(ctx.getRealPath(DIFF_FILE)); + settings.setSuccessAssertionsFile( + ctx.getRealPath(SUCCESS_ASSERTIONS_FILE)); + settings.setSuccessRDFFormat(ctx.getRealPath(SUCCESS_RDF_FORMAT)); + settings.setLogFile(ctx.getRealPath(LOG_FILE)); + settings.setErrorLogFile(ctx.getRealPath(ERROR_LOG_FILE)); + settings.setRemovedDataFile(ctx.getRealPath(REMOVED_DATA_FILE)); + try { - (new OntologyUpdater(sce.getServletContext(), oms)).update(); + (new OntologyUpdater(settings)).update(); } catch (IOException ioe) { throw new RuntimeException("IOException updating knowledge base " + "for ontology changes", ioe);