From 49289408492f5f8fe6e4020161ec6d888b9bab1d Mon Sep 17 00:00:00 2001 From: j2blake Date: Tue, 21 May 2013 17:45:48 -0400 Subject: [PATCH] VIVO-82 Use ModelAccess to store and get WebappDaoFactory references. --- .../mannlib/vedit/beans/LoginStatusBean.java | 9 +-- .../vedit/controller/BaseEditController.java | 14 +--- .../factory/BaseIdentifierBundleFactory.java | 12 +-- .../permissions/PermissionSetsLoader.java | 3 +- .../webapp/auth/policy/RootUserPolicy.java | 17 +--- .../controller/AbstractPageHandler.java | 3 +- .../vitro/webapp/controller/VitroRequest.java | 59 +------------- .../authenticate/BasicAuthenticator.java | 10 +-- .../edit/EntityRetryController.java | 3 +- .../ClassHierarchyListingController.java | 5 +- .../freemarker/DeletePropertyController.java | 3 +- .../mannlib/vitro/webapp/dao/ModelAccess.java | 79 +++++++++++++++---- .../webapp/dao/jena/VClassGroupCache.java | 16 +--- .../mannlib/vitro/webapp/dwr/EntityDWR.java | 7 +- .../webapp/filters/PageRoutingFilter.java | 16 ++-- .../filters/StartupStatusDisplayFilter.java | 5 +- .../URLRewritingHttpServletResponse.java | 4 +- .../webapp/filters/VitroRequestPrep.java | 20 +---- .../filters/WebappDaoFactorySDBPrep.java | 5 +- .../filters/WebappDaoFactorySparqlPrep.java | 18 ++--- .../filter/LanguageFilteringUtils.java | 18 ----- .../vitro/webapp/search/solr/SolrSetup.java | 2 +- .../servlet/setup/ContentModelSetup.java | 10 +-- .../servlet/setup/RunSparqlConstructs.java | 11 ++- .../servlet/setup/SimpleReasonerSetup.java | 3 +- .../servlet/setup/UpdateKnowledgeBase.java | 2 +- .../setup/UpdatePermissionSetUris.java | 4 +- .../factory/HasPermissionFactoryTest.java | 3 +- .../factory/IsRootUserFactoryTest.java | 3 +- .../identifier/factory/IsUserFactoryTest.java | 3 +- .../controller/edit/AuthenticateTest.java | 3 +- .../controller/json/JsonServletTest.java | 4 +- .../PageDataGetterUtilsTest.java | 5 +- ...yTemplateModel_PropertyListConfigTest.java | 14 +++- .../javax/servlet/http/HttpSessionStub.java | 10 ++- 35 files changed, 166 insertions(+), 237 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vedit/beans/LoginStatusBean.java b/webapp/src/edu/cornell/mannlib/vedit/beans/LoginStatusBean.java index 04ec6f276..d9a719483 100644 --- a/webapp/src/edu/cornell/mannlib/vedit/beans/LoginStatusBean.java +++ b/webapp/src/edu/cornell/mannlib/vedit/beans/LoginStatusBean.java @@ -10,6 +10,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -101,13 +102,7 @@ public class LoginStatusBean { } ServletContext ctx = session.getServletContext(); - WebappDaoFactory wadf = (WebappDaoFactory) ctx - .getAttribute("webappDaoFactory"); - if (wadf == null) { - log.error("No WebappDaoFactory"); - return null; - } - + WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); UserAccountsDao userAccountsDao = wadf.getUserAccountsDao(); if (userAccountsDao == null) { log.error("No UserAccountsDao"); diff --git a/webapp/src/edu/cornell/mannlib/vedit/controller/BaseEditController.java b/webapp/src/edu/cornell/mannlib/vedit/controller/BaseEditController.java index 6dc749274..0a0bd6b87 100644 --- a/webapp/src/edu/cornell/mannlib/vedit/controller/BaseEditController.java +++ b/webapp/src/edu/cornell/mannlib/vedit/controller/BaseEditController.java @@ -175,18 +175,12 @@ public class BaseEditController extends VitroHttpServlet { } - protected WebappDaoFactory getWebappDaoFactory(VitroRequest vreq) { - WebappDaoFactory wadf = (WebappDaoFactory) getServletContext().getAttribute( - "assertionsWebappDaoFactory"); - if (wadf == null) { - log.info("Using vreq.getFullWebappDaoFactory()"); - wadf = vreq.getFullWebappDaoFactory(); - } - return wadf; + protected WebappDaoFactory getWebappDaoFactory() { + return ModelAccess.on(getServletContext()).getBaseWebappDaoFactory(); } - protected WebappDaoFactory getWebappDaoFactory(VitroRequest vreq, String userURI) { - return getWebappDaoFactory(vreq).getUserAwareDaoFactory(userURI); + protected WebappDaoFactory getWebappDaoFactory(String userURI) { + return getWebappDaoFactory().getUserAwareDaoFactory(userURI); } public String getDefaultLandingPage(HttpServletRequest request) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseIdentifierBundleFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseIdentifierBundleFactory.java index ff5693355..2a45c4769 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseIdentifierBundleFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseIdentifierBundleFactory.java @@ -6,6 +6,7 @@ import javax.servlet.ServletContext; import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundleFactory; import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; @@ -24,16 +25,7 @@ public abstract class BaseIdentifierBundleFactory implements throw new NullPointerException("ctx may not be null."); } this.ctx = ctx; - - Object wdfObject = ctx.getAttribute("webappDaoFactory"); - if (wdfObject instanceof WebappDaoFactory) { - this.wdf = (WebappDaoFactory) wdfObject; - } else { - throw new IllegalStateException( - "Didn't find a WebappDaoFactory in the context. Found '" - + wdfObject + "' instead."); - } - + this.wdf = ModelAccess.on(ctx).getWebappDaoFactory(); this.uaDao = wdf.getUserAccountsDao(); this.indDao = wdf.getIndividualDao(); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java index d15234e47..94608e5a1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionSetsLoader.java @@ -273,8 +273,7 @@ public class PermissionSetsLoader implements ServletContextListener { this.ctx = ctx; this.ss = ss; - WebappDaoFactory wadf = (WebappDaoFactory) ctx - .getAttribute("webappDaoFactory"); + WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory(); if (wadf == null) { throw new IllegalStateException( "No webappDaoFactory on the servlet context"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/RootUserPolicy.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/RootUserPolicy.java index 9c635a6cf..2b43662e2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/RootUserPolicy.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/RootUserPolicy.java @@ -2,8 +2,6 @@ package edu.cornell.mannlib.vitro.webapp.auth.policy; -import java.util.Collections; -import java.util.Set; import java.util.TreeSet; import javax.servlet.ServletContext; @@ -23,8 +21,8 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount.Status; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.controller.authenticate.Authenticator; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; -import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; /** @@ -79,7 +77,8 @@ public class RootUserPolicy implements PolicyIface { ss = StartupStatus.getBean(ctx); try { - uaDao = getUserAccountsDao(); + uaDao = ModelAccess.on(ctx).getWebappDaoFactory() + .getUserAccountsDao(); configuredRootUser = getRootEmailFromConfig(); otherRootUsers = getEmailsOfAllRootUsers(); @@ -105,16 +104,6 @@ public class RootUserPolicy implements PolicyIface { } } - private UserAccountsDao getUserAccountsDao() { - WebappDaoFactory wadf = (WebappDaoFactory) ctx - .getAttribute("webappDaoFactory"); - if (wadf == null) { - throw new IllegalStateException( - "No webappDaoFactory on the servlet context"); - } - return wadf.getUserAccountsDao(); - } - private String getRootEmailFromConfig() { String email = ConfigurationProperties.getBean(ctx).getProperty( PROPERTY_ROOT_USER_EMAIL); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/AbstractPageHandler.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/AbstractPageHandler.java index 3e30d84a2..d4c92de57 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/AbstractPageHandler.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/AbstractPageHandler.java @@ -59,8 +59,7 @@ public abstract class AbstractPageHandler { userAccountsModel = ModelAccess.on(ctx).getUserAccountsModel(); unionModel = ModelAccess.on(ctx).getOntModel(ModelID.UNION_FULL); - WebappDaoFactory wdf = (WebappDaoFactory) this.ctx - .getAttribute("webappDaoFactory"); + WebappDaoFactory wdf = ModelAccess.on(ctx).getWebappDaoFactory(); userAccountsDao = wdf.getUserAccountsDao(); vclassDao = wdf.getVClassDao(); indDao = wdf.getIndividualDao(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java index a80542d5c..872456791 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/VitroRequest.java @@ -71,13 +71,9 @@ public class VitroRequest extends HttpServletRequestWrapper { setAttribute("unfilteredRDFService", rdfService); } - public void setWebappDaoFactory( WebappDaoFactory wdf){ - setAttribute("webappDaoFactory",wdf); - } - /** gets WebappDaoFactory with appropriate filtering for the request */ public WebappDaoFactory getWebappDaoFactory(){ - return (WebappDaoFactory) getAttribute("webappDaoFactory"); + return ModelAccess.on(this).getWebappDaoFactory(); } public void setUnfilteredWebappDaoFactory(WebappDaoFactory wdf) { @@ -92,10 +88,6 @@ public class VitroRequest extends HttpServletRequestWrapper { return (WebappDaoFactory) getAttribute("unfilteredWebappDaoFactory"); } - public void setFullWebappDaoFactory(WebappDaoFactory wdf) { - setAttribute("fullWebappDaoFactory", wdf); - } - public Dataset getDataset() { return (Dataset) getAttribute("dataset"); } @@ -106,53 +98,14 @@ public class VitroRequest extends HttpServletRequestWrapper { /** gets assertions + inferences WebappDaoFactory with no filtering **/ public WebappDaoFactory getFullWebappDaoFactory() { - Object webappDaoFactoryAttr = _req.getAttribute("fullWebappDaoFactory"); - if (webappDaoFactoryAttr instanceof WebappDaoFactory) { - return (WebappDaoFactory) webappDaoFactoryAttr; - } else { - webappDaoFactoryAttr = _req.getSession().getAttribute("webappDaoFactory"); - if (webappDaoFactoryAttr instanceof WebappDaoFactory) { - return (WebappDaoFactory) webappDaoFactoryAttr; - } else { - return (WebappDaoFactory) _req.getSession().getServletContext().getAttribute("webappDaoFactory"); - } - } + return ModelAccess.on(this).getWebappDaoFactory(); } /** gets assertions-only WebappDaoFactory with no filtering */ public WebappDaoFactory getAssertionsWebappDaoFactory() { - Object webappDaoFactoryAttr = _req.getSession().getAttribute("assertionsWebappDaoFactory"); - if (webappDaoFactoryAttr instanceof WebappDaoFactory) { - log.debug("Returning assertionsWebappDaoFactory from session"); - return (WebappDaoFactory) webappDaoFactoryAttr; - } else { - webappDaoFactoryAttr = getAttribute("assertionsWebappDaoFactory"); - if (webappDaoFactoryAttr instanceof WebappDaoFactory) { - log.debug("returning assertionsWebappDaoFactory from request attribute"); - return (WebappDaoFactory) webappDaoFactoryAttr; - } else { - log.debug("Returning assertionsWebappDaoFactory from context"); - return (WebappDaoFactory) _req.getSession().getServletContext().getAttribute("assertionsWebappDaoFactory"); - } - - } + return ModelAccess.on(this).getBaseWebappDaoFactory(); } - - /** gets assertions-only WebappDaoFactory with no filtering */ - public void setAssertionsWebappDaoFactory(WebappDaoFactory wadf) { - setAttribute("assertionsWebappDaoFactory", wadf); - } - - /** gets inferences-only WebappDaoFactory with no filtering */ - public WebappDaoFactory getDeductionsWebappDaoFactory() { - Object webappDaoFactoryAttr = _req.getSession().getAttribute("deductionsWebappDaoFactory"); - if (webappDaoFactoryAttr instanceof WebappDaoFactory) { - return (WebappDaoFactory) webappDaoFactoryAttr; - } else { - return (WebappDaoFactory) _req.getSession().getServletContext().getAttribute("deductionsWebappDaoFactory"); - } - } - + //Method that retrieves write model, returns special model in case of write model public OntModel getWriteModel() { //if special write model doesn't exist use get ont model @@ -167,10 +120,6 @@ public class VitroRequest extends HttpServletRequestWrapper { return ModelAccess.on(this).getOntModelSelector(); } - public void setJenaOntModel(OntModel ontModel) { - ModelAccess.on(this).setJenaOntModel(ontModel); - } - public OntModel getJenaOntModel() { return ModelAccess.on(this).getJenaOntModel(); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/authenticate/BasicAuthenticator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/authenticate/BasicAuthenticator.java index 39787c8ef..16435125b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/authenticate/BasicAuthenticator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/authenticate/BasicAuthenticator.java @@ -25,6 +25,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.SelfEditingConfiguration; import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; import edu.cornell.mannlib.vitro.webapp.controller.edit.Authenticate; import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; +import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.jena.LoginEvent; @@ -302,14 +303,7 @@ public class BasicAuthenticator extends Authenticator { } ServletContext servletContext = session.getServletContext(); - WebappDaoFactory wadf = (WebappDaoFactory) servletContext - .getAttribute("webappDaoFactory"); - if (wadf == null) { - log.error("no WebappDaoFactory"); - return null; - } - - return wadf; + return ModelAccess.on(servletContext).getWebappDaoFactory(); } @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java index 440848469..114ab1118 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java @@ -79,8 +79,7 @@ public class EntityRetryController extends BaseEditController { } LoginStatusBean loginBean = LoginStatusBean.getBean(request); - WebappDaoFactory myWebappDaoFactory = getWebappDaoFactory( - vreq, loginBean.getUserURI()); + WebappDaoFactory myWebappDaoFactory = getWebappDaoFactory(loginBean.getUserURI()); IndividualDao ewDao = myWebappDaoFactory.getIndividualDao(); epo.setDataAccessObject(ewDao); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/ClassHierarchyListingController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/ClassHierarchyListingController.java index 2bab7453e..2fdcc9cef 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/ClassHierarchyListingController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/listing/ClassHierarchyListingController.java @@ -27,6 +27,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; 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.OntologyDao; import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao; @@ -52,8 +53,8 @@ public class ClassHierarchyListingController extends BaseEditController { try { boolean inferred = (vrequest.getParameter("inferred") != null); - if (vrequest.getAssertionsWebappDaoFactory() != null && !inferred) { - vcDao = vrequest.getAssertionsWebappDaoFactory().getVClassDao(); + if (!inferred) { + vcDao = ModelAccess.on(vrequest).getBaseWebappDaoFactory().getVClassDao(); } else { vcDao = vrequest.getFullWebappDaoFactory().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 39e408a76..cabce6eba 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 @@ -17,6 +17,7 @@ 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.processEdit.EditN3Utils; @@ -200,7 +201,7 @@ public class DeletePropertyController extends FreemarkerHttpServlet { Individual object = EditConfigurationUtils.getIndividual(vreq, objectUri); if(object == null) { - WebappDaoFactory wadf = (WebappDaoFactory) vreq.getSession().getServletContext().getAttribute("webappDaoFactory"); + WebappDaoFactory wadf = ModelAccess.on(vreq.getSession().getServletContext()).getWebappDaoFactory(); object = wadf.getIndividualDao().getIndividualByURI(objectUri); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java index 51bd6b8eb..cc10a0806 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ModelAccess.java @@ -2,7 +2,7 @@ package edu.cornell.mannlib.vitro.webapp.dao; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import javax.servlet.ServletContext; @@ -24,29 +24,26 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; * *
  * VitroRequest.getAssertionsWebappDaoFactory()
- * VitroRequest.getDeductionsWebappDaoFactory()
  * VitroRequest.getFullWebappDaoFactory()
  * VitroRequest.getRDFService()
  * VitroRequest.getUnfilteredRDFService()
  * VitroRequest.getWebappDaoFactory()
  * VitroRequest.getWriteModel()
  * VitroRequest.getJenaOntModel()
- * VitroRequest.setJenaOntModel()
- * OntModelSelector.getAboxModel
- * OntModelSelector.getApplicationMetadataModel()
+ * vreq.setUnfilteredWebappDaoFactory(wadf);
+ * 
+ * OntModelSelector.getABoxModel
  * OntModelSelector.getFullModel()
  * OntModelSelector.getTBoxModel()
  * OntModelSelector.getTBoxModel(ontologyURI)
- * OntModelSelector.getUserAccountsModel()
  * VitroModelSource.getModel(URL)
  * VitroModelSource.getModel(URL, loadIfAbsent)
  * VitroModelSource.openModel(name)
  * VitroModelSource.openModelIfPresent(string)
- * ServletContext.getAttribute("assertionsWebappDaoFactory")
+ * ServletContext.getAttribute("deductionsWebappDaoFactory")
  * ServletContext.getAttribute("baseOntModelSelector")
  * ServletContext.getAttribute("jenaPersistentOntModel")
  * ServletContext.getAttribute("pelletOntModel")
- * ServletContext.getAttribute("webappDaoFactory")
  * VitroJenaModelMaker
  * VitroJenaSpecialModelMaker
  * JenaDataSourceSetupBase.getApplicationDataSource(ctx)
@@ -75,6 +72,10 @@ public class ModelAccess {
 		UNION_ABOX, UNION_TBOX, UNION_FULL
 	}
 
+	public enum FactoryID {
+		BASE, UNION
+	}
+
 	private enum Scope {
 		CONTEXT, SESSION, REQUEST
 	}
@@ -124,7 +125,9 @@ public class ModelAccess {
 
 	private final Scope scope;
 	private final ModelAccess parent;
-	private final Map modelMap = new HashMap<>();
+	private final Map modelMap = new EnumMap<>(ModelID.class);
+	private final Map factoryMap = new EnumMap<>(
+			FactoryID.class);
 
 	public ModelAccess(Scope scope, ModelAccess parent) {
 		this.scope = scope;
@@ -176,19 +179,21 @@ public class ModelAccess {
 	}
 
 	public void setOntModel(ModelID id, OntModel ontModel) {
-		String key = id.toString();
 		if (ontModel == null) {
-			modelMap.remove(key);
+			modelMap.remove(id);
 		} else {
-			modelMap.put(key, ontModel);
+			modelMap.put(id, ontModel);
 		}
 	}
 
+	public void removeOntModel(ModelID id) {
+		setOntModel(id, null);
+	}
+
 	public OntModel getOntModel(ModelID id) {
-		String key = id.toString();
-		if (modelMap.containsKey(key)) {
+		if (modelMap.containsKey(id)) {
 			log.debug("Using " + id + " model from " + scope);
-			return modelMap.get(key);
+			return modelMap.get(id);
 		} else if (parent != null) {
 			return parent.getOntModel(id);
 		} else {
@@ -197,6 +202,50 @@ public class ModelAccess {
 		}
 	}
 
+	// ----------------------------------------------------------------------
+	// 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
 	// ----------------------------------------------------------------------
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 d585ae2c3..55c2c127c 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
@@ -174,12 +174,7 @@ public class VClassGroupCache implements IndexingEventListener {
     }
 
     protected VClassGroupDao getVCGDao() {
-        WebappDaoFactory wdf = (WebappDaoFactory) context.getAttribute("webappDaoFactory");
-        if (wdf == null) {
-            log.error("Cannot get webappDaoFactory from context");
-            return null;
-        } else
-            return wdf.getVClassGroupDao();
+		return ModelAccess.on(context).getWebappDaoFactory().getVClassGroupDao();
     }
     
     public void doSynchronousRebuild(){
@@ -242,12 +237,9 @@ public class VClassGroupCache implements IndexingEventListener {
      */
     protected static void rebuildCacheUsingSolr( VClassGroupCache cache ) throws SolrServerException{                        
         long start = System.currentTimeMillis();
-        WebappDaoFactory wdFactory = (WebappDaoFactory) cache.context.getAttribute("webappDaoFactory");
-        if (wdFactory == null){ 
-            log.error("Unable to rebuild cache: could not get 'webappDaoFactory' from Servletcontext");
-            return;
-        }        
-        SolrServer solrServer = (SolrServer)cache.context.getAttribute(SolrSetup.SOLR_SERVER);
+		WebappDaoFactory wdFactory = ModelAccess.on(cache.context).getWebappDaoFactory();
+
+		SolrServer solrServer = (SolrServer)cache.context.getAttribute(SolrSetup.SOLR_SERVER);
         if( solrServer == null){
             log.error("Unable to rebuild cache: could not get solrServer from ServletContext");
             return;
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 d04f44d9a..c3872f70f 100755
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dwr/EntityDWR.java
@@ -2,10 +2,7 @@
 
 package edu.cornell.mannlib.vitro.webapp.dwr;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
@@ -18,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.WebappDaoFactory;
+import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
 
 /**
    This is a class to support Direct Web Remoting(DWR) in
@@ -31,7 +28,7 @@ public class EntityDWR {
     public EntityDWR(){
         WebContext ctx = WebContextFactory.get();
         ServletContext sc= ctx.getServletContext();
-        entityWADao = ((WebappDaoFactory)sc.getAttribute("webappDaoFactory")).getIndividualDao();
+        entityWADao =  ModelAccess.on(sc).getWebappDaoFactory().getIndividualDao();
     }
 
     /**
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 d4b9be61c..4c849338a 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/PageRoutingFilter.java
@@ -11,6 +11,7 @@ import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
@@ -21,6 +22,7 @@ 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.dao.WebappDaoFactory;
 /**
@@ -52,7 +54,9 @@ public class PageRoutingFilter implements Filter{
     @Override
     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) 
         throws IOException, ServletException {        
-        PageDao pageDao = getPageDao();        
+        ServletContext ctx = filterConfig.getServletContext();
+        
+		PageDao pageDao = ModelAccess.on(ctx).getWebappDaoFactory().getPageDao();        
         Map urlMappings = pageDao.getPageMappings();
         
         // get URL without hostname or servlet context
@@ -81,7 +85,7 @@ public class PageRoutingFilter implements Filter{
                 String controllerName = getControllerToForwardTo(req, pageUri, pageDao);            
                 log.debug(path + " is being forwarded to controller " + controllerName);
                 
-                RequestDispatcher rd = filterConfig.getServletContext().getNamedDispatcher( controllerName );
+                RequestDispatcher rd = ctx.getNamedDispatcher( controllerName );
                 if( rd == null ){
                     log.error(path + " should be forwarded to controller " + controllerName + " but there " +
                     		"is no servlet named that defined for the web application in web.xml");
@@ -91,7 +95,7 @@ public class PageRoutingFilter implements Filter{
                 rd.forward(req, response);
             }else if( "/".equals( path ) || path.isEmpty() ){
                 log.debug("url '" +path + "' is being forward to home controller" );
-                RequestDispatcher rd = filterConfig.getServletContext().getNamedDispatcher( HOME_CONTROLLER_NAME );            
+                RequestDispatcher rd = ctx.getNamedDispatcher( HOME_CONTROLLER_NAME );            
                 rd.forward(req, response);
             }else{
                 doNonDisplayPage(path,arg0,arg1,chain);
@@ -132,12 +136,6 @@ public class PageRoutingFilter implements Filter{
         return false;                
     }
     
-    protected PageDao getPageDao(){
-        WebappDaoFactory wdf = (WebappDaoFactory) 
-            filterConfig.getServletContext().getAttribute("webappDaoFactory");
-        return wdf.getPageDao();
-    }
-        
     @Override
     public void destroy() {
        //nothing to do here        
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 3ef123eb4..faa7f9ee2 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/StartupStatusDisplayFilter.java
@@ -21,7 +21,7 @@ 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.controller.VitroRequest;
+import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
 import freemarker.cache.WebappTemplateLoader;
@@ -116,8 +116,7 @@ public class StartupStatusDisplayFilter implements Filter {
 	private Object getApplicationName() {
 		String name = "";
 		try {
-			WebappDaoFactory wadf = (WebappDaoFactory) ctx
-					.getAttribute("webappDaoFactory");
+			WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory();
 			ApplicationBean app = wadf.getApplicationDao().getApplicationBean();
 			name = app.getApplicationName();
 		} catch (Exception e) {
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 f52727c27..64d554c5b 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/URLRewritingHttpServletResponse.java
@@ -8,7 +8,6 @@ import java.util.List;
 import java.util.regex.Pattern;
 
 import javax.servlet.ServletContext;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponseWrapper;
@@ -18,6 +17,7 @@ import org.apache.commons.logging.LogFactory;
 import org.openrdf.model.URI;
 import org.openrdf.model.impl.URIImpl;
 
+import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapper;
 import edu.cornell.mannlib.vitro.webapp.utils.NamespaceMapperFactory;
@@ -36,7 +36,7 @@ public class URLRewritingHttpServletResponse extends HttpServletResponseWrapper/
 	    super(response);
 		this._response = response;
 		this._context = context;
-		this.wadf = (WebappDaoFactory) context.getAttribute("webappDaoFactory");
+		this.wadf =	ModelAccess.on(context).getWebappDaoFactory();
 		this.contextPathDepth = slashPattern.split(request.getContextPath()).length-1;
 	}
 		
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/VitroRequestPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/VitroRequestPrep.java
index 821efd570..94ebb8628 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/VitroRequestPrep.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/VitroRequestPrep.java
@@ -123,15 +123,7 @@ public class VitroRequestPrep implements Filter {
         VitroRequest vreq = new VitroRequest(req);
         
         //-- setup DAO factory --//
-        WebappDaoFactory wdf = getWebappDaoFactory(vreq);
-        //TODO: get accept-language from request and set as preferred languages
-        
-        // if there is a WebappDaoFactory in the session, use it
-    	Object o = req.getSession().getAttribute("webappDaoFactory");
-    	if (o instanceof WebappDaoFactory) {
-    		wdf = (WebappDaoFactory) o;
-    		log.debug("Found a WebappDaoFactory in the session and using it for this request");
-    	}
+        WebappDaoFactory wdf = ModelAccess.on(vreq.getSession()).getWebappDaoFactory();
     	
     	// Set up the DisplayModel with language filtering, if appropriate.
 		ConfigurationProperties props = ConfigurationProperties.getBean(req);
@@ -160,7 +152,7 @@ public class VitroRequestPrep implements Filter {
 		HideFromDisplayByPolicyFilter filter = new HideFromDisplayByPolicyFilter(
 				RequestIdentifiers.getIdBundleForRequest(req),
 				ServletPolicyList.getPolicies(_context));
-		vreq.setWebappDaoFactory(new WebappDaoFactoryFiltering(wdf, filter));
+		ModelAccess.on(vreq).setWebappDaoFactory(new WebappDaoFactoryFiltering(wdf, filter));
 		
         // support for Dataset interface if using Jena in-memory model
         if (vreq.getDataset() == null) {
@@ -181,13 +173,7 @@ public class VitroRequestPrep implements Filter {
         chain.doFilter(req, response);
     }
 
-	private WebappDaoFactory getWebappDaoFactory(VitroRequest vreq){
-    	WebappDaoFactory webappDaoFactory = vreq.getWebappDaoFactory();
-        return (webappDaoFactory != null) ? webappDaoFactory :
-        	(WebappDaoFactory) _context.getAttribute("webappDaoFactory");
-    }
-
-    private VitroFilters getFiltersFromContextFilterFactory( HttpServletRequest request, WebappDaoFactory wdf){
+	private VitroFilters getFiltersFromContextFilterFactory( HttpServletRequest request, WebappDaoFactory wdf){
         FilterFactory ff = (FilterFactory)_context.getAttribute("FilterFactory");
         if( ff == null ){ 
             return null;
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java
index 6f951e518..ab2916b46 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java
@@ -115,6 +115,7 @@ public class WebappDaoFactorySDBPrep implements Filter {
 
 		OntModelSelector oms = ModelAccess.on(_ctx).getUnionOntModelSelector();
 		wadf = new WebappDaoFactorySDB(rdfService, oms, config);
+		ModelAccess.on(vreq).setWebappDaoFactory(wadf);
 	    
 		OntModelSelector baseOms = ModelAccess.on(_ctx).getBaseOntModelSelector();
 		WebappDaoFactory assertions = new WebappDaoFactorySDB(
@@ -122,9 +123,7 @@ public class WebappDaoFactorySDBPrep implements Filter {
 		
 	    vreq.setRDFService(rdfService);
 	    vreq.setUnfilteredRDFService(unfilteredRDFService);
-		vreq.setWebappDaoFactory(wadf);
-		vreq.setAssertionsWebappDaoFactory(assertions);
-		vreq.setFullWebappDaoFactory(wadf);
+		ModelAccess.on(vreq).setBaseWebappDaoFactory(assertions);
         vreq.setUnfilteredWebappDaoFactory(new WebappDaoFactorySDB(
                 rdfService, ModelAccess.on(_ctx).getUnionOntModelSelector()));
 		vreq.setDataset(dataset);
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySparqlPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySparqlPrep.java
index 2d3336072..400f32169 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySparqlPrep.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySparqlPrep.java
@@ -146,25 +146,17 @@ public class WebappDaoFactorySparqlPrep implements Filter {
 				
 				Model m = ModelFactory.createModelForGraph(g);
 				OntModel om = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, m);
-								
-				dataset = DatasetFactory.create(new SparqlDatasetGraph(endpointURI));
-				
-				//DataSource datasource = DatasetFactory.create();
-				//datasource.addNamedModel("fake:fake", m);
-				//dataset = datasource;			
-				
-				vreq.setAssertionsWebappDaoFactory(wadf);
-
 				ModelAccess.on(vreq).setOntModel(ModelID.UNION_ABOX, om);
 				ModelAccess.on(vreq).setOntModel(ModelID.UNION_TBOX, om);
 				ModelAccess.on(vreq).setOntModel(ModelID.UNION_FULL, om);
+
 				OntModelSelector oms = ModelAccess.on(vreq).getOntModelSelector();
-				
 				wadf = new WebappDaoFactoryJena(oms, config);
-				//wadf = new WebappDaoFactorySDB(oms, dataset, config);
-				vreq.setFullWebappDaoFactory(wadf);
+				ModelAccess.on(vreq).setWebappDaoFactory(wadf);
+				ModelAccess.on(vreq).setBaseWebappDaoFactory(wadf);
 				vreq.setUnfilteredWebappDaoFactory(wadf);
-				vreq.setWebappDaoFactory(wadf);
+
+				dataset = DatasetFactory.create(new SparqlDatasetGraph(endpointURI));
 				vreq.setDataset(dataset);
 			}
 		} catch (Throwable t) {
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringUtils.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringUtils.java
index aae04c1b5..a1e2e879d 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringUtils.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringUtils.java
@@ -13,8 +13,6 @@ import com.hp.hpl.jena.ontology.OntModel;
 import com.hp.hpl.jena.ontology.OntModelSpec;
 import com.hp.hpl.jena.rdf.model.ModelFactory;
 
-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.RDFServiceGraph;
 import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
 
@@ -44,22 +42,6 @@ public class LanguageFilteringUtils {
 
 	}
 
-	/**
-	 * Make a new OntModelSelector that containing a new display model and all
-	 * of the other models in the original OntModelSelector.
-	 */
-	public static OntModelSelector replaceDisplayModelInSelector(
-			OntModelSelector oldOms, OntModel newDisplayModel) {
-		OntModelSelectorImpl newOms = new OntModelSelectorImpl();
-		newOms.setABoxModel(oldOms.getABoxModel());
-		newOms.setApplicationMetadataModel(oldOms.getApplicationMetadataModel());
-		newOms.setDisplayModel(newDisplayModel);
-		newOms.setFullModel(oldOms.getFullModel());
-		newOms.setTBoxModel(oldOms.getTBoxModel());
-		newOms.setUserAccountsModel(oldOms.getUserAccountsModel());
-		return newOms;
-	}
-
 	/**
 	 * Add a Language Filtering layer to an OntModel by treating it as an RDFService.
 	 */
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java
index 7d6de3e01..d742a3301 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java
@@ -155,7 +155,7 @@ public class SolrSetup implements javax.servlet.ServletContextListener{
             // This is where the builder gets the list of places to try to
             // get objects to index. It is filtered so that non-public text
             // does not get into the search index.
-            WebappDaoFactory wadf = (WebappDaoFactory) context.getAttribute("webappDaoFactory");
+			WebappDaoFactory wadf = ModelAccess.on(context).getWebappDaoFactory();
             VitroFilters vf = VitroFilterUtils.getPublicFilter(context);
             wadf = new WebappDaoFactoryFiltering(wadf, vf);            
             
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 6c2459746..fcf9d4182 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
@@ -3,7 +3,6 @@
 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.dao.jena.WebappDaoFactorySDB.SDBDatasetMode.INFERENCES_ONLY;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -28,6 +27,7 @@ import com.hp.hpl.jena.util.ResourceUtils;
 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.ModelAccess.ModelID;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig;
@@ -110,15 +110,11 @@ public class ContentModelSetup extends JenaDataSourceSetupBase
         
         OntModelSelector baseOms = models.getBaseOntModelSelector();
         WebappDaoFactory baseWadf = new WebappDaoFactorySDB(rdfService, baseOms, config, ASSERTIONS_ONLY);
-        ctx.setAttribute("assertionsWebappDaoFactory",baseWadf);
-        
-        OntModelSelector inferenceOms = models.getInferenceOntModelSelector();
-        WebappDaoFactory infWadf = new WebappDaoFactorySDB(rdfService, inferenceOms, config, INFERENCES_ONLY);
-        ctx.setAttribute("deductionsWebappDaoFactory", infWadf);
+        ModelAccess.on(ctx).setBaseWebappDaoFactory(baseWadf);
         
         OntModelSelector unionOms = models.getUnionOntModelSelector();
         WebappDaoFactory wadf = new WebappDaoFactorySDB(rdfService, unionOms, config);
-        ctx.setAttribute("webappDaoFactory",wadf);
+        ModelAccess.on(ctx).setWebappDaoFactory(FactoryID.UNION, wadf);
 
         log.info("Model makers set up");
         
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 1f7cd4629..c495496d7 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
@@ -11,6 +11,7 @@ import java.util.Iterator;
 import java.util.Random;
 import java.util.Set;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
@@ -43,18 +44,20 @@ public class RunSparqlConstructs implements ServletContextListener {
 	
 	public void contextInitialized(ServletContextEvent sce) {
 		try {
-			WebappDaoFactory wadf = (WebappDaoFactory) sce.getServletContext().getAttribute("webappDaoFactory");
+			ServletContext ctx = sce.getServletContext();
+			WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory();
+
 			String namespace = (wadf != null && wadf.getDefaultNamespace() != null) 
 				? wadf.getDefaultNamespace() : DEFAULT_DEFAULT_NAMESPACE;
 			
-		    OntModel baseOntModel = ModelAccess.on(sce.getServletContext()).getBaseOntModel();
+		    OntModel baseOntModel = ModelAccess.on(ctx).getBaseOntModel();
 			Model anonModel = ModelFactory.createDefaultModel();
 			Model namedModel = ModelFactory.createDefaultModel();
 			
-			Set resourcePaths = sce.getServletContext().getResourcePaths(SPARQL_DIR);
+			Set resourcePaths = ctx.getResourcePaths(SPARQL_DIR);
 			for (String path : resourcePaths) {
 				log.debug("Attempting to execute SPARQL at " + path);
-				File file = new File(sce.getServletContext().getRealPath(path));			
+				File file = new File(ctx.getRealPath(path));			
 				try {
 					BufferedReader reader = new BufferedReader(new FileReader(file));
 					StringBuffer fileContents = new StringBuffer();
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 d907ed51f..b84913c54 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
@@ -23,6 +23,7 @@ import com.hp.hpl.jena.vocabulary.OWL;
 
 import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
 import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
+import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
 import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceDataset;
 import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
@@ -55,7 +56,7 @@ public class SimpleReasonerSetup implements ServletContextListener {
             OntModelSelector inferencesOms = ModelAccess.on(ctx).getInferenceOntModelSelector();
             OntModelSelector unionOms = ModelAccess.on(ctx).getUnionOntModelSelector();
 
-            WebappDaoFactoryJena wadf = (WebappDaoFactoryJena) sce.getServletContext().getAttribute("webappDaoFactory");
+			WebappDaoFactoryJena wadf = (WebappDaoFactoryJena) ModelAccess.on(ctx).getWebappDaoFactory();
             
             if (!assertionsOms.getTBoxModel().getProfile().NAMESPACE().equals(OWL.NAMESPACE.getNameSpace())) {        
                 log.error("Not connecting Pellet reasoner - the TBox assertions model is not an OWL model");
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 286650b1c..28fa02f5e 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
@@ -99,7 +99,7 @@ public class UpdateKnowledgeBase implements ServletContextListener {
 			settings.setErrorLogFile(ctx.getRealPath(errorLogFileName));
 			settings.setAddedDataFile(ctx.getRealPath(ADDED_DATA_FILE));
 			settings.setRemovedDataFile(ctx.getRealPath(REMOVED_DATA_FILE));
-			WebappDaoFactory wadf = (WebappDaoFactory) ctx.getAttribute("webappDaoFactory");
+			WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory();
 			settings.setDefaultNamespace(wadf.getDefaultNamespace());
 			settings.setAssertionOntModelSelector(ModelAccess.on(ctx).getBaseOntModelSelector());
 			settings.setInferenceOntModelSelector(ModelAccess.on(ctx).getInferenceOntModelSelector());
diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdatePermissionSetUris.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdatePermissionSetUris.java
index f0fffdc7b..ec03f70ff 100644
--- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdatePermissionSetUris.java
+++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdatePermissionSetUris.java
@@ -22,6 +22,7 @@ import javax.servlet.ServletContextListener;
 
 import edu.cornell.mannlib.vitro.webapp.beans.UserAccount;
 import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties;
+import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess;
 import edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDao;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
@@ -99,8 +100,7 @@ public class UpdatePermissionSetUris implements ServletContextListener {
 			this.ctx = ctx;
 			this.stats = stats;
 
-			WebappDaoFactory wadf = (WebappDaoFactory) ctx
-					.getAttribute("webappDaoFactory");
+			WebappDaoFactory wadf = ModelAccess.on(ctx).getWebappDaoFactory();
 			userAccountsDao = wadf.getUserAccountsDao();
 		}
 
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 fb32a9728..8d6f38420 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
@@ -29,6 +29,7 @@ import edu.cornell.mannlib.vitro.webapp.auth.permissions.PermissionRegistry;
 import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.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?
@@ -79,7 +80,7 @@ public class HasPermissionFactoryTest extends AbstractTestClass {
 		wdf.setUserAccountsDao(uaDao);
 
 		ctx = new ServletContextStub();
-		ctx.setAttribute("webappDaoFactory", wdf);
+		ModelAccess.on(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 2c08c0e16..2ab4e0fff 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
@@ -19,6 +19,7 @@ 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?
@@ -56,7 +57,7 @@ public class IsRootUserFactoryTest extends AbstractTestClass {
 		wdf.setUserAccountsDao(uaDao);
 
 		ctx = new ServletContextStub();
-		ctx.setAttribute("webappDaoFactory", wdf);
+		ModelAccess.on(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 5a5156b9e..e9c7d59fb 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
@@ -19,6 +19,7 @@ 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.
@@ -46,7 +47,7 @@ public class IsUserFactoryTest extends AbstractTestClass {
 		wdf.setUserAccountsDao(uaDao);
 
 		ctx = new ServletContextStub();
-		ctx.setAttribute("webappDaoFactory", wdf);
+		ModelAccess.on(ctx).setWebappDaoFactory(wdf);
 
 		session = new HttpSessionStub();
 		session.setServletContext(ctx);
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 10e937af9..f91f71b37 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
@@ -47,6 +47,7 @@ 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;
 
 /**
  */
@@ -147,7 +148,7 @@ public class AuthenticateTest extends AbstractTestClass {
 		webappDaoFactory.setIndividualDao(individualDao);
 
 		servletContext = new ServletContextStub();
-		servletContext.setAttribute("webappDaoFactory", webappDaoFactory);
+		ModelAccess.on(servletContext).setWebappDaoFactory(webappDaoFactory);
 		servletContext.setAttribute(AuthenticatorStub.FACTORY_ATTRIBUTE_NAME,
 				authenticatorFactory);
 
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 ee63e2845..3b6e103be 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
@@ -28,6 +28,7 @@ import stubs.javax.servlet.http.HttpSessionStub;
 import stubs.org.apache.solr.client.solrj.SolrServerStub;
 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.search.solr.SolrSetup;
 
 /**
@@ -106,8 +107,7 @@ public class JsonServletTest extends AbstractTestClass {
 		resp = new HttpServletResponseStub();
 
 		wadf = new WebappDaoFactoryStub();
-		req.setAttribute("webappDaoFactory", wadf);
-		ctx.setAttribute("webappDaoFactory", wadf);
+		ModelAccess.on(ctx).setWebappDaoFactory(wadf);
 
 		vcDao = new VClassDaoStub();
 		wadf.setVClassDao(vcDao);
diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/PageDataGetterUtilsTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/PageDataGetterUtilsTest.java
index 7a97f2c99..a6745102c 100644
--- a/webapp/test/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/PageDataGetterUtilsTest.java
+++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/PageDataGetterUtilsTest.java
@@ -18,6 +18,7 @@ import com.hp.hpl.jena.rdf.model.impl.RDFDefaultErrorHandler;
 
 import edu.cornell.mannlib.vitro.testing.AbstractTestClass;
 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.SimpleOntModelSelector;
 import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
@@ -48,7 +49,7 @@ public class PageDataGetterUtilsTest extends AbstractTestClass{
     @Test
     public void testGetPageDataGetterObjects() throws Exception{
         VitroRequest vreq = new VitroRequest( new HttpServletRequestStub() );
-        vreq.setWebappDaoFactory(wdf);
+        ModelAccess.on(vreq).setWebappDaoFactory(wdf);
         
         List pdgList = PageDataGetterUtils.getPageDataGetterObjects(vreq, pageURI);
         Assert.assertNotNull(pdgList);
@@ -58,7 +59,7 @@ public class PageDataGetterUtilsTest extends AbstractTestClass{
     @Test
     public void testGetNonPageDataGetterObjects() throws Exception{
         VitroRequest vreq = new VitroRequest( new HttpServletRequestStub() );
-        vreq.setWebappDaoFactory(wdf);
+        ModelAccess.on(vreq).setWebappDaoFactory(wdf);
         
         List pdgList = PageDataGetterUtils.getPageDataGetterObjects(vreq, pageURI_2);
         Assert.assertNotNull(pdgList);
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 1ab3f53f2..2ae768482 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
@@ -25,6 +25,10 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
+import com.hp.hpl.jena.ontology.OntModel;
+import com.hp.hpl.jena.ontology.OntModelSpec;
+import com.hp.hpl.jena.rdf.model.ModelFactory;
+
 import stubs.edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDaoStub;
 import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub;
 import stubs.freemarker.cache.TemplateLoaderStub;
@@ -36,6 +40,8 @@ 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.ModelAccess.ModelID;
 import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
 import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.InvalidConfigurationException;
 import edu.cornell.mannlib.vitro.webapp.web.templatemodels.customlistview.PropertyListConfig;
@@ -123,7 +129,7 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
 		hreq.setSession(session);
 
 		vreq = new VitroRequest(hreq);
-		vreq.setWebappDaoFactory(wadf);
+		ModelAccess.on(vreq).setWebappDaoFactory(wadf);
 
 		subject = new IndividualImpl();
 
@@ -273,6 +279,7 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
 	@Test
 	public void constructQueryNodeMissing()
 			throws InvalidConfigurationException {
+		ModelAccess.on(vreq).setOntModel(ModelID.UNION_FULL, emptyOntModel());
 		op = buildOperation("constructQueryMissing");
 		optm = new NonCollatingOPTM(op, subject, vreq, true);
 		// Not an error.
@@ -281,6 +288,7 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
 	@Test
 	public void constructQueryMultipleValues()
 			throws InvalidConfigurationException {
+		ModelAccess.on(vreq).setOntModel(ModelID.UNION_FULL, emptyOntModel());
 		op = buildOperation("constructQueryMultiple");
 		optm = new NonCollatingOPTM(op, subject, vreq, true);
 		assertConstructQueries("multiple construct queries", "ONE", "TWO",
@@ -367,6 +375,10 @@ public class ObjectPropertyTemplateModel_PropertyListConfigTest extends
 	// Helper methods
 	// ----------------------------------------------------------------------
 
+	private OntModel emptyOntModel() {
+		return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
+	}
+
 	/**
 	 * Sets up an operation with name "foobar" and adds it to the
 	 * ObjectPropertyDaoStub.
diff --git a/webapp/test/stubs/javax/servlet/http/HttpSessionStub.java b/webapp/test/stubs/javax/servlet/http/HttpSessionStub.java
index af27594d7..649e2c1e4 100644
--- a/webapp/test/stubs/javax/servlet/http/HttpSessionStub.java
+++ b/webapp/test/stubs/javax/servlet/http/HttpSessionStub.java
@@ -12,10 +12,11 @@ import javax.servlet.http.HttpSession;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import stubs.javax.servlet.ServletContextStub;
+
 /**
  * A simple stand-in for the HttpSession, for use in unit tests.
  */
-@SuppressWarnings("deprecation")
 public class HttpSessionStub implements HttpSession {
 	private static final Log log = LogFactory.getLog(HttpSessionStub.class);
 
@@ -49,7 +50,11 @@ public class HttpSessionStub implements HttpSession {
 
 	@Override
 	public ServletContext getServletContext() {
-		return this.context;
+		if (this.context == null) {
+			return new ServletContextStub();
+		} else {
+			return this.context;
+		}
 	}
 
 	@Override
@@ -149,6 +154,7 @@ public class HttpSessionStub implements HttpSession {
 				"HttpSessionStub.putValue() not implemented.");
 	}
 
+	@Override
 	public void removeValue(String arg0) {
 		throw new RuntimeException(
 				"HttpSessionStub.removeValue() not implemented.");