From 500bb456c34a6b678a6274b707f76eca03463c11 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Fri, 20 Sep 2013 15:41:45 -0400 Subject: [PATCH] changing behavior of reasoning wrt migration --- .../webapp/ontology/update/ChangeRecord.java | 2 + .../ontology/update/KnowledgeBaseUpdater.java | 4 +- .../ontology/update/SimpleChangeRecord.java | 10 +++- .../servlet/setup/SimpleReasonerSetup.java | 52 ++++++------------- .../servlet/setup/UpdateKnowledgeBase.java | 44 ++++++++++++++-- .../WEB-INF/resources/startup_listeners.txt | 4 +- 6 files changed, 70 insertions(+), 46 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java index 8845e1f43..3c9029839 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java @@ -12,4 +12,6 @@ public interface ChangeRecord { public void writeChanges(); + public boolean hasRecordedChanges(); + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index 1dd5012b5..6f46af050 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -57,7 +57,7 @@ public class KnowledgeBaseUpdater { this.record = new SimpleChangeRecord(settings.getAddedDataFile(), settings.getRemovedDataFile()); } - public void update(ServletContext servletContext) throws IOException { + public boolean update(ServletContext servletContext) throws IOException { if (this.logger == null) { this.logger = new SimpleChangeLogger(settings.getLogFile(), settings.getErrorLogFile()); @@ -85,7 +85,7 @@ public class KnowledgeBaseUpdater { long elapsedSecs = (System.currentTimeMillis() - startTime)/1000; log.info("Finished knowledge base migration in " + elapsedSecs + " second" + (elapsedSecs != 1 ? "s" : "")); - return; + return record.hasRecordedChanges(); } private void performUpdate(ServletContext servletContext) throws Exception { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java index d0ca316e0..78a5c6ba7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java @@ -26,6 +26,9 @@ public class SimpleChangeRecord implements ChangeRecord { private File additionsFile; private File retractionsFile; + private int additionsCount = 0; + private int retractionsCount = 0; + public SimpleChangeRecord( String additionsFile, String retractionsFile) { this.additionsFile = new File(additionsFile); @@ -46,11 +49,12 @@ public class SimpleChangeRecord implements ChangeRecord { public void recordAdditions(Model incrementalAdditions) { additionsModel.add(incrementalAdditions); - + additionsCount += incrementalAdditions.size(); } public void recordRetractions(Model incrementalRetractions) { retractionsModel.add(incrementalRetractions); + retractionsCount += incrementalRetractions.size(); } private void write(Model model, File file) { @@ -71,5 +75,9 @@ public class SimpleChangeRecord implements ChangeRecord { write(retractionsModel, retractionsFile); } } + + public boolean hasRecordedChanges() { + return additionsCount > 0 || retractionsCount > 0; + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java index 8620dbc7e..c5b6cbf3d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java @@ -110,19 +110,6 @@ public class SimpleReasonerSetup implements ServletContextListener { } simpleReasoner.setPluginList(pluginList); - - if (isRecomputeRequired(sce.getServletContext())) { - log.info("ABox inference recompute required."); - waitForTBoxReasoning(pelletListener); - if (JenaDataSourceSetupBase.isFirstStartup()) { - simpleReasoner.recompute(); - } else { - log.info("starting ABox inference recompute in a separate thread."); - new Thread(new ABoxRecomputer(simpleReasoner),"ABoxRecomputer").start(); - } - - } - SimpleReasonerTBoxListener simpleReasonerTBoxListener = new SimpleReasonerTBoxListener(simpleReasoner); sce.getServletContext().setAttribute(SimpleReasonerTBoxListener.class.getName(),simpleReasonerTBoxListener); assertionsOms.getTBoxModel().register(simpleReasonerTBoxListener); @@ -135,17 +122,21 @@ public class SimpleReasonerSetup implements ServletContextListener { } } - private void waitForTBoxReasoning(PelletListener pelletListener) + public static void waitForTBoxReasoning(ServletContextEvent sce) throws InterruptedException { - int sleeps = 0; - // sleep at least once to make sure the TBox reasoning gets started - while ((0 == sleeps) || ((sleeps < 1000) && pelletListener.isReasoning())) { - if ((sleeps % 10) == 0) { // print message at 10 second intervals - log.info("Waiting for initial TBox reasoning to complete"); - } - Thread.sleep(1000); - sleeps++; - } + PelletListener pelletListener = (PelletListener) sce.getServletContext().getAttribute("pelletListener"); + if (pelletListener == null) { + return ; + } + int sleeps = 0; + // sleep at least once to make sure the TBox reasoning gets started + while ((0 == sleeps) || ((sleeps < 1000) && pelletListener.isReasoning())) { + if ((sleeps % 10) == 0) { // print message at 10 second intervals + log.info("Waiting for initial TBox reasoning to complete"); + } + Thread.sleep(1000); + sleeps++; + } } @Override @@ -193,7 +184,7 @@ public class SimpleReasonerSetup implements ServletContextListener { ctx.setAttribute(RECOMPUTE_REQUIRED_ATTR, true); } - private static boolean isRecomputeRequired(ServletContext ctx) { + public static boolean isRecomputeRequired(ServletContext ctx) { return (ctx.getAttribute(RECOMPUTE_REQUIRED_ATTR) != null); } @@ -207,19 +198,6 @@ public class SimpleReasonerSetup implements ServletContextListener { private static boolean isMSTComputeRequired(ServletContext ctx) { return (ctx.getAttribute(MSTCOMPUTE_REQUIRED_ATTR) != null); } - - private class ABoxRecomputer implements Runnable { - - private SimpleReasoner simpleReasoner; - - public ABoxRecomputer(SimpleReasoner simpleReasoner) { - this.simpleReasoner = simpleReasoner; - } - - public void run() { - simpleReasoner.recompute(); - } - } /** * Read the names of the plugin classes classes. 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 a218a8dfa..f24e62632 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 @@ -41,9 +41,9 @@ import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater; import edu.cornell.mannlib.vitro.webapp.ontology.update.UpdateSettings; -import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; -import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.reasoner.ABoxRecomputer; +import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; /** @@ -76,11 +76,15 @@ public class UpdateKnowledgeBase implements ServletContextListener { ServletContext ctx = sce.getServletContext(); StartupStatus ss = StartupStatus.getBean(ctx); + boolean migrationChangesMade = false; + try { UpdateSettings settings = new UpdateSettings(); putReportingPathsIntoSettings(ctx, settings); putNonReportingPathsIntoSettings(ctx, settings); + SimpleReasonerSetup.waitForTBoxReasoning(sce); + WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); settings.setDefaultNamespace(wadf.getDefaultNamespace()); settings.setAssertionOntModelSelector(ModelAccess.on(ctx).getBaseOntModelSelector()); @@ -132,14 +136,14 @@ public class UpdateKnowledgeBase implements ServletContextListener { try { KnowledgeBaseUpdater ontologyUpdater = new KnowledgeBaseUpdater(settings); - + try { if (!ontologyUpdater.updateRequired(ctx)) { log.info("No data migration required."); } else { ctx.setAttribute(KBM_REQURIED_AT_STARTUP, Boolean.TRUE); log.info("Data migration required"); - ontologyUpdater.update(ctx); + migrationChangesMade = ontologyUpdater.update(ctx); if (tryMigrateDisplay) { try { migrateDisplayModel(settings); @@ -161,8 +165,40 @@ public class UpdateKnowledgeBase implements ServletContextListener { } catch (Throwable t) { ss.fatal(this, "Exception updating knowledge base for ontology changes: ", t); } + + if (SimpleReasonerSetup.isRecomputeRequired(sce.getServletContext())) { + log.info("ABox inference recompute required."); + + SimpleReasoner simpleReasoner = (SimpleReasoner) sce.getServletContext() + .getAttribute(SimpleReasoner.class.getName()); + if (simpleReasoner != null) { + if (JenaDataSourceSetupBase.isFirstStartup() || migrationChangesMade) { + simpleReasoner.recompute(); + } else { + log.info("starting ABox inference recompute in a separate thread."); + new Thread( + new ABoxRecomputer( + simpleReasoner),"ABoxRecomputer").start(); + } + } + + } + } + private class ABoxRecomputer implements Runnable { + + private SimpleReasoner simpleReasoner; + + public ABoxRecomputer(SimpleReasoner simpleReasoner) { + this.simpleReasoner = simpleReasoner; + } + + public void run() { + simpleReasoner.recompute(); + } + } + /** * Set the paths for the files that specify how to perform the update diff --git a/webapp/web/WEB-INF/resources/startup_listeners.txt b/webapp/web/WEB-INF/resources/startup_listeners.txt index 98a3fac21..657915abc 100644 --- a/webapp/web/WEB-INF/resources/startup_listeners.txt +++ b/webapp/web/WEB-INF/resources/startup_listeners.txt @@ -25,8 +25,6 @@ edu.cornell.mannlib.vitro.webapp.servlet.setup.UserModelSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.ContentModelSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.ModelMakerSetup -edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase - edu.cornell.mannlib.vitro.webapp.filestorage.backend.FileStorageSetup edu.cornell.mannlib.vitro.webapp.web.images.PlaceholderUtil$Setup @@ -38,6 +36,8 @@ edu.cornell.mannlib.vitro.webapp.servlet.setup.FileGraphSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.SimpleReasonerSetup +edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase + # Must run after JenaDataSourceSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.ThemeInfoSetup