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:
parent
d52b939743
commit
3258e2ad4f
1 changed files with 114 additions and 27 deletions
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
WebappDaoFactoryConfig config = createWadfConfig(langs, req);
|
// Anything derived from the ABOX is not memory-mapped, so create
|
||||||
|
// versions from the short-term RDF service.
|
||||||
ModelAccess.on(vreq).setJenaOntModel(
|
OntModel baseABoxModel = createNamedModelFromDataset(dataset,
|
||||||
ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM,
|
JENA_DB_MODEL);
|
||||||
dataset.getDefaultModel()));
|
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");
|
||||||
|
|
Loading…
Add table
Reference in a new issue