VIVO-82 Fix the creation of short-term models.

In the previous version of ModelAccess, all of the language-aware models were wrapped around their counterparts from the Context, so they did not come from the ShortTermRDFService. Fix it so any model that is not memory-mapped is built from the ShortTermRDFService.
This commit is contained in:
j2blake 2013-09-11 12:25:20 -04:00
parent d52b939743
commit 3258e2ad4f

View file

@ -2,6 +2,9 @@
package edu.cornell.mannlib.vitro.webapp.filters; package edu.cornell.mannlib.vitro.webapp.filters;
import static edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase.JENA_DB_MODEL;
import static edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase.JENA_INF_MODEL;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -19,9 +22,12 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.graph.BulkUpdateHandler;
import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.query.Dataset; 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.ModelFactory;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers; import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers;
@ -36,8 +42,8 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering; import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.HideFromDisplayByPolicyFilter; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.HideFromDisplayByPolicyFilter;
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.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.SpecialBulkUpdateHandlerGraph;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB; 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.dao.jena.WebappDaoFactorySDB.SDBDatasetMode;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
@ -61,7 +67,7 @@ public class RequestModelsPrep implements Filter {
* parameters, e.g. "/vitro/index.jsp" "/vitro/themes/enhanced/css/edit.css" * parameters, e.g. "/vitro/index.jsp" "/vitro/themes/enhanced/css/edit.css"
*/ */
private final static Pattern[] skipPatterns = { private final static Pattern[] skipPatterns = {
Pattern.compile(".*\\.(gif|GIF|jpg|jpeg)$"), Pattern.compile(".*\\.(gif|GIF|jpg|jpeg|png|PNG)$"),
Pattern.compile(".*\\.css$"), Pattern.compile(".*\\.js$"), Pattern.compile(".*\\.css$"), Pattern.compile(".*\\.js$"),
Pattern.compile("/.*/themes/.*/site_icons/.*"), Pattern.compile("/.*/themes/.*/site_icons/.*"),
Pattern.compile("/.*/images/.*") }; Pattern.compile("/.*/images/.*") };
@ -130,28 +136,116 @@ public class RequestModelsPrep implements Filter {
HttpServletRequest req) { HttpServletRequest req) {
VitroRequest vreq = new VitroRequest(req); VitroRequest vreq = new VitroRequest(req);
setRdfServicesAndDatasets(rawRdfService, vreq);
RDFService rdfService = vreq.getRDFService();
Dataset dataset = vreq.getDataset();
setRawModels(vreq, dataset);
wrapModelsWithLanguageAwareness(vreq);
setWebappDaoFactories(vreq, rdfService);
}
/**
* Set language-neutral and language-aware versions of the RdfService and
* Dataset.
*/
private void setRdfServicesAndDatasets(RDFService rawRdfService,
VitroRequest vreq) {
vreq.setUnfilteredRDFService(rawRdfService); vreq.setUnfilteredRDFService(rawRdfService);
vreq.setUnfilteredDataset(new RDFServiceDataset(rawRdfService)); vreq.setUnfilteredDataset(new RDFServiceDataset(rawRdfService));
List<String> langs = getPreferredLanguages(req); RDFService rdfService = addLanguageAwareness(vreq, rawRdfService);
RDFService rdfService = addLanguageAwareness(langs, rawRdfService);
vreq.setRDFService(rdfService); vreq.setRDFService(rdfService);
Dataset dataset = new RDFServiceDataset(rdfService); Dataset dataset = new RDFServiceDataset(rdfService);
vreq.setDataset(dataset); vreq.setDataset(dataset);
}
WebappDaoFactoryConfig config = createWadfConfig(langs, req); 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);
useModelFromContext(vreq, ModelID.BASE_TBOX);
useModelFromContext(vreq, ModelID.INFERRED_TBOX);
useModelFromContext(vreq, ModelID.UNION_TBOX);
ModelAccess.on(vreq).setJenaOntModel( // Anything derived from the ABOX is not memory-mapped, so create
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, // versions from the short-term RDF service.
dataset.getDefaultModel())); OntModel baseABoxModel = createNamedModelFromDataset(dataset,
JENA_DB_MODEL);
OntModel inferenceABoxModel = createNamedModelFromDataset(dataset,
JENA_INF_MODEL);
OntModel unionABoxModel = createCombinedBulkUpdatingModel(
baseABoxModel, inferenceABoxModel);
addLanguageAwarenessToRequestModel(req, ModelID.DISPLAY); OntModel baseFullModel = createCombinedBulkUpdatingModel(baseABoxModel,
addLanguageAwarenessToRequestModel(req, ModelID.APPLICATION_METADATA); ModelAccess.on(vreq).getOntModel(ModelID.BASE_TBOX));
addLanguageAwarenessToRequestModel(req, ModelID.UNION_TBOX); OntModel inferenceFullModel = createCombinedModel(inferenceABoxModel,
addLanguageAwarenessToRequestModel(req, ModelID.UNION_FULL); ModelAccess.on(vreq).getOntModel(ModelID.INFERRED_TBOX));
addLanguageAwarenessToRequestModel(req, ModelID.BASE_TBOX); OntModel unionFullModel = ModelFactory.createOntologyModel(
addLanguageAwarenessToRequestModel(req, ModelID.BASE_FULL); OntModelSpec.OWL_MEM, dataset.getDefaultModel());
ModelAccess.on(vreq).setOntModel(ModelID.BASE_ABOX, baseABoxModel);
ModelAccess.on(vreq).setOntModel(ModelID.INFERRED_ABOX, unionABoxModel);
ModelAccess.on(vreq)
.setOntModel(ModelID.UNION_ABOX, inferenceABoxModel);
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);
}
private OntModel createNamedModelFromDataset(Dataset dataset, String name) {
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, dataset.getNamedModel(name));
}
private OntModel createCombinedModel(OntModel oneModel, OntModel otherModel) {
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM,
ModelFactory.createUnion(oneModel, otherModel));
}
private OntModel createCombinedBulkUpdatingModel(OntModel baseModel,
OntModel otherModel) {
BulkUpdateHandler bulkUpdateHandler = baseModel.getGraph().getBulkUpdateHandler();
Graph unionGraph = ModelFactory.createUnion(baseModel, otherModel).getGraph();
Model unionModel = ModelFactory.createModelForGraph(
new SpecialBulkUpdateHandlerGraph(unionGraph, bulkUpdateHandler));
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, unionModel);
}
private void wrapModelsWithLanguageAwareness(VitroRequest vreq) {
wrapModelWithLanguageAwareness(vreq, ModelID.DISPLAY);
wrapModelWithLanguageAwareness(vreq, ModelID.APPLICATION_METADATA);
wrapModelWithLanguageAwareness(vreq, ModelID.BASE_TBOX);
wrapModelWithLanguageAwareness(vreq, ModelID.UNION_TBOX);
wrapModelWithLanguageAwareness(vreq, ModelID.UNION_FULL);
wrapModelWithLanguageAwareness(vreq, ModelID.BASE_FULL);
}
private void wrapModelWithLanguageAwareness(HttpServletRequest req,
ModelID id) {
if (isLanguageAwarenessEnabled()) {
OntModel unaware = ModelAccess.on(req).getOntModel(id);
OntModel aware = LanguageFilteringUtils
.wrapOntModelInALanguageFilter(unaware, req);
ModelAccess.on(req).setOntModel(id, aware);
}
}
private void setWebappDaoFactories(VitroRequest vreq, RDFService rdfService) {
WebappDaoFactoryConfig config = createWadfConfig(vreq);
WebappDaoFactory unfilteredWadf = new WebappDaoFactorySDB(rdfService, WebappDaoFactory unfilteredWadf = new WebappDaoFactorySDB(rdfService,
ModelAccess.on(vreq).getUnionOntModelSelector(), config); ModelAccess.on(vreq).getUnionOntModelSelector(), config);
@ -175,14 +269,15 @@ public class RequestModelsPrep implements Filter {
.checkForModelSwitching(vreq, wadf); .checkForModelSwitching(vreq, wadf);
HideFromDisplayByPolicyFilter filter = new HideFromDisplayByPolicyFilter( HideFromDisplayByPolicyFilter filter = new HideFromDisplayByPolicyFilter(
RequestIdentifiers.getIdBundleForRequest(req), RequestIdentifiers.getIdBundleForRequest(vreq),
ServletPolicyList.getPolicies(ctx)); ServletPolicyList.getPolicies(ctx));
WebappDaoFactoryFiltering filteredWadf = new WebappDaoFactoryFiltering( WebappDaoFactoryFiltering filteredWadf = new WebappDaoFactoryFiltering(
switchedWadf, filter); switchedWadf, filter);
ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.UNION, filteredWadf); ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.UNION, filteredWadf);
} }
private WebappDaoFactoryConfig createWadfConfig(List<String> langs, HttpServletRequest req) { private WebappDaoFactoryConfig createWadfConfig(HttpServletRequest req) {
List<String> langs = getPreferredLanguages(req);
WebappDaoFactoryConfig config = new WebappDaoFactoryConfig(); WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
config.setDefaultNamespace(defaultNamespace); config.setDefaultNamespace(defaultNamespace);
config.setPreferredLanguages(langs); config.setPreferredLanguages(langs);
@ -203,8 +298,9 @@ public class RequestModelsPrep implements Filter {
"true")); "true"));
} }
private RDFService addLanguageAwareness(List<String> langs, private RDFService addLanguageAwareness(HttpServletRequest req,
RDFService rawRDFService) { RDFService rawRDFService) {
List<String> langs = getPreferredLanguages(req);
if (isLanguageAwarenessEnabled()) { if (isLanguageAwarenessEnabled()) {
return new LanguageFilteringRDFService(rawRDFService, langs); return new LanguageFilteringRDFService(rawRDFService, langs);
} else { } else {
@ -212,15 +308,6 @@ public class RequestModelsPrep implements Filter {
} }
} }
private void addLanguageAwarenessToRequestModel(HttpServletRequest req, ModelID id) {
if (isLanguageAwarenessEnabled()) {
OntModel unaware = ModelAccess.on(req.getSession()).getOntModel(id);
OntModel aware = LanguageFilteringUtils
.wrapOntModelInALanguageFilter(unaware, req);
ModelAccess.on(req).setOntModel(id, aware);
}
}
private boolean isStoreReasoned(ServletRequest req) { private boolean isStoreReasoned(ServletRequest req) {
String isStoreReasoned = ConfigurationProperties.getBean(req).getProperty( String isStoreReasoned = ConfigurationProperties.getBean(req).getProperty(
"VitroConnection.DataSource.isStoreReasoned", "true"); "VitroConnection.DataSource.isStoreReasoned", "true");