NIHVIVO-1843 KB Migration must happen in RDB mode

This commit is contained in:
sjm222 2011-02-03 20:52:26 +00:00
parent 40de34558a
commit 304a1c7b1e
5 changed files with 110 additions and 50 deletions

View file

@ -305,8 +305,8 @@ public class KnowledgeBaseUpdater {
* @param filePath * @param filePath
* @return the query string or null if file not found * @return the query string or null if file not found
*/ */
private String loadSparqlQuery(String filePath) throws IOException { public static String loadSparqlQuery(String filePath) throws IOException {
File file = new File(settings.getAskQueryFile()); File file = new File(filePath);
if (!file.exists()) { if (!file.exists()) {
return null; return null;
} }

View file

@ -257,13 +257,15 @@ public class TBoxUpdater {
siteModel.remove(actualRetractions); siteModel.remove(actualRetractions);
record.recordRetractions(actualRetractions); record.recordRetractions(actualRetractions);
long numAdded = actualAdditions.size();
long numRemoved = actualRetractions.size();
// log summary of changes // log summary of changes
if (actualAdditions.size() > 0) { if (numAdded > 0) {
logger.log("Updated the default vitro annotation value for " + logger.log("Updated the default vitro annotation value for " +
actualAdditions.size() + " statements in the knowledge base"); numAdded + " statements in the knowledge base");
} }
long numRemoved = actualRetractions.size() - actualAdditions.size();
if (numRemoved > 0) { if (numRemoved > 0) {
logger.log("Removed " + numRemoved + logger.log("Removed " + numRemoved +
" outdated vitro annotation property setting" + ((numRemoved > 1) ? "s" : "") + " from the knowledge base"); " outdated vitro annotation property setting" + ((numRemoved > 1) ? "s" : "") + " from the knowledge base");

View file

@ -29,6 +29,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDaoCon; import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDaoCon;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaModelUtils; import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaModelUtils;
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
import edu.cornell.mannlib.vitro.webapp.dao.jena.SearchReindexingListener; import edu.cornell.mannlib.vitro.webapp.dao.jena.SearchReindexingListener;
import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker;
@ -45,22 +46,22 @@ public class JenaDataSourceSetup extends JenaDataSourceSetupBase implements java
public void contextInitialized(ServletContextEvent sce) { public void contextInitialized(ServletContextEvent sce) {
String tripleStoreTypeStr =
ConfigurationProperties.getProperty(
"VitroConnection.DataSource.tripleStoreType", "RDB");
if ("SDB".equals(tripleStoreTypeStr)) {
(new JenaDataSourceSetupSDB()).contextInitialized(sce);
return;
}
if (AbortStartup.isStartupAborted(sce.getServletContext())) { if (AbortStartup.isStartupAborted(sce.getServletContext())) {
return; return;
} }
try { try {
String tripleStoreTypeStr =
ConfigurationProperties.getProperty(
"VitroConnection.DataSource.tripleStoreType", "RDB");
//FIXME improve
if ("SDB".equals(tripleStoreTypeStr)) {
(new JenaDataSourceSetupSDB()).contextInitialized(sce);
return;
}
OntModel memModel = (OntModel) sce.getServletContext().getAttribute("jenaOntModel"); OntModel memModel = (OntModel) sce.getServletContext().getAttribute("jenaOntModel");
if (memModel == null) { if (memModel == null) {
memModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); memModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC);
@ -96,19 +97,19 @@ public class JenaDataSourceSetup extends JenaDataSourceSetupBase implements java
WebappDaoFactory baseWadf = new WebappDaoFactoryJena( WebappDaoFactory baseWadf = new WebappDaoFactoryJena(
baseOms, defaultNamespace, null, null); baseOms, defaultNamespace, null, null);
sce.getServletContext().setAttribute("assertionsWebappDaoFactory",baseWadf); sce.getServletContext().setAttribute("assertionsWebappDaoFactory",baseWadf);
sce.getServletContext().setAttribute("baseOntModelSelector", baseOms); ModelContext.setBaseOntModelSelector(baseOms, sce.getServletContext());
sce.getServletContext().setAttribute("inferenceOntModel", inferenceModel); sce.getServletContext().setAttribute("inferenceOntModel", inferenceModel);
WebappDaoFactory infWadf = new WebappDaoFactoryJena( WebappDaoFactory infWadf = new WebappDaoFactoryJena(
inferenceOms, defaultNamespace, null, null); inferenceOms, defaultNamespace, null, null);
sce.getServletContext().setAttribute("deductionsWebappDaoFactory", infWadf); sce.getServletContext().setAttribute("deductionsWebappDaoFactory", infWadf);
sce.getServletContext().setAttribute("inferenceOntModelSelector", inferenceOms); ModelContext.setInferenceOntModelSelector(inferenceOms, sce.getServletContext());
sce.getServletContext().setAttribute("jenaOntModel", unionModel); sce.getServletContext().setAttribute("jenaOntModel", unionModel);
WebappDaoFactory wadf = new WebappDaoFactoryJena( WebappDaoFactory wadf = new WebappDaoFactoryJena(
unionOms, baseOms, inferenceOms, defaultNamespace, null, null); unionOms, baseOms, inferenceOms, defaultNamespace, null, null);
sce.getServletContext().setAttribute("webappDaoFactory",wadf); sce.getServletContext().setAttribute("webappDaoFactory",wadf);
sce.getServletContext().setAttribute("unionOntModelSelector", unionOms); ModelContext.setUnionOntModelSelector(unionOms, sce.getServletContext());
ApplicationBean appBean = getApplicationBeanFromOntModel(memModel,wadf); ApplicationBean appBean = getApplicationBeanFromOntModel(memModel,wadf);
if (appBean != null) { if (appBean != null) {

View file

@ -2,6 +2,7 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup; package edu.cornell.mannlib.vitro.webapp.servlet.setup;
import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -51,6 +52,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSDBModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSDBModelMaker;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB;
import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater;
import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper; import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper;
import edu.cornell.mannlib.vitro.webapp.utils.jena.InitialJenaModelUtils; import edu.cornell.mannlib.vitro.webapp.utils.jena.InitialJenaModelUtils;
import edu.cornell.mannlib.vitro.webapp.utils.jena.NamespaceMapperJena; import edu.cornell.mannlib.vitro.webapp.utils.jena.NamespaceMapperJena;
@ -73,6 +75,15 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
// that it is not executed in a post-sdb-conversion environment. // that it is not executed in a post-sdb-conversion environment.
OntModel memModel = (OntModel) sce.getServletContext().getAttribute("jenaOntModel"); OntModel memModel = (OntModel) sce.getServletContext().getAttribute("jenaOntModel");
if ( updateRequired(sce.getServletContext(), memModel)) {
log.error(getMigrationErrString());
System.out.println(getMigrationErrString());
// The rest of the application should not
// start if this condition is encountered
AbortStartup.abortStartup(sce.getServletContext());
throw new MigrationRequiredError(getMigrationErrString());
}
if (memModel == null) { if (memModel == null) {
memModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC); memModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC);
log.warn("WARNING: no database connected. Changes will disappear after context restart."); log.warn("WARNING: no database connected. Changes will disappear after context restart.");
@ -255,12 +266,12 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
unionOms.setFullModel(masterUnion); unionOms.setFullModel(masterUnion);
sce.getServletContext().setAttribute("jenaOntModel", masterUnion); sce.getServletContext().setAttribute("jenaOntModel", masterUnion);
WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, bds, storeDesc, defaultNamespace, null, null); WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, bds, storeDesc, defaultNamespace, null, null);
//WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, dataset, defaultNamespace, null, null);
sce.getServletContext().setAttribute("webappDaoFactory",wadf); sce.getServletContext().setAttribute("webappDaoFactory",wadf);
sce.getServletContext().setAttribute("unionOntModelSelector", unionOms); //assertions and inferences ModelContext.setUnionOntModelSelector(unionOms, sce.getServletContext()); // assertions and inferences
sce.getServletContext().setAttribute("baseOntModelSelector", baseOms); //assertions ModelContext.setBaseOntModelSelector(baseOms, sce.getServletContext()); // assertions
sce.getServletContext().setAttribute("inferenceOntModelSelector", inferenceOms); //inferences ModelContext.setInferenceOntModelSelector(inferenceOms, sce.getServletContext()); // inferences
ApplicationBean appBean = getApplicationBeanFromOntModel(unionOms.getFullModel(),wadf); ApplicationBean appBean = getApplicationBeanFromOntModel(unionOms.getFullModel(),wadf);
if (appBean != null) { if (appBean != null) {
sce.getServletContext().setAttribute("applicationBean", appBean); sce.getServletContext().setAttribute("applicationBean", appBean);
@ -302,6 +313,8 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
log.info("Model makers set up"); log.info("Model makers set up");
} catch (MigrationRequiredError mre) {
throw new MigrationRequiredError(mre.getMessage());
} catch (Throwable t) { } catch (Throwable t) {
log.error("Throwable in " + this.getClass().getName(), t); log.error("Throwable in " + this.getClass().getName(), t);
// printing the error because Tomcat doesn't print context listener // printing the error because Tomcat doesn't print context listener
@ -645,4 +658,46 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
return (Store) ctx.getAttribute(STORE_ATTR); return (Store) ctx.getAttribute(STORE_ATTR);
} }
/**
* Executes a SPARQL ASK query to determine whether the knowledge base
* needs to be updated to conform to a new ontology version
*/
public boolean updateRequired(ServletContext ctx, OntModel m) throws IOException {
String sparqlQueryStr = KnowledgeBaseUpdater.loadSparqlQuery(UpdateKnowledgeBase.getAskQueryPath(ctx));
if (sparqlQueryStr == null) {
return false;
}
Query query = QueryFactory.create(sparqlQueryStr);
QueryExecution qexec = QueryExecutionFactory.create(query, m);
// if the ASK query DOES have a solution (i.e. the assertions exist
// showing that the update has already been performed), then the update
// is NOT required.
return !qexec.execAsk();
}
private String getMigrationErrString() {
String errMessage = "\n*******************************************************************";
errMessage += "\nA knowledge base migration is " +
"required and this must be done in" +
" RDB mode before converting to SDB. " +
"Please change deploy.properties to" +
" use RDB mode, redeploy, and restart. After " +
"the knowledge base migration has completed " +
"successfully, change deploy.properties to use " +
"SDB mode, redeploy, and restart.\n";
errMessage += "*******************************************************************";
return errMessage;
}
private class MigrationRequiredError extends Error {
public MigrationRequiredError(String string) {
super(string);
}
}
} }

View file

@ -29,8 +29,8 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDao; 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.OntModelSelector;
import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector;
import edu.cornell.mannlib.vitro.webapp.ontology.update.UpdateSettings;
import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater; import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater;
import edu.cornell.mannlib.vitro.webapp.ontology.update.UpdateSettings;
import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup; import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup;
/** /**
@ -43,25 +43,25 @@ public class UpdateKnowledgeBase implements ServletContextListener {
private final static Log log = LogFactory.getLog(UpdateKnowledgeBase.class); private final static Log log = LogFactory.getLog(UpdateKnowledgeBase.class);
private final String DATA_DIR = "/WEB-INF/ontologies/update/"; private static final String DATA_DIR = "/WEB-INF/ontologies/update/";
private final String LOG_DIR = "logs/"; private static final String LOG_DIR = "logs/";
private final String CHANGED_DATA_DIR = "changedData/"; private static final String CHANGED_DATA_DIR = "changedData/";
private final String ASK_QUERY_FILE = DATA_DIR + "ask.sparql"; private static final String ASK_QUERY_FILE = DATA_DIR + "ask.sparql";
private final String SUCCESS_ASSERTIONS_FILE = DATA_DIR + "success.n3"; private static final String SUCCESS_ASSERTIONS_FILE = DATA_DIR + "success.n3";
private final String SUCCESS_RDF_FORMAT = "N3"; private static final String SUCCESS_RDF_FORMAT = "N3";
private final String DIFF_FILE = DATA_DIR + "diff.tab.txt"; private static final String DIFF_FILE = DATA_DIR + "diff.tab.txt";
private final String LOG_FILE = DATA_DIR + LOG_DIR + "knowledgeBaseUpdate.log"; private static final String LOG_FILE = DATA_DIR + LOG_DIR + "knowledgeBaseUpdate.log";
private final String ERROR_LOG_FILE = DATA_DIR + LOG_DIR + "knowledgeBaseUpdate.error.log"; private static final String ERROR_LOG_FILE = DATA_DIR + LOG_DIR + "knowledgeBaseUpdate.error.log";
private final String REMOVED_DATA_FILE = DATA_DIR + CHANGED_DATA_DIR + "removedData.n3"; private static final String REMOVED_DATA_FILE = DATA_DIR + CHANGED_DATA_DIR + "removedData.n3";
private final String ADDED_DATA_FILE = DATA_DIR + CHANGED_DATA_DIR + "addedData.n3"; private static final String ADDED_DATA_FILE = DATA_DIR + CHANGED_DATA_DIR + "addedData.n3";
private final String SPARQL_CONSTRUCT_ADDITIONS_DIR = DATA_DIR + "sparqlConstructs/additions/"; private static final String SPARQL_CONSTRUCT_ADDITIONS_DIR = DATA_DIR + "sparqlConstructs/additions/";
private final String SPARQL_CONSTRUCT_ADDITIONS_PASS2_DIR = DATA_DIR + "sparqlConstructs/additions-pass2/"; private static final String SPARQL_CONSTRUCT_ADDITIONS_PASS2_DIR = DATA_DIR + "sparqlConstructs/additions-pass2/";
private final String SPARQL_CONSTRUCT_DELETIONS_DIR = DATA_DIR + "sparqlConstructs/deletions/"; private static final String SPARQL_CONSTRUCT_DELETIONS_DIR = DATA_DIR + "sparqlConstructs/deletions/";
private final String MISC_REPLACEMENTS_FILE = DATA_DIR + "miscReplacements.rdf"; private static final String MISC_REPLACEMENTS_FILE = DATA_DIR + "miscReplacements.rdf";
private final String OLD_TBOX_MODEL_DIR = DATA_DIR + "oldVersion/"; private static final String OLD_TBOX_MODEL_DIR = DATA_DIR + "oldVersion/";
private final String NEW_TBOX_MODEL_DIR = "/WEB-INF/submodels/"; private static final String NEW_TBOX_MODEL_DIR = "/WEB-INF/submodels/";
private final String OLD_TBOX_ANNOTATIONS_DIR = DATA_DIR + "oldAnnotations/"; private static final String OLD_TBOX_ANNOTATIONS_DIR = DATA_DIR + "oldAnnotations/";
private final String NEW_TBOX_ANNOTATIONS_DIR = "/WEB-INF/ontologies/user"; private static final String NEW_TBOX_ANNOTATIONS_DIR = "/WEB-INF/ontologies/user";
public void contextInitialized(ServletContextEvent sce) { public void contextInitialized(ServletContextEvent sce) {
@ -73,12 +73,10 @@ public class UpdateKnowledgeBase implements ServletContextListener {
ServletContext ctx = sce.getServletContext(); ServletContext ctx = sce.getServletContext();
OntModelSelector oms = new SimpleOntModelSelector( OntModelSelector oms = new SimpleOntModelSelector((OntModel) sce.getServletContext().getAttribute(JenaBaseDao.ASSERTIONS_ONT_MODEL_ATTRIBUTE_NAME));
(OntModel) sce.getServletContext().getAttribute(
JenaBaseDao.ASSERTIONS_ONT_MODEL_ATTRIBUTE_NAME));
UpdateSettings settings = new UpdateSettings(); UpdateSettings settings = new UpdateSettings();
settings.setAskQueryFile(ctx.getRealPath(ASK_QUERY_FILE)); settings.setAskQueryFile(getAskQueryPath(ctx));
settings.setDataDir(ctx.getRealPath(DATA_DIR)); settings.setDataDir(ctx.getRealPath(DATA_DIR));
settings.setSparqlConstructAdditionsDir(ctx.getRealPath(SPARQL_CONSTRUCT_ADDITIONS_DIR)); settings.setSparqlConstructAdditionsDir(ctx.getRealPath(SPARQL_CONSTRUCT_ADDITIONS_DIR));
settings.setSparqlConstructAdditionsPass2Dir(ctx.getRealPath(SPARQL_CONSTRUCT_ADDITIONS_PASS2_DIR)); settings.setSparqlConstructAdditionsPass2Dir(ctx.getRealPath(SPARQL_CONSTRUCT_ADDITIONS_PASS2_DIR));
@ -238,4 +236,8 @@ public class UpdateKnowledgeBase implements ServletContextListener {
// nothing to do // nothing to do
} }
public static String getAskQueryPath(ServletContext ctx) {
return ctx.getRealPath(ASK_QUERY_FILE);
}
} }