superVClasses = getVClassesForURIList(
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java
index 1e15f39c6..dcbd4a5ab 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java
@@ -31,11 +31,11 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.edit.utils.RoleLevelOptionsSetup;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class VclassRetryController extends BaseEditController {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/NamespacesListingController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/NamespacesListingController.java
index 87977762b..afdedab53 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/NamespacesListingController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/NamespacesListingController.java
@@ -22,8 +22,8 @@ import edu.cornell.mannlib.vedit.controller.BaseEditController;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class NamespacesListingController extends BaseEditController {
@@ -35,7 +35,7 @@ public class NamespacesListingController extends BaseEditController {
VitroRequest vrequest = new VitroRequest(request);
- OntModel ontModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
ArrayList results = new ArrayList();
request.setAttribute("results",results);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/RestrictionsListingController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/RestrictionsListingController.java
index d04c07618..e6b851b4f 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/RestrictionsListingController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/jena/RestrictionsListingController.java
@@ -33,9 +33,9 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class RestrictionsListingController extends BaseEditController {
@@ -52,7 +52,7 @@ public class RestrictionsListingController extends BaseEditController {
epo = super.createEpo(request);
- OntModel ontModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
ObjectPropertyDao opDao = vrequest.getUnfilteredWebappDaoFactory().getObjectPropertyDao();
VClassDao vcDao = vrequest.getUnfilteredWebappDaoFactory().getVClassDao();
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java
index b7ab19121..5563bef94 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/DeletePropertyController.java
@@ -19,10 +19,10 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.RedirectResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.ResponseValues;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.responsevalues.TemplateResponseValues;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.N3EditUtils;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.web.URLEncoder;
/*
* Custom deletion controller to which deletion requests from default property form are sent. May be replaced
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaAdminActions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaAdminActions.java
index f26c3b5e3..08b007fef 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaAdminActions.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaAdminActions.java
@@ -2,6 +2,9 @@
package edu.cornell.mannlib.vitro.webapp.controller.jena;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
+
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
@@ -43,8 +46,8 @@ import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vedit.controller.BaseEditController;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class JenaAdminActions extends BaseEditController {
@@ -88,7 +91,7 @@ public class JenaAdminActions extends BaseEditController {
* This doesn't really print just the TBox. It takes a copy of the model, removes all the individuals, and writes the result.
*/
private void outputTbox(HttpServletResponse response) {
- OntModel memoryModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel memoryModel = ModelAccess.on(getServletContext()).getOntModel(FULL_ASSERTIONS);
try {
OntModel tempOntModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
memoryModel.enterCriticalSection(Lock.READ);
@@ -158,7 +161,7 @@ public class JenaAdminActions extends BaseEditController {
private String testWriteXML() {
StringBuffer output = new StringBuffer();
output.append("Test Write XML\n");
- OntModel model = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(getServletContext()).getOntModel();
Model tmp = ModelFactory.createDefaultModel();
boolean valid = true;
for (Statement stmt : model.listStatements().toList() ) {
@@ -214,7 +217,7 @@ public class JenaAdminActions extends BaseEditController {
}
private void removeLongLiterals() {
- OntModel memoryModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel memoryModel = ModelAccess.on(getServletContext()).getOntModel();
memoryModel.enterCriticalSection(Lock.WRITE);
try {
List statementsToRemove = new LinkedList();
@@ -257,7 +260,7 @@ public class JenaAdminActions extends BaseEditController {
}
if (actionStr.equals("checkURIs")) {
- OntModel memoryModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel memoryModel = ModelAccess.on(getServletContext()).getOntModel();
StmtIterator stmtIt = memoryModel.listStatements();
try {
for (Statement stmt : stmtIt.toList() ) {
@@ -288,16 +291,16 @@ public class JenaAdminActions extends BaseEditController {
if (actionStr.equals("output")) {
OntModel memoryModel = null;
if (request.getParameter("assertionsOnly") != null) {
- memoryModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ memoryModel = ModelAccess.on(getServletContext()).getOntModel(FULL_ASSERTIONS);
System.out.println("baseOntModel");
} else if (request.getParameter("inferences") != null) {
- memoryModel = ModelAccess.on(getServletContext()).getInferenceOntModel();
+ memoryModel = ModelAccess.on(getServletContext()).getOntModel(FULL_INFERENCES);
System.out.println("inferenceOntModel");
} else if (request.getParameter("pellet") != null) {
memoryModel = (OntModel) getServletContext().getAttribute("pelletOntModel");
System.out.println("pelletOntModel");
} else {
- memoryModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ memoryModel = ModelAccess.on(getServletContext()).getOntModel();
System.out.println("jenaOntModel");
}
int subModelCount = memoryModel.listSubModels().toList().size();
@@ -319,7 +322,7 @@ public class JenaAdminActions extends BaseEditController {
}
if (actionStr.equals("outputTaxonomy")) {
- OntModel ontModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel(FULL_ASSERTIONS);
Model taxonomyModel = extractTaxonomy(ontModel);
try {
taxonomyModel.write(response.getOutputStream());
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java
index 880c05b5c..9a5f8ca18 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/JenaExportController.java
@@ -2,6 +2,12 @@
package edu.cornell.mannlib.vitro.webapp.controller.jena;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -28,9 +34,8 @@ import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.AuthorizationRequest;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaModelUtils;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
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;
@@ -118,7 +123,7 @@ public class JenaExportController extends BaseEditController {
if( "abox".equals(subgraphParam)){
model = ModelFactory.createDefaultModel();
if("inferred".equals(assertedOrInferredParam)){
- model = ModelAccess.on(getServletContext()).getOntModel(ModelNames.ABOX_INFERENCES);
+ model = ModelAccess.on(getServletContext()).getOntModel(ABOX_INFERENCES);
}
else if("full".equals(assertedOrInferredParam)){
outputSparqlConstruct(ABOX_FULL_CONSTRUCT, formatParam, response);
@@ -133,9 +138,9 @@ public class JenaExportController extends BaseEditController {
// so we'll extract the whole ontology and then include
// only those statements that are in the inferred graph
Model tempModel = xutil.extractTBox(
- ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_UNION),
+ ModelAccess.on(getServletContext()).getOntModel(TBOX_UNION),
ontologyURI);
- Model inferenceModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_INFERENCES);
+ Model inferenceModel = ModelAccess.on(getServletContext()).getOntModel(TBOX_INFERENCES);
inferenceModel.enterCriticalSection(Lock.READ);
try {
model = tempModel.intersection(inferenceModel);
@@ -144,20 +149,20 @@ public class JenaExportController extends BaseEditController {
}
} else if ("full".equals(assertedOrInferredParam)) {
model = xutil.extractTBox(
- ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_UNION),
+ ModelAccess.on(getServletContext()).getOntModel(TBOX_UNION),
ontologyURI);
} else {
model = xutil.extractTBox(
- ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_ASSERTIONS), ontologyURI);
+ ModelAccess.on(getServletContext()).getOntModel(TBOX_ASSERTIONS), ontologyURI);
}
}
else if("full".equals(subgraphParam)){
if("inferred".equals(assertedOrInferredParam)){
ontModel = xutil.extractTBox(
- dataset, ontologyURI, ModelNames.ABOX_INFERENCES);
- ontModel.addSubModel(ModelAccess.on(getServletContext()).getOntModel(ModelNames.ABOX_INFERENCES));
- ontModel.addSubModel(ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_INFERENCES));
+ dataset, ontologyURI, ABOX_INFERENCES);
+ ontModel.addSubModel(ModelAccess.on(getServletContext()).getOntModel(ABOX_INFERENCES));
+ ontModel.addSubModel(ModelAccess.on(getServletContext()).getOntModel(TBOX_INFERENCES));
}
else if("full".equals(assertedOrInferredParam)){
outputSparqlConstruct(FULL_FULL_CONSTRUCT, formatParam, response);
@@ -228,7 +233,7 @@ public class JenaExportController extends BaseEditController {
private void outputSparqlConstruct(String queryStr, String formatParam,
HttpServletResponse response) {
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(getServletContext()).getRDFService();
+ RDFService rdfService = ModelAccess.on(getServletContext()).getRDFService();
try {
setHeaders(response, formatParam);
OutputStream out = response.getOutputStream();
@@ -284,19 +289,19 @@ public class JenaExportController extends BaseEditController {
private static final String ABOX_FULL_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
"WHERE { GRAPH ?g { ?s ?p ?o } FILTER (!regex(str(?g), \"tbox\")) " +
- "FILTER (?g != <" + ModelNames.APPLICATION_METADATA + ">) }";
+ "FILTER (?g != <" + APPLICATION_METADATA + ">) }";
private static final String ABOX_ASSERTED_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
"WHERE { GRAPH ?g { ?s ?p ?o } FILTER (!regex(str(?g), \"tbox\")) " +
- "FILTER (?g != <" + ModelNames.ABOX_INFERENCES + ">) " +
- "FILTER (?g != <" + ModelNames.APPLICATION_METADATA + ">) }";
+ "FILTER (?g != <" + ABOX_INFERENCES + ">) " +
+ "FILTER (?g != <" + APPLICATION_METADATA + ">) }";
private static final String FULL_FULL_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
"WHERE { ?s ?p ?o }";
private static final String FULL_ASSERTED_CONSTRUCT = "CONSTRUCT { ?s ?p ?o } " +
"WHERE { GRAPH ?g { ?s ?p ?o } " +
- "FILTER (?g != <" + ModelNames.ABOX_INFERENCES + ">) " +
- "FILTER (?g != <" + ModelNames.TBOX_INFERENCES + ">) }";
+ "FILTER (?g != <" + ABOX_INFERENCES + ">) " +
+ "FILTER (?g != <" + TBOX_INFERENCES + ">) }";
}
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 d4f115fd0..6a2dba03e 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
@@ -2,8 +2,12 @@
package edu.cornell.mannlib.vitro.webapp.controller.jena;
-import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONFIGURATION;
-import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
import java.io.File;
import java.io.FileInputStream;
@@ -63,18 +67,15 @@ import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.beans.Ontology;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-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;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
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;
@@ -122,7 +123,7 @@ public class JenaIngestController extends BaseEditController {
VitroRequest vreq = new VitroRequest(request);
ModelMaker maker = getModelMaker(vreq);
- ModelMakerID modelType = getModelType(vreq);
+ WhichService modelType = getModelType(vreq);
String actionStr = vreq.getParameter("action");
actionStr = (actionStr != null) ? actionStr : "";
@@ -203,7 +204,7 @@ public class JenaIngestController extends BaseEditController {
}
- private void processListModelsRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processListModelsRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
showModelList(vreq, maker, modelType);
}
@@ -223,7 +224,7 @@ public class JenaIngestController extends BaseEditController {
showModelList(vreq, vsmm, CONTENT);
}
- private void processCreateModelRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processCreateModelRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
String modelName = vreq.getParameter("modelName");
if (modelName != null) {
@@ -248,7 +249,7 @@ public class JenaIngestController extends BaseEditController {
}
}
- private void processRemoveModelRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processRemoveModelRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
String modelName = vreq.getParameter("modelName");
if (modelName!=null) {
doRemoveModel(modelName, maker);
@@ -256,7 +257,7 @@ public class JenaIngestController extends BaseEditController {
showModelList(vreq, maker, modelType);
}
- private void processClearModelRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processClearModelRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
String modelName = vreq.getParameter("modelName");
if (modelName != null) {
doClearModel(modelName,maker);
@@ -316,7 +317,7 @@ public class JenaIngestController extends BaseEditController {
vreq.setAttribute("bodyJsp",INGEST_MENU_JSP);
}
- private void processAttachModelRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processAttachModelRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
String modelName = vreq.getParameter("modelName");
if (modelName != null) {
doAttachModel(modelName,maker);
@@ -324,7 +325,7 @@ public class JenaIngestController extends BaseEditController {
showModelList(vreq, maker, modelType);
}
- private void processDetachModelRequest(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ private void processDetachModelRequest(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
String modelName = vreq.getParameter("modelName");
if (modelName != null) {
doDetachModel(modelName);
@@ -464,7 +465,7 @@ public class JenaIngestController extends BaseEditController {
vreq.setAttribute("title", "Choose Workflow Step");
vreq.setAttribute("bodyJsp", WORKFLOW_STEP_JSP);
} else {
- OntModel jenaOntModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel jenaOntModel = ModelAccess.on(getServletContext()).getOntModel();
jenaOntModel.enterCriticalSection(Lock.READ);
List savedQueryList = new LinkedList();
try {
@@ -481,7 +482,7 @@ public class JenaIngestController extends BaseEditController {
private void processExecuteSparqlRequest(VitroRequest vreq) {
String sparqlQueryStr = vreq.getParameter("sparqlQueryStr");
- OntModel jenaOntModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel jenaOntModel = ModelAccess.on(getServletContext()).getOntModel();
jenaOntModel.enterCriticalSection(Lock.READ);
List savedQueryList = new LinkedList();
try {
@@ -607,8 +608,8 @@ public class JenaIngestController extends BaseEditController {
/*
* get baseOnt and infOnt models
*/
- OntModel baseOntModel = ModelAccess.on(getServletContext()).getBaseOntModel();
- OntModel tboxOntModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_UNION);
+ OntModel baseOntModel = ModelAccess.on(getServletContext()).getOntModel(FULL_ASSERTIONS);
+ OntModel tboxOntModel = ModelAccess.on(getServletContext()).getOntModel(TBOX_UNION);
/*
* calling method that does the merge operation.
@@ -679,7 +680,7 @@ public class JenaIngestController extends BaseEditController {
/**
* Get the model type from the request, or from the session.
*/
- protected ModelMakerID getModelType(VitroRequest vreq) {
+ protected WhichService getModelType(VitroRequest vreq) {
String modelType = vreq.getParameter("modelType");
if (modelType != null) {
if (modelType.equals(CONFIGURATION.toString())) {
@@ -757,7 +758,7 @@ public class JenaIngestController extends BaseEditController {
}
Model m = ModelFactory.createDefaultModel();
m.add(modelMaker.getModel(modelName));
- ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_ASSERTIONS).addSubModel(m);
+ ModelAccess.on(getServletContext()).getOntModel(TBOX_ASSERTIONS).addSubModel(m);
attachedModels.put(modelName, m);
log.info("Attached " + modelName + " (" + m.hashCode() + ") to webapp");
}
@@ -767,7 +768,7 @@ public class JenaIngestController extends BaseEditController {
if (m == null) {
return;
}
- ModelAccess.on(getServletContext()).getOntModel(ModelNames.TBOX_ASSERTIONS).removeSubModel(m);
+ ModelAccess.on(getServletContext()).getOntModel(TBOX_ASSERTIONS).removeSubModel(m);
attachedModels.remove(modelName);
log.info("Detached " + modelName + " (" + m.hashCode() + ") from webapp");
}
@@ -835,7 +836,7 @@ public class JenaIngestController extends BaseEditController {
}
private long doExecuteSparql(VitroRequest vreq) {
- OntModel jenaOntModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ OntModel jenaOntModel = ModelAccess.on(getServletContext()).getOntModel();
OntModel source = null;
if ("pellet".equals(vreq.getParameter("reasoning"))) {
source = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);
@@ -1073,13 +1074,13 @@ public class JenaIngestController extends BaseEditController {
String result = null;
Integer counter = 0;
Boolean namespacePresent = false;
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(
- getServletContext()).getRDFService();
+ RDFService rdfService = ModelAccess.on(getServletContext())
+ .getRDFService();
try {
Model baseOntModel = RDFServiceGraph.createRDFServiceModel
(new RDFServiceGraph(
- rdfService, ModelNames.ABOX_ASSERTIONS));
- OntModel ontModel = ModelAccess.on(getServletContext()).getJenaOntModel();
+ rdfService, ABOX_ASSERTIONS));
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel();
List urisToChange = new LinkedList();
ontModel.enterCriticalSection(Lock.READ);
try {
@@ -1117,7 +1118,7 @@ public class JenaIngestController extends BaseEditController {
log.debug("Renaming "+ oldURIStr + " to " + newURIStr);
String whereClause = "} WHERE { \n" +
- " GRAPH <" + ModelNames.ABOX_ASSERTIONS + "> { \n" +
+ " GRAPH <" + ABOX_ASSERTIONS + "> { \n" +
" { <" + oldURIStr + "> ?p <" + oldURIStr + "> } \n " +
" UNION \n" +
" { <" + oldURIStr + "> ?q ?o } \n " +
@@ -1140,11 +1141,11 @@ public class JenaIngestController extends BaseEditController {
cs.addAddition(rdfService.sparqlConstructQuery(
addQuery, RDFService.ModelSerializationFormat.N3),
RDFService.ModelSerializationFormat.N3,
- ModelNames.ABOX_ASSERTIONS);
+ ABOX_ASSERTIONS);
cs.addRemoval(rdfService.sparqlConstructQuery(
removeQuery, RDFService.ModelSerializationFormat.N3),
RDFService.ModelSerializationFormat.N3,
- ModelNames.ABOX_ASSERTIONS);
+ ABOX_ASSERTIONS);
rdfService.changeSetUpdate(cs);
} catch (RDFServiceException e) {
throw new RuntimeException(e);
@@ -1165,7 +1166,7 @@ public class JenaIngestController extends BaseEditController {
}
}
- protected void showModelList(VitroRequest vreq, ModelMaker maker, ModelMakerID modelType) {
+ protected void showModelList(VitroRequest vreq, ModelMaker maker, WhichService modelType) {
vreq.setAttribute("modelType", modelType.toString());
if(modelType == CONTENT){
vreq.setAttribute("infoLine", "Main Store models");
@@ -1205,19 +1206,14 @@ public class JenaIngestController extends BaseEditController {
protected static ModelMaker getModelMaker(HttpServletRequest req){
ServletContext ctx = req.getSession().getServletContext();
if (isUsingMainStoreForIngest(req)) {
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx,
- WhichService.CONTENT).getRDFService();
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService(CONTENT);
return new BlankNodeFilteringModelMaker(rdfService, ModelAccess.on(
ctx).getModelMaker(CONTENT));
} else {
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx,
- WhichService.CONFIGURATION).getRDFService();
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService(CONFIGURATION);
return new BlankNodeFilteringModelMaker(rdfService, ModelAccess.on(
ctx).getModelMaker(CONFIGURATION));
}
}
-
-
-
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java
index e8916dbf0..2d305c5c5 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/jena/RDFUploadController.java
@@ -2,6 +2,9 @@
package edu.cornell.mannlib.vitro.webapp.controller.jena;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -16,7 +19,6 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.logging.Log;
@@ -34,15 +36,14 @@ import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaModelUtils;
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
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.dao.jena.event.EditEvent;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
@@ -112,7 +113,7 @@ public class RDFUploadController extends JenaIngestController {
String uploadDesc ="";
OntModel uploadModel = (directRead)
- ? getABoxModel(request.getSession(), getServletContext())
+ ? getABoxModel(getServletContext())
: ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
/* ********************* GET RDF by URL ********************** */
@@ -184,9 +185,9 @@ public class RDFUploadController extends JenaIngestController {
JenaModelUtils xutil = new JenaModelUtils();
- OntModel tboxModel = getTBoxModel(request.getSession());
+ OntModel tboxModel = getTBoxModel();
OntModel aboxModel = getABoxModel(
- request.getSession(), getServletContext());
+ getServletContext());
OntModel tboxChangeModel = null;
Model aboxChangeModel = null;
OntModelSelector ontModelSelector = ModelAccess.on(getServletContext()).getOntModelSelector();
@@ -233,7 +234,7 @@ public class RDFUploadController extends JenaIngestController {
? RDFService.ModelSerializationFormat.RDFXML
: RDFService.ModelSerializationFormat.N3;
changeSet.addAddition(in, format,
- ModelNames.ABOX_ASSERTIONS);
+ ABOX_ASSERTIONS);
try {
rdfService.changeSetUpdate(changeSet);
} catch (RDFServiceException rdfse) {
@@ -262,7 +263,7 @@ public class RDFUploadController extends JenaIngestController {
} finally {
rdfService.close();
}
- ModelMakerID modelType = getModelType(request);
+ WhichService modelType = getModelType(request);
showModelList(request, maker, modelType);
}
@@ -282,8 +283,7 @@ public class RDFUploadController extends JenaIngestController {
private RDFService getRDFService(VitroRequest vreq, ModelMaker maker, String modelName) {
if (isUsingMainStoreForIngest(vreq)) {
log.debug("Using main RDFService");
- return RDFServiceUtils.getRDFServiceFactory(
- getServletContext()).getRDFService();
+ return ModelAccess.on(getServletContext()).getRDFService();
} else {
log.debug("Making RDFService for single model from ModelMaker");
Model m = maker.getModel(modelName);
@@ -431,15 +431,15 @@ public class RDFUploadController extends JenaIngestController {
return;
}
- private OntModel getABoxModel(HttpSession session, ServletContext ctx) {
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx).getRDFService();
+ private OntModel getABoxModel(ServletContext ctx) {
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService();
Model abox = RDFServiceGraph.createRDFServiceModel(
- new RDFServiceGraph(rdfService, ModelNames.ABOX_ASSERTIONS));
+ new RDFServiceGraph(rdfService, ABOX_ASSERTIONS));
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, abox);
}
- private OntModel getTBoxModel(HttpSession session) {
- return ModelAccess.on(session).getOntModel(ModelNames.TBOX_ASSERTIONS);
+ private OntModel getTBoxModel() {
+ return ModelAccess.on(getServletContext()).getOntModel(TBOX_ASSERTIONS);
}
private static final Log log = LogFactory.getLog(
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java
deleted file mode 100644
index d9ef31dac..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.dao;
-
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-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.dao.jena.OntModelSelectorImpl;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory;
-
-/**
- * Hierarchical storage for models. TODO
- *
- * Could this be extended? Could it be used to replace or implement these
- * methods?
- *
- *
- * VitroRequest.getAssertionsWebappDaoFactory()
- * VitroRequest.getFullWebappDaoFactory()
- * VitroRequest.getRDFService()
- * VitroRequest.getUnfilteredRDFService()
- * VitroRequest.getWebappDaoFactory()
- * VitroRequest.getWriteModel()
- *
- * OntModelSelector.getABoxModel
- * OntModelSelector.getFullModel()
- * OntModelSelector.getTBoxModel()
- * VitroModelSource.getModel(URL)
- * VitroModelSource.getModel(URL, loadIfAbsent)
- * VitroModelSource.openModel(name)
- * VitroModelSource.openModelIfPresent(string)
- * ServletContext.getAttribute("pelletOntModel")
- * JenaDataSourceSetupBase.getStartupDataset()
- * HttpSession.getAttribute("jenaAuditModel")
- *
- */
-
-public class ModelAccess {
- private static final Log log = LogFactory.getLog(ModelAccess.class);
-
- /** These attributes should only be accessed through this class. */
- private static final String ATTRIBUTE_NAME = ModelAccess.class.getName();
-
- public enum FactoryID {
- BASE, UNION, UNFILTERED_BASE, UNFILTERED_UNION
- }
-
- public enum ModelMakerID {
- CONTENT, CONFIGURATION
- }
-
- private enum Scope {
- CONTEXT, SESSION, REQUEST
- }
-
- // ----------------------------------------------------------------------
- // Factory methods
- // ----------------------------------------------------------------------
-
- public static ModelAccess on(HttpServletRequest req) {
- Object o = req.getAttribute(ATTRIBUTE_NAME);
- if (o instanceof ModelAccess) {
- return (ModelAccess) o;
- } else {
- ModelAccess parent = on(req.getSession());
- ModelAccess ma = new ModelAccess(Scope.REQUEST, parent);
- req.setAttribute(ATTRIBUTE_NAME, ma);
- return ma;
- }
- }
-
- public static ModelAccess on(HttpSession session) {
- Object o = session.getAttribute(ATTRIBUTE_NAME);
- if (o instanceof ModelAccess) {
- return (ModelAccess) o;
- } else {
- ModelAccess parent = on(session.getServletContext());
- ModelAccess ma = new ModelAccess(Scope.SESSION, parent);
- session.setAttribute(ATTRIBUTE_NAME, ma);
- return ma;
- }
- }
-
- public static ModelAccess on(ServletContext ctx) {
- Object o = ctx.getAttribute(ATTRIBUTE_NAME);
- if (o instanceof ModelAccess) {
- return (ModelAccess) o;
- } else {
- ModelAccess ma = new ModelAccess(Scope.CONTEXT, null);
- ctx.setAttribute(ATTRIBUTE_NAME, ma);
- return ma;
- }
- }
-
- // ----------------------------------------------------------------------
- // The instance
- // ----------------------------------------------------------------------
-
- private final Scope scope;
- private final ModelAccess parent;
- private final Map modelMap = new HashMap<>();
- private final Map factoryMap = new EnumMap<>(
- FactoryID.class);
- private final Map modelMakerMap = new EnumMap<>(
- ModelMakerID.class);
-
- public ModelAccess(Scope scope, ModelAccess parent) {
- this.scope = scope;
- this.parent = parent;
- }
-
- // ----------------------------------------------------------------------
- // Accessing the models
- // ----------------------------------------------------------------------
-
- public OntModel getApplicationMetadataModel() {
- return getOntModel(ModelNames.APPLICATION_METADATA);
- }
-
- public OntModel getUserAccountsModel() {
- return getOntModel(ModelNames.USER_ACCOUNTS);
- }
-
- public OntModel getDisplayModel() {
- return getOntModel(ModelNames.DISPLAY);
- }
-
- public OntModel getJenaOntModel() {
- return getOntModel(ModelNames.FULL_UNION);
- }
-
- public OntModel getBaseOntModel() {
- return getOntModel(ModelNames.FULL_ASSERTIONS);
- }
-
- public OntModel getInferenceOntModel() {
- return getOntModel(ModelNames.FULL_INFERENCES);
- }
-
- public void setOntModel(String id, OntModel ontModel) {
- if (ontModel == null) {
- modelMap.remove(id);
- } else {
- modelMap.put(id, ontModel);
- }
- }
-
- public OntModel getOntModel(String id) {
- if (modelMap.containsKey(id)) {
- log.debug("Using " + id + " model from " + scope);
- return modelMap.get(id);
- } else if (parent != null) {
- return parent.getOntModel(id);
- } else {
- log.warn("No model found for " + id);
- return null;
- }
- }
-
- // ----------------------------------------------------------------------
- // Accessing the Webapp DAO factories.
- // ----------------------------------------------------------------------
-
- public void setWebappDaoFactory(WebappDaoFactory wadf) {
- setWebappDaoFactory(FactoryID.UNION, wadf);
- }
-
- public WebappDaoFactory getWebappDaoFactory() {
- return getWebappDaoFactory(FactoryID.UNION);
- }
-
- public void setBaseWebappDaoFactory(WebappDaoFactory wadf) {
- setWebappDaoFactory(FactoryID.BASE, wadf);
- }
-
- public WebappDaoFactory getBaseWebappDaoFactory() {
- return getWebappDaoFactory(FactoryID.BASE);
- }
-
- public void setWebappDaoFactory(FactoryID id, WebappDaoFactory wadf) {
- if (wadf == null) {
- factoryMap.remove(id);
- } else {
- factoryMap.put(id, wadf);
- }
- }
-
- public void removeWebappDaoFactory(FactoryID id) {
- setWebappDaoFactory(id, null);
- }
-
- public WebappDaoFactory getWebappDaoFactory(FactoryID id) {
- if (factoryMap.containsKey(id)) {
- log.debug("Using " + id + " DAO factory from " + scope);
- return factoryMap.get(id);
- } else if (parent != null) {
- return parent.getWebappDaoFactory(id);
- } else {
- log.warn("No DAO factory found for " + id);
- return null;
- }
- }
-
- // ----------------------------------------------------------------------
- // Accessing the OntModelSelectors
- // ----------------------------------------------------------------------
-
- public OntModelSelector getOntModelSelector() {
- return getUnionOntModelSelector();
- }
-
- public OntModelSelector getBaseOntModelSelector() {
- return createOntModelSelector(ModelNames.ABOX_ASSERTIONS,
- ModelNames.TBOX_ASSERTIONS, ModelNames.FULL_ASSERTIONS);
- }
-
- public OntModelSelector getInferenceOntModelSelector() {
- return createOntModelSelector(ModelNames.ABOX_INFERENCES,
- ModelNames.TBOX_INFERENCES, ModelNames.FULL_INFERENCES);
- }
-
- public OntModelSelector getUnionOntModelSelector() {
- return createOntModelSelector(ModelNames.ABOX_UNION,
- ModelNames.TBOX_UNION, ModelNames.FULL_UNION);
- }
-
- // ----------------------------------------------------------------------
- // Accessing the ModelMakers
- // ----------------------------------------------------------------------
-
- public ModelMaker getModelMaker(ModelMakerID id) {
- if (modelMakerMap.containsKey(id)) {
- log.debug("Using " + id + " modelMaker from " + scope);
- return modelMakerMap.get(id);
- } else if (parent != null) {
- return parent.getModelMaker(id);
- } else {
- log.warn("No modelMaker found for " + id);
- return null;
- }
- }
-
- public void setModelMaker(ModelMakerID id, ModelMaker modelMaker) {
- modelMakerMap.put(id, modelMaker);
- if (id == ModelMakerID.CONFIGURATION) {
- setOntModel(modelMaker, ModelNames.USER_ACCOUNTS);
- setOntModel(modelMaker, ModelNames.DISPLAY);
- setOntModel(modelMaker, ModelNames.DISPLAY_DISPLAY);
- setOntModel(modelMaker, ModelNames.DISPLAY_TBOX);
- } else {
- setOntModel(modelMaker, ModelNames.APPLICATION_METADATA);
- setOntModel(modelMaker, ModelNames.TBOX_ASSERTIONS);
- setOntModel(modelMaker, ModelNames.TBOX_INFERENCES);
- setOntModel(modelMaker, ModelNames.TBOX_UNION);
- setOntModel(modelMaker, ModelNames.ABOX_ASSERTIONS);
- setOntModel(modelMaker, ModelNames.ABOX_INFERENCES);
- setOntModel(modelMaker, ModelNames.ABOX_UNION);
- setOntModel(modelMaker, ModelNames.FULL_ASSERTIONS);
- setOntModel(modelMaker, ModelNames.FULL_INFERENCES);
- setOntModel(modelMaker, ModelNames.FULL_UNION);
-
- /*
- * KLUGE
- *
- * For some reason, the union of two OntModels (like this) works
- * fine as the TBOX_UNION, but an OntModel wrapped around the union
- * of two Models (from ModelMakers) does not work.
- *
- * See also the Kluge in RequestModelsPrep.
- */
- setOntModel(ModelNames.TBOX_UNION, VitroModelFactory.createUnion(
- getOntModel(ModelNames.TBOX_ASSERTIONS),
- getOntModel(ModelNames.TBOX_INFERENCES)));
- }
- }
-
- private void setOntModel(ModelMaker mm, String name) {
- setOntModel(name,
- VitroModelFactory.createOntologyModel(mm.getModel(name)));
- }
-
- private OntModelSelector createOntModelSelector(String aboxName,
- String tboxName, String fullName) {
- OntModelSelectorImpl oms = new OntModelSelectorImpl();
-
- oms.setApplicationMetadataModel(getOntModel(ModelNames.APPLICATION_METADATA));
- oms.setDisplayModel(getOntModel(ModelNames.DISPLAY));
- oms.setUserAccountsModel(getOntModel(ModelNames.USER_ACCOUNTS));
-
- oms.setABoxModel(getOntModel(aboxName));
- oms.setTBoxModel(getOntModel(tboxName));
- oms.setFullModel(getOntModel(fullName));
-
- return oms;
- }
-
- // ----------------------------------------------------------------------
- // Close all locally stored models, WADFs, etc.
- // ----------------------------------------------------------------------
-
- public void close() {
- if (this.scope == Scope.REQUEST) {
- for (WebappDaoFactory wadf : factoryMap.values()) {
- wadf.close();
- }
- }
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupsForRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupsForRequest.java
index 20484b00b..b775e08b5 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupsForRequest.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupsForRequest.java
@@ -16,6 +16,7 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* A request-based image of the VClassGroupCache. That means that the names of
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/WebappDaoFactoryFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/WebappDaoFactoryFiltering.java
index 828757a2d..b362daca8 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/WebappDaoFactoryFiltering.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/WebappDaoFactoryFiltering.java
@@ -3,7 +3,6 @@
package edu.cornell.mannlib.vitro.webapp.dao.filtering;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import edu.cornell.mannlib.vitro.webapp.dao.ApplicationDao;
@@ -73,9 +72,15 @@ public class WebappDaoFactoryFiltering implements WebappDaoFactory {
this.innerWebappDaoFactory = innerDao;
}
+ @Override
+ public String toString() {
+ return "WebappDaoFactoryFiltering[inner=" + innerWebappDaoFactory + "]";
+ }
+
/* ******************* filtering *********************** */
- public String checkURI(String uriStr) {
+
+ public String checkURI(String uriStr) {
return innerWebappDaoFactory.checkURI(uriStr);
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java
index 5e28f248e..a1c663ba5 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/BlankNodeFilteringGraph.java
@@ -20,7 +20,7 @@ import com.hp.hpl.jena.shared.PrefixMapping;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class BlankNodeFilteringGraph implements Graph {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java
index b393c60a0..ee5c8e55b 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DifferenceGraph.java
@@ -19,7 +19,7 @@ import com.hp.hpl.jena.shared.PrefixMapping;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class DifferenceGraph implements Graph {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java
deleted file mode 100644
index de575b5be..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java
+++ /dev/null
@@ -1,115 +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.sql.SQLException;
-
-import com.hp.hpl.jena.graph.Graph;
-import com.hp.hpl.jena.rdf.listeners.StatementListener;
-import com.hp.hpl.jena.rdf.model.Model;
-import com.hp.hpl.jena.rdf.model.ModelFactory;
-import com.hp.hpl.jena.rdf.model.Statement;
-
-/**
- * This listener will open and close DB models as it performs edits to avoid
- * wasting DB connections
- * @author bjl23
- *
- */
-public class MemToDBModelSynchronizer extends StatementListener {
-
- private static long IDLE_MILLIS = 2000; // how long to let a model site idle
- // after an edit has been performed
-
- SQLGraphGenerator generator;
- Model model;
- boolean editInProgress;
- boolean cleanupThreadActive;
- long lastEditTimeMillis;
-
- public MemToDBModelSynchronizer(SQLGraphGenerator generator) {
- this.generator = generator;
- }
-
- private Model getModel() {
- if ( model != null && !model.isClosed() ) {
- return model;
- } else {
- Graph g = generator.generateGraph();
- model = ModelFactory.createModelForGraph(g);
- return model;
- }
- }
-
- @Override
- public void addedStatement(Statement stmt) {
- this.editInProgress = true;
- try {
- getModel().add(stmt);
- } finally {
- lastEditTimeMillis = System.currentTimeMillis();
- this.editInProgress = false;
- if (!cleanupThreadActive) {
- (new Thread(
- new Cleanup(this), "MemToDBModelSynchronizer")).start();
- }
- }
- }
-
- @Override
- public void removedStatement(Statement stmt) {
- this.editInProgress = true;
- try {
- getModel().remove(stmt);
- } finally {
- lastEditTimeMillis = System.currentTimeMillis();
- this.editInProgress = false;
- if (!cleanupThreadActive) {
- (new Thread(
- new Cleanup(this), "MemToDBModelSynchronizer")).start();
- }
- }
- }
-
- private class Cleanup implements Runnable {
-
- private MemToDBModelSynchronizer s;
-
- public Cleanup(MemToDBModelSynchronizer s) {
- this.s = s;
- }
-
- public void run() {
- s.cleanupThreadActive = true;
- while( (s.editInProgress)
- || (System.currentTimeMillis()
- - s.lastEditTimeMillis < IDLE_MILLIS ) ) {
- try {
- Thread.currentThread().sleep(1000);
- } catch (InterruptedException e) {
- throw new RuntimeException(
- "Interrupted cleanup thread in "
- + this.getClass().getName(), e);
- }
- }
- if (s.model != null) {
- s.model.close();
- s.model = null;
- } else {
- throw new RuntimeException(
- this.getClass().getName() + "Model already null");
- }
- java.sql.Connection c = generator.getConnection();
- try {
- if ( (c != null) && (!c.isClosed()) ) {
- c.close();
- }
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- s.cleanupThreadActive = false;
- }
-
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelSynchronizer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelSynchronizer.java
deleted file mode 100644
index 4c3077656..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelSynchronizer.java
+++ /dev/null
@@ -1,117 +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.List;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.hp.hpl.jena.rdf.model.Model;
-import com.hp.hpl.jena.rdf.model.ModelChangedListener;
-import com.hp.hpl.jena.rdf.model.Statement;
-import com.hp.hpl.jena.rdf.model.StmtIterator;
-import com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.event.CloseEvent;
-
-/**
- * Simple change listener to keep a model (the 'synchronizee') in synch with the
- * model with which it is registered.
- *
- * @author bjl23
- *
- */
-public class ModelSynchronizer implements ModelChangedListener {
- private static final Log log = LogFactory.getLog(ModelSynchronizer.class);
-
- private Model m;
- private String hash;
-
- public ModelSynchronizer(Model synchronizee, String name) {
- this.m = synchronizee;
- this.hash = Integer.toHexString(this.hashCode());
- log.debug(String.format("create: %s, wraps %s(%s) as %s", hash, this.m
- .getClass().getName(), Integer.toHexString(this.m.hashCode()),
- name));
- }
-
- @Override
- public void addedStatement(Statement s) {
- log.debug(hash + " addedStatement" + s);
- m.add(s);
- }
-
- @Override
- public void addedStatements(Statement[] statements) {
- log.debug(hash + " addedStatements: " + statements.length);
- m.add(statements);
- }
-
- @Override
- public void addedStatements(List statements) {
- log.debug(hash + " addedStatements: " + statements.size());
- m.add(statements);
- }
-
- @Override
- public void addedStatements(StmtIterator statements) {
- if (log.isDebugEnabled()) {
- Set set = statements.toSet();
- log.debug(hash + " addedStatements: " + set.size());
- m.add(new StmtIteratorImpl(set.iterator()));
- } else {
- m.add(new StmtIteratorImpl(statements));
- }
- }
-
- @Override
- public void addedStatements(Model model) {
- log.debug(hash + " addedStatements: " + model.size());
- m.add(model);
- }
-
- @Override
- public void notifyEvent(Model model, Object event) {
- if (event instanceof CloseEvent) {
- m.close();
- }
- }
-
- @Override
- public void removedStatement(Statement s) {
- log.debug(hash + " removedStatement" + s);
- m.remove(s);
- }
-
- @Override
- public void removedStatements(Statement[] statements) {
- log.debug(hash + " removedStatements: " + statements.length);
- m.remove(statements);
- }
-
- @Override
- public void removedStatements(List statements) {
- log.debug(hash + " removedStatements: " + statements.size());
- m.remove(statements);
- }
-
- @Override
- public void removedStatements(StmtIterator statements) {
- if (log.isDebugEnabled()) {
- Set set = statements.toSet();
- log.debug(hash + " removedStatements: " + set.size());
- m.remove(new StmtIteratorImpl(set.iterator()));
- } else {
- m.remove(new StmtIteratorImpl(statements));
- }
- }
-
- @Override
- public void removedStatements(Model model) {
- log.debug(hash + " removedStatements: " + model.size());
- m.remove(model);
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/OntModelSelectorImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/OntModelSelectorImpl.java
index a80d064f2..bd7dcc73a 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/OntModelSelectorImpl.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/OntModelSelectorImpl.java
@@ -12,7 +12,7 @@ public class OntModelSelectorImpl implements OntModelSelector {
private OntModel fullModel;
private OntModel tboxModel;
private OntModel userAccountsModel;
-
+
@Override
public OntModel getABoxModel() {
return this.aboxModel;
@@ -42,11 +42,11 @@ public class OntModelSelectorImpl implements OntModelSelector {
public OntModel getUserAccountsModel() {
return this.userAccountsModel;
}
-
+
public void setABoxModel(OntModel m) {
this.aboxModel = m;
}
-
+
public void setApplicationMetadataModel(OntModel m) {
this.applicationMetadataModel = m;
}
@@ -54,17 +54,26 @@ public class OntModelSelectorImpl implements OntModelSelector {
public void setDisplayModel(OntModel m) {
this.displayModel = m;
}
-
+
public void setTBoxModel(OntModel m) {
this.tboxModel = m;
}
-
+
public void setUserAccountsModel(OntModel m) {
this.userAccountsModel = m;
}
-
+
public void setFullModel(OntModel m) {
this.fullModel = m;
}
-
+
+ @Override
+ public String toString() {
+ return "OntModelSelectorImpl[abox=" + hashHex(aboxModel) + ", tbox="
+ + hashHex(tboxModel) + ", full=" + hashHex(fullModel) + "]";
+ }
+
+ private String hashHex(Object o) {
+ return (o == null) ? "00000000" : Integer.toString(o.hashCode(), 16);
+ }
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java
index 9e2d85e53..ae2bbfc34 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDataset.java
@@ -16,7 +16,7 @@ import com.hp.hpl.jena.sparql.core.DatasetGraph;
import com.hp.hpl.jena.sparql.util.Context;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class RDFServiceDataset implements Dataset {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java
index 736860e59..b2f010b5d 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java
@@ -24,6 +24,7 @@ import com.hp.hpl.jena.util.iterator.WrappedIterator;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class RDFServiceDatasetGraph implements DatasetGraph {
@@ -224,4 +225,9 @@ public class RDFServiceDatasetGraph implements DatasetGraph {
return (node == null || node.isVariable() || node == Node.ANY);
}
+ @Override
+ public String toString() {
+ return "RDFServiceDatasetGraph[" + ToString.hashHex(this)
+ + ", " + rdfService + "]";
+ }
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java
index bba1d4b97..61afe6091 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java
@@ -39,7 +39,7 @@ 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.RDFServiceUtils;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class RDFServiceGraph implements GraphWithPerform {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceModelMaker.java
index 3325605d6..2ae6886c0 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceModelMaker.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceModelMaker.java
@@ -160,4 +160,9 @@ public class RDFServiceModelMaker implements ModelMaker {
return dataset.getNamedModel(name);
}
+ @Override
+ public String toString() {
+ return "RDFServiceModelMaker[service=" + service + "]";
+ }
+
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java
index 392839081..da205d408 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java
@@ -21,7 +21,7 @@ import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.vocabulary.DCTerms;
import com.hp.hpl.jena.vocabulary.RDF;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class RegeneratingGraph implements Graph, Regenerable {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java
index 5ff4a009f..c64b5c444 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java
@@ -43,7 +43,7 @@ import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.SingletonIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class SparqlGraph implements GraphWithPerform {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java
index a743c5bef..74a93d7a2 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphMultilingual.java
@@ -21,7 +21,7 @@ import com.hp.hpl.jena.shared.AddDeniedException;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.WrappedIterator;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class SparqlGraphMultilingual extends SparqlGraph implements GraphWithPerform {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java
index 6853d8cf6..fdc102166 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java
@@ -27,7 +27,6 @@ import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupsForRequest;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
@@ -35,6 +34,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngine;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngineException;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchFacetField;
@@ -498,7 +498,7 @@ public class VClassGroupCache implements IndexingEventListener {
} else if(VitroVocabulary.DISPLAY_RANK.equals(stmt.getPredicate().getURI())){
requestCacheUpdate();
} else {
- OntModel jenaOntModel = ModelAccess.on(context).getJenaOntModel();
+ OntModel jenaOntModel = ModelAccess.on(context).getOntModel();
if( isClassNameChange(stmt, jenaOntModel) ) {
requestCacheUpdate();
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroModelSource.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroModelSource.java
index 906141a00..bddf240db 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroModelSource.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroModelSource.java
@@ -9,7 +9,7 @@ import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelReader;
import com.hp.hpl.jena.rdf.model.ModelSource;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
/**
@@ -107,11 +107,11 @@ public class VitroModelSource implements ModelSource {
private Model getNamedModel( ModelName pmn ){
switch( pmn ){
case ABOX:
- return ModelAccess.on(context).getJenaOntModel();
+ return ModelAccess.on(context).getOntModel();
case TBOX:
return (Model) context.getAttribute("tboxmodel???");
case DISPLAY:
- return ModelAccess.on(context).getDisplayModel();
+ return ModelAccess.on(context).getOntModel(ModelNames.DISPLAY);
case DISPLAY_TBOX:
return ModelAccess.on(context).getOntModel(ModelNames.DISPLAY_TBOX);
case DISPLAY_DISPLAY:
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java
index f613018f1..c7d6197ee 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java
@@ -49,8 +49,14 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena {
this.datasetMode = datasetMode;
}
}
-
- public WebappDaoFactorySDB(WebappDaoFactorySDB base, String userURI) {
+
+ @Override
+ public String toString() {
+ return "WebappDaoFactorySDB[" + Integer.toString(hashCode(), 16) + ", "
+ + datasetMode + "]";
+ }
+
+ public WebappDaoFactorySDB(WebappDaoFactorySDB base, String userURI) {
super(base.ontModelSelector);
this.ontModelSelector = base.ontModelSelector;
this.config = base.config;
@@ -94,6 +100,7 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena {
return vClassDao = new VClassDaoSDB(dwf, datasetMode, this, config.isUnderlyingStoreReasoned());
}
+ @Override
public WebappDaoFactory getUserAwareDaoFactory(String userURI) {
return new WebappDaoFactorySDB(this, userURI);
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java
index c3872f70f..289cf0f45 100755
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java
@@ -15,7 +15,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao;
import edu.cornell.mannlib.vitro.webapp.dao.InsertException;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
This is a class to support Direct Web Remoting(DWR) in
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java
index a53e3f65e..a445b091c 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/EditConfigurationUtils.java
@@ -23,11 +23,11 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.freemarker.config.FreemarkerConfiguration;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import freemarker.template.Configuration;
public class EditConfigurationUtils {
@@ -215,7 +215,7 @@ public class EditConfigurationUtils {
public static DataPropertyStatement getDataPropertyStatement(VitroRequest vreq, HttpSession session, Integer dataHash, String predicateUri) {
DataPropertyStatement dps = null;
if( dataHash != 0) {
- OntModel model = ModelAccess.on(session.getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(session.getServletContext()).getOntModel();
dps = RdfLiteralHash.getPropertyStmtByHash(EditConfigurationUtils.getSubjectUri(vreq), predicateUri, dataHash, model);
}
return dps;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/N3EditUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/N3EditUtils.java
index 726adcb3b..df0189e31 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/N3EditUtils.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/VTwo/N3EditUtils.java
@@ -1,7 +1,8 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo;
-import java.lang.reflect.Constructor;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
@@ -17,12 +18,10 @@ import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
-import com.hp.hpl.jena.query.QuerySolutionMap;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Literal;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Resource;
-import com.hp.hpl.jena.rdf.model.ResourceFactory;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers;
@@ -32,10 +31,9 @@ import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.ModelChangePreprocessor;
-import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetter;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils;
public class N3EditUtils {
@@ -52,7 +50,7 @@ public class N3EditUtils {
List modelChangePreprocessors = editConfiguration.getModelChangePreprocessors();
//Check if there is a default set of preprocessors for the whole application
- List defaultPreprocessors = getDefaultModelChangePreprocessors(request, ModelAccess.on(request).getDisplayModel());
+ List defaultPreprocessors = getDefaultModelChangePreprocessors(request, ModelAccess.on(request).getOntModel(DISPLAY));
if(modelChangePreprocessors != null) {
//if preprocessors exist for the configuration, add default preprocessors to the end
modelChangePreprocessors.addAll(defaultPreprocessors);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/IdModelSelector.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/IdModelSelector.java
index e25833c7f..7051e61d9 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/IdModelSelector.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/IdModelSelector.java
@@ -1,7 +1,7 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration;
-import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -9,8 +9,8 @@ import javax.servlet.http.HttpServletRequest;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelMaker;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroModelSource;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class IdModelSelector implements ModelSelector {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/StandardModelSelector.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/StandardModelSelector.java
index 6fb134cff..ce6a4f7da 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/StandardModelSelector.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/StandardModelSelector.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
+
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -10,15 +12,14 @@ import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.ontology.OntModel;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class StandardModelSelector implements ModelSelector {
-
private static final Log log = LogFactory.getLog(StandardModelSelector.class);
- public OntModel getModel(HttpServletRequest request, ServletContext context) {
- return ModelAccess.on(request.getSession()).getOntModel(ModelNames.ABOX_UNION);
+ @Override
+ public OntModel getModel(HttpServletRequest request, ServletContext context) {
+ return ModelAccess.on(context).getOntModel(ABOX_UNION);
}
public static final ModelSelector selector = new StandardModelSelector();
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/BaseEditConfigurationGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/BaseEditConfigurationGenerator.java
index 0599081bd..dac6eb3df 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/BaseEditConfigurationGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/BaseEditConfigurationGenerator.java
@@ -11,11 +11,11 @@ import org.apache.commons.lang.StringUtils;
import com.hp.hpl.jena.ontology.OntModel;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.IdModelSelector;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.StandardModelSelector;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public abstract class BaseEditConfigurationGenerator implements EditConfigurationGenerator {
@@ -62,7 +62,7 @@ public abstract class BaseEditConfigurationGenerator implements EditConfiguratio
//setup the model selectors for query, write and display models on editConfig
setupModelSelectorsFromVitroRequest(vreq, editConfig);
- OntModel queryModel = ModelAccess.on(vreq).getJenaOntModel();
+ OntModel queryModel = ModelAccess.on(vreq).getOntModel();
if( editConfig.getSubjectUri() == null)
editConfig.setSubjectUri( EditConfigurationUtils.getSubjectUri(vreq));
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java
index 0a8a866a3..dc9ef5acf 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultAddMissingIndividualFormGenerator.java
@@ -16,19 +16,18 @@ import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.Literal;
-import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.DefaultAddMissingIndividualFormModelPreprocessor;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* Generates the edit configuration for a default property form.
@@ -355,7 +354,7 @@ public class DefaultAddMissingIndividualFormGenerator implements EditConfigurati
private void prepareForUpdate(VitroRequest vreq, HttpSession session, EditConfigurationVTwo editConfiguration) {
//Here, retrieve model from
- OntModel model = ModelAccess.on(session.getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(session.getServletContext()).getOntModel();
//if object property
if(EditConfigurationUtils.isObjectProperty(EditConfigurationUtils.getPredicateUri(vreq), vreq)){
Individual objectIndividual = EditConfigurationUtils.getObjectIndividual(vreq);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java
index cd35a9f03..7812ed09d 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/DefaultObjectPropertyFormGenerator.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.generators;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -22,7 +24,6 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
@@ -31,6 +32,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.IndividualsViaObjectPropetyOptions;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngine;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngineException;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchQuery;
@@ -468,7 +470,7 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene
private void prepareForUpdate(VitroRequest vreq, HttpSession session, EditConfigurationVTwo editConfiguration) {
//Here, retrieve model from
- OntModel model = ModelAccess.on(session.getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(session.getServletContext()).getOntModel();
//if object property
if(EditConfigurationUtils.isObjectProperty(EditConfigurationUtils.getPredicateUri(vreq), vreq)){
Individual objectIndividual = EditConfigurationUtils.getObjectIndividual(vreq);
@@ -499,7 +501,7 @@ public class DefaultObjectPropertyFormGenerator implements EditConfigurationGene
if(isSelectFromExisting(vreq)) {
// set ProhibitedFromSearch object so picklist doesn't show
// individuals from classes that should be hidden from list views
- OntModel displayOntModel = ModelAccess.on(session.getServletContext()).getDisplayModel();
+ OntModel displayOntModel = ModelAccess.on(session.getServletContext()).getOntModel(DISPLAY);
ProhibitedFromSearch pfs = new ProhibitedFromSearch(
DisplayVocabulary.SEARCH_INDEX_URI, displayOntModel);
if( editConfig != null )
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java
index caed9de4d..10caf6d02 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java
@@ -36,7 +36,6 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupsForRequest;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
@@ -46,6 +45,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocesso
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3Utils;
import edu.cornell.mannlib.vitro.webapp.i18n.I18n;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils;
import edu.cornell.mannlib.vitro.webapp.utils.menuManagement.MenuManagementDataUtils;
@@ -219,7 +219,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
void prepare(VitroRequest vreq, EditConfigurationVTwo editConfig) {
//setup the model selectors for query, write and display models on editConfig
setupModelSelectorsFromVitroRequest(vreq, editConfig);
- OntModel queryModel = ModelAccess.on(vreq).getJenaOntModel();
+ OntModel queryModel = ModelAccess.on(vreq).getOntModel();
if (editConfig.isParamUpdate()) {
editConfig.prepareForParamUpdate(queryModel);
@@ -236,7 +236,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen
if (editConfig.isParamUpdate()) {
//setup the model selectors for query, write and display models on editConfig
setupModelSelectorsFromVitroRequest(vreq, editConfig);
- OntModel queryModel = ModelAccess.on(vreq).getJenaOntModel();
+ OntModel queryModel = ModelAccess.on(vreq).getOntModel();
retrieveExistingDataGetterInfo(context, editConfig, queryModel);
}
@@ -639,7 +639,7 @@ private String getExistingIsSelfContainedTemplateQuery() {
int maxMenuPosition = 0;
Literal menuPosition = null;
setupModelSelectorsFromVitroRequest(vreq, editConfig);
- OntModel queryModel = ModelAccess.on(vreq).getJenaOntModel();
+ OntModel queryModel = ModelAccess.on(vreq).getOntModel();
String maxMenuPositionQuery = getMaxMenuPositionQueryString();
QueryExecution qe = null;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/NewIndividualFormGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/NewIndividualFormGenerator.java
index 54c189705..f46d60022 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/NewIndividualFormGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/NewIndividualFormGenerator.java
@@ -17,12 +17,12 @@ import com.hp.hpl.jena.vocabulary.XSD;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* Generates the edit configuration for a default property form.
@@ -240,7 +240,7 @@ public class NewIndividualFormGenerator implements EditConfigurationGenerator {
private void prepareForUpdate(VitroRequest vreq, HttpSession session, EditConfigurationVTwo editConfiguration) {
//Here, retrieve model from
- OntModel model = ModelAccess.on(session.getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(session.getServletContext()).getOntModel();
//This form is always doing a non-update
editConfiguration.prepareForNonUpdate( model );
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/RDFSLabelGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/RDFSLabelGenerator.java
index 648e1d768..9953a85c1 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/RDFSLabelGenerator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/RDFSLabelGenerator.java
@@ -15,19 +15,18 @@ import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.Literal;
-import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.vocabulary.XSD;
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationUtils;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.EditConfigurationVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.validators.AntiXssValidation;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* Generates the edit configuration for RDFS Label form.
*
@@ -299,7 +298,7 @@ public class RDFSLabelGenerator implements EditConfigurationGenerator {
private void prepareForUpdate(VitroRequest vreq, HttpSession session, EditConfigurationVTwo editConfiguration) {
//Here, retrieve model from
- OntModel model = ModelAccess.on(session.getServletContext()).getJenaOntModel();
+ OntModel model = ModelAccess.on(session.getServletContext()).getOntModel();
if( editConfiguration.isDataPropertyUpdate() ){
editConfiguration.prepareForDataPropUpdate(model, vreq.getWebappDaoFactory().getDataPropertyDao());
}
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 a334e7b1c..4240e8e96 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/ModelSwitcher.java
@@ -7,8 +7,10 @@ import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.SWITCH_TO_D
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_DISPLAY_MODEL_PARAM;
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_MODEL_PARAM;
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_TBOX_MODEL_PARAM;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY_TBOX;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
@@ -25,15 +27,15 @@ import com.hp.hpl.jena.rdf.model.ModelFactory;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyHelper;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroModelSource;
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.RequestModelAccessImpl;
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;
/**
* Handle model switching, if requested for the editing framework.
@@ -86,8 +88,8 @@ public class ModelSwitcher {
// If they asked for the display model, give it to them.
if (isParameterPresent(vreq, SWITCH_TO_DISPLAY_MODEL)) {
- OntModel mainOntModel = ModelAccess.on(_context).getDisplayModel();
- OntModel tboxOntModel = ModelAccess.on(_context).getOntModel(ModelNames.DISPLAY_TBOX);
+ OntModel mainOntModel = ModelAccess.on(_context).getOntModel(DISPLAY);
+ OntModel tboxOntModel = ModelAccess.on(_context).getOntModel(DISPLAY_TBOX);
setSpecialWriteModel(vreq, mainOntModel);
vreq.setAttribute(VitroRequest.ID_FOR_ABOX_MODEL, VitroModelSource.ModelName.DISPLAY.toString());
@@ -120,8 +122,8 @@ public class ModelSwitcher {
}
private void setSpecialWriteModel(VitroRequest vreq, OntModel mainOntModel) {
- if (mainOntModel != null) {
- ModelAccess.on(vreq).setOntModel(ModelNames.FULL_UNION, mainOntModel);
+ if (mainOntModel != null) {
+ ((RequestModelAccessImpl) ModelAccess.on(vreq)).setSpecialWriteModel(mainOntModel);
vreq.setAttribute(SPECIAL_WRITE_MODEL, mainOntModel);
}
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java
index daa09d735..9c4972da4 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java
@@ -22,8 +22,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.controller.freemarker.PageController;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.PageDao;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* This filter is intended to route requests to pages defined in the display model.
*
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 ce9d043a9..a4b5b0403 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/RequestModelsPrep.java
@@ -2,21 +2,14 @@
package edu.cornell.mannlib.vitro.webapp.filters;
-import static edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID.CONTENT;
-
import java.io.IOException;
import java.text.Collator;
import java.util.Enumeration;
-import java.util.List;
import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -25,67 +18,24 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-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.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers;
-import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
-import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
-import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.controller.VitroHttpServlet;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.FactoryID;
-import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
-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.filters.HideFromDisplayByPolicyFilter;
-import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
-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.ModelMakerUtils;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-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;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
- * This sets up several objects in the Request scope for each incoming HTTP
- * request. This is done in a Filter so that controllers and JSPs get the same
- * setup.
+ * This used to set up a lot of request-based objects. Now, most of them are
+ * obtained through ModelAccess, which does not require setup here. However, it
+ * does require teardown.
*
- * This code configures the WebappDaoFactory for each request.
+ * This is done in a filter, so it applies to both Servlets and JSPs.
*/
public class RequestModelsPrep implements Filter {
private final static Log log = LogFactory.getLog(RequestModelsPrep.class);
- /**
- * The filter will be applied to all incoming urls, this is a list of URI
- * patterns to skip. These are matched against the requestURI sans query
- * parameters, e.g. "/vitro/index.jsp" "/vitro/themes/enhanced/css/edit.css"
- */
- private final static Pattern[] skipPatterns = {
- Pattern.compile(".*\\.(gif|GIF|jpg|jpeg|png|PNG)$"),
- Pattern.compile(".*\\.css$"), Pattern.compile(".*\\.js$"),
- Pattern.compile("/.*/themes/.*/site_icons/.*"),
- Pattern.compile("/.*/images/.*") };
-
- private ServletContext ctx;
- private ConfigurationProperties props;
- private String defaultNamespace;
-
@Override
public void init(FilterConfig fc) throws ServletException {
- ctx = fc.getServletContext();
- props = ConfigurationProperties.getBean(ctx);
- defaultNamespace = props.getProperty("Vitro.defaultNamespace");
+ // Nothing to do
}
@Override
@@ -101,251 +51,19 @@ public class RequestModelsPrep implements Filter {
return;
}
- if (!thisRequestNeedsModels(req) || modelsAreAlreadySetUp(req)) {
+ try {
+ setCollator(new VitroRequest(req));
filterChain.doFilter(req, resp);
- } else {
- RDFService contentRdfService = RDFServiceUtils
- .getRDFServiceFactory(ctx, WhichService.CONTENT)
- .getShortTermRDFService();
- RDFService configurationRdfService = RDFServiceUtils
- .getRDFServiceFactory(ctx, WhichService.CONFIGURATION)
- .getShortTermRDFService();
- try {
- setUpTheRequestModels(contentRdfService, configurationRdfService, req);
- filterChain.doFilter(req, resp);
- tearDownTheRequestModels(req);
- } finally {
- contentRdfService.close();
- configurationRdfService.close();
+ } finally {
+ if (ModelAccess.isPresent(req)) {
+ ModelAccess.on(req).close();
}
}
}
- private boolean thisRequestNeedsModels(HttpServletRequest req) {
- String requestURI = req.getRequestURI();
- for (Pattern skipPattern : skipPatterns) {
- if (skipPattern.matcher(requestURI).matches()) {
- log.debug("request matched skipPattern '" + skipPattern
- + "', skipping RequestModelsPrep");
- return false;
- }
- }
- return true;
- }
-
- private boolean modelsAreAlreadySetUp(HttpServletRequest req) {
- String attributeName = RequestModelsPrep.class.getName() + "-setup";
- if (req.getAttribute(attributeName) != null) {
- return true;
- } else {
- req.setAttribute(attributeName, Boolean.TRUE);
- return false;
- }
- }
-
- private void setUpTheRequestModels(RDFService contentRdfService, RDFService configurationRdfService,
- HttpServletRequest req) {
- VitroRequest vreq = new VitroRequest(req);
-
- setRdfServicesAndDatasets(contentRdfService, vreq);
-
- setRawModels(contentRdfService, configurationRdfService, vreq);
-
- RDFService rdfService = vreq.getRDFService();
-
- // 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(
- ModelNames.FULL_UNION));
- vreq.setLanguageNeutralWebappDaoFactory(new WebappDaoFactorySDB(
- rdfService, createLanguageNeutralOntModelSelector(vreq),
- createWadfConfig(vreq)));
-
- wrapModelsWithLanguageAwareness(vreq);
-
- setCollator(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.setUnfilteredDataset(new RDFServiceDataset(rawRdfService));
-
- RDFService rdfService = addLanguageAwareness(vreq, rawRdfService);
- vreq.setRDFService(rdfService);
-
- Dataset dataset = new RDFServiceDataset(rdfService);
- vreq.setDataset(dataset);
- }
-
- private void setRawModels(RDFService contentRdfService, RDFService configurationRdfService, VitroRequest vreq) {
- ModelAccess models = ModelAccess.on(vreq);
-
- /**
- * KLUGE -- VIVO-843
- *
- * We happen to know that the short-term configuration models are the
- * same as the long-term ones. But if we wrap them in OntModels again,
- * we will lose the everytime sub-models. So for now, just skip that.
- */
-// ModelMaker configMM = ModelMakerUtils.getShortTermModelMaker(ctx,
-// configurationRdfService, WhichService.CONFIGURATION);
-// models.setModelMaker(CONFIGURATION, configMM);
-
- ModelMaker contentMM = ModelMakerUtils.getShortTermModelMaker(ctx,
- contentRdfService, WhichService.CONTENT);
- models.setModelMaker(CONTENT, contentMM);
-
- /*
- * KLUGE
- *
- * The TBOX_ASSERTIONS 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 TBOX_INFERENCES and TBOX_UNION? Maybe
- * not.
- *
- * See also the Kluge in ModelAccess.
- */
- useModelFromContext(vreq, ModelNames.TBOX_ASSERTIONS);
- useModelFromContext(vreq, ModelNames.TBOX_INFERENCES);
- useModelFromContext(vreq, ModelNames.TBOX_UNION);
- }
-
- private void useModelFromContext(VitroRequest vreq, String 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.
- */
- private OntModelSelector createLanguageNeutralOntModelSelector(
- VitroRequest vreq) {
- OntModelSelectorImpl oms = new OntModelSelectorImpl();
- oms.setABoxModel(ModelAccess.on(vreq).getOntModel(ModelNames.ABOX_UNION));
- oms.setTBoxModel(ModelAccess.on(vreq).getOntModel(ModelNames.TBOX_UNION));
- oms.setFullModel(ModelAccess.on(vreq).getOntModel(ModelNames.FULL_UNION));
- oms.setApplicationMetadataModel(ModelAccess.on(vreq).getOntModel(
- ModelNames.APPLICATION_METADATA));
- oms.setDisplayModel(ModelAccess.on(vreq).getOntModel(ModelNames.DISPLAY));
- oms.setUserAccountsModel(ModelAccess.on(vreq).getOntModel(
- ModelNames.USER_ACCOUNTS));
- return oms;
- }
-
- private void wrapModelsWithLanguageAwareness(VitroRequest vreq) {
- wrapModelWithLanguageAwareness(vreq, ModelNames.DISPLAY);
- wrapModelWithLanguageAwareness(vreq, ModelNames.APPLICATION_METADATA);
- wrapModelWithLanguageAwareness(vreq, ModelNames.TBOX_ASSERTIONS);
- wrapModelWithLanguageAwareness(vreq, ModelNames.TBOX_UNION);
- wrapModelWithLanguageAwareness(vreq, ModelNames.FULL_UNION);
- wrapModelWithLanguageAwareness(vreq, ModelNames.FULL_ASSERTIONS);
- }
-
- private void wrapModelWithLanguageAwareness(HttpServletRequest req,
- String name) {
- if (isLanguageAwarenessEnabled()) {
- OntModel unaware = ModelAccess.on(req).getOntModel(name);
- OntModel aware = LanguageFilteringUtils
- .wrapOntModelInALanguageFilter(unaware, req);
- ModelAccess.on(req).setOntModel(name, 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);
- ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.BASE,
- unfilteredAssertionsWadf);
- ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.UNFILTERED_BASE,
- unfilteredAssertionsWadf);
-
- WebappDaoFactory wadf = new WebappDaoFactorySDB(rdfService, ModelAccess
- .on(vreq).getUnionOntModelSelector(), config);
-
- // Do model switching and replace the WebappDaoFactory with
- // a different version if requested by parameters
- WebappDaoFactory switchedWadf = new ModelSwitcher()
- .checkForModelSwitching(vreq, wadf);
- // Switch the language-neutral one also.
- vreq.setLanguageNeutralWebappDaoFactory(new ModelSwitcher()
- .checkForModelSwitching(vreq,
- vreq.getLanguageNeutralWebappDaoFactory()));
-
- HideFromDisplayByPolicyFilter filter = new HideFromDisplayByPolicyFilter(
- RequestIdentifiers.getIdBundleForRequest(vreq),
- ServletPolicyList.getPolicies(ctx));
- WebappDaoFactoryFiltering filteredWadf = new WebappDaoFactoryFiltering(
- switchedWadf, filter);
- ModelAccess.on(vreq).setWebappDaoFactory(FactoryID.UNION, filteredWadf);
- }
-
- private WebappDaoFactoryConfig createWadfConfig(HttpServletRequest req) {
- List langs = getPreferredLanguages(req);
- WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
- config.setDefaultNamespace(defaultNamespace);
- config.setPreferredLanguages(langs);
- config.setUnderlyingStoreReasoned(isStoreReasoned(req));
- config.setCustomListViewConfigFileMap(getCustomListViewConfigFileMap(req
- .getSession().getServletContext()));
- return config;
- }
-
- /**
- * 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();
- }
-
- private List getPreferredLanguages(HttpServletRequest req) {
- log.debug("Accept-Language: " + req.getHeader("Accept-Language"));
- return LanguageFilteringUtils
- .localesToLanguages(getPreferredLocales(req));
- }
-
- /**
- * Language awareness is disabled unless they explicitly enable it.
- */
- private Boolean isLanguageAwarenessEnabled() {
- return Boolean.valueOf(props.getProperty("RDFService.languageFilter",
- "false"));
- }
-
- private RDFService addLanguageAwareness(HttpServletRequest req,
- RDFService rawRDFService) {
- List langs = getPreferredLanguages(req);
- if (isLanguageAwarenessEnabled()) {
- return new LanguageFilteringRDFService(rawRDFService, langs);
- } else {
- return rawRDFService;
- }
- }
-
private void setCollator(VitroRequest vreq) {
- Enumeration locales = getPreferredLocales(vreq);
+ @SuppressWarnings("unchecked")
+ Enumeration locales = vreq.getLocales();
while (locales.hasMoreElements()) {
Locale locale = locales.nextElement();
Collator collator = Collator.getInstance(locale);
@@ -357,28 +75,6 @@ public class RequestModelsPrep implements Filter {
vreq.setCollator(Collator.getInstance());
}
- private boolean isStoreReasoned(ServletRequest req) {
- 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 void tearDownTheRequestModels(HttpServletRequest req) {
- ModelAccess.on(req).close();
- }
-
@Override
public void destroy() {
// Nothing to destroy
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java
index c20b6ff3b..f618c9e24 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java
@@ -21,8 +21,8 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.Configuration;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java
index ab8dccffd..0f0d6ea61 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java
@@ -16,8 +16,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.IndividualImpl;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper;
import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapperFactory;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContentModelMakerFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContentModelMakerFactory.java
deleted file mode 100644
index 3cbe0344f..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContentModelMakerFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess;
-
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
-import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONTENT;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.NamedDefaultModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.UnionModelsModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.UnionModelsModelMaker.UnionSpec;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService;
-
-/**
- * Common functionality among the Content-based ModelMakerFactorys
- */
-public abstract class ContentModelMakerFactory implements ModelMakerFactory {
-
- /**
- * These are the small content models that we want to keep in memory.
- */
- protected static final String[] SMALL_CONTENT_MODELS = {
- APPLICATION_METADATA, TBOX_ASSERTIONS, TBOX_INFERENCES };
-
-
- private static final UnionSpec[] CONTENT_UNIONS = new UnionSpec[] {
- UnionSpec.base(ABOX_ASSERTIONS).plus(ABOX_INFERENCES)
- .yields(ABOX_UNION),
- UnionSpec.base(TBOX_ASSERTIONS).plus(TBOX_INFERENCES)
- .yields(TBOX_UNION),
- UnionSpec.base(ABOX_ASSERTIONS).plus(TBOX_ASSERTIONS)
- .yields(FULL_ASSERTIONS),
- UnionSpec.base(ABOX_INFERENCES).plus(TBOX_INFERENCES)
- .yields(FULL_INFERENCES) };
-
- private static final String CONTENT_DEFAULT_MODEL_NAME = FULL_UNION;
-
- /**
- * These decorations are added to a Content ModelMaker, regardless of the
- * source.
- *
- * Create the union models and full models. Use the default model as the
- * full union.
- */
- protected ModelMaker addContentDecorators(ModelMaker sourceMM) {
- ModelMaker unions = new UnionModelsModelMaker(sourceMM, CONTENT_UNIONS);
- return new NamedDefaultModelMaker(unions, CONTENT_DEFAULT_MODEL_NAME);
- }
-
- @Override
- public WhichService whichModelMaker() {
- return CONTENT;
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccess.java
new file mode 100644
index 000000000..b4525ea03
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccess.java
@@ -0,0 +1,57 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * Data structures on the context have fewer options than those on a request.
+ *
+ * There is no Preferred Language or Policy restrictions if there is no
+ * "current user".
+ */
+public interface ContextModelAccess {
+ /** Get the RDFService for the CONTENT. */
+ public RDFService getRDFService();
+
+ /** Get the RDFService for either CONTENT or CONFIGURATION models. */
+ public RDFService getRDFService(WhichService which);
+
+ /** Get the Dataset for the CONTENT models. */
+ public Dataset getDataset();
+
+ /** Get the Dataset for either CONTENT or CONFIGURATION models. */
+ public Dataset getDataset(WhichService which);
+
+ /** Get the ModelMaker for the CONTENT models. */
+ public ModelMaker getModelMaker();
+
+ /** Get the ModelMaker for either CONTENT or CONFIGURATION models. */
+ public ModelMaker getModelMaker(WhichService which);
+
+ /** Get the FULL_UNION OntModel. */
+ public OntModel getOntModel();
+
+ /** Get an OntModel by name. */
+ public OntModel getOntModel(String name);
+
+ /** Get the ASSERTIONS_AND_INFERENCES OntModelSelector. */
+ public OntModelSelector getOntModelSelector();
+
+ /** Get an OntModelSelector based on ASSERTIONS, INFERENCES, or both. */
+ public OntModelSelector getOntModelSelector(ReasoningOption option);
+
+ /** Get the ASSERTIONS_AND_INFERENCES WebappDaoFactory. */
+ public WebappDaoFactory getWebappDaoFactory();
+
+ /** Get a WebappDaoFactory, based on ASSERTIONS, INFERENCES, or both. */
+ public WebappDaoFactory getWebappDaoFactory(ReasoningOption option);
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccess.java
new file mode 100644
index 000000000..cb2697390
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccess.java
@@ -0,0 +1,198 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.ContextModelAccessImpl;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.RequestModelAccessImpl;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.DataStructuresProvider;
+
+/**
+ * The root access point for the RDF data structures: RDFServices, Datasets,
+ * ModelMakers, OntModels, OntModelSelectors and WebappDaoFactories.
+ *
+ * Get a long-term data structure by accessing from the context. Get a
+ * short-term data structure by accessing from the request.
+ *
+ *
+ * ModelAccess.on(ctx).getRDFService(CONFIGURATION);
+ * ModelAccess.on(req).getOntModel(ModelNames.DISPLAY);
+ *
+ *
+ * ------------------------------------
+ *
+ * The elaborate structure of options enums allows us to specify method
+ * signatures like this on RequestModelAccess:
+ *
+ *
+ * getOntModelSelector(OntModelSelectorOption... options);
+ *
+ *
+ * Which can be invoked in any of these ways:
+ *
+ *
+ * ModelAccess.on(req).getOntModelSelector();
+ * ModelAccess.on(req).getOntModelSelector(LANGUAGE_NEUTRAL);
+ * ModelAccess.on(req).getOntModelSelector(INFERENCES_ONLY);
+ * ModelAccess.on(req).getOntModelSelector(ASSERTIONS_ONLY, LANGUAGE_NEUTRAL);
+ *
+ *
+ * The compiler insures that only appropriate options are specified. However, if
+ * conflicting options are supplied, it will only be caught at runtime.
+ */
+public class ModelAccess {
+ private static final Log log = LogFactory.getLog(ModelAccess.class);
+
+ // ----------------------------------------------------------------------
+ // The options enums.
+ // ----------------------------------------------------------------------
+
+ /*
+ * It may seem complicated, but it allows us to verify options at compile
+ * time, and to provide or omit them in any order in a method call.
+ */
+
+ public interface ModelAccessOption {
+ boolean isDefault();
+ }
+
+ public interface RdfServiceOption extends ModelAccessOption {
+ // Just a marker interface
+ }
+
+ public interface DatasetOption extends ModelAccessOption {
+ // Just a marker interface
+ }
+
+ public interface OntModelSelectorOption extends ModelAccessOption {
+ // Just a marker interface
+ }
+
+ public interface WebappDaoFactoryOption extends ModelAccessOption {
+ // Just a marker interface
+ }
+
+ @SuppressWarnings("hiding")
+ public enum LanguageOption implements RdfServiceOption, DatasetOption,
+ OntModelSelectorOption, WebappDaoFactoryOption {
+ LANGUAGE_NEUTRAL, LANGUAGE_AWARE;
+ @Override
+ public boolean isDefault() {
+ return this == LANGUAGE_AWARE;
+ }
+ }
+
+ @SuppressWarnings("hiding")
+ public enum ReasoningOption implements OntModelSelectorOption,
+ WebappDaoFactoryOption {
+ ASSERTIONS_ONLY, INFERENCES_ONLY, ASSERTIONS_AND_INFERENCES;
+ @Override
+ public boolean isDefault() {
+ return this == ASSERTIONS_AND_INFERENCES;
+ }
+ }
+
+ @SuppressWarnings("hiding")
+ public enum PolicyOption implements WebappDaoFactoryOption {
+ POLICY_NEUTRAL, POLICY_AWARE;
+ @Override
+ public boolean isDefault() {
+ return this == POLICY_AWARE;
+ }
+
+ }
+
+ @SuppressWarnings("hiding")
+ public enum WhichService implements RdfServiceOption, DatasetOption {
+ CONTENT, CONFIGURATION;
+ @Override
+ public boolean isDefault() {
+ return this == CONTENT;
+ }
+
+ }
+
+ /*
+ * This is the easiest way to specify an option:
+ * ModelAccess.LANGUAGE_NEUTRAL, instead of
+ * ModelAccess.LanguageOption.LANGUAGE_NEUTRAL
+ */
+ public static final LanguageOption LANGUAGE_NEUTRAL = LanguageOption.LANGUAGE_NEUTRAL;
+ public static final LanguageOption LANGUAGE_AWARE = LanguageOption.LANGUAGE_AWARE;
+ public static final ReasoningOption ASSERTIONS_ONLY = ReasoningOption.ASSERTIONS_ONLY;
+ public static final ReasoningOption INFERENCES_ONLY = ReasoningOption.INFERENCES_ONLY;
+ public static final ReasoningOption ASSERTIONS_AND_INFERENCES = ReasoningOption.ASSERTIONS_AND_INFERENCES;
+ public static final PolicyOption POLICY_NEUTRAL = PolicyOption.POLICY_NEUTRAL;
+ public static final PolicyOption POLICY_AWARE = PolicyOption.POLICY_AWARE;
+ public static final WhichService CONTENT = WhichService.CONTENT;
+ public static final WhichService CONFIGURATION = WhichService.CONFIGURATION;
+
+ // ----------------------------------------------------------------------
+ // The factory
+ // ----------------------------------------------------------------------
+
+ private static volatile DataStructuresProvider dataStructuresProvider;
+ private static volatile ModelAccessFactory factory = new ModelAccessFactory();
+
+ /** These attributes should only be accessed through this class. */
+ private static final String ATTRIBUTE_NAME = ModelAccess.class.getName();
+
+ public static void setDataStructuresProvider(DataStructuresProvider provider) {
+ if (dataStructuresProvider != null) {
+ log.warn("Assigning DataStructuresProvider " + provider
+ + ", but was already set to " + dataStructuresProvider);
+ }
+ dataStructuresProvider = provider;
+ }
+
+ public static RequestModelAccess on(HttpServletRequest req) {
+ Object o = req.getAttribute(ATTRIBUTE_NAME);
+ if (o instanceof RequestModelAccess) {
+ return (RequestModelAccess) o;
+ } else {
+ RequestModelAccess access = factory.buildRequestModelAccess(req);
+ req.setAttribute(ATTRIBUTE_NAME, access);
+ return access;
+ }
+ }
+
+ public static boolean isPresent(HttpServletRequest req) {
+ return (req.getAttribute(ATTRIBUTE_NAME) instanceof RequestModelAccess);
+ }
+
+ public static ContextModelAccess on(ServletContext ctx) {
+ Object o = ctx.getAttribute(ATTRIBUTE_NAME);
+ if (o instanceof ContextModelAccess) {
+ return (ContextModelAccess) o;
+ } else {
+ ContextModelAccess access = factory.buildContextModelAccess(ctx);
+ ctx.setAttribute(ATTRIBUTE_NAME, access);
+ return access;
+ }
+ }
+
+ // ----------------------------------------------------------------------
+ // A factory to create the instances, so we can override in unit tests.
+ // ----------------------------------------------------------------------
+
+ public static class ModelAccessFactory {
+ public ContextModelAccess buildContextModelAccess(ServletContext ctx) {
+ return new ContextModelAccessImpl(ctx, dataStructuresProvider);
+ }
+
+ /**
+ * Note that the RequestModelAccess must be closed when the request
+ * closes.
+ */
+ public RequestModelAccess buildRequestModelAccess(HttpServletRequest req) {
+ return new RequestModelAccessImpl(req,
+ dataStructuresProvider
+ .getShortTermDataStructuresProvider(req));
+ }
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerFactory.java
deleted file mode 100644
index 1156e23b6..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService;
-
-/**
- * Get model makers for long and short-term use.
- */
-public interface ModelMakerFactory {
-
- /**
- * Get a model maker that is suitable for long-term use.
- */
- ModelMaker getModelMaker(RDFService longTermRdfService);
-
- /**
- * Get a model maker that should not be left idle for long periods of time.
- *
- * Because it is based (at least in part) on a short-term RDFService, it
- * should not be stored in the context or the session, but should be deleted
- * at the end of the request.
- */
- ModelMaker getShortTermModelMaker(RDFService shortTermRdfService);
-
- /**
- * Is this factory configured to provide CONTENT models or CONFIGURATION models?
- */
- WhichService whichModelMaker();
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerUtils.java
deleted file mode 100644
index 4e5d7716c..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelMakerUtils.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess;
-
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONTENT;
-
-import javax.servlet.ServletContext;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-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;
-
-/**
- * Convenience methods for obtaining the ModelMakerFactories.
- */
-public class ModelMakerUtils {
- public static final String ATTRIBUTE_BASE = ModelMakerUtils.class.getName();
-
- public static void setContentModelMakerFactory(ServletContext ctx,
- ModelMakerFactory mmFactory) {
- if (ctx == null) {
- throw new NullPointerException("ctx may not be null.");
- }
- if (mmFactory == null) {
- throw new NullPointerException("mmFactory may not be null.");
- }
- if (mmFactory.whichModelMaker() != CONTENT) {
- throw new IllegalArgumentException(
- "mmFactory must be a CONTENT ModelMakerFactory");
- }
- ctx.setAttribute(attributeName(CONTENT), mmFactory);
- }
-
- public static void setConfigurationModelMakerFactory(ServletContext ctx,
- ModelMakerFactory mmFactory) {
- if (ctx == null) {
- throw new NullPointerException("ctx may not be null.");
- }
- if (mmFactory == null) {
- throw new NullPointerException("mmFactory may not be null.");
- }
- if (mmFactory.whichModelMaker() != CONFIGURATION) {
- throw new IllegalArgumentException(
- "mmFactory must be a CONFIGURATION ModelMakerFactory");
- }
- ctx.setAttribute(attributeName(CONFIGURATION), mmFactory);
- }
-
- public static ModelMaker getModelMaker(ServletContext ctx,
- WhichService which) {
- if (ctx == null) {
- throw new NullPointerException("ctx may not be null.");
- }
- if (which == null) {
- throw new NullPointerException("which may not be null.");
- }
- return getFactory(ctx, which).getModelMaker(
- RDFServiceUtils.getRDFServiceFactory(ctx)
- .getShortTermRDFService());
- }
-
- public static ModelMaker getShortTermModelMaker(ServletContext ctx,
- RDFService shortTermRdfService, WhichService which) {
- if (ctx == null) {
- throw new NullPointerException("ctx may not be null.");
- }
- if (shortTermRdfService == null) {
- throw new NullPointerException(
- "shortTermRdfService may not be null.");
- }
- if (which == null) {
- throw new NullPointerException("which may not be null.");
- }
-
- return getFactory(ctx, which).getShortTermModelMaker(
- shortTermRdfService);
- }
-
- private static ModelMakerFactory getFactory(ServletContext ctx,
- WhichService which) {
- Object attribute = ctx.getAttribute(attributeName(which));
- if (attribute instanceof ModelMakerFactory) {
- return (ModelMakerFactory) attribute;
- } else {
- throw new IllegalStateException("Expected a ModelMakerFactory at '"
- + attributeName(which) + "', but found " + attribute);
- }
- }
-
- private static String attributeName(WhichService which) {
- return ATTRIBUTE_BASE + "-" + which;
- }
-
- /**
- * No need for an instance - all methods are static.
- */
- private ModelMakerUtils() {
- // Nothing to instantiate.
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelNames.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelNames.java
index 677ac815a..2dbcb6459 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelNames.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelNames.java
@@ -2,6 +2,10 @@
package edu.cornell.mannlib.vitro.webapp.modelaccess;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* A central place to record the URIs of the models that we rely on.
*/
@@ -9,18 +13,44 @@ public class ModelNames {
public static final String ABOX_ASSERTIONS = "http://vitro.mannlib.cornell.edu/default/vitro-kb-2";
public static final String ABOX_INFERENCES = "http://vitro.mannlib.cornell.edu/default/vitro-kb-inf";
public static final String ABOX_UNION = "vitro:aboxOntModel";
-
+
public static final String TBOX_ASSERTIONS = "http://vitro.mannlib.cornell.edu/default/asserted-tbox";
public static final String TBOX_INFERENCES = "http://vitro.mannlib.cornell.edu/default/inferred-tbox";
public static final String TBOX_UNION = "vitro:tboxOntModel";
-
+
public static final String FULL_ASSERTIONS = "vitro:baseOntModel";
public static final String FULL_INFERENCES = "vitro:inferenceOntModel";
public static final String FULL_UNION = "vitro:jenaOntModel";
-
+
public static final String APPLICATION_METADATA = "http://vitro.mannlib.cornell.edu/default/vitro-kb-applicationMetadata";
public static final String USER_ACCOUNTS = "http://vitro.mannlib.cornell.edu/default/vitro-kb-userAccounts";
public static final String DISPLAY = "http://vitro.mannlib.cornell.edu/default/vitro-kb-displayMetadata";
public static final String DISPLAY_TBOX = "http://vitro.mannlib.cornell.edu/default/vitro-kb-displayMetadataTBOX";
public static final String DISPLAY_DISPLAY = "http://vitro.mannlib.cornell.edu/default/vitro-kb-displayMetadata-displayModel";
+
+ /**
+ * A map of the URIS, keyed by their short names, intended only for display
+ * purposes.
+ */
+ public static final Map namesMap = populateNamesMap();
+
+ private static Map populateNamesMap() {
+ Map map = new HashMap<>();
+ map.put("ABOX_ASSERTIONS", ABOX_ASSERTIONS);
+ map.put("ABOX_INFERENCES", ABOX_INFERENCES);
+ map.put("ABOX_UNION", ABOX_UNION);
+ map.put("TBOX_ASSERTIONS", TBOX_ASSERTIONS);
+ map.put("TBOX_INFERENCES", TBOX_INFERENCES);
+ map.put("TBOX_UNION", TBOX_UNION);
+ map.put("FULL_ASSERTIONS", FULL_ASSERTIONS);
+ map.put("FULL_INFERENCES", FULL_INFERENCES);
+ map.put("FULL_UNION", FULL_UNION);
+ map.put("APPLICATION_METADATA", APPLICATION_METADATA);
+ map.put("USER_ACCOUNTS", USER_ACCOUNTS);
+ map.put("DISPLAY", DISPLAY);
+ map.put("DISPLAY_TBOX", DISPLAY_TBOX);
+ map.put("DISPLAY_DISPLAY", DISPLAY_DISPLAY);
+ return Collections.unmodifiableMap(map);
+ }
+
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccess.java
new file mode 100644
index 000000000..14e3eff3c
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccess.java
@@ -0,0 +1,57 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.query.Dataset;
+
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.DatasetOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.OntModelSelectorOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.RdfServiceOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WebappDaoFactoryOption;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * Data structure on a request have additional options, depending on the
+ * identity and preferences of the user.
+ */
+public interface RequestModelAccess {
+ /**
+ * Get an RDFService: CONTENT or CONFIGURATION, Language-aware or not.
+ */
+ RDFService getRDFService(RdfServiceOption... options);
+
+ /**
+ * Get a Dataset: CONTENT or CONFIGURATION, Language-aware or not.
+ */
+ Dataset getDataset(DatasetOption... options);
+
+ /**
+ * Get the FULL_UNION OntModel: Language-aware or not.
+ */
+ OntModel getOntModel(LanguageOption... options);
+
+ /**
+ * Get an OntModel: Language-aware or not.
+ */
+ OntModel getOntModel(String name, LanguageOption... options);
+
+ /**
+ * Get an OntModelSelector: Language-aware or not, ASSERTIONS or INFERENCES or both.
+ */
+ OntModelSelector getOntModelSelector(OntModelSelectorOption... options);
+
+ /**
+ * Get a WebappDaoFactory: Filtered or not, Language-aware or not,
+ * ASSERTIONS or INFERENCES or both.
+ */
+ WebappDaoFactory getWebappDaoFactory(WebappDaoFactoryOption... options);
+
+ /**
+ * When finished, release any resources.
+ */
+ void close();
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/AbstractModelMakerDecorator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/AbstractModelMakerDecorator.java
index 8df8905ea..092ca328b 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/AbstractModelMakerDecorator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/AbstractModelMakerDecorator.java
@@ -21,6 +21,11 @@ public class AbstractModelMakerDecorator implements ModelMaker {
}
this.inner = inner;
}
+
+ @Override public String toString() {
+ return this.getClass().getSimpleName() + "[inner="
+ + String.valueOf(inner) + "]";
+ }
@Override
public Model createDefaultModel() {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMaker.java
index 9f9da1907..359e7b276 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMaker.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMaker.java
@@ -10,8 +10,7 @@ import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.rdf.model.ModelReader;
import com.hp.hpl.jena.shared.AlreadyExistsException;
-import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.MemoryMappedModel;
/**
* Provides fast read access to small models, by creating a "mapped" model in
@@ -34,11 +33,7 @@ public class MemoryMappingModelMaker extends AbstractModelMakerDecorator {
}
private Model createMemoryMapping(String name) {
- Model externalModel = super.openModel(name);
- Model memoryModel = VitroModelFactory.createModel();
- memoryModel.add(externalModel);
- memoryModel.register(new ModelSynchronizer(externalModel, name));
- return memoryModel;
+ return new MemoryMappedModel(super.openModel(name), name);
}
private boolean isMapped(String name) {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ShadowingModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ShadowingModelMaker.java
deleted file mode 100644
index a755fb79a..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ShadowingModelMaker.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess.adapters;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-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.util.iterator.ExtendedIterator;
-import com.hp.hpl.jena.util.iterator.WrappedIterator;
-
-/**
- * Allow some models in the "shadowing" ModelMaker to hide the corresponding
- * models in the "shadowed" ModelMaker.
- *
- * Specify both ModelMakers, and the list of URIs for the shadowing models.
- */
-public class ShadowingModelMaker extends AbstractModelMakerDecorator {
- private final ModelMaker shadowing;
- private final Set shadowUris;
-
- public ShadowingModelMaker(ModelMaker shadowed, ModelMaker shadowing,
- String... shadowUris) {
- super(shadowed);
- this.shadowing = shadowing;
- this.shadowUris = new HashSet<>(Arrays.asList(shadowUris));
- }
-
- private boolean isShadow(String name) {
- return shadowUris.contains(name);
- }
-
- @Override
- public Model createDefaultModel() {
- return super.createDefaultModel();
- }
-
- @Override
- public Model createFreshModel() {
- return super.createFreshModel();
- }
-
- @Override
- public Model openModel(String name) {
- if (isShadow(name)) {
- return shadowing.openModel(name);
- } else {
- return super.openModel(name);
- }
- }
-
- @Override
- public Model openModelIfPresent(String name) {
- if (isShadow(name)) {
- return shadowing.openModelIfPresent(name);
- } else {
- return super.openModelIfPresent(name);
- }
- }
-
- @Override
- public Model getModel(String name) {
- if (isShadow(name)) {
- return shadowing.getModel(name);
- } else {
- return super.getModel(name);
- }
- }
-
- @Override
- public Model getModel(String name, ModelReader loadIfAbsent) {
- if (isShadow(name)) {
- return shadowing.getModel(name, loadIfAbsent);
- } else {
- return super.getModel(name, loadIfAbsent);
- }
- }
-
- @Override
- public Model createModel(String name, boolean strict) {
- if (isShadow(name)) {
- return shadowing.createModel(name, strict);
- } else {
- return super.createModel(name, strict);
- }
- }
-
- @Override
- public Model createModel(String name) {
- if (isShadow(name)) {
- return shadowing.createModel(name);
- } else {
- return super.createModel(name);
- }
- }
-
- @Override
- public Model openModel(String name, boolean strict) {
- if (isShadow(name)) {
- return shadowing.openModel(name, strict);
- } else {
- return super.openModel(name, strict);
- }
- }
-
- @Override
- public void removeModel(String name) {
- if (isShadow(name)) {
- shadowing.removeModel(name);
- } else {
- super.removeModel(name);
- }
- }
-
- @Override
- public boolean hasModel(String name) {
- if (isShadow(name)) {
- return shadowing.hasModel(name);
- } else {
- return super.hasModel(name);
- }
- }
-
- @Override
- public void close() {
- shadowing.close();
- super.close();
- }
-
- @Override
- public ExtendedIterator listModels() {
- Set allNames = super.listModels().toSet();
- allNames.addAll(shadowUris);
- return WrappedIterator.create(allNames.iterator());
- }
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMaker.java
deleted file mode 100644
index 0ad156a54..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMaker.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess.adapters;
-
-import java.util.HashMap;
-import java.util.Map;
-
-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 edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory;
-
-/**
- * This ModelMaker decorator creates one or more "union models" over the models
- * provided to it by the inner ModelMaker.
- *
- * Each union model contains all of the triples of both its base model and its
- * "plus" model. Any changes to the union model are delegated to the base model.
- * If changes are desired in the "plus" model, it must be accessed directly.
- *
- * This can create surprises, since the union model will claim to have a given
- * statement that is part of the plus model, but an attempt to delete that
- * statement from the union model has no effect.
- */
-public class UnionModelsModelMaker extends AbstractModelMakerDecorator {
- private final Map unionModelsMap;
-
- /**
- * Create it like this:
- *
- *
- * new UnionModelsModelMaker(inner,
- * UnionSpec.base("baseUri").plus("plusUri").yields("unionUri"),
- * ...);
- *
- */
- public UnionModelsModelMaker(ModelMaker inner, UnionSpec... unionModelSpecs) {
- super(inner);
-
- this.unionModelsMap = new HashMap<>();
-
- for (UnionSpec spec : unionModelSpecs) {
- String unionUri = spec.getUnionUri();
- if (unionModelsMap.containsKey(unionUri)) {
- throw new IllegalArgumentException(
- "Two UnionSpecs may not have the same union URI: "
- + spec + ", " + unionModelsMap.get(unionUri));
- }
- this.unionModelsMap.put(unionUri, spec);
- }
-
- for (UnionSpec spec1 : unionModelsMap.values()) {
- if (unionModelsMap.containsKey(spec1.getBaseUri())
- || unionModelsMap.containsKey(spec1.getPlusUri())) {
- throw new IllegalArgumentException(
- "A UnionSpec may not build on another UnionSpec: "
- + spec1);
- }
- }
- }
-
- private boolean hasUnionModel(String name) {
- return unionModelsMap.containsKey(name);
- }
-
- /**
- * The union models use lazy initialization, so there is no overhead if the
- * model is never requested.
- */
- private Model getUnionModel(String name) {
- UnionSpec spec = unionModelsMap.get(name);
- synchronized (spec) {
- if (spec.getUnionModel() == null) {
- Model baseModel = super.openModel(spec.getBaseUri());
- Model plusModel = super.openModel(spec.getPlusUri());
- spec.setUnionModel(VitroModelFactory.createUnion(baseModel,
- plusModel));
- }
- }
- return spec.getUnionModel();
- }
-
- // ----------------------------------------------------------------------
- // Overridden methods.
- // ----------------------------------------------------------------------
-
- @Override
- public Model createModel(String name) {
- return createModel(name, false);
- }
-
- @Override
- public Model createModel(String name, boolean strict) {
- if (hasUnionModel(name)) {
- if (strict) {
- throw new AlreadyExistsException(name);
- } else {
- return getUnionModel(name);
- }
- } else {
- return super.createModel(name, strict);
- }
- }
-
- @Override
- public Model openModel(String name, boolean strict) {
- if (hasUnionModel(name)) {
- return getUnionModel(name);
- } else {
- return super.openModel(name, strict);
- }
- }
-
- @Override
- public Model openModel(String name) {
- if (hasUnionModel(name)) {
- return getUnionModel(name);
- } else {
- return super.openModel(name);
- }
- }
-
- @Override
- public Model openModelIfPresent(String name) {
- if (hasUnionModel(name)) {
- return getUnionModel(name);
- } else {
- return super.openModelIfPresent(name);
- }
- }
-
- @Override
- public boolean hasModel(String name) {
- if (hasUnionModel(name)) {
- return true;
- } else {
- return super.hasModel(name);
- }
- }
-
- @Override
- public ExtendedIterator listModels() {
- return super.listModels().andThen(unionModelsMap
- .keySet().iterator());
- }
-
- @Override
- public void removeModel(String name) {
- if (hasUnionModel(name)) {
- unionModelsMap.remove(name);
- } else {
- super.removeModel(name);
- }
- }
-
- @Override
- public Model getModel(String URL) {
- if (hasUnionModel(URL)) {
- return getUnionModel(URL);
- } else {
- return super.getModel(URL);
- }
- }
-
- @Override
- public Model getModel(String URL, ModelReader loadIfAbsent) {
- if (hasUnionModel(URL)) {
- return getUnionModel(URL);
- } else {
- return super.getModel(URL, loadIfAbsent);
- }
- }
-
- // ----------------------------------------------------------------------
- // UnionSpec and builder classes.
- // ----------------------------------------------------------------------
-
- public static class UnionSpec {
- public static UnionSpecBase base(String baseUri) {
- return new UnionSpecBase(baseUri);
- }
-
- private final String baseUri;
- private final String plusUri;
- private final String unionUri;
- private Model unionModel;
-
- public UnionSpec(String baseUri, String plusUri, String unionUri) {
- this.baseUri = baseUri;
- this.plusUri = plusUri;
- this.unionUri = unionUri;
- }
-
- public Model getUnionModel() {
- return unionModel;
- }
-
- public void setUnionModel(Model unionModel) {
- this.unionModel = unionModel;
- }
-
- public String getBaseUri() {
- return baseUri;
- }
-
- public String getPlusUri() {
- return plusUri;
- }
-
- public String getUnionUri() {
- return unionUri;
- }
-
- @Override
- public String toString() {
- return "UnionSpec[baseUri=" + baseUri + ", plusUri=" + plusUri
- + ", unionUri=" + unionUri + "]";
- }
- }
-
- public static class UnionSpecBase {
- private final String baseUri;
-
- UnionSpecBase(String baseUri) {
- this.baseUri = baseUri;
- }
-
- public UnionSpecPair plus(String plusUri) {
- return new UnionSpecPair(baseUri, plusUri);
- }
- }
-
- public static class UnionSpecPair {
- private final String baseUri;
- private final String plusUri;
-
- public UnionSpecPair(String baseUri, String plusUri) {
- this.baseUri = baseUri;
- this.plusUri = plusUri;
- }
-
- public UnionSpec yields(String unionUri) {
- return new UnionSpec(baseUri, plusUri, unionUri);
- }
- }
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/ContextModelAccessImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/ContextModelAccessImpl.java
new file mode 100644
index 000000000..85b71fc53
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/ContextModelAccessImpl.java
@@ -0,0 +1,279 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_AND_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_ONLY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.INFERENCES_ONLY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+
+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.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl;
+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.ContextModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.DataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * The context-based model access is simpler than the request-based model
+ * access.
+ *
+ * There is no "current user", so there can be no preferred language or
+ * policy-based filtering.
+ *
+ * We are confident that each of these structures will be used at some point, so
+ * there is no need for lazy initialization.
+ */
+public class ContextModelAccessImpl implements ContextModelAccess {
+ private static final Log log = LogFactory
+ .getLog(ContextModelAccessImpl.class);
+
+ private static final String VITRO_DEFAULT_NAMESPACE = "Vitro.defaultNamespace";
+
+ private final ConfigurationProperties props;
+
+ private final DataStructuresProvider factory;
+
+ private final Map rdfServiceMap;
+ private final Map datasetMap;
+ private final Map modelMakerMap;
+ private final OntModelCache ontModelCache;
+ private final Map omsMap;
+ private final Map wadfMap;
+
+ /**
+ * Pull all of the items into maps, instead of fetching them from the
+ * factory on demand. We don't know that the factory wouldn't create fresh
+ * ones.
+ *
+ * The exception is the OntModels, for two reasons: first, because the
+ * OntModelCache assures us that it won't create fresh copies, and second
+ * because we may not know the names of all of the models that will be
+ * requested.
+ */
+ public ContextModelAccessImpl(ServletContext ctx,
+ DataStructuresProvider factory) {
+ this.props = ConfigurationProperties.getBean(ctx);
+ this.factory = factory;
+
+ this.ontModelCache = factory.getOntModelCache();
+ this.rdfServiceMap = populateRdfServiceMap();
+ this.datasetMap = populateDatasetMap();
+ this.modelMakerMap = populateModelMakerMap();
+ this.omsMap = populateOmsMap();
+ this.wadfMap = populateWadfMap();
+ }
+
+ @Override
+ public String toString() {
+ return "ContextModelAccessImpl[" + ToString.hashHex(this)
+ + ", factory=" + factory + "]";
+ }
+
+ // ----------------------------------------------------------------------
+ // RDFServices
+ // ----------------------------------------------------------------------
+
+ private Map populateRdfServiceMap() {
+ Map map = new EnumMap<>(WhichService.class);
+ map.put(CONTENT, factory.getRDFService(CONTENT));
+ map.put(CONFIGURATION, factory.getRDFService(CONFIGURATION));
+ log.debug("RdfServiceMap: " + map);
+ return Collections.unmodifiableMap(map);
+ }
+
+ @Override
+ public RDFService getRDFService() {
+ return getRDFService(CONTENT);
+ }
+
+ @Override
+ public RDFService getRDFService(WhichService which) {
+ RDFService rdfService = rdfServiceMap.get(which);
+ log.debug("getRDFService " + which + ": " + rdfService);
+ return rdfService;
+ }
+
+ // ----------------------------------------------------------------------
+ // Datasets
+ // ----------------------------------------------------------------------
+
+ private Map populateDatasetMap() {
+ Map map = new EnumMap<>(WhichService.class);
+ map.put(CONTENT, factory.getDataset(CONTENT));
+ map.put(CONFIGURATION, factory.getDataset(CONFIGURATION));
+ log.debug("DatasetMap: " + map);
+ return Collections.unmodifiableMap(map);
+ }
+
+ @Override
+ public Dataset getDataset() {
+ return getDataset(CONTENT);
+ }
+
+ @Override
+ public Dataset getDataset(WhichService which) {
+ Dataset dataset = datasetMap.get(which);
+ log.debug("getDataset " + which + ": " + dataset);
+ return dataset;
+ }
+
+ // ----------------------------------------------------------------------
+ // ModelMakers
+ // ----------------------------------------------------------------------
+
+ private Map populateModelMakerMap() {
+ Map map = new EnumMap<>(WhichService.class);
+ map.put(CONTENT, factory.getModelMaker(CONTENT));
+ map.put(CONFIGURATION, factory.getModelMaker(CONFIGURATION));
+ log.debug("ModelMakerMap: " + map);
+ return Collections.unmodifiableMap(map);
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ return getModelMaker(CONTENT);
+ }
+
+ @Override
+ public ModelMaker getModelMaker(WhichService which) {
+ ModelMaker modelMaker = modelMakerMap.get(which);
+ log.debug("getModelMaker " + which + ": " + modelMaker);
+ return modelMaker;
+ }
+
+ // ----------------------------------------------------------------------
+ // OntModels
+ // ----------------------------------------------------------------------
+
+ @Override
+ public OntModel getOntModel() {
+ return getOntModel(FULL_UNION);
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ OntModel ontModel = ontModelCache.getOntModel(name);
+ log.debug("getOntModel: " + ontModel);
+ return ontModel;
+ }
+
+ // ----------------------------------------------------------------------
+ // OntModelSelectors
+ // ----------------------------------------------------------------------
+
+ private Map populateOmsMap() {
+ Map map = new EnumMap<>(
+ ReasoningOption.class);
+ map.put(ASSERTIONS_ONLY,
+ createOntModelSelector(ABOX_ASSERTIONS, TBOX_ASSERTIONS,
+ FULL_ASSERTIONS));
+ map.put(INFERENCES_ONLY,
+ createOntModelSelector(ABOX_INFERENCES, TBOX_INFERENCES,
+ FULL_INFERENCES));
+ map.put(ASSERTIONS_AND_INFERENCES,
+ createOntModelSelector(ABOX_UNION, TBOX_UNION, FULL_UNION));
+ log.debug("OntModelSelectorMap: " + map);
+ return Collections.unmodifiableMap(map);
+ }
+
+ private OntModelSelector createOntModelSelector(String aboxName,
+ String tboxName, String fullName) {
+ OntModelSelectorImpl oms = new OntModelSelectorImpl();
+ oms.setABoxModel(getOntModel(aboxName));
+ oms.setTBoxModel(getOntModel(tboxName));
+ oms.setFullModel(getOntModel(fullName));
+ oms.setApplicationMetadataModel(getOntModel(APPLICATION_METADATA));
+ oms.setDisplayModel(getOntModel(DISPLAY));
+ oms.setUserAccountsModel(getOntModel(USER_ACCOUNTS));
+ return oms;
+ }
+
+ @Override
+ public OntModelSelector getOntModelSelector() {
+ return getOntModelSelector(ASSERTIONS_AND_INFERENCES);
+ }
+
+ @Override
+ public OntModelSelector getOntModelSelector(ReasoningOption option) {
+ OntModelSelector ontModelSelector = omsMap.get(option);
+ log.debug("getOntModelSelector: " + ontModelSelector);
+ return ontModelSelector;
+ }
+
+ // ----------------------------------------------------------------------
+ // WebappDaoFactories
+ // ----------------------------------------------------------------------
+
+ private Map populateWadfMap() {
+ WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
+ config.setDefaultNamespace(getDefaultNamespace());
+
+ RDFService rdfService = getRDFService(CONTENT);
+
+ Map map = new EnumMap<>(
+ ReasoningOption.class);
+ map.put(ASSERTIONS_ONLY, new WebappDaoFactorySDB(rdfService,
+ getOntModelSelector(ASSERTIONS_ONLY), config,
+ SDBDatasetMode.ASSERTIONS_ONLY));
+ map.put(INFERENCES_ONLY, new WebappDaoFactorySDB(rdfService,
+ getOntModelSelector(INFERENCES_ONLY), config,
+ SDBDatasetMode.INFERENCES_ONLY));
+ map.put(ASSERTIONS_AND_INFERENCES, new WebappDaoFactorySDB(rdfService,
+ getOntModelSelector(ASSERTIONS_AND_INFERENCES), config,
+ SDBDatasetMode.ASSERTIONS_AND_INFERENCES));
+ log.debug("WebappdaoFactoryMap: " + map);
+ return Collections.unmodifiableMap(map);
+ }
+
+ private String getDefaultNamespace() {
+ return props.getProperty(VITRO_DEFAULT_NAMESPACE);
+ }
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory() {
+ return getWebappDaoFactory(ASSERTIONS_AND_INFERENCES);
+ }
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory(ReasoningOption option) {
+ WebappDaoFactory wadf = wadfMap.get(option);
+ log.debug("getWebappDaoFactory: " + wadf);
+ return wadf;
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/RequestModelAccessImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/RequestModelAccessImpl.java
new file mode 100644
index 000000000..c6b9277bd
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/RequestModelAccessImpl.java
@@ -0,0 +1,342 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_AWARE;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_NEUTRAL;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_AWARE;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+
+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 edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers;
+import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+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.filters.HideFromDisplayByPolicyFilter;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+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.filters.ModelSwitcher;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.DatasetOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.OntModelSelectorOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.RdfServiceOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WebappDaoFactoryOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.RequestModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.DatasetKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.OntModelKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.OntModelSelectorKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.RDFServiceKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.WebappDaoFactoryKey;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.ShortTermDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * For each category of data structure, the pattern is the same:
+ *
+ * Build a key from the supplied options. If the cache contains a structure with
+ * that key, return it.
+ *
+ * Otherwise, create the requested structure, often from a simplified version.
+ * For example, if the request was for a LANGUAGE_AWARE RDFService, get the
+ * LANGUAGE_NEUTRAL RDFService and wrap it with langauge awareness.
+ *
+ * This second step is a recursive call, so we check again to see if the cache
+ * contains the new requested structure based on a modified key. If it does
+ * contain the structure, use it. Otherwise, create it. Eventually, we reach a
+ * request for the simplest structure, which we fetch from the
+ * ShortTermDataStructuresFactory.
+ *
+ * If the request includes language-awareness, the structure can be created from
+ * the language-neutral version. If language-awareness is disabled, the
+ * language-neutral structure will be cached under two different keys.
+ *
+ * ----------------------------------------
+ *
+ * There are two hacks here to support model switching: one in the OntModels and
+ * one in the WebappDaoFactories. These are hacks for several reasons, not the
+ * least of which is that the model switching will not be available on
+ * WebappDaoFactories based on ASSERTIONS_ONLY or INFERENCES_ONLY, and similarly
+ * for the OntModel.
+ */
+public class RequestModelAccessImpl implements RequestModelAccess {
+ private static final Log log = LogFactory
+ .getLog(RequestModelAccessImpl.class);
+
+ private final HttpServletRequest req;
+ private final ServletContext ctx;
+ private final ConfigurationProperties props;
+ private final ShortTermDataStructuresProvider provider;
+
+ public RequestModelAccessImpl(HttpServletRequest req,
+ ShortTermDataStructuresProvider provider) {
+ this.req = req;
+ this.ctx = req.getSession().getServletContext();
+ this.props = ConfigurationProperties.getBean(req);
+ this.provider = provider;
+ }
+
+ /**
+ * Language awareness is disabled unless they explicitly enable it.
+ */
+ private Boolean isLanguageAwarenessEnabled() {
+ return Boolean.valueOf(props.getProperty("RDFService.languageFilter",
+ "false"));
+ }
+
+ private List getPreferredLanguages() {
+ return LanguageFilteringUtils.localesToLanguages(req.getLocales());
+ }
+
+ @Override
+ public void close() {
+ this.provider.close();
+ }
+
+ @Override
+ public String toString() {
+ return "RequestModelAccessImpl[" + ToString.hashHex(this) + ", req="
+ + ToString.hashHex(req) + ", provider=" + provider + "]";
+ }
+
+ // ----------------------------------------------------------------------
+ // RDFServices
+ // ----------------------------------------------------------------------
+
+ private final Map rdfServiceMap = new HashMap<>();
+
+ @Override
+ public RDFService getRDFService(RdfServiceOption... options) {
+ return getRDFService(new RDFServiceKey(options));
+ }
+
+ private RDFService getRDFService(RDFServiceKey key) {
+ if (!rdfServiceMap.containsKey(key)) {
+ RDFService rdfService = createRDFService(key);
+ log.debug("Creating: " + key + ", request=" + req.hashCode()
+ + ", " + rdfService);
+ rdfServiceMap.put(key, rdfService);
+ }
+ RDFService rdfService = rdfServiceMap.get(key);
+ log.debug("getRDFService, " + key + ": " + rdfService);
+ return rdfService;
+ }
+
+ private RDFService createRDFService(RDFServiceKey key) {
+ if (key.getLanguageOption() == LANGUAGE_AWARE) {
+ return addLanguageAwareness(getRDFService(LANGUAGE_NEUTRAL));
+ } else {
+ return provider.getRDFService(key.getWhichService());
+ }
+ }
+
+ private RDFService addLanguageAwareness(RDFService unaware) {
+ if (isLanguageAwarenessEnabled()) {
+ return new LanguageFilteringRDFService(unaware,
+ getPreferredLanguages());
+ } else {
+ return unaware;
+ }
+ }
+
+ // ----------------------------------------------------------------------
+ // Datasets
+ // ----------------------------------------------------------------------
+
+ private final Map datasetMap = new HashMap<>();
+
+ @Override
+ public Dataset getDataset(DatasetOption... options) {
+ return getDataset(new DatasetKey(options));
+ }
+
+ private Dataset getDataset(DatasetKey key) {
+ if (!datasetMap.containsKey(key)) {
+ Dataset dataset = createDataset(key);
+ log.debug("Creating: " + key + ", request=" + req.hashCode()
+ + ", " + dataset);
+ datasetMap.put(key, dataset);
+ }
+ Dataset dataset = datasetMap.get(key);
+ log.debug("getDataset, " + key + ": " + dataset);
+ return dataset;
+ }
+
+ private Dataset createDataset(DatasetKey key) {
+ return new RDFServiceDataset(getRDFService(key.rdfServiceKey()));
+ }
+
+ // ----------------------------------------------------------------------
+ // OntModels
+ // ----------------------------------------------------------------------
+
+ private final Map ontModelMap = new HashMap<>();
+
+ @Override
+ public OntModel getOntModel(LanguageOption... options) {
+ return getOntModel(ModelNames.FULL_UNION, options);
+ }
+
+ @Override
+ public OntModel getOntModel(String name, LanguageOption... options) {
+ return getOntModel(new OntModelKey(name, options));
+ }
+
+ private OntModel getOntModel(OntModelKey key) {
+ if (!ontModelMap.containsKey(key)) {
+ OntModel ontModel = createOntModel(key);
+ log.debug("Creating: " + key + ", request=" + req.hashCode()
+ + ", " + ontModel);
+ ontModelMap.put(key, ontModel);
+ }
+ OntModel ontModel = ontModelMap.get(key);
+ log.debug("getOntModel, " + key + ": " + ontModel);
+ return ontModel;
+ }
+
+ private OntModel createOntModel(OntModelKey key) {
+ if (key.getLanguageOption() == LANGUAGE_AWARE) {
+ return addLanguageAwareness(getOntModel(key.getName(),
+ LANGUAGE_NEUTRAL));
+ } else {
+ return provider.getOntModelCache().getOntModel(key.getName());
+ }
+ }
+
+ private OntModel addLanguageAwareness(OntModel unaware) {
+ if (isLanguageAwarenessEnabled()) {
+ return LanguageFilteringUtils.wrapOntModelInALanguageFilter(
+ unaware, req);
+ } else {
+ return unaware;
+ }
+ }
+
+ /**
+ * TODO Hack for model switching.
+ */
+ public void setSpecialWriteModel(OntModel mainOntModel) {
+ ontModelMap.put(new OntModelKey(ModelNames.FULL_UNION), mainOntModel);
+ }
+
+ // ----------------------------------------------------------------------
+ // OntModelSelectors
+ // ----------------------------------------------------------------------
+
+ private final Map ontModelSelectorMap = new HashMap<>();
+
+ @Override
+ public OntModelSelector getOntModelSelector(
+ OntModelSelectorOption... options) {
+ return getOntModelSelector(new OntModelSelectorKey(options));
+ }
+
+ private OntModelSelector getOntModelSelector(OntModelSelectorKey key) {
+ if (!ontModelSelectorMap.containsKey(key)) {
+ OntModelSelector oms = createOntModelSelector(key);
+ log.debug("Creating: " + key + ", request=" + req.hashCode()
+ + ", " + oms);
+ ontModelSelectorMap.put(key, oms);
+ }
+ OntModelSelector ontModelSelector = ontModelSelectorMap.get(key);
+ log.debug("getOntModelSelector, " + key + ": " + ontModelSelector);
+ return ontModelSelector;
+ }
+
+ private OntModelSelector createOntModelSelector(OntModelSelectorKey key) {
+ OntModelSelectorImpl oms = new OntModelSelectorImpl();
+
+ oms.setABoxModel(getOntModel(key.aboxKey()));
+ oms.setTBoxModel(getOntModel(key.tboxKey()));
+ oms.setFullModel(getOntModel(key.fullKey()));
+
+ oms.setApplicationMetadataModel(getOntModel(key
+ .ontModelKey(APPLICATION_METADATA)));
+ oms.setDisplayModel(getOntModel(key.ontModelKey(DISPLAY)));
+ oms.setUserAccountsModel(getOntModel(key.ontModelKey(USER_ACCOUNTS)));
+
+ return oms;
+ }
+
+ // ----------------------------------------------------------------------
+ // WebappDaoFactories
+ // ----------------------------------------------------------------------
+
+ private final Map wadfMap = new HashMap<>();
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory(
+ WebappDaoFactoryOption... options) {
+ return getWebappDaoFactory(new WebappDaoFactoryKey(options));
+ }
+
+ private WebappDaoFactory getWebappDaoFactory(WebappDaoFactoryKey key) {
+ if (!wadfMap.containsKey(key)) {
+ WebappDaoFactory wadf = createWebappDaoFactory(key);
+ log.debug("Creating: " + key + ", request=" + req.hashCode()
+ + ", " + wadf);
+ wadfMap.put(key, wadf);
+ }
+ WebappDaoFactory wadf = wadfMap.get(key);
+ log.debug("getWebappDaoFactory, " + key + ": " + wadf);
+ return wadf;
+ }
+
+ private WebappDaoFactory createWebappDaoFactory(WebappDaoFactoryKey key) {
+ if (key.getPolicyOption() == POLICY_AWARE) {
+ return addPolicyAwareness(getWebappDaoFactory(key.policyNeutral()));
+ }
+
+ RDFService rdfService = getRDFService(key.rdfServiceKey());
+ OntModelSelector ontModelSelector = getOntModelSelector(key
+ .ontModelSelectorKey());
+ WebappDaoFactoryConfig config = provider.getWebappDaoFactoryConfig();
+
+ switch (key.getReasoningOption()) {
+ case ASSERTIONS_ONLY:
+ return new WebappDaoFactorySDB(rdfService, ontModelSelector,
+ config, SDBDatasetMode.ASSERTIONS_ONLY);
+ case INFERENCES_ONLY:
+ return new WebappDaoFactorySDB(rdfService, ontModelSelector,
+ config, SDBDatasetMode.INFERENCES_ONLY);
+ default: // ASSERTIONS_AND_INFERENCES
+ // TODO Do model switching and replace the WebappDaoFactory with
+ // a different version if requested by parameters
+ WebappDaoFactory unswitched = new WebappDaoFactorySDB(rdfService,
+ ontModelSelector, config);
+ return new ModelSwitcher().checkForModelSwitching(new VitroRequest(
+ req), unswitched);
+ }
+ }
+
+ private WebappDaoFactory addPolicyAwareness(WebappDaoFactory unaware) {
+ HideFromDisplayByPolicyFilter filter = new HideFromDisplayByPolicyFilter(
+ RequestIdentifiers.getIdBundleForRequest(req),
+ ServletPolicyList.getPolicies(ctx));
+ return new WebappDaoFactoryFiltering(unaware, filter);
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/DatasetKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/DatasetKey.java
new file mode 100644
index 000000000..5609c38ff
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/DatasetKey.java
@@ -0,0 +1,35 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.DatasetOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+
+/**
+ * An immutable key for storing Dataset objects in the ModelAccess maps.
+ */
+public final class DatasetKey extends ModelAccessKey {
+ public DatasetKey(DatasetOption... options) {
+ super(findWhichService(options), findLanguageOption(options));
+ }
+
+ @Override
+ public WhichService getWhichService() {
+ return super.getWhichService();
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+ /**
+ * How would we access an RDFService that is the basis for the Dataset
+ * accessed by this key?
+ */
+ public RDFServiceKey rdfServiceKey() {
+ return new RDFServiceKey(getWhichService(), getLanguageOption());
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/LanguageOptionKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/LanguageOptionKey.java
new file mode 100644
index 000000000..6cac9d902
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/LanguageOptionKey.java
@@ -0,0 +1,21 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+
+/**
+ * An immutable key that distills a list of LanguageOptions into a single
+ * result.
+ */
+public final class LanguageOptionKey extends ModelAccessKey {
+ public LanguageOptionKey(LanguageOption... options) {
+ super(options);
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/ModelAccessKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/ModelAccessKey.java
new file mode 100644
index 000000000..42a5ae40d
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/ModelAccessKey.java
@@ -0,0 +1,159 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ModelAccessOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+
+/**
+ * An immutable collection of options that can be used as a key in a hashmap.
+ *
+ * The class of the key is part of the hash, so a OntModelKey and a
+ * RDFServiceKey can both be used in the same map without conflict.
+ */
+public abstract class ModelAccessKey {
+
+ // ----------------------------------------------------------------------
+ // Static methods
+ // ----------------------------------------------------------------------
+
+ protected static WhichService findWhichService(ModelAccessOption... options) {
+ return findWhichService(Arrays.asList(options));
+ }
+
+ protected static WhichService findWhichService(
+ Iterable options) {
+ return findOption(options, WhichService.CONTENT, WhichService.class);
+ }
+
+ protected static ReasoningOption findReasoningOption(
+ ModelAccessOption... options) {
+ return findReasoningOption(Arrays.asList(options));
+ }
+
+ protected static ReasoningOption findReasoningOption(
+ Iterable options) {
+ return findOption(options, ReasoningOption.ASSERTIONS_AND_INFERENCES,
+ ReasoningOption.class);
+ }
+
+ protected static LanguageOption findLanguageOption(
+ ModelAccessOption... options) {
+ return findLanguageOption(Arrays.asList(options));
+ }
+
+ protected static LanguageOption findLanguageOption(
+ Iterable options) {
+ return findOption(options, LanguageOption.LANGUAGE_AWARE,
+ LanguageOption.class);
+ }
+
+ protected static PolicyOption findPolicyOption(ModelAccessOption[] options) {
+ return findPolicyOption(Arrays.asList(options));
+ }
+
+ protected static PolicyOption findPolicyOption(
+ Iterable options) {
+ return findOption(options, PolicyOption.POLICY_AWARE,
+ PolicyOption.class);
+ }
+
+ /**
+ * Search through the options for values from the specified class. If none
+ * are found, use the default value.
+ *
+ * Redundant options are silently accepted, but conflicting options will
+ * throw an exception.
+ */
+ private static T findOption(Iterable options,
+ T defaultValue, Class clazz) {
+ T found = null;
+ for (ModelAccessOption option : options) {
+ if (found == option) {
+ continue;
+ }
+ if (!clazz.isInstance(option)) {
+ continue;
+ }
+ if (found == null) {
+ found = clazz.cast(option);
+ continue;
+ }
+ throw new IllegalArgumentException("Conflicting options: " + found
+ + " and " + option);
+ }
+
+ if (found == null) {
+ return defaultValue;
+ } else {
+ return found;
+ }
+ }
+
+ // ----------------------------------------------------------------------
+ // The instance
+ // ----------------------------------------------------------------------
+
+ protected final List keyComponents;
+ private final int hashCode;
+
+ protected ModelAccessKey(ModelAccessOption... options) {
+ this.keyComponents = Collections.unmodifiableList(new ArrayList<>(
+ Arrays.asList(options)));
+ this.hashCode = keyComponents.hashCode() ^ this.getClass().hashCode();
+ }
+
+ protected ReasoningOption getReasoningOption() {
+ return findReasoningOption(keyComponents);
+ }
+
+ protected LanguageOption getLanguageOption() {
+ return findLanguageOption(keyComponents);
+ }
+
+ protected WhichService getWhichService() {
+ return findWhichService(keyComponents);
+ }
+
+ protected PolicyOption getPolicyOption() {
+ return findPolicyOption(keyComponents);
+ }
+
+ @Override
+ public int hashCode() {
+ return hashCode;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ } else if (obj == null) {
+ return false;
+ } else if (getClass() != obj.getClass()) {
+ return false;
+ }
+ ModelAccessKey that = (ModelAccessKey) obj;
+ return this.keyComponents.equals(that.keyComponents);
+ }
+
+ @Override
+ public String toString() {
+ List notDefaults = new ArrayList<>();
+ for (ModelAccessOption option : keyComponents) {
+ if (!option.isDefault()) {
+ notDefaults.add(option);
+ }
+ }
+ return this.getClass().getSimpleName() + notDefaults;
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelKey.java
new file mode 100644
index 000000000..bbb3263ee
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelKey.java
@@ -0,0 +1,48 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * An immutable key for storing and retrieving OntModels.
+ *
+ * In addition to the usual options, it has a name, which adds to the
+ * uniqueness.
+ */
+public final class OntModelKey extends ModelAccessKey {
+ private final String name;
+ private final int hashCode;
+
+ public OntModelKey(String name, LanguageOption... options) {
+ super(findLanguageOption(options));
+ this.name = name;
+ this.hashCode = super.hashCode() ^ name.hashCode();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return super.equals(obj) && ((OntModelKey) obj).name.equals(this.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return hashCode;
+ }
+
+ @Override
+ public String toString() {
+ return super.toString() + " " + ToString.modelName(name);
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelSelectorKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelSelectorKey.java
new file mode 100644
index 000000000..a790f4ee3
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/OntModelSelectorKey.java
@@ -0,0 +1,77 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.OntModelSelectorOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+
+/**
+ * An immutable key for storing OntModelSelectors in the ModelAccess maps.
+ */
+public final class OntModelSelectorKey extends ModelAccessKey {
+ public OntModelSelectorKey(OntModelSelectorOption... options) {
+ super(findLanguageOption(options), findReasoningOption(options));
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+ @Override
+ public ReasoningOption getReasoningOption() {
+ return super.getReasoningOption();
+ }
+
+ public OntModelKey aboxKey() {
+ switch (getReasoningOption()) {
+ case ASSERTIONS_ONLY:
+ return new OntModelKey(ABOX_ASSERTIONS, getLanguageOption());
+ case INFERENCES_ONLY:
+ return new OntModelKey(ABOX_INFERENCES, getLanguageOption());
+ default: // ASSERTIONS_AND_INFERENCES
+ return new OntModelKey(ABOX_UNION, getLanguageOption());
+ }
+ }
+
+ public OntModelKey tboxKey() {
+ switch (getReasoningOption()) {
+ case ASSERTIONS_ONLY:
+ return new OntModelKey(TBOX_ASSERTIONS, getLanguageOption());
+ case INFERENCES_ONLY:
+ return new OntModelKey(TBOX_INFERENCES, getLanguageOption());
+ default: // ASSERTIONS_AND_INFERENCES
+ return new OntModelKey(TBOX_UNION, getLanguageOption());
+ }
+ }
+
+ public OntModelKey fullKey() {
+ switch (getReasoningOption()) {
+ case ASSERTIONS_ONLY:
+ return new OntModelKey(FULL_ASSERTIONS, getLanguageOption());
+ case INFERENCES_ONLY:
+ return new OntModelKey(FULL_INFERENCES, getLanguageOption());
+ default: // ASSERTIONS_AND_INFERENCES
+ return new OntModelKey(FULL_UNION, getLanguageOption());
+ }
+ }
+
+ /**
+ * Get appropriate keys for the DISPLAY, USER_ACCOUNTS, and
+ * APPLICATION_METADATA models.
+ */
+ public OntModelKey ontModelKey(String name) {
+ return new OntModelKey(name, getLanguageOption());
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/RDFServiceKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/RDFServiceKey.java
new file mode 100644
index 000000000..4507272b4
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/RDFServiceKey.java
@@ -0,0 +1,27 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.RdfServiceOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+
+/**
+ * An immutable key for storing RDFService objects in the ModelAccess maps.
+ */
+public final class RDFServiceKey extends ModelAccessKey {
+ public RDFServiceKey(RdfServiceOption... options) {
+ super(findWhichService(options), findLanguageOption(options));
+ }
+
+ @Override
+ public WhichService getWhichService() {
+ return super.getWhichService();
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/WebappDaoFactoryKey.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/WebappDaoFactoryKey.java
new file mode 100644
index 000000000..9efddf61b
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/impl/keys/WebappDaoFactoryKey.java
@@ -0,0 +1,48 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption.POLICY_NEUTRAL;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.PolicyOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WebappDaoFactoryOption;
+
+/**
+ * An immutable key for storing RDFService objects in the ModelAccess maps.
+ */
+public final class WebappDaoFactoryKey extends ModelAccessKey {
+ public WebappDaoFactoryKey(WebappDaoFactoryOption... options) {
+ super(findLanguageOption(options), findReasoningOption(options),
+ findPolicyOption(options));
+ }
+
+ @Override
+ public LanguageOption getLanguageOption() {
+ return super.getLanguageOption();
+ }
+
+ @Override
+ public ReasoningOption getReasoningOption() {
+ return super.getReasoningOption();
+ }
+
+ @Override
+ public PolicyOption getPolicyOption() {
+ return super.getPolicyOption();
+ }
+
+ public WebappDaoFactoryKey policyNeutral() {
+ return new WebappDaoFactoryKey(getLanguageOption(),
+ getReasoningOption(), POLICY_NEUTRAL);
+ }
+
+ public RDFServiceKey rdfServiceKey() {
+ return new RDFServiceKey(getWhichService(), getLanguageOption());
+ }
+
+ public OntModelSelectorKey ontModelSelectorKey() {
+ return new OntModelSelectorKey(getLanguageOption(),
+ getReasoningOption());
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/JoinedOntModelCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/JoinedOntModelCache.java
new file mode 100644
index 000000000..3207196bf
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/JoinedOntModelCache.java
@@ -0,0 +1,67 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.hp.hpl.jena.ontology.OntModel;
+
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * Use two OntModelCaches as one.
+ *
+ * If both caches contain models with the same name, a warning will be written
+ * to the log, and the model from the primary cache will be used.
+ *
+ * Any new models will be created on the primary cache.
+ */
+public class JoinedOntModelCache implements OntModelCache {
+ private static final Log log = LogFactory.getLog(JoinedOntModelCache.class);
+
+ private final OntModelCache primary;
+ private final OntModelCache secondary;
+
+ public JoinedOntModelCache(OntModelCache primary, OntModelCache secondary) {
+ this.primary = primary;
+ this.secondary = secondary;
+
+ Set duplicateNames = new HashSet<>(primary.getModelNames());
+ duplicateNames.retainAll(secondary.getModelNames());
+ if (!duplicateNames.isEmpty()) {
+ log.warn("These model names appear in both caches: "
+ + duplicateNames);
+ }
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ if (primary.getModelNames().contains(name)) {
+ return primary.getOntModel(name);
+ }
+ if (secondary.getModelNames().contains(name)) {
+ return secondary.getOntModel(name);
+ }
+ return primary.getOntModel(name);
+ }
+
+ @Override
+ public SortedSet getModelNames() {
+ SortedSet allNames = new TreeSet<>(primary.getModelNames());
+ allNames.addAll(secondary.getModelNames());
+ return allNames;
+ }
+
+ @Override
+ public String toString() {
+ return "JoinedOntModelCache[" + ToString.hashHex(this) + ", primary="
+ + primary + ", secondary=" + secondary + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/MaskingOntModelCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/MaskingOntModelCache.java
new file mode 100644
index 000000000..9ae5a5d1b
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/MaskingOntModelCache.java
@@ -0,0 +1,77 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.hp.hpl.jena.ontology.OntModel;
+
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * The named models in the masking cache will be used in preference to a model
+ * of the same name in the base cache.
+ *
+ * If a named model doesn't exist in the masking cache, a warning is written to
+ * the log and the name will be ignored.
+ *
+ * New models are created in the base cache only.
+ */
+public class MaskingOntModelCache implements OntModelCache {
+ private static final Log log = LogFactory
+ .getLog(MaskingOntModelCache.class);
+
+ private final OntModelCache baseCache;
+ private final OntModelCache maskingCache;
+ private final Set maskingNames;
+
+ public MaskingOntModelCache(OntModelCache baseCache,
+ OntModelCache maskingCache, Collection maskingNames) {
+ this.baseCache = baseCache;
+ this.maskingCache = maskingCache;
+ this.maskingNames = new HashSet<>(maskingNames);
+ checkForMissingNamedModels();
+ }
+
+ private void checkForMissingNamedModels() {
+ Set missingModelNames = new HashSet<>(this.maskingNames);
+ missingModelNames.removeAll(maskingCache.getModelNames());
+ if (!missingModelNames.isEmpty()) {
+ log.warn("Specifed models do not exist in the masking cache: "
+ + missingModelNames);
+ maskingNames.removeAll(missingModelNames);
+ }
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ if (maskingNames.contains(name)) {
+ return maskingCache.getOntModel(name);
+ } else {
+ return baseCache.getOntModel(name);
+ }
+ }
+
+ /** The list of names in the baseCache may have changed. */
+ @Override
+ public SortedSet getModelNames() {
+ SortedSet allNames = new TreeSet<>(baseCache.getModelNames());
+ allNames.addAll(maskingNames);
+ return allNames;
+ }
+
+ @Override
+ public String toString() {
+ return "MaskingOntModelCache[" + ToString.hashHex(this)
+ + ", baseCache=" + baseCache + ", maskingCache=" + maskingCache
+ + ", maskingNames=" + maskingNames + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/ModelMakerOntModelCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/ModelMakerOntModelCache.java
new file mode 100644
index 000000000..94106433c
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/ModelMakerOntModelCache.java
@@ -0,0 +1,57 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * When an OntModel is requested for the first time, get a model from the
+ * ModelMaker, wrap it, and cache it for subsequent requests.
+ */
+public class ModelMakerOntModelCache implements OntModelCache {
+ private final Map cache = new HashMap<>();
+ private final ModelMaker mm;
+
+ public ModelMakerOntModelCache(ModelMaker mm) {
+ this.mm = mm;
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ synchronized (cache) {
+ if (cache.containsKey(name)) {
+ return cache.get(name);
+ }
+ return wrapAndCache(name);
+ }
+ }
+
+ private OntModel wrapAndCache(String name) {
+ Model m = mm.getModel(name);
+ OntModel om = VitroModelFactory.createOntologyModel(m);
+ cache.put(name, om);
+ return om;
+ }
+
+ @Override
+ public SortedSet getModelNames() {
+ return new TreeSet<>(mm.listModels().toList());
+ }
+
+ @Override
+ public String toString() {
+ return "ModelMakerOntModelCache[" + ToString.hashHex(this) + ", mm=" + mm
+ + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/OntModelCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/OntModelCache.java
new file mode 100644
index 000000000..865f07fd6
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/OntModelCache.java
@@ -0,0 +1,26 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels;
+
+import java.util.SortedSet;
+
+import com.hp.hpl.jena.ontology.OntModel;
+
+/**
+ * A source for OntModels from the triple-store. The contract is this:
+ *
+ * If you ask by a name that is not in use, an OntModel will be created.
+ *
+ * If you ask by the same name twice, you get the same OntModel.
+ */
+public interface OntModelCache {
+ /**
+ * Get the model with this name (URI). If such a model does not exist, it will be created.
+ */
+ OntModel getOntModel(String name);
+
+ /**
+ * Get the names of all existing models.
+ */
+ SortedSet getModelNames();
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/UnionModelsOntModelsCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/UnionModelsOntModelsCache.java
new file mode 100644
index 000000000..2ce5af5cc
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ontmodels/UnionModelsOntModelsCache.java
@@ -0,0 +1,181 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import com.hp.hpl.jena.ontology.OntModel;
+
+import edu.cornell.mannlib.vitro.webapp.rdfservice.adapters.VitroModelFactory;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * Decorates an OntModelCache with some "virtual" OntModels, each of which is a
+ * union of two actual OntModels.
+ *
+ * For example, we might create a model called FULL_ASSERTIONS, that is the
+ * union of two models called ABOX_ASSERTIONS and TBOX_ASSERTIONS.
+ *
+ * The inner class UnionSpec holds the model names, and allows us to lazily
+ * create the union models.
+ */
+public class UnionModelsOntModelsCache implements OntModelCache {
+ private final OntModelCache inner;
+ private final Map unionModelsMap;
+
+ /**
+ * Create it like this:
+ *
+ *
+ * new UnionModelsOntModelsCache(inner,
+ * UnionSpec.base("baseUri").plus("plusUri").yields("unionUri"),
+ * ...);
+ *
+ */
+ public UnionModelsOntModelsCache(OntModelCache inner,
+ UnionSpec... unionModelSpecs) {
+ this.inner = inner;
+
+ this.unionModelsMap = new HashMap<>();
+
+ for (UnionSpec spec : unionModelSpecs) {
+ String unionUri = spec.getUnionUri();
+ if (unionModelsMap.containsKey(unionUri)) {
+ throw new IllegalArgumentException(
+ "Two UnionSpecs may not have the same union URI: "
+ + spec + ", " + unionModelsMap.get(unionUri));
+ }
+ this.unionModelsMap.put(unionUri, spec);
+ }
+
+ for (UnionSpec spec : unionModelsMap.values()) {
+ if (unionModelsMap.containsKey(spec.getBaseUri())
+ || unionModelsMap.containsKey(spec.getPlusUri())) {
+ throw new IllegalArgumentException(
+ "A UnionSpec may not build on another UnionSpec: "
+ + spec);
+ }
+ }
+ }
+
+ private boolean hasUnionModel(String name) {
+ return unionModelsMap.containsKey(name);
+ }
+
+ /**
+ * The union models use lazy initialization, so there is no overhead if the
+ * model is never requested.
+ */
+ private OntModel getUnionModel(String name) {
+ UnionSpec spec = unionModelsMap.get(name);
+ synchronized (spec) {
+ if (spec.getUnionModel() == null) {
+ OntModel baseModel = inner.getOntModel(spec.getBaseUri());
+ OntModel plusModel = inner.getOntModel(spec.getPlusUri());
+ spec.setUnionModel(VitroModelFactory.createUnion(baseModel,
+ plusModel));
+ }
+ }
+ return spec.getUnionModel();
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ if (hasUnionModel(name)) {
+ return getUnionModel(name);
+ } else {
+ return inner.getOntModel(name);
+ }
+ }
+
+ @Override
+ public SortedSet getModelNames() {
+ SortedSet names = new TreeSet<>(inner.getModelNames());
+ names.addAll(unionModelsMap.keySet());
+ return names;
+ }
+
+ @Override
+ public String toString() {
+ return "UnionModelsOntModelsCache[" + ToString.hashHex(this)
+ + ", inner=" + inner + ", unionModelsMap=" + unionModelsMap
+ + "]";
+ }
+
+ // ----------------------------------------------------------------------
+ // UnionSpec and builder classes.
+ // ----------------------------------------------------------------------
+
+ public static class UnionSpec {
+ public static UnionSpecBase base(String baseUri) {
+ return new UnionSpecBase(baseUri);
+ }
+
+ private final String baseUri;
+ private final String plusUri;
+ private final String unionUri;
+ private OntModel unionModel;
+
+ public UnionSpec(String baseUri, String plusUri, String unionUri) {
+ this.baseUri = baseUri;
+ this.plusUri = plusUri;
+ this.unionUri = unionUri;
+ }
+
+ public OntModel getUnionModel() {
+ return unionModel;
+ }
+
+ public void setUnionModel(OntModel unionModel) {
+ this.unionModel = unionModel;
+ }
+
+ public String getBaseUri() {
+ return baseUri;
+ }
+
+ public String getPlusUri() {
+ return plusUri;
+ }
+
+ public String getUnionUri() {
+ return unionUri;
+ }
+
+ @Override
+ public String toString() {
+ return "UnionSpec[baseUri=" + baseUri + ", plusUri=" + plusUri
+ + ", unionUri=" + unionUri + "]";
+ }
+ }
+
+ public static class UnionSpecBase {
+ private final String baseUri;
+
+ UnionSpecBase(String baseUri) {
+ this.baseUri = baseUri;
+ }
+
+ public UnionSpecPair plus(String plusUri) {
+ return new UnionSpecPair(baseUri, plusUri);
+ }
+ }
+
+ public static class UnionSpecPair {
+ private final String baseUri;
+ private final String plusUri;
+
+ public UnionSpecPair(String baseUri, String plusUri) {
+ this.baseUri = baseUri;
+ this.plusUri = plusUri;
+ }
+
+ public UnionSpec yields(String unionUri) {
+ return new UnionSpec(baseUri, plusUri, unionUri);
+ }
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java
index 0b4b72923..c5d2995be 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java
@@ -31,6 +31,7 @@ import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
@@ -333,7 +334,7 @@ public class KnowledgeBaseUpdater {
return required;
}
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(servletContext).getRDFService();
+ RDFService rdfService = ModelAccess.on(servletContext).getRDFService();
// if the ASK query DOES have a solution (i.e. the assertions exist
// showing that the update has already been performed), then the update
@@ -381,7 +382,7 @@ public class KnowledgeBaseUpdater {
private void assertSuccess(ServletContext servletContext) throws FileNotFoundException, IOException {
try {
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(servletContext).getRDFService();
+ RDFService rdfService = ModelAccess.on(servletContext).getRDFService();
ChangeSet changeSet = rdfService.manufactureChangeSet();
File successAssertionsFile = new File(settings.getSuccessAssertionsFile());
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractModelDecorator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractModelDecorator.java
index 1cdbf2d2d..1c607398f 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractModelDecorator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractModelDecorator.java
@@ -40,6 +40,8 @@ import com.hp.hpl.jena.shared.Command;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.shared.PrefixMapping;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
/**
* The base class for a delegating model decorator.
*
@@ -56,6 +58,12 @@ public abstract class AbstractModelDecorator implements Model {
this.inner = m;
}
+ @Override
+ public String toString() {
+ return ToString.simpleName(this) + "[" + ToString.hashHex(this)
+ + ", inner=" + ToString.modelToString(inner) + "]";
+ }
+
@Override
@Deprecated
public Resource getResource(String uri, com.hp.hpl.jena.rdf.model.ResourceF f) {
@@ -464,13 +472,13 @@ public abstract class AbstractModelDecorator implements Model {
@Override
public Model remove(Model m) {
- return m.remove(m);
+ return inner.remove(m);
}
@Override
@Deprecated
public Model remove(Model m, boolean suppressReifications) {
- return m.remove(m, suppressReifications);
+ return inner.remove(m, suppressReifications);
}
@Override
@@ -737,13 +745,13 @@ public abstract class AbstractModelDecorator implements Model {
@Override
public Model add(Model m) {
- return m.add(m);
+ return inner.add(m);
}
@Override
@Deprecated
public Model add(Model m, boolean suppressReifications) {
- return m.add(m, suppressReifications);
+ return inner.add(m, suppressReifications);
}
@Override
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java
index 2f9f6d8d4..dc6d2b7eb 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/AbstractOntModelDecorator.java
@@ -79,7 +79,7 @@ import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.shared.PrefixMapping;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
/**
* The base class for a delegating ontology model decorator.
@@ -511,13 +511,13 @@ public abstract class AbstractOntModelDecorator implements OntModel {
@Override
public Model remove(Model m) {
- return m.remove(m);
+ return inner.remove(m);
}
@Override
@Deprecated
public Model remove(Model m, boolean suppressReifications) {
- return m.remove(m, suppressReifications);
+ return inner.remove(m, suppressReifications);
}
@Override
@@ -784,13 +784,13 @@ public abstract class AbstractOntModelDecorator implements OntModel {
@Override
public Model add(Model m) {
- return m.add(m);
+ return inner.add(m);
}
@Override
@Deprecated
public Model add(Model m, boolean suppressReifications) {
- return m.add(m, suppressReifications);
+ return inner.add(m, suppressReifications);
}
@Override
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java
index 59472183d..0ad31d3cb 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/BulkUpdatingModel.java
@@ -182,11 +182,6 @@ public class BulkUpdatingModel extends AbstractModelDecorator {
return this;
}
- @Override
- public String toString() {
- return "<" + this.getClass().getSimpleName() + " " + getGraph() + ">";
- }
-
private Iterator asTriples(StmtIterator it) {
return it.mapWith(mapAsTriple);
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/MemoryMappedModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/MemoryMappedModel.java
new file mode 100644
index 000000000..8eff342d6
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/MemoryMappedModel.java
@@ -0,0 +1,142 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.rdfservice.adapters;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.ModelChangedListener;
+import com.hp.hpl.jena.rdf.model.Statement;
+import com.hp.hpl.jena.rdf.model.StmtIterator;
+import com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl;
+
+import edu.cornell.mannlib.vitro.webapp.dao.jena.event.CloseEvent;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * Creates an in-memory model, with a listener that keeps the external model in
+ * sync with it.
+ */
+public class MemoryMappedModel extends AbstractModelDecorator {
+ private static final Log log = LogFactory.getLog(MemoryMappedModel.class);
+
+ private final String toString;
+
+ public MemoryMappedModel(Model externalModel, String name) {
+ super(VitroModelFactory.createModel());
+ super.add(externalModel);
+ super.register(new ModelSynchronizer(externalModel, name));
+
+ this.toString = "MemoryMappedModel[wrapping "
+ + ToString.modelToString(externalModel) + "]";
+ }
+
+ @Override
+ public String toString() {
+ return this.toString;
+ }
+
+ // ----------------------------------------------------------------------
+ // The listener
+ // ----------------------------------------------------------------------
+
+ /**
+ * Simple change listener to keep a model (the 'synchronizee') in synch with
+ * the model with which it is registered.
+ */
+ public class ModelSynchronizer implements ModelChangedListener {
+ private Model m;
+ private String hash;
+
+ public ModelSynchronizer(Model synchronizee, String name) {
+ this.m = synchronizee;
+ this.hash = Integer.toHexString(this.hashCode());
+ log.debug(String.format("create: %s, wraps %s(%s) as %s", hash,
+ this.m.getClass().getName(),
+ Integer.toHexString(this.m.hashCode()), name));
+ }
+
+ @Override
+ public void addedStatement(Statement s) {
+ log.debug(hash + " addedStatement" + s);
+ m.add(s);
+ }
+
+ @Override
+ public void addedStatements(Statement[] statements) {
+ log.debug(hash + " addedStatements: " + statements.length);
+ m.add(statements);
+ }
+
+ @Override
+ public void addedStatements(List statements) {
+ log.debug(hash + " addedStatements: " + statements.size());
+ m.add(statements);
+ }
+
+ @Override
+ public void addedStatements(StmtIterator statements) {
+ if (log.isDebugEnabled()) {
+ Set set = statements.toSet();
+ log.debug(hash + " addedStatements: " + set.size());
+ m.add(new StmtIteratorImpl(set.iterator()));
+ } else {
+ m.add(new StmtIteratorImpl(statements));
+ }
+ }
+
+ @Override
+ public void addedStatements(Model model) {
+ log.debug(hash + " addedStatements: " + model.size());
+ m.add(model);
+ }
+
+ @Override
+ public void notifyEvent(Model model, Object event) {
+ if (event instanceof CloseEvent) {
+ m.close();
+ }
+ }
+
+ @Override
+ public void removedStatement(Statement s) {
+ log.debug(hash + " removedStatement" + s);
+ m.remove(s);
+ }
+
+ @Override
+ public void removedStatements(Statement[] statements) {
+ log.debug(hash + " removedStatements: " + statements.length);
+ m.remove(statements);
+ }
+
+ @Override
+ public void removedStatements(List statements) {
+ log.debug(hash + " removedStatements: " + statements.size());
+ m.remove(statements);
+ }
+
+ @Override
+ public void removedStatements(StmtIterator statements) {
+ if (log.isDebugEnabled()) {
+ Set set = statements.toSet();
+ log.debug(hash + " removedStatements: " + set.size());
+ m.remove(new StmtIteratorImpl(set.iterator()));
+ } else {
+ m.remove(new StmtIteratorImpl(statements));
+ }
+ }
+
+ @Override
+ public void removedStatements(Model model) {
+ log.debug(hash + " removedStatements: " + model.size());
+ m.remove(model);
+ }
+
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java
index 739bc9975..3de5327ce 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/adapters/VitroModelFactory.java
@@ -17,7 +17,7 @@ import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.impl.ModelCom;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
/**
* Make models that will do proper bulk updates.
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceFactorySingle.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceFactorySingle.java
index e970c8969..a1915a189 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceFactorySingle.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceFactorySingle.java
@@ -11,6 +11,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.RDFServiceFactory;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
/**
* An RDFServiceFactory that always returns the same RDFService object
@@ -140,7 +141,12 @@ public class RDFServiceFactorySingle implements RDFServiceFactory {
// Don't close s. It's being used by everybody.
}
+ @Override
+ public String toString() {
+ return ToString.simpleName(this) + "[" + ToString.hashHex(this)
+ + ", inner=" + s + "]";
+ }
+
}
-
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java
index 77e864436..15c67689a 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceUtils.java
@@ -18,6 +18,7 @@ import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.sparql.resultset.ResultsFormat;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService.ModelSerializationFormat;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService.ResultFormat;
@@ -31,8 +32,6 @@ public class RDFServiceUtils {
private static final String RDFSERVICEFACTORY_ATTR =
RDFServiceUtils.class.getName() + ".RDFServiceFactory";
- public enum WhichService {CONTENT, CONFIGURATION}
-
public static RDFServiceFactory getRDFServiceFactory(ServletContext context) {
return getRDFServiceFactory(context, WhichService.CONTENT);
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java
index 6d8702ce0..690fcf02f 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/ListeningGraph.java
@@ -29,7 +29,7 @@ import com.hp.hpl.jena.util.iterator.WrappedIterator;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ModelChange;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceImpl;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class ListeningGraph implements GraphWithPerform {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java
index cf7ced6e6..40fb8edda 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java
@@ -27,7 +27,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.jena.RDFServiceJena;
-import edu.cornell.mannlib.vitro.webapp.utils.ToString;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
public class RDFServiceSDB extends RDFServiceJena implements RDFService {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java
index cff20f024..519bd9e02 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java
@@ -22,6 +22,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.DatasetWrapper;
import edu.cornell.mannlib.vitro.webapp.rdfservice.ChangeSet;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.RDFServiceJena;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
/**
* An implementation that is based on Jena TDB.
@@ -165,4 +166,8 @@ public class RDFServiceTDB extends RDFServiceJena {
}
}
+ @Override
+ public String toString() {
+ return "RDFServiceTDB[" + ToString.hashHex(this) + "]";
+ }
}
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 f229aeadc..bce72e978 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java
@@ -17,7 +17,6 @@ import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.ontology.AnnotationProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
-import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.rdf.listeners.StatementListener;
import com.hp.hpl.jena.rdf.model.Literal;
@@ -66,9 +65,9 @@ public class SimpleReasoner extends StatementListener {
private static final String mostSpecificTypePropertyURI =
"http://vitro.mannlib.cornell.edu/ns/vitro/0.7#mostSpecificType";
- private static final AnnotationProperty mostSpecificType =
- (ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM))
- .createAnnotationProperty(mostSpecificTypePropertyURI);
+ private static final AnnotationProperty mostSpecificType = (
+ VitroModelFactory.createOntologyModel())
+ .createAnnotationProperty(mostSpecificTypePropertyURI);
// DeltaComputer
private CumulativeDeltaModeler aBoxDeltaModeler1 = null;
@@ -102,8 +101,8 @@ public class SimpleReasoner extends StatementListener {
this.tboxModel = tboxModel;
- this.fullModel = ModelFactory.createOntologyModel(
- OntModelSpec.OWL_MEM, ModelFactory.createModelForGraph(
+ this.fullModel = VitroModelFactory.createOntologyModel(
+ VitroModelFactory.createModelForGraph(
new RDFServiceGraph(rdfService)));
this.aboxModel = VitroModelFactory.createOntologyModel(
@@ -141,9 +140,8 @@ public class SimpleReasoner extends StatementListener {
this.tboxModel = tboxModel;
this.aboxModel = aboxModel;
this.inferenceModel = inferenceModel;
- this.fullModel = ModelFactory.createOntologyModel(
- OntModelSpec.OWL_MEM, ModelFactory.createUnion(
- aboxModel, inferenceModel));
+ this.fullModel = VitroModelFactory.createUnion(aboxModel,
+ VitroModelFactory.createOntologyModel(inferenceModel));
aBoxDeltaModeler1 = new CumulativeDeltaModeler();
aBoxDeltaModeler2 = new CumulativeDeltaModeler();
this.batchMode = 0;
@@ -550,7 +548,7 @@ public class SimpleReasoner extends StatementListener {
*/
protected void addedSubClass(OntClass subClass, OntClass superClass, Model inferenceModel) {
//log.debug("subClass = " + subClass.getURI() + " superClass = " + superClass.getURI());
- OntModel unionModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
+ OntModel unionModel = VitroModelFactory.createOntologyModel();
unionModel.addSubModel(aboxModel);
unionModel.addSubModel(inferenceModel);
List subjectList = new ArrayList();
@@ -580,7 +578,7 @@ public class SimpleReasoner extends StatementListener {
* of A (including A itself)
*/
protected void removedSubClass(OntClass subClass, OntClass superClass, Model inferenceModel) {
- OntModel unionModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
+ OntModel unionModel = VitroModelFactory.createOntologyModel();
unionModel.addSubModel(aboxModel);
unionModel.addSubModel(inferenceModel);
List subjectList = new ArrayList();
@@ -862,7 +860,7 @@ public class SimpleReasoner extends StatementListener {
protected void generateSameAsInferences(Resource ind1, Resource ind2, Model inferenceModel) {
- OntModel unionModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
+ OntModel unionModel = VitroModelFactory.createOntologyModel();
unionModel.addSubModel(aboxModel);
unionModel.addSubModel(inferenceModel);
@@ -1310,7 +1308,7 @@ public class SimpleReasoner extends StatementListener {
HashSet typeURIs = new HashSet();
try {
- OntModel unionModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
+ OntModel unionModel = VitroModelFactory.createOntologyModel();
unionModel.addSubModel(aboxModel);
unionModel.addSubModel(inferenceModel);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java
index bb42e07c4..6e742499b 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.searchindex;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+
import java.util.ArrayList;
import java.util.List;
@@ -14,13 +16,13 @@ import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.vocabulary.OWL;
import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngine;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
@@ -80,8 +82,8 @@ public class SearchIndexerSetup implements ServletContextListener {
try {
/* set up the individual to search doc translation */
- OntModel jenaOntModel = ModelAccess.on(context).getJenaOntModel();
- OntModel displayModel = ModelAccess.on(context).getDisplayModel();
+ OntModel jenaOntModel = ModelAccess.on(context).getOntModel();
+ OntModel displayModel = ModelAccess.on(context).getOntModel(DISPLAY);
/*
* try to get context attribute DocumentModifiers and use that as
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 aa35e7bd2..b195f65eb 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,14 +2,18 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY_DISPLAY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY_TBOX;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;
+
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.hp.hpl.jena.ontology.OntModel;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
/**
@@ -23,10 +27,10 @@ public class ConfigurationModelsSetup implements ServletContextListener {
StartupStatus ss = StartupStatus.getBean(ctx);
try {
- setupModel(ctx, ModelNames.DISPLAY, "display");
- setupModel(ctx, ModelNames.DISPLAY_TBOX, "displayTbox");
- setupModel(ctx, ModelNames.DISPLAY_DISPLAY, "displayDisplay");
- setupModel(ctx, ModelNames.USER_ACCOUNTS, "auth");
+ setupModel(ctx, DISPLAY, "display");
+ setupModel(ctx, DISPLAY_TBOX, "displayTbox");
+ setupModel(ctx, DISPLAY_DISPLAY, "displayDisplay");
+ setupModel(ctx, USER_ACCOUNTS, "auth");
ss.info(this,
"Set up the display models and the user accounts model.");
} catch (Exception e) {
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 df6d1164e..2f8eb399c 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
@@ -2,7 +2,9 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
-import static edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB.SDBDatasetMode.ASSERTIONS_ONLY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
import java.util.ArrayList;
import java.util.List;
@@ -14,7 +16,6 @@ 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.rdf.model.ResIterator;
import com.hp.hpl.jena.rdf.model.Resource;
@@ -23,18 +24,10 @@ import com.hp.hpl.jena.util.ResourceUtils;
import com.hp.hpl.jena.util.iterator.ClosableIterator;
import com.hp.hpl.jena.vocabulary.RDF;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.FactoryID;
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.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.modelaccess.ContextModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
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;
/**
@@ -56,19 +49,16 @@ public class ContentModelSetup extends JenaDataSourceSetupBase
}
private void setUpJenaDataSource(ServletContext ctx) {
- ModelAccess models = ModelAccess.on(ctx);
+ ContextModelAccess models = ModelAccess.on(ctx);
- RDFService rdfService = createRdfService(ctx);
- createStartupDataset(ctx, rdfService);
-
- Model applicationMetadataModel = models.getOntModel(ModelNames.APPLICATION_METADATA);
+ Model applicationMetadataModel = models.getOntModel(APPLICATION_METADATA);
if (applicationMetadataModel.size()== 0) {
thisIsFirstStartup();
}
- OntModel baseABoxModel = models.getOntModel(ModelNames.ABOX_ASSERTIONS);
- OntModel baseTBoxModel = models.getOntModel(ModelNames.TBOX_ASSERTIONS);
+ OntModel baseABoxModel = models.getOntModel(ABOX_ASSERTIONS);
+ OntModel baseTBoxModel = models.getOntModel(TBOX_ASSERTIONS);
if (isFirstStartup()) {
initializeApplicationMetadata(ctx, applicationMetadataModel);
@@ -81,32 +71,8 @@ public class ContentModelSetup extends JenaDataSourceSetupBase
RDFFilesLoader.loadEveryTimeFiles(ctx, "tbox", baseTBoxModel);
log.info("Setting up DAO factories");
-
- WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
- config.setDefaultNamespace(getDefaultNamespace(ctx));
-
- OntModelSelector baseOms = models.getBaseOntModelSelector();
- WebappDaoFactory baseWadf = new WebappDaoFactorySDB(rdfService, baseOms, config, ASSERTIONS_ONLY);
- ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.BASE, baseWadf);
- ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNFILTERED_BASE, baseWadf);
-
- OntModelSelector unionOms = models.getUnionOntModelSelector();
- WebappDaoFactory wadf = new WebappDaoFactorySDB(rdfService, unionOms, config);
- ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNION, wadf);
- ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNFILTERED_UNION, wadf);
-
- ctx.setAttribute("defaultNamespace", getDefaultNamespace(ctx));
}
- 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) {
return (System.currentTimeMillis() - startTime) / 1000;
}
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 5b8752af8..402804e63 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
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -32,13 +34,10 @@ 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.BlankNodeFilteringModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerUtils;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
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
@@ -72,12 +71,10 @@ public class FileGraphSetup implements ServletContextListener {
try {
OntDocumentManager.getInstance().setProcessImports(true);
- Dataset dataset = JenaDataSourceSetupBase.getStartupDataset(ctx);
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx,
- WhichService.CONTENT).getRDFService();
+ Dataset dataset = ModelAccess.on(ctx).getDataset();
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService(CONTENT);
ModelMaker modelMaker = new BlankNodeFilteringModelMaker(
- rdfService, ModelMakerUtils.getModelMaker(ctx,
- WhichService.CONTENT));
+ rdfService, ModelAccess.on(ctx).getModelMaker(CONTENT));
// ABox files
Set paths = getFilegraphPaths(ctx, RDF, ABOX, FILEGRAPH);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java
index bc0b3923f..b7a77de7d 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupBase.java
@@ -7,8 +7,6 @@ import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import com.hp.hpl.jena.query.Dataset;
-
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDaoCon;
@@ -40,13 +38,4 @@ public class JenaDataSourceSetupBase extends JenaBaseDaoCon {
}
}
- public static void setStartupDataset(Dataset dataset, ServletContext ctx) {
- ctx.setAttribute("startupDataset", dataset);
- }
-
- public static Dataset getStartupDataset(ServletContext ctx) {
- Object o = ctx.getAttribute("startupDataset");
- return (o instanceof Dataset) ? ((Dataset) o) : null;
- }
-
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/PropertyMaskingSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/PropertyMaskingSetup.java
index 2687af6fa..0338109eb 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/PropertyMaskingSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/PropertyMaskingSetup.java
@@ -13,15 +13,15 @@ import net.sf.jga.fn.UnaryFunctor;
import com.hp.hpl.jena.ontology.OntModel;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.EntityPropertyListFilter;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class PropertyMaskingSetup implements ServletContextListener {
private final static String ENTITY_PROPERTY_LIST_FILTER_ATTR_NAME = "entityPropertyListFilter";
public void contextInitialized(ServletContextEvent sce) {
- OntModel jenaOntModel = ModelAccess.on(sce.getServletContext()).getJenaOntModel();
+ OntModel jenaOntModel = ModelAccess.on(sce.getServletContext()).getOntModel();
sce.getServletContext().setAttribute(ENTITY_PROPERTY_LIST_FILTER_ATTR_NAME, new EntityPropertyListFilter(jenaOntModel));
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RemoveObsoletePermissions.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RemoveObsoletePermissions.java
index b673e2423..68bd8dfa7 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RemoveObsoletePermissions.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RemoveObsoletePermissions.java
@@ -2,7 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
@@ -19,10 +20,9 @@ import com.hp.hpl.jena.update.UpdateAction;
import com.hp.hpl.jena.update.UpdateFactory;
import com.hp.hpl.jena.update.UpdateRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
/**
@@ -84,11 +84,11 @@ public class RemoveObsoletePermissions implements ServletContextListener {
}
public void update() {
- OntModel model = ModelAccess.on(ctx).getUserAccountsModel();
+ OntModel model = ModelAccess.on(ctx).getOntModel(USER_ACCOUNTS);
long statementsAtStart = model.size();
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx,
- CONFIGURATION).getRDFService();
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService(
+ CONFIGURATION);
for (String permissionUri : OBSOLETE_PERMISSIONS) {
removeStatements(rdfService, permissionUri);
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RunSparqlConstructs.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RunSparqlConstructs.java
index c495496d7..0a381cb16 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RunSparqlConstructs.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/RunSparqlConstructs.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
@@ -29,8 +31,8 @@ import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.ResourceUtils;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public class RunSparqlConstructs implements ServletContextListener {
@@ -50,7 +52,7 @@ public class RunSparqlConstructs implements ServletContextListener {
String namespace = (wadf != null && wadf.getDefaultNamespace() != null)
? wadf.getDefaultNamespace() : DEFAULT_DEFAULT_NAMESPACE;
- OntModel baseOntModel = ModelAccess.on(ctx).getBaseOntModel();
+ OntModel baseOntModel = ModelAccess.on(ctx).getOntModel(FULL_ASSERTIONS);
Model anonModel = ModelFactory.createDefaultModel();
Model namedModel = ModelFactory.createDefaultModel();
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 a306f5bf4..08d3b5cc3 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
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
@@ -21,15 +23,13 @@ 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.WebappDaoFactory;
-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;
import edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.ReasonerConfiguration;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
import edu.cornell.mannlib.vitro.webapp.reasoner.ReasonerPlugin;
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner;
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasonerTBoxListener;
@@ -88,12 +88,12 @@ public class SimpleReasonerSetup implements ServletContextListener {
// set up simple reasoning for the ABox
- RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx).getRDFService();
- Dataset dataset = new RDFServiceDataset(rdfService);
+ RDFService rdfService = ModelAccess.on(ctx).getRDFService();
+ Dataset dataset = ModelAccess.on(ctx).getDataset();
Model rebuildModel = dataset.getNamedModel(JENA_INF_MODEL_REBUILD);
Model scratchModel = dataset.getNamedModel(JENA_INF_MODEL_SCRATCHPAD);
- Model inferenceModel = dataset.getNamedModel(ModelNames.ABOX_INFERENCES);
+ Model inferenceModel = dataset.getNamedModel(ABOX_INFERENCES);
// the simple reasoner will register itself as a listener to the ABox assertions
SimpleReasoner simpleReasoner = new SimpleReasoner(
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ThemeInfoSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ThemeInfoSetup.java
index 0d7f65658..8fb5a968a 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ThemeInfoSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/ThemeInfoSetup.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
@@ -23,8 +25,8 @@ import com.hp.hpl.jena.util.iterator.ClosableIterator;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean;
import edu.cornell.mannlib.vitro.webapp.beans.ApplicationBean.ThemeInfo;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
public class ThemeInfoSetup implements ServletContextListener {
@@ -91,7 +93,7 @@ public class ThemeInfoSetup implements ServletContextListener {
}
private String getCurrentThemeName(ServletContext ctx) {
- OntModel ontModel = ModelAccess.on(ctx).getApplicationMetadataModel();
+ OntModel ontModel = ModelAccess.on(ctx).getOntModel(APPLICATION_METADATA);
ontModel.enterCriticalSection(Lock.READ);
try {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java
index 5d1e01160..b2482eb94 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java
@@ -2,6 +2,10 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_ONLY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.INFERENCES_ONLY;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -42,11 +46,10 @@ import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater;
import edu.cornell.mannlib.vitro.webapp.ontology.update.UpdateSettings;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
/**
@@ -90,13 +93,13 @@ public class UpdateKnowledgeBase implements ServletContextListener {
WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory();
settings.setDefaultNamespace(wadf.getDefaultNamespace());
- settings.setAssertionOntModelSelector(ModelAccess.on(ctx).getBaseOntModelSelector());
- settings.setInferenceOntModelSelector(ModelAccess.on(ctx).getInferenceOntModelSelector());
- settings.setUnionOntModelSelector(ModelAccess.on(ctx).getUnionOntModelSelector());
+ settings.setAssertionOntModelSelector(ModelAccess.on(ctx).getOntModelSelector(ASSERTIONS_ONLY));
+ settings.setInferenceOntModelSelector(ModelAccess.on(ctx).getOntModelSelector(INFERENCES_ONLY));
+ settings.setUnionOntModelSelector(ModelAccess.on(ctx).getOntModelSelector());
ConfigurationProperties props = ConfigurationProperties.getBean(ctx);
Path homeDir = Paths.get(props.getProperty("vitro.home"));
- settings.setDisplayModel(ModelAccess.on(ctx).getDisplayModel());
+ settings.setDisplayModel(ModelAccess.on(ctx).getOntModel(DISPLAY));
OntModel oldTBoxModel = loadModelFromDirectory(ctx.getRealPath(OLD_TBOX_MODEL_DIR));
settings.setOldTBoxModel(oldTBoxModel);
OntModel newTBoxModel = loadModelFromDirectory(createDirectory(homeDir, "rdf", "tbox", "filegraph").toString());
@@ -105,7 +108,7 @@ public class UpdateKnowledgeBase implements ServletContextListener {
settings.setOldTBoxAnnotationsModel(oldTBoxAnnotationsModel);
OntModel newTBoxAnnotationsModel = loadModelFromDirectory(createDirectory(homeDir, "rdf", "tbox", "firsttime").toString());
settings.setNewTBoxAnnotationsModel(newTBoxAnnotationsModel);
- settings.setRDFService(RDFServiceUtils.getRDFServiceFactory(ctx).getRDFService());
+ settings.setRDFService(ModelAccess.on(ctx).getRDFService());
boolean tryMigrateDisplay = true;
try {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/DataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/DataStructuresProvider.java
new file mode 100644
index 000000000..bd84e0f0c
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/DataStructuresProvider.java
@@ -0,0 +1,35 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * Provides the long-term data structures, and a way to obtain the short-term
+ * data structures.
+ *
+ * Repeated calls for the same data structure should yield the same instance.
+ *
+ * Repeated calls for the ShortTermDataStructuresProvider need not yield the
+ * same instance, but must yield an instance that will return the same
+ * structures as any other instance for the same request.
+ */
+public interface DataStructuresProvider {
+ RDFService getRDFService(WhichService whichService);
+
+ Dataset getDataset(WhichService whichService);
+
+ ModelMaker getModelMaker(WhichService whichService);
+
+ OntModelCache getOntModelCache();
+
+ ShortTermDataStructuresProvider getShortTermDataStructuresProvider(
+ HttpServletRequest req);
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSetup.java
index ed0f918e7..00fb71fd4 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSetup.java
@@ -2,38 +2,43 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONTENT;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql.RDFSourceSPARQL.PROPERTY_SPARQL_ENDPOINT_URI;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb.RDFSourceTDB.PROPERTY_CONTENT_TDB_PATH;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql.ContentDataStructuresProviderSPARQL.PROPERTY_SPARQL_ENDPOINT_URI;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb.ContentDataStructuresProviderTDB.PROPERTY_CONTENT_TDB_PATH;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.ontology.OntDocumentManager;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerUtils;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
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.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB;
-import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql.RDFSourceSPARQL;
-import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb.RDFSourceTDB;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.BasicDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ConfigurationDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ContentDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql.ContentDataStructuresProviderSPARQL;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb.ConfigurationDataStructuresProviderTDB;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb.ContentDataStructuresProviderTDB;
/**
* Create the RDFServiceFactories and ModelMakers for the application to use.
*/
public class RDFSetup implements ServletContextListener {
+ private static final Log log = LogFactory.getLog(RDFSetup.class);
+
private ServletContext ctx;
private ConfigurationProperties configProps;
- private RDFSource contentRdfSource;
- private RDFSource configurationRdfSource;
+ private ContentDataStructuresProvider contentProvider;
+ private ConfigurationDataStructuresProvider configurationProvider;
+ private BasicDataStructuresProvider provider;
@Override
public void contextInitialized(ServletContextEvent sce) {
@@ -42,23 +47,14 @@ public class RDFSetup implements ServletContextListener {
configureJena();
- createRdfSources();
+ createProviders();
RDFServiceUtils.setRDFServiceFactory(ctx,
- contentRdfSource.getRDFServiceFactory(), WhichService.CONTENT);
- ModelMakerUtils.setContentModelMakerFactory(ctx,
- contentRdfSource.getContentModelMakerFactory());
- ModelAccess.on(ctx).setModelMaker(ModelMakerID.CONTENT,
- ModelMakerUtils.getModelMaker(ctx, WhichService.CONTENT));
-
+ contentProvider.getRDFServiceFactory());
RDFServiceUtils.setRDFServiceFactory(ctx,
- configurationRdfSource.getRDFServiceFactory(),
- WhichService.CONFIGURATION);
- ModelMakerUtils.setConfigurationModelMakerFactory(ctx,
- configurationRdfSource.getConfigurationModelMakerFactory());
- ModelAccess.on(ctx).setModelMaker(ModelMakerID.CONFIGURATION,
- ModelMakerUtils.getModelMaker(ctx, WhichService.CONFIGURATION));
+ configurationProvider.getRDFServiceFactory(), CONFIGURATION);
+ ModelAccess.setDataStructuresProvider(provider);
}
private void configureJena() {
@@ -70,15 +66,20 @@ public class RDFSetup implements ServletContextListener {
* For now, these steps are hard-coded. They should be driven by a
* configuration file.
*/
- private void createRdfSources() {
+ private void createProviders() {
if (isSparqlEndpointContentConfigured()) {
- contentRdfSource = new RDFSourceSPARQL(ctx, this);
+ contentProvider = new ContentDataStructuresProviderSPARQL(ctx, this);
} else if (isTdbConfigured()) {
- contentRdfSource = new RDFSourceTDB(ctx, this, CONTENT);
+ contentProvider = new ContentDataStructuresProviderTDB(ctx, this);
} else {
- contentRdfSource = new RDFSourceSDB(ctx, this);
+ contentProvider = new ContentDataStructuresProviderSDB(ctx, this);
}
- configurationRdfSource = new RDFSourceTDB(ctx, this, CONFIGURATION);
+
+ configurationProvider = new ConfigurationDataStructuresProviderTDB(ctx,
+ this);
+
+ provider = new BasicDataStructuresProvider(contentProvider,
+ configurationProvider);
}
private boolean isSparqlEndpointContentConfigured() {
@@ -93,11 +94,19 @@ public class RDFSetup implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
- if (configurationRdfSource != null) {
- configurationRdfSource.close();
+ if (contentProvider != null) {
+ try {
+ contentProvider.close();
+ } catch (Exception e) {
+ log.error("Problem when closing content provider", e);
+ }
}
- if (contentRdfSource != null) {
- contentRdfSource.close();
+ if (configurationProvider != null) {
+ try {
+ configurationProvider.close();
+ } catch (Exception e) {
+ log.error("Problem when closing configuration provider", e);
+ }
}
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSource.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSource.java
deleted file mode 100644
index 9528a3bad..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/RDFSource.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup;
-
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
-
-/**
- * The interface for a triple-store implementation. It returns an
- * RDFServiceFactory and either or both of the ModelMakerFactories.
- *
- * You should call close() when shutting down the triple-store.
- */
-public interface RDFSource extends AutoCloseable {
-
- RDFServiceFactory getRDFServiceFactory();
-
- ModelMakerFactory getContentModelMakerFactory();
-
- ModelMakerFactory getConfigurationModelMakerFactory();
-
- @Override
- void close();
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/ShortTermDataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/ShortTermDataStructuresProvider.java
new file mode 100644
index 000000000..2b7d1c6ea
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/ShortTermDataStructuresProvider.java
@@ -0,0 +1,27 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup;
+
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * Provide the short-term data structures. Should be closed when no longer
+ * needed.
+ *
+ * Repeated calls for the same data structure should yield the same instance.
+ *
+ * Repeated calls for the WebappDaoFactoryConfig need not yield the same
+ * instance.
+ */
+public interface ShortTermDataStructuresProvider {
+ RDFService getRDFService(WhichService whichService);
+
+ OntModelCache getOntModelCache();
+
+ WebappDaoFactoryConfig getWebappDaoFactoryConfig();
+
+ void close();
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicDataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicDataStructuresProvider.java
new file mode 100644
index 000000000..ab31e1dd4
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicDataStructuresProvider.java
@@ -0,0 +1,124 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.ABOX_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_UNION;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.JoinedOntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.ModelMakerOntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.UnionModelsOntModelsCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.UnionModelsOntModelsCache.UnionSpec;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.DataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.ShortTermDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * A simple implementation of DataStructuresProvider.
+ *
+ * Note that we don't bother to cache the RDFServices, RDFServiceFactories, and
+ * ModelMakers, since the providers can be expected to cache them.
+ *
+ * We must cache the OntModelCache because it was created here. If we were to
+ * recreate it, we would lose any sub-models that had been attached in the
+ * meantime.
+ */
+public class BasicDataStructuresProvider implements DataStructuresProvider {
+ /**
+ * Create union models for ABox and TBox, and full models for assertions and
+ * inferences. No need to create FULL_UNION, since it's the default model.
+ */
+ public static final UnionSpec[] CONTENT_UNIONS = new UnionSpec[] {
+ UnionSpec.base(ABOX_ASSERTIONS).plus(ABOX_INFERENCES)
+ .yields(ABOX_UNION),
+ UnionSpec.base(TBOX_ASSERTIONS).plus(TBOX_INFERENCES)
+ .yields(TBOX_UNION),
+ UnionSpec.base(ABOX_ASSERTIONS).plus(TBOX_ASSERTIONS)
+ .yields(FULL_ASSERTIONS),
+ UnionSpec.base(ABOX_INFERENCES).plus(TBOX_INFERENCES)
+ .yields(FULL_INFERENCES) };
+
+ private final Map providers;
+ private final Map ontModels;
+ private final OntModelCache ontModelCache;
+
+ public BasicDataStructuresProvider(
+ SingleSourceDataStructuresProvider contentProvider,
+ SingleSourceDataStructuresProvider configurationProvider) {
+ providers = new EnumMap<>(WhichService.class);
+ providers.put(CONTENT, contentProvider);
+ providers.put(CONFIGURATION, configurationProvider);
+
+ ontModels = new EnumMap<>(WhichService.class);
+ ontModels.put(CONTENT, new ModelMakerOntModelCache(
+ getModelMaker(CONTENT)));
+ ontModels.put(CONFIGURATION, new ModelMakerOntModelCache(
+ getModelMaker(CONFIGURATION)));
+
+ ontModelCache = new UnionModelsOntModelsCache(new JoinedOntModelCache(
+ ontModels.get(CONTENT), ontModels.get(CONFIGURATION)),
+ CONTENT_UNIONS);
+ }
+
+ protected OntModelCache getOntModels(WhichService whichService) {
+ return ontModels.get(whichService);
+ }
+
+ protected RDFServiceFactory getRDFServiceFactory(WhichService whichService) {
+ return providers.get(whichService).getRDFServiceFactory();
+ }
+
+ @Override
+ public RDFService getRDFService(WhichService whichService) {
+ return providers.get(whichService).getRDFService();
+ }
+
+ @Override
+ public Dataset getDataset(WhichService whichService) {
+ return providers.get(whichService).getDataset();
+ }
+
+ @Override
+ public ModelMaker getModelMaker(WhichService whichService) {
+ return providers.get(whichService).getModelMaker();
+ }
+
+ @Override
+ public OntModelCache getOntModelCache() {
+ return ontModelCache;
+ }
+
+ @Override
+ public ShortTermDataStructuresProvider getShortTermDataStructuresProvider(
+ HttpServletRequest req) {
+ return new BasicShortTermDataStructuresProvider(req, this, providers);
+ }
+
+ @Override
+ public String toString() {
+ return "BasicDataStructuresProvider[" + ToString.hashHex(this)
+ + ", providers=" + providers + ", ontModels=" + ontModelCache
+ + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicShortTermDataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicShortTermDataStructuresProvider.java
new file mode 100644
index 000000000..8c371cbe7
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/BasicShortTermDataStructuresProvider.java
@@ -0,0 +1,150 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONFIGURATION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService.CONTENT;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jena.atlas.lib.Pair;
+
+import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.JoinedOntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.ShortTermDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * The simple implementation of ShortTermDataStructuresProvider.
+ *
+ * The short-term RDFServices are cached, lest we somehow create duplicates for
+ * the same request. Similarly with the short-term OntModels.
+ */
+public class BasicShortTermDataStructuresProvider implements
+ ShortTermDataStructuresProvider {
+ private static final Log log = LogFactory
+ .getLog(BasicShortTermDataStructuresProvider.class);
+
+ private final HttpServletRequest req;
+ private final ServletContext ctx;
+ private final ConfigurationProperties props;
+ private final BasicDataStructuresProvider parent;
+ private final Map providers;
+ private final Map rdfServices;
+ private final OntModelCache ontModelCache;
+
+ public BasicShortTermDataStructuresProvider(
+ HttpServletRequest req,
+ BasicDataStructuresProvider parent,
+ final Map providers) {
+ this.req = req;
+ this.ctx = req.getSession().getServletContext();
+ this.props = ConfigurationProperties.getBean(ctx);
+ this.parent = parent;
+ this.providers = providers;
+ this.rdfServices = populateRdfServicesMap();
+ this.ontModelCache = createOntModelCache();
+ }
+
+ private Map populateRdfServicesMap() {
+ Map map = new EnumMap<>(WhichService.class);
+ for (WhichService which : WhichService.values()) {
+ map.put(which, parent.getRDFServiceFactory(which)
+ .getShortTermRDFService());
+ }
+ return Collections.unmodifiableMap(map);
+ }
+
+ private OntModelCache createOntModelCache() {
+ return new JoinedOntModelCache(shortModels(CONTENT),
+ shortModels(CONFIGURATION));
+ }
+
+ /**
+ * Ask each provider what short-term models should mask their long-term
+ * counterparts.
+ */
+ private OntModelCache shortModels(WhichService which) {
+ return providers.get(which).getShortTermOntModels(
+ rdfServices.get(which), parent.getOntModels(which));
+ }
+
+ @Override
+ public RDFService getRDFService(WhichService whichService) {
+ return rdfServices.get(whichService);
+ }
+
+ @Override
+ public OntModelCache getOntModelCache() {
+ return ontModelCache;
+ }
+
+ @Override
+ public WebappDaoFactoryConfig getWebappDaoFactoryConfig() {
+ List langs = getPreferredLanguages();
+ WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
+ config.setDefaultNamespace(props.getProperty("Vitro.defaultNamespace"));
+ config.setPreferredLanguages(langs);
+ config.setUnderlyingStoreReasoned(isStoreReasoned());
+ config.setCustomListViewConfigFileMap(getCustomListViewConfigFileMap());
+ return config;
+ }
+
+ private List getPreferredLanguages() {
+ log.debug("Accept-Language: " + req.getHeader("Accept-Language"));
+ return LanguageFilteringUtils.localesToLanguages(getPreferredLocales());
+ }
+
+ @SuppressWarnings("unchecked")
+ private Enumeration getPreferredLocales() {
+ return req.getLocales();
+ }
+
+ private boolean isStoreReasoned() {
+ String isStoreReasoned = props.getProperty(
+ "VitroConnection.DataSource.isStoreReasoned", "true");
+ return ("true".equals(isStoreReasoned));
+ }
+
+ private Map>, String> getCustomListViewConfigFileMap() {
+ Map>, String> map = (Map>, String>) ctx
+ .getAttribute("customListViewConfigFileMap");
+ if (map == null) {
+ map = new ConcurrentHashMap>, String>();
+ ctx.setAttribute("customListViewConfigFileMap", map);
+ }
+ return map;
+ }
+
+ @Override
+ public void close() {
+ for (WhichService which : WhichService.values()) {
+ rdfServices.get(which).close();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "BasicShortTermDataStructuresProvider[" + ToString.hashHex(this)
+ + ", req=" + ToString.hashHex(req) + ", providers=" + providers
+ + ", ontModels=" + ontModelCache + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ConfigurationModelMakerFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ConfigurationDataStructuresProvider.java
similarity index 63%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ConfigurationModelMakerFactory.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ConfigurationDataStructuresProvider.java
index f0ae53616..9d9fa90ab 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/modelaccess/ConfigurationModelMakerFactory.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ConfigurationDataStructuresProvider.java
@@ -1,23 +1,20 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.modelaccess;
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY_DISPLAY;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY_TBOX;
import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.USER_ACCOUNTS;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
import com.hp.hpl.jena.rdf.model.ModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService;
-
/**
- * Common functionality among the Configuration-based ModelMakerFactorys
+ * The base class for a provider of configuration models. It just contains some
+ * useful constants and utility methods.
*/
-public abstract class ConfigurationModelMakerFactory implements
- ModelMakerFactory {
-
+public abstract class ConfigurationDataStructuresProvider implements
+ SingleSourceDataStructuresProvider {
/**
* A list of all Configuration models, in case the implementation wants to
* add memory-mapping.
@@ -30,13 +27,11 @@ public abstract class ConfigurationModelMakerFactory implements
* the source.
*/
protected ModelMaker addConfigurationDecorators(ModelMaker sourceMM) {
- // No decorators yet.
+ // Insure that these models are created here, and not in the Content.
+ for (String name : CONFIGURATION_MODELS) {
+ sourceMM.getModel(name);
+ }
return sourceMM;
}
- @Override
- public WhichService whichModelMaker() {
- return CONFIGURATION;
- }
-
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ContentDataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ContentDataStructuresProvider.java
new file mode 100644
index 000000000..f5fa82053
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/ContentDataStructuresProvider.java
@@ -0,0 +1,44 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.APPLICATION_METADATA;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.TBOX_ASSERTIONS;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.*;
+
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.NamedDefaultModelMaker;
+
+/**
+ * The base class for a provider of content models. It just contains some useful
+ * constants and utility methods.
+ */
+public abstract class ContentDataStructuresProvider implements
+ SingleSourceDataStructuresProvider {
+
+ /**
+ * These are the small content models that we want to keep in memory.
+ */
+ protected static final String[] SMALL_CONTENT_MODELS = {
+ APPLICATION_METADATA, TBOX_ASSERTIONS, TBOX_INFERENCES };
+
+ /**
+ * These are the small content OntModels for which we don't need short-term instances.
+ */
+ protected static final String[] MEMORY_MAPPED_CONTENT_MODELS = {
+ APPLICATION_METADATA, TBOX_ASSERTIONS, TBOX_INFERENCES };
+
+ private static final String CONTENT_DEFAULT_MODEL_NAME = FULL_UNION;
+
+ /**
+ * These decorations are added to a Content ModelMaker, regardless of the
+ * source.
+ *
+ * Use the default model as the full union.
+ */
+ protected static ModelMaker addContentDecorators(ModelMaker sourceMM) {
+ return new NamedDefaultModelMaker(sourceMM, CONTENT_DEFAULT_MODEL_NAME);
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/SingleSourceDataStructuresProvider.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/SingleSourceDataStructuresProvider.java
new file mode 100644
index 000000000..cae8beafc
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/SingleSourceDataStructuresProvider.java
@@ -0,0 +1,30 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
+
+/**
+ * An RDFSource that provides Content models or Configuration models, but not
+ * both.
+ *
+ * Repeated calls for the same data structure should yield the same instance,
+ * except for the short-term OntModelCache.
+ */
+public interface SingleSourceDataStructuresProvider extends AutoCloseable {
+ RDFServiceFactory getRDFServiceFactory();
+
+ RDFService getRDFService();
+
+ Dataset getDataset();
+
+ ModelMaker getModelMaker();
+
+ OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
+ OntModelCache longTermOntModelCache);
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ConfigurationModelMakerFactorySDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ConfigurationModelMakerFactorySDB.java
deleted file mode 100644
index ec037d72a..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ConfigurationModelMakerFactorySDB.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ConfigurationModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * In SDB, Configuration models require database connections.
- *
- * However, they are all small enough for memory-mapping. Once memory-mapped,
- * they are suitable for short-term or long-term use.
- *
- * RDFService doesn't support empty models, so support them with ListCaching
- */
-public class ConfigurationModelMakerFactorySDB extends
- ConfigurationModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ConfigurationModelMakerFactorySDB(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(
- new MemoryMappingModelMaker(new RDFServiceModelMaker(
- longTermRdfService), CONFIGURATION_MODELS));
- }
-
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
- /**
- * The long-term models are all memory-mapped, so use them.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/RDFSourceSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentDataStructuresProviderSDB.java
similarity index 62%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/RDFSourceSDB.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentDataStructuresProviderSDB.java
index 190e20289..ba6d249de 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/RDFSourceSDB.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentDataStructuresProviderSDB.java
@@ -2,7 +2,10 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.BasicDataStructuresProvider.CONTENT_UNIONS;
+
import java.sql.SQLException;
+import java.util.Arrays;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
@@ -11,6 +14,8 @@ import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.sdb.SDB;
import com.hp.hpl.jena.sdb.SDBFactory;
import com.hp.hpl.jena.sdb.Store;
@@ -22,25 +27,33 @@ import com.hp.hpl.jena.sdb.util.StoreUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.MaskingOntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.ModelMakerOntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.UnionModelsOntModelsCache;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.sdb.RDFServiceFactorySDB;
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
-import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.RDFSource;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ContentDataStructuresProvider;
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
/**
* Create the connection to the SDB triple-store.
*
* Do some smoke-tests on the parameters, create the connection pool, and create
* the RDFServiceFactory.
- *
- * Create the ModelMakerFactories only if requested.
*/
-public class RDFSourceSDB implements RDFSource {
- private static final Log log = LogFactory.getLog(RDFSourceSDB.class);
+public class ContentDataStructuresProviderSDB extends
+ ContentDataStructuresProvider {
+ private static final Log log = LogFactory
+ .getLog(ContentDataStructuresProviderSDB.class);
static final String PROPERTY_DB_URL = "VitroConnection.DataSource.url";
static final String PROPERTY_DB_USERNAME = "VitroConnection.DataSource.username";
@@ -69,24 +82,30 @@ public class RDFSourceSDB implements RDFSource {
private final ComboPooledDataSource ds;
private final RDFServiceFactory rdfServiceFactory;
private final RDFService rdfService;
+ private final Dataset dataset;
+ private final ModelMaker modelMaker;
- public RDFSourceSDB(ServletContext ctx, ServletContextListener parent) {
+ public ContentDataStructuresProviderSDB(ServletContext ctx,
+ ServletContextListener ctxListener) {
try {
this.ctx = ctx;
this.ss = StartupStatus.getBean(ctx);
configureSDBContext();
- new SDBConnectionSmokeTests(ctx, parent)
+ new SDBConnectionSmokeTests(ctx, ctxListener)
.checkDatabaseConnection();
this.ds = new SDBDataSource(ctx).getDataSource();
this.rdfServiceFactory = createRdfServiceFactory();
this.rdfService = rdfServiceFactory.getRDFService();
- ss.info(parent, "Initialized the RDF source for SDB");
+ this.dataset = new RDFServiceDataset(this.rdfService);
+ this.modelMaker = createModelMaker();
+ ss.info(ctxListener,
+ "Initialized the content data structures for SDB");
} catch (SQLException e) {
throw new RuntimeException(
- "Failed to set up the RDF source for SDB", e);
+ "Failed to set up the content data structures for SDB", e);
}
}
@@ -105,12 +124,9 @@ public class RDFSourceSDB implements RDFSource {
return new RDFServiceFactorySDB(ds, storeDesc);
}
-
+
/**
* Tests whether an SDB store has been formatted and populated for use.
- *
- * @param store
- * @return
*/
private boolean isSetUp(Store store) throws SQLException {
if (!(StoreUtils.isFormatted(store))) {
@@ -118,7 +134,6 @@ public class RDFSourceSDB implements RDFSource {
}
// even if the store exists, it may be empty
-
try {
return (SDBFactory.connectNamedModel(store,
ModelNames.TBOX_ASSERTIONS)).size() > 0;
@@ -148,19 +163,49 @@ public class RDFSourceSDB implements RDFSource {
store.getTableFormatter().truncate();
}
+ private ModelMaker createModelMaker() {
+ return addContentDecorators(new ListCachingModelMaker(
+ new MemoryMappingModelMaker(new RDFServiceModelMaker(
+ this.rdfService), SMALL_CONTENT_MODELS)));
+ }
+
@Override
public RDFServiceFactory getRDFServiceFactory() {
return this.rdfServiceFactory;
}
@Override
- public ModelMakerFactory getContentModelMakerFactory() {
- return new ContentModelMakerFactorySDB(this.rdfService);
+ public RDFService getRDFService() {
+ return this.rdfService;
}
@Override
- public ModelMakerFactory getConfigurationModelMakerFactory() {
- return new ConfigurationModelMakerFactorySDB(this.rdfService);
+ public Dataset getDataset() {
+ return this.dataset;
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ return this.modelMaker;
+ }
+
+ /**
+ * Use models from the short-term RDFService, since there is less contention
+ * for the database connections that way. The exceptions are the
+ * memory-mapped models. By keeping them, we also keep their sub-models.
+ */
+ @Override
+ public OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
+ OntModelCache longTermOntModelCache) {
+ ModelMakerOntModelCache shortCache = new ModelMakerOntModelCache(
+ addContentDecorators(new ListCachingModelMaker(
+ new RDFServiceModelMaker(shortTermRdfService))));
+
+ MaskingOntModelCache combinedCache = new MaskingOntModelCache(
+ shortCache, longTermOntModelCache,
+ Arrays.asList(MEMORY_MAPPED_CONTENT_MODELS));
+
+ return new UnionModelsOntModelsCache(combinedCache, CONTENT_UNIONS);
}
@Override
@@ -170,4 +215,10 @@ public class RDFSourceSDB implements RDFSource {
}
}
+ @Override
+ public String toString() {
+ return "ContentDataStructuresProviderSDB[" + ToString.hashHex(this)
+ + "]";
+ }
+
}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentModelMakerFactorySDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentModelMakerFactorySDB.java
deleted file mode 100644
index 08b51ae22..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/ContentModelMakerFactorySDB.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ContentModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ShadowingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * In SDB, Content models require database connections.
- *
- * Memory-map the small models, and use a short-term connection for the others
- * (when available).
- *
- * RDFService doesn't support empty models, so support them with ListCaching
- */
-public class ContentModelMakerFactorySDB extends ContentModelMakerFactory
- implements ModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ContentModelMakerFactorySDB(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(
- new MemoryMappingModelMaker(new RDFServiceModelMaker(
- longTermRdfService), SMALL_CONTENT_MODELS));
- }
-
- /**
- * The small content models (tbox, app_metadata) are memory mapped, for
- * speed.
- */
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addContentDecorators(longTermModelMaker);
- }
-
- /**
- * For short-term use, the large models (abox) will come from a short-term
- * service. The small models can be the memory-mapped ones that we created
- * for long-term use.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- ModelMaker shortTermModelMaker = new RDFServiceModelMaker(
- shortTermRdfService);
-
- // No need to create a fresh memory map of the small models: use the
- // long-term ones.
- return addContentDecorators(new ShadowingModelMaker(
- shortTermModelMaker, longTermModelMaker, SMALL_CONTENT_MODELS));
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBConnectionSmokeTests.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBConnectionSmokeTests.java
index ad9162c0c..b1eedcb00 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBConnectionSmokeTests.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBConnectionSmokeTests.java
@@ -2,12 +2,12 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_DRIVER_CLASS;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_DRIVER_CLASS_NAME;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_PASSWORD;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_TYPE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_URL;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_USERNAME;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_DRIVER_CLASS;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_DRIVER_CLASS_NAME;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_PASSWORD;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_TYPE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_URL;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_USERNAME;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBDataSource.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBDataSource.java
index d598bc185..d842fd623 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBDataSource.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sdb/SDBDataSource.java
@@ -2,22 +2,22 @@
package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_DRIVER_CLASS;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_MAXACTIVE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_MAXIDLE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_TESTONBORROW;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_TESTONRETURN;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_TYPE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.DEFAULT_VALIDATION_QUERY;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.MINIMUM_MAXACTIVE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_DRIVER_CLASS_NAME;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_MAX_ACTIVE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_MAX_IDLE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_PASSWORD;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_TYPE;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_URL;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_USERNAME;
-import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.RDFSourceSDB.PROPERTY_DB_VALIDATION_QUERY;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_DRIVER_CLASS;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_MAXACTIVE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_MAXIDLE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_TESTONBORROW;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_TESTONRETURN;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_TYPE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.DEFAULT_VALIDATION_QUERY;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.MINIMUM_MAXACTIVE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_DRIVER_CLASS_NAME;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_MAX_ACTIVE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_MAX_IDLE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_PASSWORD;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_TYPE;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_URL;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_USERNAME;
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sdb.ContentDataStructuresProviderSDB.PROPERTY_DB_VALIDATION_QUERY;
import java.beans.PropertyVetoException;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ConfigurationModelMakerFactorySPARQL.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ConfigurationModelMakerFactorySPARQL.java
deleted file mode 100644
index c516d7e57..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ConfigurationModelMakerFactorySPARQL.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ConfigurationModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * On a SPARQL endpoint, is there any difference between short-term and
- * long-term connections?
- *
- * In any case, memory-map all of the Configuration models, and apply them to
- * both short-term and long-term use.
- *
- * RDFService doesn't support empty models, so support them with ListCaching
- */
-public class ConfigurationModelMakerFactorySPARQL extends
- ConfigurationModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ConfigurationModelMakerFactorySPARQL(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(new MemoryMappingModelMaker(
- new RDFServiceModelMaker(longTermRdfService),
- CONFIGURATION_MODELS));
- }
-
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
- /**
- * The long-term models are all memory-mapped, so use them.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentDataStructuresProviderSPARQL.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentDataStructuresProviderSPARQL.java
new file mode 100644
index 000000000..9b43cbcbe
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentDataStructuresProviderSPARQL.java
@@ -0,0 +1,133 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextListener;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceFactorySingle;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.sparql.RDFServiceSparql;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ContentDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * For a SPARQL endpoint, each connection is created as needed by the
+ * RDFService, so there is no need to manage connections here.
+ *
+ * As a result, we have a single RDFService, a RDFServiceFactory that always
+ * returns that single RDFService, a single instance of the Dataset and the
+ * ModelMaker.
+ *
+ * Memory-map the small content models, and add the standard decorators.
+ */
+public class ContentDataStructuresProviderSPARQL extends
+ ContentDataStructuresProvider {
+ public static final String PROPERTY_SPARQL_ENDPOINT_URI = "VitroConnection.DataSource.endpointURI";
+ public static final String PROPERTY_SPARQL_UPDATE_ENDPOINT_URI = "VitroConnection.DataSource.updateEndpointURI";
+
+ private final ServletContextListener ctxListener;
+ private final ConfigurationProperties props;
+ private final StartupStatus ss;
+ private final String endpointURI;
+ private final String updateEndpointURI;
+
+ private final RDFService rdfService;
+ private final RDFServiceFactory rdfServiceFactory;
+ private final Dataset dataset;
+ private final ModelMaker modelMaker;
+
+ public ContentDataStructuresProviderSPARQL(ServletContext ctx,
+ ServletContextListener ctxListener) {
+ this.ctxListener = ctxListener;
+ this.props = ConfigurationProperties.getBean(ctx);
+ this.ss = StartupStatus.getBean(ctx);
+
+ this.endpointURI = props.getProperty(PROPERTY_SPARQL_ENDPOINT_URI);
+ this.updateEndpointURI = props
+ .getProperty(PROPERTY_SPARQL_UPDATE_ENDPOINT_URI);
+
+ this.rdfService = createRDFService();
+ this.rdfServiceFactory = createRDFServiceFactory();
+ this.dataset = createDataset();
+ this.modelMaker = createModelMaker();
+ }
+
+ private RDFService createRDFService() {
+ if (updateEndpointURI == null) {
+ ss.info(ctxListener, "Using endpoint at " + endpointURI);
+ return new RDFServiceSparql(endpointURI);
+ } else {
+ ss.info(ctxListener, "Using read endpoint at " + endpointURI
+ + " and update endpoint at " + updateEndpointURI);
+ return new RDFServiceSparql(endpointURI, updateEndpointURI);
+ }
+ }
+
+ private RDFServiceFactory createRDFServiceFactory() {
+ return new RDFServiceFactorySingle(this.rdfService);
+ }
+
+ private Dataset createDataset() {
+ return new RDFServiceDataset(getRDFService());
+ }
+
+ private ModelMaker createModelMaker() {
+ return addContentDecorators(new ListCachingModelMaker(
+ new MemoryMappingModelMaker(new RDFServiceModelMaker(
+ getRDFService()), SMALL_CONTENT_MODELS)));
+ }
+
+ @Override
+ public RDFServiceFactory getRDFServiceFactory() {
+ return this.rdfServiceFactory;
+ }
+
+ @Override
+ public RDFService getRDFService() {
+ return this.rdfService;
+ }
+
+ @Override
+ public Dataset getDataset() {
+ return this.dataset;
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ return this.modelMaker;
+ }
+
+ @Override
+ public OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
+ OntModelCache longTermOntModelCache) {
+ // No need to use short-term models.
+ return longTermOntModelCache;
+ }
+
+ @Override
+ public void close() {
+ if (this.rdfService != null) {
+ this.rdfService.close();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "ContentDataStructuresProviderSPARQL[" + ToString.hashHex(this)
+ + ", endpointURI=" + endpointURI + ", updateEndpointURI="
+ + updateEndpointURI + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentModelMakerFactorySPARQL.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentModelMakerFactorySPARQL.java
deleted file mode 100644
index f8d636ceb..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/ContentModelMakerFactorySPARQL.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ContentModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ShadowingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * On a SPARQL endpoint, is there any difference between short-term and
- * long-term connections?
- *
- * Anyway, memory-map the small models, and use a short-term connection for the
- * others (when available).
- *
- * RDFService doesn't support empty models, so support them with ListCaching
- */
-public class ContentModelMakerFactorySPARQL extends ContentModelMakerFactory
- implements ModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ContentModelMakerFactorySPARQL(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(new MemoryMappingModelMaker(
- new RDFServiceModelMaker(longTermRdfService),
- SMALL_CONTENT_MODELS));
- }
-
- /**
- * The small content models (tbox, app_metadata) are memory mapped, for
- * speed.
- */
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addContentDecorators(longTermModelMaker);
- }
-
- /**
- * For short-term use, the large models (abox) will come from a short-term
- * service. The small models can be the memory-mapped ones that we created
- * for long-term use.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- ModelMaker shortTermModelMaker = new RDFServiceModelMaker(
- shortTermRdfService);
-
- // No need to create a fresh memory map of the small models: use the
- // long-term ones.
- return addContentDecorators(new ShadowingModelMaker(
- shortTermModelMaker, longTermModelMaker, SMALL_CONTENT_MODELS));
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/RDFSourceSPARQL.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/RDFSourceSPARQL.java
deleted file mode 100644
index 58166d9dc..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/sparql/RDFSourceSPARQL.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.sparql;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextListener;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceFactorySingle;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.sparql.RDFServiceSparql;
-import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.RDFSource;
-import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
-
-/**
- * Create the connection to a SPARQL endpoint.
- *
- * Depending on the settings, we might use two endpoints: one for reads and one
- * for updates.
- *
- * Create the RDFServiceFactory.
- */
-public class RDFSourceSPARQL implements RDFSource {
- private static final Log log = LogFactory.getLog(RDFSourceSPARQL.class);
-
- public static final String PROPERTY_SPARQL_ENDPOINT_URI = "VitroConnection.DataSource.endpointURI";
- public static final String PROPERTY_SPARQL_UPDATE_ENDPOINT_URI = "VitroConnection.DataSource.updateEndpointURI";
-
- private final ServletContextListener parent;
- private final ConfigurationProperties props;
- private final StartupStatus ss;
- private final String endpointURI;
- private final String updateEndpointURI;
-
- private final RDFService rdfService;
- private final RDFServiceFactory rdfServiceFactory;
-
- public RDFSourceSPARQL(ServletContext ctx, ServletContextListener parent) {
- this.parent = parent;
- this.props = ConfigurationProperties.getBean(ctx);
- this.ss = StartupStatus.getBean(ctx);
-
- this.endpointURI = props.getProperty(PROPERTY_SPARQL_ENDPOINT_URI);
- this.updateEndpointURI = props
- .getProperty(PROPERTY_SPARQL_UPDATE_ENDPOINT_URI);
-
- this.rdfService = createRDFService();
- this.rdfServiceFactory = createRDFServiceFactory();
- }
-
- private RDFService createRDFService() {
- if (updateEndpointURI == null) {
- ss.info(parent, "Using endpoint at " + endpointURI);
- return new RDFServiceSparql(endpointURI);
- } else {
- ss.info(parent, "Using read endpoint at " + endpointURI
- + " and update endpoint at " + updateEndpointURI);
- return new RDFServiceSparql(endpointURI, updateEndpointURI);
- }
- }
-
- private RDFServiceFactory createRDFServiceFactory() {
- return new RDFServiceFactorySingle(this.rdfService);
- }
-
- @Override
- public RDFServiceFactory getRDFServiceFactory() {
- return this.rdfServiceFactory;
- }
-
- @Override
- public ModelMakerFactory getContentModelMakerFactory() {
- return new ContentModelMakerFactorySPARQL(this.rdfService);
- }
-
- @Override
- public ModelMakerFactory getConfigurationModelMakerFactory() {
- return new ConfigurationModelMakerFactorySPARQL(this.rdfService);
- }
-
- @Override
- public void close() {
- if (this.rdfService != null) {
- this.rdfService.close();
- }
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationDataStructuresProviderTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationDataStructuresProviderTDB.java
new file mode 100644
index 000000000..003cdb1f6
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationDataStructuresProviderTDB.java
@@ -0,0 +1,128 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextListener;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+import com.hp.hpl.jena.tdb.TDB;
+
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceFactorySingle;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.tdb.RDFServiceTDB;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ConfigurationDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * A TDB triple-store has no concept of connections, so we need not manage them
+ * here.
+ *
+ * As a result, we have a single RDFService, a RDFServiceFactory that always
+ * returns that single RDFService, a single instance of the Dataset and the
+ * ModelMaker.
+ *
+ * Memory-map all of the configuration models, and add the standard decorators.
+ */
+public class ConfigurationDataStructuresProviderTDB extends
+ ConfigurationDataStructuresProvider {
+
+ private static final String DIRECTORY_TDB = "tdbModels";
+
+ private final ConfigurationProperties props;
+ private final StartupStatus ss;
+
+ private final RDFServiceFactory rdfServiceFactory;
+ private final RDFService rdfService;
+ private final Dataset dataset;
+ private final ModelMaker modelMaker;
+
+ public ConfigurationDataStructuresProviderTDB(ServletContext ctx,
+ ServletContextListener ctxListener) {
+ this.props = ConfigurationProperties.getBean(ctx);
+ this.ss = StartupStatus.getBean(ctx);
+
+ configureTDB();
+
+ String tdbPath = props.getProperty("vitro.home") + File.separatorChar
+ + DIRECTORY_TDB;
+
+ try {
+ this.rdfService = new RDFServiceTDB(tdbPath);
+ this.rdfServiceFactory = createRDFServiceFactory();
+ this.dataset = new RDFServiceDataset(this.rdfService);
+ this.modelMaker = createModelMaker();
+ ss.info(ctxListener, "Initialized the RDF source for TDB");
+ } catch (IOException e) {
+ throw new RuntimeException(
+ "Failed to set up the RDF source for TDB", e);
+ }
+ }
+
+ private void configureTDB() {
+ TDB.getContext().setTrue(TDB.symUnionDefaultGraph);
+ }
+
+ private RDFServiceFactory createRDFServiceFactory() {
+ return new RDFServiceFactorySingle(this.rdfService);
+ }
+
+ private ModelMaker createModelMaker() {
+ ModelMaker longTermModelMaker = new ListCachingModelMaker(
+ new MemoryMappingModelMaker(new RDFServiceModelMaker(
+ this.rdfService), CONFIGURATION_MODELS));
+ return addConfigurationDecorators(longTermModelMaker);
+ }
+
+ @Override
+ public RDFServiceFactory getRDFServiceFactory() {
+ return this.rdfServiceFactory;
+ }
+
+ @Override
+ public RDFService getRDFService() {
+ return this.rdfService;
+ }
+
+ @Override
+ public Dataset getDataset() {
+ return this.dataset;
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ return this.modelMaker;
+ }
+
+ @Override
+ public OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
+ OntModelCache longTermOntModelCache) {
+ // No need to use short-term models.
+ return longTermOntModelCache;
+ }
+
+ @Override
+ public void close() {
+ if (this.rdfService != null) {
+ this.rdfService.close();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "ConfigurationDataStructuresProviderTDB["
+ + ToString.hashHex(this) + "]";
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationModelMakerFactoryTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationModelMakerFactoryTDB.java
deleted file mode 100644
index ac5aa7368..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ConfigurationModelMakerFactoryTDB.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ConfigurationModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * In TDB, is there any difference between short-term and long-term connections?
- *
- * In any case, memory-map all of the Configuration models, and apply them to
- * both short-term and long-term use.
- *
- * RDFService doesn't support empty models, so support them with ListCaching
- */
-public class ConfigurationModelMakerFactoryTDB extends
- ConfigurationModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ConfigurationModelMakerFactoryTDB(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(new MemoryMappingModelMaker(
- new RDFServiceModelMaker(longTermRdfService),
- CONFIGURATION_MODELS));
- }
-
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
- /**
- * The long-term models are all memory-mapped, so use them.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- return addConfigurationDecorators(longTermModelMaker);
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentDataStructuresProviderTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentDataStructuresProviderTDB.java
new file mode 100644
index 000000000..641f2d02c
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentDataStructuresProviderTDB.java
@@ -0,0 +1,126 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb;
+
+import java.io.IOException;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextListener;
+
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+import com.hp.hpl.jena.tdb.TDB;
+
+import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ontmodels.OntModelCache;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceFactorySingle;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.tdb.RDFServiceTDB;
+import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.ContentDataStructuresProvider;
+import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
+import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString;
+
+/**
+ * A TDB triple-store has no concept of connections, so we need not manage them
+ * here.
+ *
+ * As a result, we have a single RDFService, a RDFServiceFactory that always
+ * returns that single RDFService, a single instance of the Dataset and the
+ * ModelMaker.
+ *
+ * Memory-map the small content models, and add the standard decorators.
+ */
+public class ContentDataStructuresProviderTDB extends
+ ContentDataStructuresProvider {
+
+ public static final String PROPERTY_CONTENT_TDB_PATH = "VitroConnection.DataSource.tdbDirectory";
+
+ private final ConfigurationProperties props;
+ private final StartupStatus ss;
+
+ private final RDFServiceFactory rdfServiceFactory;
+ private final RDFService rdfService;
+ private final Dataset dataset;
+ private final ModelMaker modelMaker;
+
+ public ContentDataStructuresProviderTDB(ServletContext ctx,
+ ServletContextListener ctxListener) {
+ this.props = ConfigurationProperties.getBean(ctx);
+ this.ss = StartupStatus.getBean(ctx);
+
+ configureTDB();
+
+ String tdbPath = props.getProperty(PROPERTY_CONTENT_TDB_PATH);
+
+ try {
+ this.rdfService = new RDFServiceTDB(tdbPath);
+ this.rdfServiceFactory = createRDFServiceFactory();
+ this.dataset = new RDFServiceDataset(this.rdfService);
+ this.modelMaker = createModelMaker();
+ ss.info(ctxListener, "Initialized the RDF source for TDB");
+ } catch (IOException e) {
+ throw new RuntimeException(
+ "Failed to set up the RDF source for TDB", e);
+ }
+ }
+
+ private void configureTDB() {
+ TDB.getContext().setTrue(TDB.symUnionDefaultGraph);
+ }
+
+ private RDFServiceFactory createRDFServiceFactory() {
+ return new RDFServiceFactorySingle(this.rdfService);
+ }
+
+ private ModelMaker createModelMaker() {
+ return addContentDecorators(new ListCachingModelMaker(
+ new MemoryMappingModelMaker(new RDFServiceModelMaker(
+ this.rdfService), SMALL_CONTENT_MODELS)));
+ }
+
+ @Override
+ public RDFServiceFactory getRDFServiceFactory() {
+ return this.rdfServiceFactory;
+ }
+
+ @Override
+ public RDFService getRDFService() {
+ return this.rdfService;
+ }
+
+ @Override
+ public Dataset getDataset() {
+ return this.dataset;
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ return this.modelMaker;
+ }
+
+ @Override
+ public OntModelCache getShortTermOntModels(RDFService shortTermRdfService,
+ OntModelCache longTermOntModelCache) {
+ // No need to use short-term models.
+ return longTermOntModelCache;
+ }
+
+ @Override
+ public void close() {
+ if (this.rdfService != null) {
+ this.rdfService.close();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "ContentDataStructuresProviderTDB[" + ToString.hashHex(this)
+ + "]";
+ }
+
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentModelMakerFactoryTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentModelMakerFactoryTDB.java
deleted file mode 100644
index 1812129de..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/ContentModelMakerFactoryTDB.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb;
-
-import com.hp.hpl.jena.rdf.model.ModelMaker;
-
-import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ContentModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.ListCachingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.MemoryMappingModelMaker;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-
-/**
- * In TDB, is there any difference between short-term and long-term connections?
- * For now, use long-term connections for all models, memory-mapping the small
- * ones.
- *
- * RDFService doesn't support empty models, so support them with ListCaching.
- */
-public class ContentModelMakerFactoryTDB extends ContentModelMakerFactory
- implements ModelMakerFactory {
-
- private final ModelMaker longTermModelMaker;
-
- public ContentModelMakerFactoryTDB(RDFService longTermRdfService) {
- this.longTermModelMaker = new ListCachingModelMaker(
- new MemoryMappingModelMaker(new RDFServiceModelMaker(
- longTermRdfService), SMALL_CONTENT_MODELS));
- }
-
- /**
- * The small content models are memory mapped, for speed.
- */
- @Override
- public ModelMaker getModelMaker(RDFService longTermRdfService) {
- return addContentDecorators(longTermModelMaker);
- }
-
- /**
- * There are no connections or connection pool, so short-term use is the
- * same as long-term use.
- */
- @Override
- public ModelMaker getShortTermModelMaker(RDFService shortTermRdfService) {
- return addContentDecorators(longTermModelMaker);
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/RDFSourceTDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/RDFSourceTDB.java
deleted file mode 100644
index 51dd10f98..000000000
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/rdfsetup/impl/tdb/RDFSourceTDB.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.impl.tdb;
-
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONFIGURATION;
-import static edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService.CONTENT;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextListener;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.hp.hpl.jena.tdb.TDB;
-
-import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelMakerFactory;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceFactorySingle;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils.WhichService;
-import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.tdb.RDFServiceTDB;
-import edu.cornell.mannlib.vitro.webapp.servlet.setup.rdfsetup.RDFSource;
-import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
-
-/**
- * Create the connection to the TDB triple-store. This connection is either for
- * CONTENT or for CONFIGURATION, but not both.
- *
- * Create the RDFService on the directory. Create the RDFServiceFactory.
- */
-public class RDFSourceTDB implements RDFSource {
- private static final Log log = LogFactory.getLog(RDFSourceTDB.class);
-
- private static final String DIRECTORY_TDB = "tdbModels";
- public static final String PROPERTY_CONTENT_TDB_PATH = "VitroConnection.DataSource.tdbDirectory";
-
- private final ConfigurationProperties props;
- private final StartupStatus ss;
-
- private final WhichService which;
- private final RDFService rdfService;
- private final RDFServiceFactory rdfServiceFactory;
-
- public RDFSourceTDB(ServletContext ctx, ServletContextListener parent,
- WhichService which) {
- this.props = ConfigurationProperties.getBean(ctx);
- this.ss = StartupStatus.getBean(ctx);
- this.which = which;
-
- configureTDB();
-
- String tdbPath;
- if (CONTENT == which) {
- tdbPath = props.getProperty(PROPERTY_CONTENT_TDB_PATH);
- } else {
- String vitroHome = props.getProperty("vitro.home");
- tdbPath = vitroHome + File.separatorChar + DIRECTORY_TDB;
- }
-
- try {
- this.rdfService = new RDFServiceTDB(tdbPath);
- this.rdfServiceFactory = createRDFServiceFactory();
- ss.info(parent, "Initialized the RDF source for TDB");
- } catch (IOException e) {
- throw new RuntimeException(
- "Failed to set up the RDF source for TDB", e);
- }
- }
-
- private void configureTDB() {
- TDB.getContext().setTrue(TDB.symUnionDefaultGraph);
- }
-
- private RDFServiceFactory createRDFServiceFactory() {
- return new RDFServiceFactorySingle(this.rdfService);
- }
-
- @Override
- public RDFServiceFactory getRDFServiceFactory() {
- return this.rdfServiceFactory;
- }
-
- @Override
- public ModelMakerFactory getContentModelMakerFactory() {
- if (CONTENT == which) {
- return new ContentModelMakerFactoryTDB(this.rdfService);
- } else {
- throw new IllegalStateException("This RDFSource is for " + which);
- }
- }
-
- @Override
- public ModelMakerFactory getConfigurationModelMakerFactory() {
- if (CONFIGURATION == which) {
- return new ConfigurationModelMakerFactoryTDB(this.rdfService);
- } else {
- throw new IllegalStateException("This RDFSource is for " + which);
- }
- }
-
- @Override
- public void close() {
- if (this.rdfService != null) {
- this.rdfService.close();
- }
- }
-
-}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java
index 79a1b7400..f42384c9c 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java
@@ -1,6 +1,8 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.utils.dataGetter;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.DISPLAY;
+
import javax.servlet.ServletContext;
import org.apache.commons.lang.StringUtils;
@@ -9,7 +11,7 @@ import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.jena.JenaIngestController;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
public abstract class DataGetterBase implements DataGetter {
@@ -25,7 +27,7 @@ public abstract class DataGetterBase implements DataGetter {
}else if( REQUEST_JENA_ONT_MODEL.equals(modelName)){
return vreq.getJenaOntModel();
}else if( CONTEXT_DISPLAY_MODEL.equals(modelName)){
- return ModelAccess.on(context).getDisplayModel();
+ return ModelAccess.on(context).getOntModel(DISPLAY);
}else if( ! StringUtils.isEmpty( modelName)){
Model model = JenaIngestController.getModel( modelName, vreq);
if( model == null )
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ComplexStringFormatter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ComplexStringFormatter.java
new file mode 100644
index 000000000..d00a2e7a2
--- /dev/null
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ComplexStringFormatter.java
@@ -0,0 +1,141 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package edu.cornell.mannlib.vitro.webapp.utils.logging;
+
+import java.util.Stack;
+
+/**
+ *
+ * The string form of a data structure might look like this:
+ * HolderOfSeveralComponents[@1023948fe,
+ * AComponentThing[@dc0048ba],
+ * AThingWithSurprisingFormatting,
+ * ThingWithOneComponent[@120985093,
+ * HoldsNoComponents[@99999999]
+ * ],
+ * ThingWithNoHashCodeAndAMap[
+ * map={
+ * one,
+ * two,
+ * three
+ * }
+ * ],
+ * AnotherThingWithSurprisingFormatting
+ * ]
+ *
+ * Created by following these rules:
+ * create stack holding line number: size of stack is indent level
+ * on [ or { -- write "[" or "{", add line number to stack. If next character is not @, } or ], line-break.
+ * on , -- write ",", line-break
+ * on ] or } -- pop, if same line number, write "]" or "}"
+ * if different line number, line-break (indent plus 1), write "]" or "}"
+ * where each line-break includes indentation, and skipping any subsequent spaces.
+ *
+ */
+public class ComplexStringFormatter {
+ private final String rawString;
+ private final String indentText;
+
+ private int cursor;
+ private Stack stack = new Stack<>();
+ private StringBuilder buffer = new StringBuilder();
+ private int lineNumber;
+
+ public ComplexStringFormatter(String rawString) {
+ this(rawString, " ");
+ }
+
+ public ComplexStringFormatter(String rawString, String indentText) {
+ this.rawString = rawString;
+ this.indentText = indentText;
+ }
+
+ @Override
+ public String toString() {
+ while (cursor < rawString.length()) {
+ char c = currentChar();
+ switch (c) {
+ case '[':
+ case '{':
+ addChar();
+ pushDelimiter();
+ skipWhiteSpace();
+ if (!isNextCharacter('@', '}', ']')) {
+ lineBreak();
+ }
+ break;
+ case ',':
+ addChar();
+ lineBreak();
+ break;
+ case ']':
+ case '}':
+ boolean multiline = popDelimiter();
+ if (multiline) {
+ lineBreak();
+ addOneIndent();
+ }
+ addChar();
+ break;
+ default:
+ addChar();
+ }
+ next();
+ }
+ return buffer.toString();
+ }
+
+ private void next() {
+ cursor++;
+ }
+
+ private char currentChar() {
+ return rawString.charAt(cursor);
+ }
+
+ private void addChar() {
+ buffer.append(currentChar());
+ }
+
+ private void addOneIndent() {
+ buffer.append(indentText);
+ }
+
+ private void pushDelimiter() {
+ stack.push(lineNumber);
+ }
+
+ /** Return true if there was a line break since the delimiter was pushed. */
+ private boolean popDelimiter() {
+ return lineNumber != stack.pop();
+ }
+
+ private boolean isNextCharacter(char... chars) {
+ if (cursor + 1 >= rawString.length()) {
+ return false;
+ }
+ char nextChar = rawString.charAt(cursor + 1);
+ for (char c : chars) {
+ if (nextChar == c) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Advance the cursor to before the next non-white character. */
+ private void skipWhiteSpace() {
+ while (isNextCharacter(' ', '\r', '\n', '\t')) {
+ next();
+ }
+ }
+
+ private void lineBreak() {
+ buffer.append('\n');
+ lineNumber++;
+ for (int i = 0; i < stack.size(); i++) {
+ addOneIndent();
+ }
+ skipWhiteSpace();
+ }
+}
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ToString.java
similarity index 74%
rename from webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java
rename to webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ToString.java
index af18b6a38..c5f0620bb 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/ToString.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/logging/ToString.java
@@ -1,10 +1,13 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-package edu.cornell.mannlib.vitro.webapp.utils;
+package edu.cornell.mannlib.vitro.webapp.utils.logging;
+
+import static edu.cornell.mannlib.vitro.webapp.servlet.setup.FileGraphSetup.FILEGRAPH_URI_ROOT;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
+import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
@@ -14,6 +17,8 @@ import com.hp.hpl.jena.graph.compose.Polyadic;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.Model;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+
/**
* Some useful methods for printing out the contents of data structures:
* OntModels, Models, Datasets, etc.
@@ -88,15 +93,39 @@ public class ToString {
}
/**
- * If the string is found in ModelNames, return the name of the constant. If
- * not, use the string itself.
+ * If the string is found in ModelNames, return the name of the constant.
*
- * TODO: Make it work.
+ * If the name is a filegraph, convert it to filegraph:[suffix]
+ *
+ * Otherwise, return the string itself.
*/
public static String modelName(String name) {
+ if (name == null) {
+ return "null";
+ }
+ for (Entry entry : ModelNames.namesMap.entrySet()) {
+ if (name.equals(entry.getValue())) {
+ return entry.getKey();
+ }
+ }
+ if (name.startsWith(FILEGRAPH_URI_ROOT)) {
+ return "filegraph:" + name.substring(FILEGRAPH_URI_ROOT.length());
+ }
return name;
}
+ /**
+ * Replace all Model URIs with their short names. If the filegraph URI root
+ * is found, replace it with "filegraph:".
+ */
+ public static String replaceModelNames(String raw) {
+ String s = raw;
+ for (Entry entry : ModelNames.namesMap.entrySet()) {
+ s = s.replace(entry.getValue(), entry.getKey());
+ }
+ return s.replace(FILEGRAPH_URI_ROOT, "filegraph:");
+ }
+
public static boolean isVitroClass(Object o) {
return (o == null) ? false : o.getClass().getName()
.startsWith("edu.cornell");
@@ -107,7 +136,7 @@ public class ToString {
}
public static String hashHex(Object o) {
- return (o == null) ? "00000000" : Integer.toString(o.hashCode(), 16);
+ return (o == null) ? "@00000000" : String.format("@%08x", o.hashCode());
}
/**
@@ -116,4 +145,5 @@ public class ToString {
private ToString() {
// Nothing to initialize.
}
+
}
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactoryTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactoryTest.java
index a5facb4ef..7e3646070 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactoryTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactoryTest.java
@@ -14,6 +14,7 @@ import org.junit.Test;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
import stubs.javax.servlet.http.HttpSessionStub;
@@ -29,7 +30,6 @@ import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionRegistry;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.RequestedAction;
import edu.cornell.mannlib.vitro.webapp.beans.PermissionSet;
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
/**
* Can we tell whether a user is logged in as root?
@@ -80,7 +80,7 @@ public class HasPermissionFactoryTest extends AbstractTestClass {
wdf.setUserAccountsDao(uaDao);
ctx = new ServletContextStub();
- ModelAccess.on(ctx).setWebappDaoFactory(wdf);
+ new ModelAccessFactoryStub().get(ctx).setWebappDaoFactory(wdf);
session = new HttpSessionStub();
session.setServletContext(ctx);
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactoryTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactoryTest.java
index 2ab4e0fff..42a847679 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactoryTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactoryTest.java
@@ -9,6 +9,7 @@ import org.junit.Test;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
import stubs.javax.servlet.http.HttpSessionStub;
@@ -19,7 +20,6 @@ import edu.cornell.mannlib.vitro.webapp.auth.identifier.ArrayIdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.common.IsRootUser;
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
/**
* Can we tell whether a user is logged in as root?
@@ -57,7 +57,7 @@ public class IsRootUserFactoryTest extends AbstractTestClass {
wdf.setUserAccountsDao(uaDao);
ctx = new ServletContextStub();
- ModelAccess.on(ctx).setWebappDaoFactory(wdf);
+ new ModelAccessFactoryStub().get(ctx).setWebappDaoFactory(wdf);
session = new HttpSessionStub();
session.setServletContext(ctx);
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactoryTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactoryTest.java
index e9c7d59fb..c9b69b018 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactoryTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactoryTest.java
@@ -9,6 +9,7 @@ import org.junit.Test;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
import stubs.javax.servlet.http.HttpSessionStub;
@@ -19,7 +20,6 @@ import edu.cornell.mannlib.vitro.webapp.auth.identifier.ArrayIdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.common.IsUser;
import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
/**
* The simplest of the IdentifierBundleFactory classes.
@@ -42,12 +42,12 @@ public class IsUserFactoryTest extends AbstractTestClass {
@Before
public void setup() {
uaDao = new UserAccountsDaoStub();
-
+
wdf = new WebappDaoFactoryStub();
wdf.setUserAccountsDao(uaDao);
ctx = new ServletContextStub();
- ModelAccess.on(ctx).setWebappDaoFactory(wdf);
+ new ModelAccessFactoryStub().get(ctx).setWebappDaoFactory(wdf);
session = new HttpSessionStub();
session.setServletContext(ctx);
@@ -70,7 +70,7 @@ public class IsUserFactoryTest extends AbstractTestClass {
LoginStatusBean lsb = new LoginStatusBean(USER_URI,
AuthenticationSource.EXTERNAL);
LoginStatusBean.setBean(session, lsb);
-
+
UserAccount user = new UserAccount();
user.setUri(USER_URI);
uaDao.addUser(user);
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java
index 0529007ea..bb64ad10a 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/edit/AuthenticateTest.java
@@ -27,6 +27,7 @@ import stubs.edu.cornell.mannlib.vitro.webapp.dao.IndividualDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.i18n.I18nStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.ServletConfigStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
@@ -48,7 +49,6 @@ import edu.cornell.mannlib.vitro.webapp.controller.authenticate.Authenticator;
import edu.cornell.mannlib.vitro.webapp.controller.authenticate.AuthenticatorStub;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean;
import edu.cornell.mannlib.vitro.webapp.controller.login.LoginProcessBean.State;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
/**
*/
@@ -132,11 +132,15 @@ public class AuthenticateTest extends AbstractTestClass {
authenticator.setAssociatedUri(OLD_SELF.username,
"old_self_associated_uri");
+ servletContext = new ServletContextStub();
+ servletContext.setAttribute(AuthenticatorStub.FACTORY_ATTRIBUTE_NAME,
+ authenticatorFactory);
+
PermissionSet adminPermissionSet = new PermissionSet();
adminPermissionSet.setUri(URI_DBA);
adminPermissionSet.setPermissionUris(Collections
.singleton(SimplePermission.SEE_SITE_ADMIN_PAGE.getUri()));
-
+
userAccountsDao = new UserAccountsDaoStub();
userAccountsDao.addPermissionSet(adminPermissionSet);
userAccountsDao.addUser(createUserFromUserInfo(NEW_DBA));
@@ -150,10 +154,8 @@ public class AuthenticateTest extends AbstractTestClass {
webappDaoFactory.setUserAccountsDao(userAccountsDao);
webappDaoFactory.setIndividualDao(individualDao);
- servletContext = new ServletContextStub();
- ModelAccess.on(servletContext).setWebappDaoFactory(webappDaoFactory);
- servletContext.setAttribute(AuthenticatorStub.FACTORY_ATTRIBUTE_NAME,
- authenticatorFactory);
+ ModelAccessFactoryStub mafs = new ModelAccessFactoryStub();
+ mafs.get(servletContext).setWebappDaoFactory(webappDaoFactory);
setLoggerLevel(ServletPolicyList.class, Level.WARN);
ServletPolicyList.addPolicy(servletContext, new PermissionsPolicy());
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.java
index dd1fcb711..638e00cfc 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.java
@@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.controller.individual;
import static com.hp.hpl.jena.ontology.OntModelSpec.OWL_MEM;
import static edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.LABEL;
import static edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.RDF_TYPE;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption.LANGUAGE_NEUTRAL;
import static org.junit.Assert.fail;
import java.io.IOException;
@@ -22,6 +23,7 @@ import org.apache.log4j.Level;
import org.junit.Before;
import org.junit.Test;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
import stubs.javax.servlet.http.HttpSessionStub;
@@ -45,8 +47,8 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.RequestedAction;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishDataPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishObjectPropertyStatement;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
import edu.cornell.mannlib.vitro.webapp.web.ContentType;
@@ -349,8 +351,7 @@ public class IndividualRdfAssemblerTest extends AbstractTestClass {
private void setupIndividualRdfAssembler() {
rdfService = new RDFServiceModel(rawRdf);
- req.setAttribute("rdfService", rdfService);
- req.setAttribute("unfilteredRDFService", rdfService);
+ new ModelAccessFactoryStub().get(req).setRDFService(rdfService, LANGUAGE_NEUTRAL);
vreq = new VitroRequest(req);
ira = new IndividualRdfAssembler(vreq, INDIVIDUAL_URI, ContentType.N3);
}
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java
index 8de80829f..dcdf92aca 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/controller/json/JsonServletTest.java
@@ -20,6 +20,7 @@ import org.junit.Test;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.VClassDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modules.ApplicationStub;
import stubs.edu.cornell.mannlib.vitro.webapp.modules.searchEngine.SearchEngineStub;
import stubs.javax.servlet.ServletConfigStub;
@@ -29,7 +30,7 @@ import stubs.javax.servlet.http.HttpServletResponseStub;
import stubs.javax.servlet.http.HttpSessionStub;
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/**
* TODO
@@ -107,7 +108,7 @@ public class JsonServletTest extends AbstractTestClass {
resp = new HttpServletResponseStub();
wadf = new WebappDaoFactoryStub();
- ModelAccess.on(ctx).setWebappDaoFactory(wadf);
+ new ModelAccessFactoryStub().get(req).setWebappDaoFactory(wadf);
vcDao = new VClassDaoStub();
wadf.setVClassDao(vcDao);
@@ -185,9 +186,9 @@ public class JsonServletTest extends AbstractTestClass {
/**
* TODO test successful responses. This will require figuring out how to
- * stub SearchEngine. Since we are no longer dealing with an abstract class
- * (like SolrServer), so we just need to figure out
- * what sort of NamedList is required as a response to a request.
+ * stub SearchEngine. Since we are no longer dealing with an abstract class
+ * (like SolrServer), so we just need to figure out what sort of NamedList
+ * is required as a response to a request.
*/
@Test
public void individualsByClassNoIndividuals() throws ServletException,
@@ -230,8 +231,10 @@ public class JsonServletTest extends AbstractTestClass {
assertEquals("count", count, getFieldValue(actual, "totalCount"));
JSONObject vclassObj = (JSONObject) getFieldValue(actual, "vclass");
- assertEquals("vclass name", vclassId.split("://")[1], getFieldValue(vclassObj, "name"));
- assertEquals("vclass uri", vclassId, getFieldValue(vclassObj, "URI"));
+ assertEquals("vclass name", vclassId.split("://")[1],
+ getFieldValue(vclassObj, "name"));
+ assertEquals("vclass uri", vclassId,
+ getFieldValue(vclassObj, "URI"));
assertEquals("status", SC_OK, resp.getStatus());
} catch (JSONException e) {
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ListCachingModelMakerTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ListCachingModelMakerTest.java
index 7f3013d5c..7d087227f 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ListCachingModelMakerTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/ListCachingModelMakerTest.java
@@ -28,7 +28,8 @@ import com.hp.hpl.jena.shared.DoesNotExistException;
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
/**
- * TODO
+ * Test the functions of a ListCachingModelMaker. Does it properly register the
+ * presence of a model with no triples?
*/
public class ListCachingModelMakerTest extends AbstractTestClass {
private static final String URI_ONE = "http://model.one";
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMakerTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMakerTest.java
index 28803c097..78b2cf164 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMakerTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/MemoryMappingModelMakerTest.java
@@ -31,7 +31,8 @@ import com.hp.hpl.jena.rdf.model.Statement;
import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
/**
- * TODO
+ * Checks the function of a MemoryMappingModelMaker, testing the difference in
+ * behavior between an mapped model and an unmapped model.
*/
public class MemoryMappingModelMakerTest extends AbstractTestClass {
private static final String URI_MAPPED = "http://memory.mapped.model";
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMakerTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMakerTest.java
deleted file mode 100644
index dc5ee5a72..000000000
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/modelaccess/adapters/UnionModelsModelMakerTest.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/* $This file is distributed under the terms of the license in /doc/license.txt$ */
-
-package edu.cornell.mannlib.vitro.webapp.modelaccess.adapters;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import stubs.com.hp.hpl.jena.rdf.model.ModelMaker.ModelMakerStub;
-
-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 com.hp.hpl.jena.shared.AlreadyExistsException;
-import com.hp.hpl.jena.shared.CannotCreateException;
-import com.hp.hpl.jena.shared.DoesNotExistException;
-
-import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.adapters.UnionModelsModelMaker.UnionSpec;
-
-/**
- * Test the functionality of the UnionModelsModelMaker.
- */
-public class UnionModelsModelMakerTest extends AbstractTestClass {
- private static final String URI_ONE = "http://model.one";
- private static final String URI_TWO = "http://model.two";
- private static final String URI_THREE = "http://model.three";
- private static final String URI_UNION = "http://model.union";
- private static final String URI_NONE = "http://model.does.not.exist";
-
- private static final Model MODEL_ONE = createModel();
- private static final Model MODEL_TWO = createModel();
- private static final Model MODEL_THREE = createModel();
- private static final Model MODEL_DEFAULT = createModel();
- private static final Model MODEL_FRESH = createModel();
-
- private static Model createModel() {
- return ModelFactory.createDefaultModel();
- }
-
- private ModelMaker inner;
- private ModelMaker mm;
-
- @Before
- public void setup() {
- /*
- * Use a rigorous inner model maker, but it doesn't make much difference.
- */
- inner = ModelMakerStub.rigorous(MODEL_DEFAULT, MODEL_FRESH)
- .put(URI_ONE, MODEL_ONE).put(URI_TWO, MODEL_TWO)
- .put(URI_THREE, MODEL_THREE);
-
- mm = new UnionModelsModelMaker(inner, UnionSpec.base(URI_ONE)
- .plus(URI_TWO).yields(URI_UNION));
- }
-
- @SuppressWarnings("unused")
- @Test(expected = NullPointerException.class)
- public void nullInnerModel() {
- new UnionModelsModelMaker(null, UnionSpec.base(URI_ONE).plus(URI_TWO)
- .yields(URI_UNION));
- }
-
- @SuppressWarnings("unused")
- @Test(expected = IllegalArgumentException.class)
- public void duplicateUnionUri() {
- new UnionModelsModelMaker(inner, UnionSpec.base(URI_ONE).plus(URI_TWO)
- .yields(URI_UNION), UnionSpec.base(URI_ONE).plus(URI_THREE)
- .yields(URI_UNION));
- }
-
- @SuppressWarnings("unused")
- @Test(expected = IllegalArgumentException.class)
- public void nestedUnions() {
- new UnionModelsModelMaker(inner, UnionSpec.base(URI_ONE).plus(URI_TWO)
- .yields(URI_UNION), UnionSpec.base(URI_UNION).plus(URI_THREE)
- .yields("http://nestedUnion"));
- }
-
- @Test
- public void hasModelActual() {
- assertTrue(mm.hasModel(URI_ONE));
- }
-
- @Test
- public void hasModelNone() {
- assertFalse(mm.hasModel(URI_NONE));
- }
-
- @Test
- public void hasModelUnion() {
- assertTrue(mm.hasModel(URI_UNION));
- }
-
- @Test
- public void listModels() {
- assertExpectedModelsList(URI_ONE, URI_TWO, URI_THREE, URI_UNION);
- }
-
- @Test
- public void createModelActual() {
- assertEquals(MODEL_ONE, mm.createModel(URI_ONE));
- }
-
- @Test
- public void createModelNone() {
- assertEquals(MODEL_FRESH, mm.createModel(URI_NONE));
- }
-
- @Test
- public void createModelUnion() {
- assertTrue(isUnionModel(mm.createModel(URI_UNION)));
- }
-
- @Test(expected = AlreadyExistsException.class)
- public void createModelActualStrict() {
- mm.createModel(URI_ONE, true);
- }
-
- @Test
- public void createModelNoneStrict() {
- assertEquals(MODEL_FRESH, mm.createModel(URI_NONE, true));
- }
-
- @Test(expected = AlreadyExistsException.class)
- public void createModelUnionStrict() {
- mm.createModel(URI_UNION, true);
- }
-
- @Test
- public void openModelActual() {
- assertEquals(MODEL_ONE, mm.openModel(URI_ONE));
- }
-
- @Test(expected = DoesNotExistException.class)
- public void openModelNone() {
- mm.openModel(URI_NONE);
- }
-
- @Test
- public void openModelUnion() {
- assertTrue(isUnionModel(mm.openModel(URI_UNION)));
- }
-
- @Test
- public void openModelActualStrict() {
- assertEquals(MODEL_ONE, mm.openModel(URI_ONE, true));
- }
-
- @Test(expected = DoesNotExistException.class)
- public void openModelNoneStrict() {
- mm.openModel(URI_NONE, true);
- }
-
- @Test
- public void openModelUnionStrict() {
- assertTrue(isUnionModel(mm.openModel(URI_UNION, true)));
- }
-
- @Test
- public void openModelIfPresentActual() {
- assertEquals(MODEL_ONE, mm.openModelIfPresent(URI_ONE));
- }
-
- @Test
- public void openModelIfPresentNone() {
- assertNull(mm.openModelIfPresent(URI_NONE));
- }
-
- @Test
- public void openModelIfPresentUnion() {
- assertTrue(isUnionModel(mm.openModelIfPresent(URI_UNION)));
- }
-
- @Test
- public void removeModelActual() {
- mm.removeModel(URI_ONE);
- assertExpectedModelsList(URI_TWO, URI_THREE, URI_UNION);
- }
-
- @Test(expected = DoesNotExistException.class)
- public void removeModelNone() {
- mm.removeModel(URI_NONE);
- }
-
- @Test
- public void removeModelUnion() {
- mm.removeModel(URI_UNION);
- assertExpectedModelsList(URI_ONE, URI_TWO, URI_THREE);
- }
-
- @Test
- public void getModelActual() {
- assertEquals(MODEL_ONE, mm.getModel(URI_ONE));
- }
-
- @Test
- public void getModelNone() {
- assertEquals(null, mm.getModel(URI_NONE));
- }
-
- @Test
- public void getModelUnion() {
- assertTrue(isUnionModel(mm.getModel(URI_UNION)));
- }
-
- @Test
- public void getModelLoadIfAbsentActual() {
- assertEquals(MODEL_ONE, mm.getModel(URI_ONE, null));
- }
-
- @Test(expected = CannotCreateException.class)
- public void getModelLoadIfAbsentNone() {
- mm.getModel(URI_NONE, null);
- }
-
- @Test
- public void getModelLoadIfAbsentUnion() {
- assertTrue(isUnionModel(mm.getModel(URI_UNION, null)));
- }
-
- // ----------------------------------------------------------------------
- // Helper methods
- // ----------------------------------------------------------------------
-
- /**
- * No easy way to assert that this is actually the union model, but we can
- * assert that it is not null, and not any model we know of.
- */
- private boolean isUnionModel(Model m) {
- Model[] knownModels = { MODEL_ONE, MODEL_TWO, MODEL_THREE,
- MODEL_DEFAULT, MODEL_FRESH };
- if (m == null) {
- return false;
- }
-
- for (Model knownModel : knownModels) {
- if (m == knownModel) {
- return false;
- }
- }
-
- return true;
- }
-
- private void assertExpectedModelsList(String... uris) {
- Set expected = new HashSet<>(Arrays.asList(uris));
- assertEquals(expected, mm.listModels().toSet());
- }
-
-}
\ No newline at end of file
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel_PropertyListConfigTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel_PropertyListConfigTest.java
index 8e123cf3e..7e608b44e 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel_PropertyListConfigTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel_PropertyListConfigTest.java
@@ -2,6 +2,8 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_AND_INFERENCES;
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames.FULL_UNION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
@@ -27,6 +29,7 @@ import org.junit.rules.ExpectedException;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDaoStub;
import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
+import stubs.edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccessFactoryStub;
import stubs.freemarker.cache.TemplateLoaderStub;
import stubs.javax.servlet.ServletContextStub;
import stubs.javax.servlet.http.HttpServletRequestStub;
@@ -41,9 +44,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.IndividualImpl;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
-import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
-import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.InvalidConfigurationException;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.PropertyListConfig;
import freemarker.cache.TemplateLoader;
@@ -70,6 +71,8 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
private TemplateLoaderStub tl;
private StringWriter logMessages;
+
+ private ModelAccessFactoryStub mafs;
/**
* In general, we expect no exception, but individual tests may override,
@@ -130,7 +133,9 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
hreq.setSession(session);
vreq = new VitroRequest(hreq);
- ModelAccess.on(vreq).setWebappDaoFactory(wadf);
+
+ mafs = new ModelAccessFactoryStub();
+ mafs.get(vreq).setWebappDaoFactory(wadf, ASSERTIONS_AND_INFERENCES);
subject = new IndividualImpl();
@@ -280,7 +285,7 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
@Test
public void constructQueryNodeMissing()
throws InvalidConfigurationException {
- ModelAccess.on(vreq).setOntModel(ModelNames.FULL_UNION, emptyOntModel());
+ mafs.get(vreq).setOntModel(emptyOntModel(), FULL_UNION);
op = buildOperation("constructQueryMissing");
optm = new NonCollatingOPTM(op, subject, vreq, true);
// Not an error.
@@ -289,7 +294,7 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
@Test
public void constructQueryMultipleValues()
throws InvalidConfigurationException {
- ModelAccess.on(vreq).setOntModel(ModelNames.FULL_UNION, emptyOntModel());
+ mafs.get(vreq).setOntModel(emptyOntModel(), FULL_UNION);
op = buildOperation("constructQueryMultiple");
optm = new NonCollatingOPTM(op, subject, vreq, true);
assertConstructQueries("multiple construct queries", "ONE", "TWO",
diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccessStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccessStub.java
new file mode 100644
index 000000000..1ab169f23
--- /dev/null
+++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ContextModelAccessStub.java
@@ -0,0 +1,122 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package stubs.edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import static edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption.ASSERTIONS_AND_INFERENCES;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.query.Dataset;
+import com.hp.hpl.jena.rdf.model.ModelMaker;
+
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ContextModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ReasoningOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * A mock instance of ContextModelAccess for use in unit tests.
+ *
+ * I have only implemented the methods that I needed for my tests. Feel free to
+ * implement the rest, as needed.
+ */
+public class ContextModelAccessStub implements ContextModelAccess {
+ // ----------------------------------------------------------------------
+ // Stub infrastructure
+ // ----------------------------------------------------------------------
+
+ private final Map wadfMap = new HashMap<>();
+
+ public void setWebappDaoFactory(WebappDaoFactory wadf) {
+ setWebappDaoFactory(wadf, ASSERTIONS_AND_INFERENCES);
+ }
+
+ public void setWebappDaoFactory(WebappDaoFactory wadf,
+ ReasoningOption option) {
+ wadfMap.put(option, wadf);
+ }
+
+ // ----------------------------------------------------------------------
+ // Stub methods
+ // ----------------------------------------------------------------------
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory() {
+ return wadfMap.get(ASSERTIONS_AND_INFERENCES);
+ }
+
+ // ----------------------------------------------------------------------
+ // Un-implemented methods
+ // ----------------------------------------------------------------------
+
+ @Override
+ public RDFService getRDFService() {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getRDFService() not implemented.");
+ }
+
+ @Override
+ public RDFService getRDFService(WhichService which) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getRDFService() not implemented.");
+ }
+
+ @Override
+ public Dataset getDataset() {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getDataset() not implemented.");
+ }
+
+ @Override
+ public Dataset getDataset(WhichService which) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getDataset() not implemented.");
+ }
+
+ @Override
+ public ModelMaker getModelMaker() {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getModelMaker() not implemented.");
+ }
+
+ @Override
+ public ModelMaker getModelMaker(WhichService which) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getModelMaker() not implemented.");
+ }
+
+ @Override
+ public OntModel getOntModel() {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getOntModel() not implemented.");
+ }
+
+ @Override
+ public OntModel getOntModel(String name) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getOntModel() not implemented.");
+ }
+
+ @Override
+ public OntModelSelector getOntModelSelector() {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getOntModelSelector() not implemented.");
+ }
+
+ @Override
+ public OntModelSelector getOntModelSelector(ReasoningOption option) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getOntModelSelector() not implemented.");
+ }
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory(ReasoningOption option) {
+ throw new RuntimeException(
+ "ContextModelAccessStub.getWebappDaoFactory() not implemented.");
+ }
+
+}
diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccessFactoryStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccessFactoryStub.java
new file mode 100644
index 000000000..bdee3b0fe
--- /dev/null
+++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/ModelAccessFactoryStub.java
@@ -0,0 +1,57 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package stubs.edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import java.lang.reflect.Field;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ContextModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.ModelAccessFactory;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.RequestModelAccess;
+
+/**
+ * A mock instance of ModelAccessFactory for use in unit tests.
+ *
+ * I have only implemented the methods that I needed for my tests. Feel free to
+ * implement the rest, as needed.
+ */
+public class ModelAccessFactoryStub extends ModelAccessFactory {
+ private final ContextModelAccessStub contextMA;
+ private final RequestModelAccessStub requestMA;
+
+ public ModelAccessFactoryStub() {
+ try {
+ Field factoryField = ModelAccess.class.getDeclaredField("factory");
+ factoryField.setAccessible(true);
+ factoryField.set(null, this);
+ } catch (NoSuchFieldException | SecurityException
+ | IllegalArgumentException | IllegalAccessException e) {
+ throw new RuntimeException(
+ "Failed to create the ModelAccessFactoryStub", e);
+ }
+
+ contextMA = new ContextModelAccessStub();
+ requestMA = new RequestModelAccessStub();
+ }
+
+ @Override
+ public ContextModelAccess buildContextModelAccess(ServletContext ctx) {
+ return contextMA;
+ }
+
+ @Override
+ public RequestModelAccess buildRequestModelAccess(HttpServletRequest req) {
+ return requestMA;
+ }
+
+ public ContextModelAccessStub get(ServletContext ctx) {
+ return contextMA;
+ }
+
+ public RequestModelAccessStub get(HttpServletRequest req) {
+ return requestMA;
+ }
+}
diff --git a/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccessStub.java b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccessStub.java
new file mode 100644
index 000000000..00ac671c7
--- /dev/null
+++ b/webapp/test/stubs/edu/cornell/mannlib/vitro/webapp/modelaccess/RequestModelAccessStub.java
@@ -0,0 +1,104 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+package stubs.edu.cornell.mannlib.vitro.webapp.modelaccess;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.query.Dataset;
+
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.DatasetOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.LanguageOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.OntModelSelectorOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.RdfServiceOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WebappDaoFactoryOption;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.RequestModelAccess;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.OntModelKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.RDFServiceKey;
+import edu.cornell.mannlib.vitro.webapp.modelaccess.impl.keys.WebappDaoFactoryKey;
+import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
+
+/**
+ * A mock instance of RequestModelAccess for use in unit tests.
+ *
+ * I have only implemented the methods that I needed for my tests. Feel free to
+ * implement the rest, as needed.
+ */
+public class RequestModelAccessStub implements RequestModelAccess {
+ // ----------------------------------------------------------------------
+ // Stub infrastructure
+ // ----------------------------------------------------------------------
+
+ private final Map rdfServiceMap = new HashMap<>();
+
+ public void setRDFService(RDFService rdfService,
+ RdfServiceOption... options) {
+ rdfServiceMap.put(new RDFServiceKey(options), rdfService);
+ }
+
+ private final Map ontModelMap = new HashMap<>();
+
+ public void setOntModel(OntModel model, String name) {
+ ontModelMap.put(new OntModelKey(name), model);
+ }
+
+ private final Map wadfMap = new HashMap<>();
+
+ public void setWebappDaoFactory(WebappDaoFactory wadf,
+ WebappDaoFactoryOption... options) {
+ wadfMap.put(new WebappDaoFactoryKey(options), wadf);
+ }
+
+ // ----------------------------------------------------------------------
+ // Stub methods
+ // ----------------------------------------------------------------------
+
+ @Override
+ public RDFService getRDFService(RdfServiceOption... options) {
+ return rdfServiceMap.get(new RDFServiceKey(options));
+ }
+
+ @Override
+ public OntModel getOntModel(LanguageOption... options) {
+ return getOntModel(ModelNames.FULL_UNION, options);
+ }
+
+ @Override
+ public OntModel getOntModel(String name, LanguageOption... options) {
+ return ontModelMap.get(new OntModelKey(name, options));
+ }
+
+ @Override
+ public WebappDaoFactory getWebappDaoFactory(
+ WebappDaoFactoryOption... options) {
+ return wadfMap.get(new WebappDaoFactoryKey(options));
+ }
+
+ // ----------------------------------------------------------------------
+ // Un-implemented methods
+ // ----------------------------------------------------------------------
+
+ @Override
+ public Dataset getDataset(DatasetOption... options) {
+ throw new RuntimeException(
+ "RequestModelAccessStub.getDataset() not implemented.");
+ }
+
+ @Override
+ public OntModelSelector getOntModelSelector(
+ OntModelSelectorOption... options) {
+ throw new RuntimeException(
+ "RequestModelAccessStub.getOntModelSelector() not implemented.");
+ }
+
+ @Override
+ public void close() {
+ throw new RuntimeException(
+ "RequestModelAccessStub.close() not implemented.");
+ }
+
+}
diff --git a/webapp/web/admin/conceptRepair.jsp b/webapp/web/admin/conceptRepair.jsp
index 301b105e3..1d18a48fd 100644
--- a/webapp/web/admin/conceptRepair.jsp
+++ b/webapp/web/admin/conceptRepair.jsp
@@ -3,7 +3,8 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.Controllers" %>
-<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess"%>
+<%@ page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess"%>
+<%@ page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames"%>
<%@taglib prefix="vitro" uri="/WEB-INF/tlds/VitroUtils.tld" %>
<%@page import="edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission" %>
@@ -22,7 +23,7 @@
" FILTER(afn:bnode(?bnode) = \"" + conceptIdStr + "\")\n" +
"}";
- OntModel ontModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.FULL_ASSERTIONS);
Model conceptDescription = ModelFactory.createDefaultModel();
try {
ontModel.enterCriticalSection(Lock.READ);
diff --git a/webapp/web/admin/removeBadRestrictions.jsp b/webapp/web/admin/removeBadRestrictions.jsp
index 18e8e78d8..af3a03bcf 100644
--- a/webapp/web/admin/removeBadRestrictions.jsp
+++ b/webapp/web/admin/removeBadRestrictions.jsp
@@ -4,13 +4,15 @@
<%@taglib prefix="vitro" uri="/WEB-INF/tlds/VitroUtils.tld" %>
<%@page import="edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission" %>
-<%@page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess"%>
+<%@page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess"%>
+<%@page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames"%>
+
<% request.setAttribute("requestedActions", SimplePermission.USE_MISCELLANEOUS_CURATOR_PAGES.ACTION); %>
<%
if (request.getParameter("execute") != null) {
- OntModel ontModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.FULL_ASSERTIONS);
int results = doRemoval(ontModel);
request.setAttribute("removalCount", results);
}
@@ -67,7 +69,7 @@
" FILTER(afn:bnode(?bnode) = \"" + bnodeId + "\")\n" +
"}";
- OntModel ontModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.FULL_ASSERTIONS);
Model conceptDescription = ModelFactory.createDefaultModel();
try {
ontModel.enterCriticalSection(Lock.READ);
diff --git a/webapp/web/admin/removeResourceDescription.jsp b/webapp/web/admin/removeResourceDescription.jsp
index 874e1f0cb..276eb713e 100644
--- a/webapp/web/admin/removeResourceDescription.jsp
+++ b/webapp/web/admin/removeResourceDescription.jsp
@@ -6,7 +6,8 @@
<%@taglib prefix="vitro" uri="/WEB-INF/tlds/VitroUtils.tld" %>
<%@page import="edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission" %>
-<%@page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess"%>
+<%@page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess"%>
+<%@page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames"%>
<% request.setAttribute("requestedActions", SimplePermission.USE_MISCELLANEOUS_CURATOR_PAGES.ACTION); %>
@@ -17,7 +18,7 @@
String describeQueryStr =
"DESCRIBE <" + resourceURIStr + ">";
- OntModel ontModel = ModelAccess.on(getServletContext()).getBaseOntModel();
+ OntModel ontModel = ModelAccess.on(getServletContext()).getOntModel(ModelNames.FULL_ASSERTIONS);
Model resourceDescription = ModelFactory.createDefaultModel();
try {
ontModel.enterCriticalSection(Lock.READ);
diff --git a/webapp/web/admin/sparql.jsp b/webapp/web/admin/sparql.jsp
index f1671ea9f..2ecc3f58d 100644
--- a/webapp/web/admin/sparql.jsp
+++ b/webapp/web/admin/sparql.jsp
@@ -1,8 +1,8 @@
<%@page import="com.hp.hpl.jena.vocabulary.OWL"%>
<%@page import="com.hp.hpl.jena.rdf.model.ModelMaker"%>
-<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess"%>
-<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess.ModelMakerID"%>
+<%@ page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess"%>
+<%@ page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess.WhichService"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
@@ -123,7 +123,7 @@ td {
<%
try {
- ModelMaker maker = ModelAccess.on(application).getModelMaker(ModelMakerID.CONFIGURATION);
+ ModelMaker maker = ModelAccess.on(application).getModelMaker(WhichService.CONFIGURATION);
for (Iterator it = maker.listModels(); it.hasNext();) {
String modelName = (String) it.next();
%>
diff --git a/webapp/web/css/showSources.css b/webapp/web/css/showSources.css
new file mode 100644
index 000000000..da39589ea
--- /dev/null
+++ b/webapp/web/css/showSources.css
@@ -0,0 +1,21 @@
+/* $This file is distributed under the terms of the license in /doc/license.txt$ */
+
+/* Styles for Freemarker template admin/showSources */
+
+#show-sources pre {
+ font-family: monospace;
+ line-height: 1.1em;
+}
+
+#show-sources table {
+ width: 100%;
+ border: solid black;
+}
+
+#show-sources th {
+ background-color: #EEEEEE;
+}
+
+#show-sources td {
+ border: 1px solid gray;
+}
diff --git a/webapp/web/jenaIngest/executeWorkflow.jsp b/webapp/web/jenaIngest/executeWorkflow.jsp
index 8f5751f83..c1483e621 100644
--- a/webapp/web/jenaIngest/executeWorkflow.jsp
+++ b/webapp/web/jenaIngest/executeWorkflow.jsp
@@ -3,7 +3,7 @@
<%@ page import="com.hp.hpl.jena.ontology.Individual" %>
<%@ page import="com.hp.hpl.jena.ontology.OntModel" %>
<%@ page import="com.hp.hpl.jena.rdf.model.ModelMaker" %>
-<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.ModelAccess"%>
+<%@ page import="edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess"%>
<%@ page import="com.hp.hpl.jena.shared.Lock" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.util.List" %>
@@ -24,7 +24,7 @@