From e1bc8971547c3237786f8d83bed4a28bdbd10a86 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Fri, 18 Jul 2014 17:19:52 -0400 Subject: [PATCH] VIVO-823 Adjust these classes to use the new ModelMakers, as much as possible. There are commented Kluges in RequestModelsPrep and ModelAccess, where things still are not as clean as they should be. --- .../controller/jena/JenaIngestController.java | 12 +- .../mannlib/vitro/webapp/dao/ModelAccess.java | 70 ++++--- .../dao/jena/VitroInterceptingModelMaker.java | 171 ---------------- .../vitro/webapp/filters/ModelSwitcher.java | 2 +- .../webapp/filters/RequestModelsPrep.java | 184 +++++++++--------- .../vitro/webapp/reasoner/SimpleReasoner.java | 5 +- .../setup/ConfigurationModelsSetup.java | 46 +---- .../servlet/setup/ContentModelSetup.java | 81 ++------ .../webapp/servlet/setup/FileGraphSetup.java | 57 +++--- .../servlet/setup/SimpleReasonerSetup.java | 19 +- 10 files changed, 219 insertions(+), 428 deletions(-) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroInterceptingModelMaker.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaIngestController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaIngestController.java index add10b116..74c19d191 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaIngestController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaIngestController.java @@ -67,6 +67,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID; import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao; +import edu.cornell.mannlib.vitro.webapp.dao.jena.BlankNodeFilteringModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; @@ -74,6 +75,7 @@ import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService; import edu.cornell.mannlib.vitro.webapp.utils.SparqlQueryUtils; import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils; import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils.MergeResult; @@ -1204,9 +1206,15 @@ public class JenaIngestController extends BaseEditController { protected static ModelMaker getModelMaker(HttpServletRequest req){ ServletContext ctx = req.getSession().getServletContext(); if (isUsingMainStoreForIngest(req)) { - return ModelAccess.on(ctx).getModelMaker(CONTENT); + RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx, + WhichService.CONTENT).getRDFService(); + return new BlankNodeFilteringModelMaker(rdfService, ModelAccess.on( + ctx).getModelMaker(CONTENT)); } else { - return ModelAccess.on(ctx).getModelMaker(CONFIGURATION); + RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx, + WhichService.CONFIGURATION).getRDFService(); + return new BlankNodeFilteringModelMaker(rdfService, ModelAccess.on( + ctx).getModelMaker(CONFIGURATION)); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java index 75e8d2640..7a262012e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java @@ -16,6 +16,8 @@ import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.rdf.model.ModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; +import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; /** * Hierarchical storage for models. TODO @@ -140,34 +142,18 @@ public class ModelAccess { return getOntModel(ModelID.APPLICATION_METADATA); } - public void setUserAccountsModel(OntModel m) { - setOntModel(ModelID.USER_ACCOUNTS, m); - } - public OntModel getUserAccountsModel() { return getOntModel(ModelID.USER_ACCOUNTS); } - public void setDisplayModel(OntModel m) { - setOntModel(ModelID.DISPLAY, m); - } - public OntModel getDisplayModel() { return getOntModel(ModelID.DISPLAY); } - public void setJenaOntModel(OntModel m) { - setOntModel(ModelID.UNION_FULL, m); - } - public OntModel getJenaOntModel() { return getOntModel(ModelID.UNION_FULL); } - public void setBaseOntModel(OntModel m) { - setOntModel(ModelID.BASE_FULL, m); - } - public OntModel getBaseOntModel() { return getOntModel(ModelID.BASE_FULL); } @@ -184,10 +170,6 @@ public class ModelAccess { } } - public void removeOntModel(ModelID id) { - setOntModel(id, null); - } - public OntModel getOntModel(ModelID id) { if (modelMap.containsKey(id)) { log.debug("Using " + id + " model from " + scope); @@ -284,20 +266,60 @@ public class ModelAccess { } public void setModelMaker(ModelMakerID id, ModelMaker modelMaker) { - if (modelMaker == null) { - modelMakerMap.remove(id); + modelMakerMap.put(id, modelMaker); + if (id == ModelMakerID.CONFIGURATION) { + setOntModel(ModelID.USER_ACCOUNTS, modelMaker, + ModelNames.USER_ACCOUNTS); + setOntModel(ModelID.DISPLAY, modelMaker, ModelNames.DISPLAY); + setOntModel(ModelID.DISPLAY_DISPLAY, modelMaker, + ModelNames.DISPLAY_DISPLAY); + setOntModel(ModelID.DISPLAY_TBOX, modelMaker, + ModelNames.DISPLAY_TBOX); } else { - modelMakerMap.put(id, modelMaker); + setOntModel(ModelID.APPLICATION_METADATA, modelMaker, + ModelNames.APPLICATION_METADATA); + setOntModel(ModelID.BASE_TBOX, modelMaker, + ModelNames.TBOX_ASSERTIONS); + setOntModel(ModelID.INFERRED_TBOX, modelMaker, + ModelNames.TBOX_INFERENCES); + setOntModel(ModelID.UNION_TBOX, modelMaker, ModelNames.TBOX_UNION); + setOntModel(ModelID.BASE_ABOX, modelMaker, + ModelNames.ABOX_ASSERTIONS); + setOntModel(ModelID.INFERRED_ABOX, modelMaker, + ModelNames.ABOX_INFERENCES); + setOntModel(ModelID.UNION_ABOX, modelMaker, ModelNames.ABOX_UNION); + setOntModel(ModelID.BASE_FULL, modelMaker, + ModelNames.FULL_ASSERTIONS); + setOntModel(ModelID.INFERRED_FULL, modelMaker, + ModelNames.FULL_INFERENCES); + setOntModel(ModelID.UNION_FULL, modelMaker, ModelNames.FULL_UNION); + + /* + * KLUGE + * + * For some reason, the union of two OntModels (like this) works + * fine as the UNION_TBOX, but an OntModel wrapped around the union + * of two Models (from ModelMakers) does not work. + * + * See also the Kluge in RequestModelsPrep. + */ + setOntModel(ModelID.UNION_TBOX, VitroModelFactory.createUnion( + getOntModel(ModelID.BASE_TBOX), + getOntModel(ModelID.INFERRED_TBOX))); } } + private void setOntModel(ModelID id, ModelMaker mm, String uri) { + setOntModel(id, VitroModelFactory.createOntologyModel(mm.getModel(uri))); + } + // ---------------------------------------------------------------------- // Close all locally stored models, WADFs, etc. // ---------------------------------------------------------------------- public void close() { if (this.scope == Scope.REQUEST) { - for (WebappDaoFactory wadf: factoryMap.values()) { + for (WebappDaoFactory wadf : factoryMap.values()) { wadf.close(); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroInterceptingModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroInterceptingModelMaker.java deleted file mode 100644 index 06b57a56c..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroInterceptingModelMaker.java +++ /dev/null @@ -1,171 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.dao.jena; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import com.hp.hpl.jena.graph.GraphMaker; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelMaker; -import com.hp.hpl.jena.rdf.model.ModelReader; -import com.hp.hpl.jena.shared.AlreadyExistsException; -import com.hp.hpl.jena.util.iterator.ExtendedIterator; -import com.hp.hpl.jena.util.iterator.NiceIterator; - -/** - * A decorator on top of a model maker. It looks for requests on particular - * URIs, and shunts them to the pre-made models on ModelAccess. - * - * The result is two-fold: - * - * We have effective URIs for models that only exist as combinations of other - * named models (UNION_FULL, BASE_FULL, INFERRED_FULL). - * - * For models with in-memory mapping, a request will return a reference to that - * mapping. - */ -public class VitroInterceptingModelMaker implements ModelMaker { - private final ModelMaker innerMM; - private final Map specialMap; - - public VitroInterceptingModelMaker(ModelMaker innerMM, Map specialMap) { - this.innerMM = innerMM; - this.specialMap = Collections.unmodifiableMap(new HashMap<>(specialMap)); - } - - @Override - public Model getModel(String url) { - return isSpecial(url) ? getSpecial(url) : innerMM.getModel(url); - } - - @Override - public Model getModel(String url, ModelReader loadIfAbsent) { - return isSpecial(url) ? getSpecial(url) : innerMM.getModel(url, - loadIfAbsent); - } - - @Override - public Model createDefaultModel() { - return innerMM.createDefaultModel(); - } - - @Override - public Model createFreshModel() { - return innerMM.createFreshModel(); - } - - @Override - public Model openModel(String name) { - return isSpecial(name) ? getSpecial(name) : innerMM.openModel(name); - } - - @Override - public Model openModelIfPresent(String name) { - return isSpecial(name) ? getSpecial(name) : innerMM - .openModelIfPresent(name); - } - - @Override - public void close() { - innerMM.close(); - } - - @Override - public Model createModel(String name) { - return isSpecial(name) ? getSpecial(name) : innerMM.createModel(name); - } - - @Override - public Model createModel(String name, boolean strict) { - if (isSpecial(name)) { - if (strict) { - throw new AlreadyExistsException(name); - } else { - return getSpecial(name); - } - } else { - return innerMM.createModel(name, strict); - } - } - - /** - * TODO this should actually return an intercepting graph maker. - */ - @Override - public GraphMaker getGraphMaker() { - return innerMM.getGraphMaker(); - } - - @Override - public boolean hasModel(String name) { - return isSpecial(name) || innerMM.hasModel(name); - } - - @Override - public ExtendedIterator listModels() { - return new SetsExtendedIterator(getSpecialNames(), innerMM.listModels() - .toSet()); - } - - @Override - public Model openModel(String name, boolean strict) { - return isSpecial(name) ? getSpecial(name) : innerMM.openModel(name, - strict); - } - - /** - * We don't lete anyone remove the special models. - */ - @Override - public void removeModel(String name) { - if (!isSpecial(name)) { - innerMM.removeModel(name); - } - } - - // ---------------------------------------------------------------------- - // Intercepting mechanism - // ---------------------------------------------------------------------- - - private Collection getSpecialNames() { - return specialMap.keySet(); - } - - private boolean isSpecial(String url) { - return specialMap.containsKey(url); - } - - private Model getSpecial(String url) { - return specialMap.get(url); - } - - private static class SetsExtendedIterator extends NiceIterator { - private final Iterator iter; - - @SafeVarargs - public SetsExtendedIterator(Collection... collections) { - Set set = new TreeSet<>(); - for (Collection c : collections) { - set.addAll(c); - } - this.iter = set.iterator(); - } - - @Override - public boolean hasNext() { - return iter.hasNext(); - } - - @Override - public String next() { - return iter.next(); - } - - } -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java index b1de19092..5d4d14ea2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java @@ -121,7 +121,7 @@ public class ModelSwitcher { private void setSpecialWriteModel(VitroRequest vreq, OntModel mainOntModel) { if (mainOntModel != null) { - ModelAccess.on(vreq).setJenaOntModel(mainOntModel); + ModelAccess.on(vreq).setOntModel(ModelID.UNION_FULL, mainOntModel); vreq.setAttribute(SPECIAL_WRITE_MODEL, mainOntModel); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java index a74791f55..3ad13dab3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java @@ -2,6 +2,9 @@ package edu.cornell.mannlib.vitro.webapp.filters; +import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONFIGURATION; +import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONTENT; + import java.io.IOException; import java.text.Collator; import java.util.Enumeration; @@ -27,7 +30,7 @@ import org.apache.jena.atlas.lib.Pair; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.query.Dataset; -//import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.ModelMaker; import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers; import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList; @@ -47,12 +50,12 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB.SDBDatasetMode; -import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerUtils; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; -import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService; /** * This sets up several objects in the Request scope for each incoming HTTP @@ -142,22 +145,23 @@ public class RequestModelsPrep implements Filter { setRdfServicesAndDatasets(rawRdfService, vreq); + setRawModels(vreq); + RDFService rdfService = vreq.getRDFService(); - Dataset dataset = vreq.getDataset(); - - setRawModels(vreq, dataset); - - // We need access to some language-neutral items - either because we need to see all - // contents regardless of language, or because we need to see the blank nodes that - // are removed during language filtering. - vreq.setLanguageNeutralUnionFullModel(ModelAccess.on(vreq).getOntModel(ModelID.UNION_FULL)); + + // We need access to some language-neutral items - either because we + // need to see all contents regardless of language, or because we need + // to see the blank nodes that are removed during language filtering. + vreq.setLanguageNeutralUnionFullModel(ModelAccess.on(vreq).getOntModel( + ModelID.UNION_FULL)); vreq.setLanguageNeutralWebappDaoFactory(new WebappDaoFactorySDB( - rdfService, createLanguageNeutralOntModelSelector(vreq), createWadfConfig(vreq))); + rdfService, createLanguageNeutralOntModelSelector(vreq), + createWadfConfig(vreq))); wrapModelsWithLanguageAwareness(vreq); - + setCollator(vreq); - + setWebappDaoFactories(vreq, rdfService); } @@ -176,59 +180,61 @@ public class RequestModelsPrep implements Filter { Dataset dataset = new RDFServiceDataset(rdfService); vreq.setDataset(dataset); } - - private void setRawModels(VitroRequest vreq, Dataset dataset) { - // These are memory-mapped (fast), and read-mostly (low contention), so - // just use the ones from the context. - useModelFromContext(vreq, ModelID.APPLICATION_METADATA); - useModelFromContext(vreq, ModelID.USER_ACCOUNTS); - useModelFromContext(vreq, ModelID.DISPLAY); - useModelFromContext(vreq, ModelID.DISPLAY_DISPLAY); - useModelFromContext(vreq, ModelID.DISPLAY_TBOX); + + private void setRawModels(VitroRequest vreq) { + ModelAccess models = ModelAccess.on(vreq); + + RDFService shortTermConfigRdfService = RDFServiceUtils + .getRDFServiceFactory(ctx, WhichService.CONFIGURATION) + .getShortTermRDFService(); + ModelMaker configMM = ModelMakerUtils.getShortTermModelMaker(ctx, + shortTermConfigRdfService, WhichService.CONFIGURATION); + models.setModelMaker(CONFIGURATION, configMM); + + RDFService shortTermContentRdfService = RDFServiceUtils + .getRDFServiceFactory(ctx, WhichService.CONTENT) + .getShortTermRDFService(); + ModelMaker contentMM = ModelMakerUtils.getShortTermModelMaker(ctx, + shortTermContentRdfService, WhichService.CONTENT); + models.setModelMaker(CONTENT, contentMM); + + /* + * KLUGE + * + * The BASE_TBOX in the context is wrapped by an OntModel with + * sub-models (file-graph models). If we wrap a new OntModel around it, + * we will lose those sub-models, so use the OntModel from the context. + * + * Do we need to do the same with INFERRED_TBOX and UNION_TBOX? Maybe + * not. + * + * See also the Kluge in ModelAccess. + */ useModelFromContext(vreq, ModelID.BASE_TBOX); useModelFromContext(vreq, ModelID.INFERRED_TBOX); useModelFromContext(vreq, ModelID.UNION_TBOX); - - // Anything derived from the ABOX is not memory-mapped, so create - // versions from the short-term RDF service. - OntModel baseABoxModel = VitroModelFactory.createOntologyModel(dataset - .getNamedModel(ModelNames.ABOX_ASSERTIONS)); - OntModel inferenceABoxModel = VitroModelFactory - .createOntologyModel(dataset.getNamedModel(ModelNames.ABOX_INFERENCES)); - OntModel unionABoxModel = VitroModelFactory.createUnion( - baseABoxModel, inferenceABoxModel); - - OntModel baseFullModel = VitroModelFactory.createUnion(baseABoxModel, - ModelAccess.on(vreq).getOntModel(ModelID.BASE_TBOX)); - OntModel inferenceFullModel = VitroModelFactory.createUnion( - inferenceABoxModel, - ModelAccess.on(vreq).getOntModel(ModelID.INFERRED_TBOX)); - OntModel unionFullModel = VitroModelFactory.createOntologyModel( - dataset.getDefaultModel()); - - ModelAccess.on(vreq).setOntModel(ModelID.BASE_ABOX, baseABoxModel); - ModelAccess.on(vreq).setOntModel(ModelID.INFERRED_ABOX, inferenceABoxModel); - ModelAccess.on(vreq).setOntModel(ModelID.UNION_ABOX, unionABoxModel); - ModelAccess.on(vreq).setOntModel(ModelID.BASE_FULL, baseFullModel); - ModelAccess.on(vreq).setOntModel(ModelID.INFERRED_FULL, inferenceFullModel); - ModelAccess.on(vreq).setOntModel(ModelID.UNION_FULL, unionFullModel); } private void useModelFromContext(VitroRequest vreq, ModelID modelId) { OntModel contextModel = ModelAccess.on(ctx).getOntModel(modelId); ModelAccess.on(vreq).setOntModel(modelId, contextModel); } - - /** Create an OntModelSelector that will hold the un-language-filtered models. */ + + /** + * Create an OntModelSelector that will hold the un-language-filtered + * models. + */ private OntModelSelector createLanguageNeutralOntModelSelector( VitroRequest vreq) { OntModelSelectorImpl oms = new OntModelSelectorImpl(); oms.setABoxModel(ModelAccess.on(vreq).getOntModel(ModelID.UNION_ABOX)); oms.setTBoxModel(ModelAccess.on(vreq).getOntModel(ModelID.UNION_TBOX)); oms.setFullModel(ModelAccess.on(vreq).getOntModel(ModelID.UNION_FULL)); - oms.setApplicationMetadataModel(ModelAccess.on(vreq).getOntModel(ModelID.APPLICATION_METADATA)); + oms.setApplicationMetadataModel(ModelAccess.on(vreq).getOntModel( + ModelID.APPLICATION_METADATA)); oms.setDisplayModel(ModelAccess.on(vreq).getOntModel(ModelID.DISPLAY)); - oms.setUserAccountsModel(ModelAccess.on(vreq).getOntModel(ModelID.USER_ACCOUNTS)); + oms.setUserAccountsModel(ModelAccess.on(vreq).getOntModel( + ModelID.USER_ACCOUNTS)); return oms; } @@ -250,15 +256,15 @@ public class RequestModelsPrep implements Filter { ModelAccess.on(req).setOntModel(id, aware); } } - + private void setWebappDaoFactories(VitroRequest vreq, RDFService rdfService) { WebappDaoFactoryConfig config = createWadfConfig(vreq); - + WebappDaoFactory unfilteredWadf = new WebappDaoFactorySDB(rdfService, ModelAccess.on(vreq).getUnionOntModelSelector(), config); ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.UNFILTERED_UNION, unfilteredWadf); - + WebappDaoFactory unfilteredAssertionsWadf = new WebappDaoFactorySDB( rdfService, ModelAccess.on(vreq).getBaseOntModelSelector(), config, SDBDatasetMode.ASSERTIONS_ONLY); @@ -293,24 +299,26 @@ public class RequestModelsPrep implements Filter { config.setDefaultNamespace(defaultNamespace); config.setPreferredLanguages(langs); config.setUnderlyingStoreReasoned(isStoreReasoned(req)); - config.setCustomListViewConfigFileMap(getCustomListViewConfigFileMap( - req.getSession().getServletContext())); + config.setCustomListViewConfigFileMap(getCustomListViewConfigFileMap(req + .getSession().getServletContext())); return config; } /** - * This method is also used by VitroHttpServlet to retrieve the right Collator - * instance for picklist sorting + * This method is also used by VitroHttpServlet to retrieve the right + * Collator instance for picklist sorting + * * @param req * @return */ public static Enumeration getPreferredLocales(HttpServletRequest req) { - return req.getLocales(); + return req.getLocales(); } - + private List getPreferredLanguages(HttpServletRequest req) { log.debug("Accept-Language: " + req.getHeader("Accept-Language")); - return LanguageFilteringUtils.localesToLanguages(getPreferredLocales(req)); + return LanguageFilteringUtils + .localesToLanguages(getPreferredLocales(req)); } /** @@ -330,36 +338,36 @@ public class RequestModelsPrep implements Filter { return rawRDFService; } } - - private void setCollator(VitroRequest vreq) { - Enumeration locales = getPreferredLocales(vreq); - while(locales.hasMoreElements()) { - Locale locale = locales.nextElement(); - Collator collator = Collator.getInstance(locale); - if(collator != null) { - vreq.setCollator(collator); - return; - } - } - vreq.setCollator(Collator.getInstance()); - } + + private void setCollator(VitroRequest vreq) { + Enumeration locales = getPreferredLocales(vreq); + while (locales.hasMoreElements()) { + Locale locale = locales.nextElement(); + Collator collator = Collator.getInstance(locale); + if (collator != null) { + vreq.setCollator(collator); + return; + } + } + vreq.setCollator(Collator.getInstance()); + } private boolean isStoreReasoned(ServletRequest req) { - String isStoreReasoned = ConfigurationProperties.getBean(req).getProperty( - "VitroConnection.DataSource.isStoreReasoned", "true"); - return ("true".equals(isStoreReasoned)); + String isStoreReasoned = ConfigurationProperties.getBean(req) + .getProperty("VitroConnection.DataSource.isStoreReasoned", + "true"); + return ("true".equals(isStoreReasoned)); } - - private Map>, String> - getCustomListViewConfigFileMap(ServletContext ctx) { - Map>, String> map = - (Map>, String>) - ctx.getAttribute("customListViewConfigFileMap"); - if (map == null) { - map = new ConcurrentHashMap>, String>(); - ctx.setAttribute("customListViewConfigFileMap", map); - } - return map; + + private Map>, String> getCustomListViewConfigFileMap( + ServletContext ctx) { + Map>, String> map = (Map>, String>) ctx + .getAttribute("customListViewConfigFileMap"); + if (map == null) { + map = new ConcurrentHashMap>, String>(); + ctx.setAttribute("customListViewConfigFileMap", map); + } + return map; } private void tearDownTheRequestModels(HttpServletRequest req) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index 0f40e4721..f229aeadc 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -43,6 +43,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.BulkUpdateEvent; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; +import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel; import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread; @@ -105,8 +106,8 @@ public class SimpleReasoner extends StatementListener { OntModelSpec.OWL_MEM, ModelFactory.createModelForGraph( new RDFServiceGraph(rdfService))); - this.aboxModel = ModelFactory.createOntologyModel( - OntModelSpec.OWL_MEM, ModelFactory.createModelForGraph( + this.aboxModel = VitroModelFactory.createOntologyModel( + VitroModelFactory.createModelForGraph( new DifferenceGraph(new DifferenceGraph(new RDFServiceGraph(rdfService),inferenceModel.getGraph()), tboxModel.getGraph()))); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ConfigurationModelsSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ConfigurationModelsSetup.java index a34f27988..e43e7ab49 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ConfigurationModelsSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ConfigurationModelsSetup.java @@ -2,24 +2,15 @@ package edu.cornell.mannlib.vitro.webapp.servlet.setup; -import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION; - import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.query.Dataset; -import com.hp.hpl.jena.rdf.model.Model; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; -import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer; -import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; -import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory; -import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; -import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; /** @@ -33,8 +24,7 @@ public class ConfigurationModelsSetup implements ServletContextListener { StartupStatus ss = StartupStatus.getBean(ctx); try { - setupModel(ctx, ModelNames.DISPLAY, "display", - ModelID.DISPLAY); + setupModel(ctx, ModelNames.DISPLAY, "display", ModelID.DISPLAY); setupModel(ctx, ModelNames.DISPLAY_TBOX, "displayTbox", ModelID.DISPLAY_TBOX); @@ -42,12 +32,11 @@ public class ConfigurationModelsSetup implements ServletContextListener { setupModel(ctx, ModelNames.DISPLAY_DISPLAY, "displayDisplay", ModelID.DISPLAY_DISPLAY); - ss.info(this, "Set up the display models."); - setupModel(ctx, ModelNames.USER_ACCOUNTS, "auth", ModelID.USER_ACCOUNTS); - ss.info(this, "Set up the user accounts model."); + ss.info(this, + "Set up the display models and the user accounts model."); } catch (Exception e) { ss.fatal(this, e.getMessage(), e.getCause()); } @@ -56,44 +45,21 @@ public class ConfigurationModelsSetup implements ServletContextListener { private void setupModel(ServletContext ctx, String modelUri, String modelPath, ModelID modelId) { try { - Dataset dataset = getConfigurationModelsDataset(ctx); - OntModel baseModel = getNamedOntModel(modelUri, dataset); - - loadFirstTimeFiles(ctx, modelPath, baseModel); - loadEveryTimeFiles(ctx, modelPath, baseModel); - - OntModel memoryModel = wrapWithMemoryModel(baseModel); - ModelAccess.on(ctx).setOntModel(modelId, memoryModel); + OntModel ontModel = ModelAccess.on(ctx).getOntModel(modelId); + loadFirstTimeFiles(ctx, modelPath, ontModel); + loadEveryTimeFiles(ctx, modelPath, ontModel); } catch (Exception e) { throw new RuntimeException("Failed to create the '" + modelPath + "' model (" + modelUri + ").", e); } } - private Dataset getConfigurationModelsDataset(ServletContext ctx) { - RDFServiceFactory factory = RDFServiceUtils.getRDFServiceFactory(ctx, - CONFIGURATION); - return new RDFServiceDataset(factory.getRDFService()); - } - - private OntModel getNamedOntModel(String modelUri, Dataset dataset) { - Model model = dataset.getNamedModel(modelUri); - return VitroModelFactory.createOntologyModel(model); - } - private void loadFirstTimeFiles(ServletContext ctx, String modelPath, OntModel baseModel) { RDFFilesLoader.loadFirstTimeFiles(ctx, modelPath, baseModel, baseModel.isEmpty()); } - private OntModel wrapWithMemoryModel(OntModel baseModel) { - OntModel memoryModel = VitroModelFactory.createOntologyModel(); - memoryModel.add(baseModel); - memoryModel.getBaseModel().register(new ModelSynchronizer(baseModel)); - return memoryModel; - } - private void loadEveryTimeFiles(ServletContext ctx, String modelPath, OntModel memoryModel) { RDFFilesLoader.loadEveryTimeFiles(ctx, modelPath, memoryModel); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java index 759f96440..e0d068d77 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ContentModelSetup.java @@ -29,13 +29,10 @@ import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig; -import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB; -import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; -import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; @@ -59,25 +56,20 @@ public class ContentModelSetup extends JenaDataSourceSetupBase } private void setUpJenaDataSource(ServletContext ctx) { - RDFServiceFactory rdfServiceFactory = RDFServiceUtils.getRDFServiceFactory(ctx); - RDFService rdfService = rdfServiceFactory.getRDFService(); - Dataset dataset = new RDFServiceDataset(rdfService); - setStartupDataset(dataset, ctx); + ModelAccess models = ModelAccess.on(ctx); - OntModel applicationMetadataModel = createdMemoryMappedModel(dataset, ModelNames.APPLICATION_METADATA, "application metadata model"); + RDFService rdfService = createRdfService(ctx); + createStartupDataset(ctx, rdfService); + + Model applicationMetadataModel = models.getOntModel(ModelID.APPLICATION_METADATA); if (applicationMetadataModel.size()== 0) { - JenaDataSourceSetupBase.thisIsFirstStartup(); + thisIsFirstStartup(); } - ModelAccess models = ModelAccess.on(ctx); - OntModel baseABoxModel = createNamedModelFromDataset(dataset, ModelNames.ABOX_ASSERTIONS); - OntModel inferenceABoxModel = createNamedModelFromDataset(dataset, ModelNames.ABOX_INFERENCES); - OntModel baseTBoxModel = createdMemoryMappedModel(dataset, ModelNames.TBOX_ASSERTIONS, "tbox assertions"); - OntModel inferenceTBoxModel = createdMemoryMappedModel(dataset, ModelNames.TBOX_INFERENCES, "tbox inferences"); - OntModel unionABoxModel = VitroModelFactory.createUnion(baseABoxModel, inferenceABoxModel); - OntModel unionTBoxModel = VitroModelFactory.createUnion(baseTBoxModel, inferenceTBoxModel); - + OntModel baseABoxModel = models.getOntModel(ModelID.BASE_ABOX); + OntModel baseTBoxModel = models.getOntModel(ModelID.BASE_TBOX); + if (isFirstStartup()) { initializeApplicationMetadata(ctx, applicationMetadataModel); RDFFilesLoader.loadFirstTimeFiles(ctx, "abox", baseABoxModel, true); @@ -87,25 +79,7 @@ public class ContentModelSetup extends JenaDataSourceSetupBase } RDFFilesLoader.loadEveryTimeFiles(ctx, "abox", baseABoxModel); RDFFilesLoader.loadEveryTimeFiles(ctx, "tbox", baseTBoxModel); - - log.info("Setting up full models"); - OntModel baseFullModel = VitroModelFactory.createUnion(baseABoxModel, baseTBoxModel); - OntModel inferenceFullModel = VitroModelFactory.createUnion(inferenceABoxModel, inferenceTBoxModel); - OntModel unionFullModel = VitroModelFactory.createOntologyModel(dataset.getDefaultModel()); - - models.setOntModel(ModelID.APPLICATION_METADATA, applicationMetadataModel); - - models.setOntModel(ModelID.BASE_ABOX, baseABoxModel); - models.setOntModel(ModelID.BASE_TBOX, baseTBoxModel); - models.setOntModel(ModelID.BASE_FULL, baseFullModel); - models.setOntModel(ModelID.INFERRED_ABOX, inferenceABoxModel); - models.setOntModel(ModelID.INFERRED_TBOX, inferenceTBoxModel); - models.setOntModel(ModelID.INFERRED_FULL, inferenceFullModel); - models.setOntModel(ModelID.UNION_ABOX, unionABoxModel); - models.setOntModel(ModelID.UNION_TBOX, unionTBoxModel); - models.setOntModel(ModelID.UNION_FULL, unionFullModel); - - + log.info("Setting up DAO factories"); WebappDaoFactoryConfig config = new WebappDaoFactoryConfig(); @@ -121,31 +95,16 @@ public class ContentModelSetup extends JenaDataSourceSetupBase ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNION, wadf); ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNFILTERED_UNION, wadf); - log.info("Model makers set up"); - ctx.setAttribute("defaultNamespace", getDefaultNamespace(ctx)); } - private OntModel createNamedModelFromDataset(Dataset dataset, String name) { - return VitroModelFactory.createOntologyModel(dataset.getNamedModel(name)); - } - - private OntModel createdMemoryMappedModel(Dataset dataset, String name, String label) { - try { - Model dbModel = dataset.getNamedModel(name); - OntModel memoryModel = VitroModelFactory.createOntologyModel(); - - if (dbModel != null) { - long begin = System.currentTimeMillis(); - log.info("Copying cached " + label + " into memory"); - memoryModel.add(dbModel); - log.info(secondsSince(begin) + " seconds to load " + label); - memoryModel.getBaseModel().register(new ModelSynchronizer(dbModel)); - } - return memoryModel; - } catch (Throwable e) { - throw new RuntimeException("Unable to load " + label + " from DB", e); - } + private RDFService createRdfService(ServletContext ctx) { + return RDFServiceUtils.getRDFServiceFactory(ctx).getRDFService(); + } + + private void createStartupDataset(ServletContext ctx, RDFService rdfService) { + Dataset dataset = new RDFServiceDataset(rdfService); + setStartupDataset(dataset, ctx); } private long secondsSince(long startTime) { @@ -162,7 +121,7 @@ public class ContentModelSetup extends JenaDataSourceSetupBase * warnings about editing a blank node. */ private void initializeApplicationMetadata(ServletContext ctx, - OntModel applicationMetadataModel) { + Model applicationMetadataModel) { OntModel temporaryAMModel = VitroModelFactory.createOntologyModel(); RDFFilesLoader.loadFirstTimeFiles(ctx, "applicationMetadata", temporaryAMModel, true); setPortalUriOnFirstTime(temporaryAMModel, ctx); @@ -173,7 +132,7 @@ public class ContentModelSetup extends JenaDataSourceSetupBase * If we are loading the application metadata for the first time, set the * URI of the Portal based on the default namespace. */ - private void setPortalUriOnFirstTime(OntModel model, ServletContext ctx) { + private void setPortalUriOnFirstTime(Model model, ServletContext ctx) { // Only a single portal is permitted in the initialization data Resource portalResource = null; ClosableIterator portalResIt = model @@ -200,7 +159,7 @@ public class ContentModelSetup extends JenaDataSourceSetupBase * If we find a "portal1" portal (and we should), its URI should use the * default namespace. */ - private void checkForNamespaceMismatch(OntModel model, ServletContext ctx) { + private void checkForNamespaceMismatch(Model model, ServletContext ctx) { String expectedNamespace = getDefaultNamespace(ctx); List portals = getPortal1s(model); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java index 193cae0e5..1e995d465 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/FileGraphSetup.java @@ -29,12 +29,16 @@ import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.ModelMaker; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; -import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; -import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; +import edu.cornell.mannlib.vitro.webapp.dao.jena.BlankNodeFilteringModelMaker; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerUtils; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; // This ContextListener must run after the JenaDataSourceSetup ContextListener @@ -63,32 +67,33 @@ public class FileGraphSetup implements ServletContextListener { boolean aboxChanged = false; // indicates whether any ABox file graph model has changed boolean tboxChanged = false; // indicates whether any TBox file graph model has changed - OntModelSelector baseOms = null; ServletContext ctx = sce.getServletContext(); try { OntDocumentManager.getInstance().setProcessImports(true); - baseOms = ModelAccess.on(ctx).getBaseOntModelSelector(); Dataset dataset = JenaDataSourceSetupBase.getStartupDataset(ctx); - RDFServiceModelMaker maker = new RDFServiceModelMaker(RDFServiceUtils.getRDFServiceFactory(ctx)); + RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx, + WhichService.CONTENT).getRDFService(); + ModelMaker modelMaker = new BlankNodeFilteringModelMaker( + rdfService, ModelMakerUtils.getModelMaker(ctx, + WhichService.CONTENT)); // ABox files Set paths = getFilegraphPaths(ctx, RDF, ABOX, FILEGRAPH); cleanupDB(dataset, pathsToURIs(paths, ABOX), ABOX); - OntModel aboxBaseModel = baseOms.getABoxModel(); // Just update the ABox filegraphs in the DB; don't attach them to a base model. - aboxChanged = readGraphs(paths, maker, ABOX, /* aboxBaseModel */ null); + aboxChanged = readGraphs(paths, modelMaker, ABOX, /* aboxBaseModel */ null); // TBox files paths = getFilegraphPaths(ctx, RDF, TBOX, FILEGRAPH); cleanupDB(dataset, pathsToURIs(paths, TBOX),TBOX); - OntModel tboxBaseModel = baseOms.getTBoxModel(); - tboxChanged = readGraphs(paths, maker, TBOX, tboxBaseModel); + OntModel tboxBaseModel = ModelAccess.on(ctx).getOntModel(ModelID.BASE_TBOX); + tboxChanged = readGraphs(paths, modelMaker, TBOX, tboxBaseModel); } catch (ClassCastException cce) { String errMsg = "Unable to cast servlet context attribute to the appropriate type " + cce.getLocalizedMessage(); log.error(errMsg); @@ -100,16 +105,16 @@ public class FileGraphSetup implements ServletContextListener { } /* - if (isUpdateRequired(sce.getServletContext())) { + if (isUpdateRequired(ctx)) { log.info("mostSpecificType will be computed because a knowledge base migration was performed." ); - SimpleReasonerSetup.setMSTComputeRequired(sce.getServletContext()); + SimpleReasonerSetup.setMSTComputeRequired(ctx); } else */ - if ( (aboxChanged || tboxChanged) && !isUpdateRequired(sce.getServletContext())) { + if ( (aboxChanged || tboxChanged) && !isUpdateRequired(ctx)) { log.info("a full recompute of the Abox will be performed because" + " the filegraph abox(s) and/or tbox(s) have changed or are being read for the first time." ); - SimpleReasonerSetup.setRecomputeRequired(sce.getServletContext(), SimpleReasonerSetup.RecomputeMode.BACKGROUND); + SimpleReasonerSetup.setRecomputeRequired(ctx, SimpleReasonerSetup.RecomputeMode.BACKGROUND); } } @@ -141,14 +146,6 @@ public class FileGraphSetup implements ServletContextListener { return paths; } - /* - * Reads graphs without using submodels to separate filegraph content from the - * base model. - */ - public boolean readGraphs(Set pathSet, RDFServiceModelMaker dataset, String type, OntModel baseModel) { - return readGraphs(pathSet, dataset, type, baseModel, true); - } - /* * Reads the graphs stored as files in sub-directories of * 1. updates the SDB store to reflect the current contents of the graph. @@ -157,7 +154,7 @@ public class FileGraphSetup implements ServletContextListener { * Note: no connection needs to be maintained between the in-memory copy of the * graph and the DB copy. */ - public boolean readGraphs(Set pathSet, RDFServiceModelMaker dataset, String type, OntModel baseModel, boolean useSubmodels) { + private boolean readGraphs(Set pathSet, ModelMaker modelMaker, String type, OntModel baseModel) { int count = 0; @@ -182,15 +179,11 @@ public class FileGraphSetup implements ServletContextListener { } if ( !model.isEmpty() && baseModel != null ) { - if (useSubmodels) { - baseModel.addSubModel(model); - } else { - baseModel.add(model); - } + baseModel.addSubModel(model); log.debug("Attached file graph as " + type + " submodel " + p.getFileName()); } - modelChanged = modelChanged | updateGraphInDB(dataset, model, type, p); + modelChanged = modelChanged | updateGraphInDB(modelMaker, model, type, p); } catch (Exception ioe) { log.error("Unable to process file graph " + p, ioe); @@ -224,11 +217,15 @@ public class FileGraphSetup implements ServletContextListener { * Otherwise, if a graph with the given name is in the DB and is isomorphic with * the graph that was read from the files system, then do nothing. */ - public boolean updateGraphInDB(RDFServiceModelMaker dataset, Model fileModel, String type, Path path) { + public boolean updateGraphInDB(ModelMaker modelMaker, Model fileModel, String type, Path path) { String graphURI = pathToURI(path,type); - Model dbModel = dataset.getModel(graphURI); + Model dbModel = modelMaker.getModel(graphURI); boolean modelChanged = false; + log.debug(String.format( + "%s %s dbModel size is %d, fileModel size is %d", type, + path.getFileName(), dbModel.size(), fileModel.size())); + boolean isIsomorphic = dbModel.isIsomorphicWith(fileModel); if (dbModel.isEmpty() && !fileModel.isEmpty()) { 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 fd54f9cf9..85a9c197f 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 @@ -16,13 +16,14 @@ import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.vocabulary.OWL; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelID; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; -import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena; import edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.PelletListener; @@ -52,13 +53,13 @@ public class SimpleReasonerSetup implements ServletContextListener { try { // set up Pellet reasoning for the TBox - OntModelSelector assertionsOms = ModelAccess.on(ctx).getBaseOntModelSelector(); - OntModelSelector inferencesOms = ModelAccess.on(ctx).getInferenceOntModelSelector(); - OntModelSelector unionOms = ModelAccess.on(ctx).getUnionOntModelSelector(); + OntModel tboxAssertionsModel = ModelAccess.on(ctx).getOntModel(ModelID.BASE_TBOX); + OntModel tboxInferencesModel = ModelAccess.on(ctx).getOntModel(ModelID.INFERRED_TBOX); + OntModel tboxUnionModel = ModelAccess.on(ctx).getOntModel(ModelID.UNION_TBOX); WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); - if (!assertionsOms.getTBoxModel().getProfile().NAMESPACE().equals(OWL.NAMESPACE.getNameSpace())) { + if (!tboxAssertionsModel.getProfile().NAMESPACE().equals(OWL.NAMESPACE.getNameSpace())) { log.error("Not connecting Pellet reasoner - the TBox assertions model is not an OWL model"); return; } @@ -71,7 +72,7 @@ public class SimpleReasonerSetup implements ServletContextListener { //PelletOptions.USE_INCREMENTAL_CONSISTENCY = true; //PelletOptions.USE_INCREMENTAL_DELETION = true; - PelletListener pelletListener = new PelletListener(unionOms.getTBoxModel(),assertionsOms.getTBoxModel(),inferencesOms.getTBoxModel(),ReasonerConfiguration.DEFAULT); + PelletListener pelletListener = new PelletListener(tboxUnionModel,tboxAssertionsModel,tboxInferencesModel,ReasonerConfiguration.DEFAULT); sce.getServletContext().setAttribute("pelletListener",pelletListener); sce.getServletContext().setAttribute("pelletOntModel", pelletListener.getPelletModel()); @@ -94,7 +95,7 @@ public class SimpleReasonerSetup implements ServletContextListener { // the simple reasoner will register itself as a listener to the ABox assertions SimpleReasoner simpleReasoner = new SimpleReasoner( - unionOms.getTBoxModel(), rdfService, inferenceModel, rebuildModel, scratchModel); + tboxUnionModel, rdfService, inferenceModel, rebuildModel, scratchModel); sce.getServletContext().setAttribute(SimpleReasoner.class.getName(),simpleReasoner); StartupStatus ss = StartupStatus.getBean(ctx); @@ -117,8 +118,8 @@ public class SimpleReasonerSetup implements ServletContextListener { SimpleReasonerTBoxListener simpleReasonerTBoxListener = new SimpleReasonerTBoxListener(simpleReasoner); sce.getServletContext().setAttribute(SimpleReasonerTBoxListener.class.getName(),simpleReasonerTBoxListener); - assertionsOms.getTBoxModel().register(simpleReasonerTBoxListener); - inferencesOms.getTBoxModel().register(simpleReasonerTBoxListener); + tboxAssertionsModel.register(simpleReasonerTBoxListener); + tboxInferencesModel.register(simpleReasonerTBoxListener); RecomputeMode mode = getRecomputeRequired(ctx); if (RecomputeMode.FOREGROUND.equals(mode)) {