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)) {