diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/ActiveIdentifierBundleFactories.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/ActiveIdentifierBundleFactories.java index 086326c43..02e9b927e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/ActiveIdentifierBundleFactories.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/ActiveIdentifierBundleFactories.java @@ -8,7 +8,8 @@ import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; + +import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** * Keep a list of the active IdentifierBundleFactories in the context. @@ -50,14 +51,15 @@ public class ActiveIdentifierBundleFactories { getActiveFactories(ctx).addFactory(factory); } - + /** - * Just for diagnostics. Don't expose the factories themselves, only their names. + * Just for diagnostics. Don't expose the factories themselves, only their + * names. */ public static List getFactoryNames(ServletContext ctx) { List names = new ArrayList(); ActiveIdentifierBundleFactories actFact = getActiveFactories(ctx); - for (IdentifierBundleFactory factory: actFact.factories) { + for (IdentifierBundleFactory factory : actFact.factories) { names.add(factory.toString()); } return names; @@ -72,10 +74,28 @@ public class ActiveIdentifierBundleFactories { * request. */ static IdentifierBundle getIdentifierBundle(HttpServletRequest request) { - HttpSession session = request.getSession(); - ServletContext ctx = session.getServletContext(); - return getActiveFactories(ctx).getIdentifierBundle(request, session, - ctx); + return getActiveFactories(request).getBundleForRequest(request); + } + + /** + * Get the Identifiers that would be created if this user were to log in. + */ + public static IdentifierBundle getUserIdentifierBundle( + HttpServletRequest request, UserAccount userAccount) { + return getActiveFactories(request).getBundleForUser(userAccount); + } + + /** + * Get the singleton instance from the servlet context. If there isn't one, + * create one. This never returns null. + */ + private static ActiveIdentifierBundleFactories getActiveFactories( + HttpServletRequest req) { + if (req == null) { + throw new NullPointerException("req may not be null."); + } + + return getActiveFactories(req.getSession().getServletContext()); } /** @@ -118,15 +138,26 @@ public class ActiveIdentifierBundleFactories { * Run through the active factories and get all Identifiers for this * request. */ - private IdentifierBundle getIdentifierBundle(HttpServletRequest request, - HttpSession session, ServletContext ctx) { + private IdentifierBundle getBundleForRequest(HttpServletRequest request) { IdentifierBundle ib = new ArrayIdentifierBundle(); for (IdentifierBundleFactory ibf : factories) { - IdentifierBundle obj = ibf.getIdentifierBundle(request); - if (obj != null) { - ib.addAll(obj); + ib.addAll(ibf.getIdentifierBundle(request)); + } + return ib; + } + + /** + * Get all Identifiers that would be created if this User logged in. + */ + private IdentifierBundle getBundleForUser(UserAccount userAccount) { + IdentifierBundle ib = new ArrayIdentifierBundle(); + for (IdentifierBundleFactory ibf : factories) { + if (ibf instanceof UserBasedIdentifierBundleFactory) { + UserBasedIdentifierBundleFactory ubibf = (UserBasedIdentifierBundleFactory) ibf; + ib.addAll(ubibf.getIdentifierBundleForUser(userAccount)); } } return ib; } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/UserBasedIdentifierBundleFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/UserBasedIdentifierBundleFactory.java new file mode 100644 index 000000000..869bdebad --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/UserBasedIdentifierBundleFactory.java @@ -0,0 +1,18 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.identifier; + +import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; + +/** + * Creates an IdentifierBundle based only on the characteristics of the current + * user, without considering other aspects of the current request. + */ +public interface UserBasedIdentifierBundleFactory extends + IdentifierBundleFactory { + /** + * Get the IdentifierBundle for this user. If user is null, return an empty + * bundle. Never returns null. + */ + public IdentifierBundle getIdentifierBundleForUser(UserAccount user); +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseUserBasedIdentifierBundleFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseUserBasedIdentifierBundleFactory.java new file mode 100644 index 000000000..2fafd49de --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/BaseUserBasedIdentifierBundleFactory.java @@ -0,0 +1,32 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.identifier.factory; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +import edu.cornell.mannlib.vedit.beans.LoginStatusBean; +import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle; +import edu.cornell.mannlib.vitro.webapp.auth.identifier.UserBasedIdentifierBundleFactory; +import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; + +/** + * Some fields and methods that are helpful to IdentifierBundleFactory classes. + */ +public abstract class BaseUserBasedIdentifierBundleFactory extends + BaseIdentifierBundleFactory implements UserBasedIdentifierBundleFactory { + + public BaseUserBasedIdentifierBundleFactory(ServletContext ctx) { + super(ctx); + } + + @Override + public final IdentifierBundle getIdentifierBundle(HttpServletRequest request) { + return getIdentifierBundleForUser(LoginStatusBean + .getCurrentUser(request)); + } + + @Override + public abstract IdentifierBundle getIdentifierBundleForUser(UserAccount user); + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactory.java index 913132d44..af18494c8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionFactory.java @@ -9,12 +9,10 @@ import java.util.List; import java.util.Set; 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.vedit.beans.LoginStatusBean; 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.HasPermission; @@ -26,7 +24,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** * Figure out what Permissions the user is entitled to have. */ -public class HasPermissionFactory extends BaseIdentifierBundleFactory { +public class HasPermissionFactory extends BaseUserBasedIdentifierBundleFactory { private static final Log log = LogFactory .getLog(HasPermissionFactory.class); @@ -35,8 +33,7 @@ public class HasPermissionFactory extends BaseIdentifierBundleFactory { } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { - UserAccount user = LoginStatusBean.getCurrentUser(req); + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { if (user == null) { return createPublicPermissions(); } else { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionSetFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionSetFactory.java index 4d4b397d0..8e3ed9db6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionSetFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasPermissionSetFactory.java @@ -3,12 +3,10 @@ package edu.cornell.mannlib.vitro.webapp.auth.identifier.factory; 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.vedit.beans.LoginStatusBean; 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.HasPermissionSet; @@ -18,7 +16,8 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** * Figure out what PermissionSets the user is entitled to have. */ -public class HasPermissionSetFactory extends BaseIdentifierBundleFactory { +public class HasPermissionSetFactory extends + BaseUserBasedIdentifierBundleFactory { private static final Log log = LogFactory .getLog(HasPermissionFactory.class); @@ -27,12 +26,10 @@ public class HasPermissionSetFactory extends BaseIdentifierBundleFactory { } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { IdentifierBundle ids = new ArrayIdentifierBundle(); - UserAccount user = LoginStatusBean.getCurrentUser(req); if (user != null) { - - for (String psUri: user.getPermissionSetUris()) { + for (String psUri : user.getPermissionSetUris()) { PermissionSet ps = uaDao.getPermissionSetByUri(psUri); if (ps != null) { ids.add(new HasPermissionSet(ps)); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProfileOrIsBlacklistedFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProfileOrIsBlacklistedFactory.java index b4280960b..4fa966c3c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProfileOrIsBlacklistedFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProfileOrIsBlacklistedFactory.java @@ -6,12 +6,10 @@ import java.util.ArrayList; import java.util.Collection; 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.vedit.beans.LoginStatusBean; import edu.cornell.mannlib.vitro.webapp.auth.identifier.ArrayIdentifierBundle; import edu.cornell.mannlib.vitro.webapp.auth.identifier.Identifier; import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle; @@ -26,7 +24,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; * create either an IsBlacklisted or HasAssociatedIndividual for each one. */ public class HasProfileOrIsBlacklistedFactory extends - BaseIdentifierBundleFactory { + BaseUserBasedIdentifierBundleFactory { private static final Log log = LogFactory .getLog(HasProfileOrIsBlacklistedFactory.class); @@ -35,10 +33,10 @@ public class HasProfileOrIsBlacklistedFactory extends } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { ArrayIdentifierBundle ids = new ArrayIdentifierBundle(); - for (Individual ind : getAssociatedIndividuals(req)) { + for (Individual ind : getAssociatedIndividuals(user)) { // If they are blacklisted, this factory will return an identifier Identifier id = IsBlacklisted.getInstance(ind, ctx); if (id != null) { @@ -54,17 +52,15 @@ public class HasProfileOrIsBlacklistedFactory extends /** * Get all Individuals associated with the current user as SELF. */ - private Collection getAssociatedIndividuals( - HttpServletRequest req) { + private Collection getAssociatedIndividuals(UserAccount user) { Collection individuals = new ArrayList(); - UserAccount user = LoginStatusBean.getCurrentUser(req); if (user == null) { log.debug("No Associated Individuals: not logged in."); return individuals; } - SelfEditingConfiguration sec = SelfEditingConfiguration.getBean(req); + SelfEditingConfiguration sec = SelfEditingConfiguration.getBean(ctx); individuals.addAll(sec.getAssociatedIndividuals(indDao, user)); return individuals; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProxyEditingRightsFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProxyEditingRightsFactory.java index 905dfccac..03ad69ab8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProxyEditingRightsFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/HasProxyEditingRightsFactory.java @@ -3,9 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.auth.identifier.factory; import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import edu.cornell.mannlib.vedit.beans.LoginStatusBean; 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.HasProxyEditingRights; @@ -14,17 +12,17 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** * Find out what Profiles the User can edit through proxy. */ -public class HasProxyEditingRightsFactory extends BaseIdentifierBundleFactory { +public class HasProxyEditingRightsFactory extends + BaseUserBasedIdentifierBundleFactory { public HasProxyEditingRightsFactory(ServletContext ctx) { super(ctx); } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { ArrayIdentifierBundle ids = new ArrayIdentifierBundle(); - UserAccount user = LoginStatusBean.getCurrentUser(req); if (user != null) { for (String proxiedUri : user.getProxiedIndividualUris()) { ids.add(new HasProxyEditingRights(proxiedUri)); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactory.java index 2b0dfa455..44418266f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsRootUserFactory.java @@ -3,9 +3,7 @@ package edu.cornell.mannlib.vitro.webapp.auth.identifier.factory; import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import edu.cornell.mannlib.vedit.beans.LoginStatusBean; 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; @@ -14,15 +12,14 @@ import edu.cornell.mannlib.vitro.webapp.beans.UserAccount; /** * If the user is logged in as a Root User, create an identifier. */ -public class IsRootUserFactory extends BaseIdentifierBundleFactory { +public class IsRootUserFactory extends BaseUserBasedIdentifierBundleFactory { public IsRootUserFactory(ServletContext ctx) { super(ctx); } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { - UserAccount user = LoginStatusBean.getCurrentUser(req); + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { if ((user != null) && user.isRootUser()) { return new ArrayIdentifierBundle(IsRootUser.INSTANCE); } else { @@ -31,4 +28,3 @@ public class IsRootUserFactory extends BaseIdentifierBundleFactory { } } - diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactory.java index 825021eab..ba0c44943 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactory.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/identifier/factory/IsUserFactory.java @@ -3,29 +3,27 @@ package edu.cornell.mannlib.vitro.webapp.auth.identifier.factory; import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import edu.cornell.mannlib.vedit.beans.LoginStatusBean; 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; /** * If the user is logged in, create an Identifier. */ -public class IsUserFactory extends BaseIdentifierBundleFactory { +public class IsUserFactory extends BaseUserBasedIdentifierBundleFactory { public IsUserFactory(ServletContext ctx) { super(ctx); } @Override - public IdentifierBundle getIdentifierBundle(HttpServletRequest req) { - LoginStatusBean bean = LoginStatusBean.getBean(req); - if (bean.isLoggedIn()) { - return new ArrayIdentifierBundle(new IsUser(bean.getUserURI())); - } else { + public IdentifierBundle getIdentifierBundleForUser(UserAccount user) { + if (user == null) { return new ArrayIdentifierBundle(); + } else { + return new ArrayIdentifierBundle(new IsUser(user.getUri())); } } 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 9d20003dd..5a5156b9e 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 @@ -7,6 +7,7 @@ import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; +import stubs.edu.cornell.mannlib.vitro.webapp.dao.UserAccountsDaoStub; import stubs.edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryStub; import stubs.javax.servlet.ServletContextStub; import stubs.javax.servlet.http.HttpServletRequestStub; @@ -17,6 +18,7 @@ import edu.cornell.mannlib.vitro.testing.AbstractTestClass; 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; /** * The simplest of the IdentifierBundleFactory classes. @@ -25,6 +27,7 @@ public class IsUserFactoryTest extends AbstractTestClass { private static final String USER_URI = "http://userUri"; private WebappDaoFactoryStub wdf; + private UserAccountsDaoStub uaDao; private ServletContextStub ctx; private HttpSessionStub session; @@ -37,7 +40,10 @@ public class IsUserFactoryTest extends AbstractTestClass { @Before public void setup() { + uaDao = new UserAccountsDaoStub(); + wdf = new WebappDaoFactoryStub(); + wdf.setUserAccountsDao(uaDao); ctx = new ServletContextStub(); ctx.setAttribute("webappDaoFactory", wdf); @@ -63,6 +69,10 @@ 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); expectedIds = new ArrayIdentifierBundle(new IsUser(USER_URI)); actualIds = factory.getIdentifierBundle(req);