NIHVIVO-2211 Replace ServletIdentifierBundleFactory with ActiveIdentifierBundleFactories and RequestIdentifiers.
This commit is contained in:
parent
401960e5d4
commit
90a508808e
4 changed files with 181 additions and 144 deletions
|
@ -11,24 +11,15 @@ import javax.servlet.ServletContext;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import javax.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundleFactory;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.identifier.ServletIdentifierBundleFactory;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyList;
|
import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyList;
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.RequestPolicyList;
|
import edu.cornell.mannlib.vitro.webapp.auth.policy.RequestPolicyList;
|
||||||
import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
|
import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup an IdentifierBundle and PolicyList for the request and put it in the request scope.
|
* Setup a PolicyList for the request and put it in the request scope.
|
||||||
*
|
*
|
||||||
* It expects to get the IdentifierBundleFactory from ServletIdentifierBundleFactory and
|
* It expects to get the PolicyList from ServletPolicyList;
|
||||||
* PolicyList from ServletPolicyList;
|
|
||||||
*
|
*
|
||||||
* @author bdc34
|
* @author bdc34
|
||||||
*
|
*
|
||||||
|
@ -36,30 +27,15 @@ import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList;
|
||||||
public class AuthSetupForRequest implements Filter {
|
public class AuthSetupForRequest implements Filter {
|
||||||
ServletContext context;
|
ServletContext context;
|
||||||
|
|
||||||
public void init(FilterConfig filterConfig) throws ServletException {
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
context = filterConfig.getServletContext();
|
context = filterConfig.getServletContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest,
|
||||||
//get a factory that will convert Requests into Identifiers
|
ServletResponse servletResponse, FilterChain filterChain)
|
||||||
IdentifierBundleFactory idbf = ServletIdentifierBundleFactory.getIdentifierBundleFactory(context);
|
throws IOException, ServletException {
|
||||||
|
|
||||||
//try to get the session
|
|
||||||
HttpSession session = null;
|
|
||||||
if( servletRequest instanceof HttpServletRequest)
|
|
||||||
session = ((HttpServletRequest)servletRequest).getSession(false);
|
|
||||||
|
|
||||||
//get Identifiers and stick in Request scope
|
|
||||||
try{
|
|
||||||
if( idbf != null ){
|
|
||||||
IdentifierBundle ib = idbf.getIdentifierBundle(servletRequest, session, context);
|
|
||||||
servletRequest.setAttribute(IDENTIFIER_BUNDLE, ib);
|
|
||||||
}
|
|
||||||
}catch(RuntimeException rx){
|
|
||||||
log.warn("could not get Identifier Bundle",rx);
|
|
||||||
}
|
|
||||||
|
|
||||||
//get the policies that are in effect for the context and add to Request Scope
|
//get the policies that are in effect for the context and add to Request Scope
|
||||||
PolicyList plist = ServletPolicyList.getPolicies(context);
|
PolicyList plist = ServletPolicyList.getPolicies(context);
|
||||||
servletRequest.setAttribute(RequestPolicyList.POLICY_LIST , plist);
|
servletRequest.setAttribute(RequestPolicyList.POLICY_LIST , plist);
|
||||||
|
@ -67,29 +43,6 @@ public class AuthSetupForRequest implements Filter {
|
||||||
filterChain.doFilter(servletRequest, servletResponse);
|
filterChain.doFilter(servletRequest, servletResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() { }
|
@Override
|
||||||
|
public void destroy() { /* Nothing to destroy */ }
|
||||||
private static final Log log = LogFactory.getLog(AuthSetupForRequest.class);
|
|
||||||
private static final String IDENTIFIER_BUNDLE = "IdentifierBundle";
|
|
||||||
|
|
||||||
/* ************ static utility methods ********************* */
|
|
||||||
public static IdentifierBundle getIdentifierBundle(HttpServletRequest req){
|
|
||||||
if( req != null )
|
|
||||||
return (IdentifierBundle)req.getAttribute(IDENTIFIER_BUNDLE);
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PolicyList getPolicyList( HttpServletRequest req){
|
|
||||||
if( req != null ){
|
|
||||||
HttpSession sess = req.getSession(false);
|
|
||||||
if( sess != null ){
|
|
||||||
return (PolicyList)sess.getAttribute(RequestPolicyList.POLICY_LIST);
|
|
||||||
}else{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.auth.identifier;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
import javax.servlet.ServletContextEvent;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keep a list of the active IdentifierBundleFactories in the context.
|
||||||
|
*/
|
||||||
|
public class ActiveIdentifierBundleFactories {
|
||||||
|
private static final String ATTRIBUTE_ACTIVE_FACTORIES = ActiveIdentifierBundleFactories.class
|
||||||
|
.getName();
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// static methods
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new IdentifierBundleFactory to the list.
|
||||||
|
*/
|
||||||
|
public static void addFactory(ServletContextEvent sce,
|
||||||
|
IdentifierBundleFactory factory) {
|
||||||
|
if (sce == null) {
|
||||||
|
throw new NullPointerException("sce may not be null.");
|
||||||
|
}
|
||||||
|
if (factory == null) {
|
||||||
|
throw new NullPointerException("factory may not be null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
addFactory(sce.getServletContext(), factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new IdentifierBundleFactory to the list.
|
||||||
|
*/
|
||||||
|
public static void addFactory(ServletContext ctx,
|
||||||
|
IdentifierBundleFactory factory) {
|
||||||
|
if (ctx == null) {
|
||||||
|
throw new NullPointerException("ctx may not be null.");
|
||||||
|
}
|
||||||
|
if (factory == null) {
|
||||||
|
throw new NullPointerException("factory may not be null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
getActiveFactories(ctx).addFactory(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Identifiers from the list of factories. This might return an
|
||||||
|
* empty bundle, but it never returns null.
|
||||||
|
*
|
||||||
|
* This is package access, and should only be called by RequestIdentifiers.
|
||||||
|
* Everyone else should ask RequestIdentifiers to fetch them from the
|
||||||
|
* request.
|
||||||
|
*/
|
||||||
|
static IdentifierBundle getIdentifierBundle(HttpServletRequest request) {
|
||||||
|
HttpSession session = request.getSession();
|
||||||
|
ServletContext ctx = session.getServletContext();
|
||||||
|
return getActiveFactories(ctx).getIdentifierBundle(request, session,
|
||||||
|
ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the singleton instance from the servlet context. If there isn't one,
|
||||||
|
* create one. This never returns null.
|
||||||
|
*/
|
||||||
|
private static ActiveIdentifierBundleFactories getActiveFactories(
|
||||||
|
ServletContext ctx) {
|
||||||
|
if (ctx == null) {
|
||||||
|
throw new NullPointerException("ctx may not be null.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Object obj = ctx.getAttribute(ATTRIBUTE_ACTIVE_FACTORIES);
|
||||||
|
if (obj == null) {
|
||||||
|
obj = new ActiveIdentifierBundleFactories();
|
||||||
|
ctx.setAttribute(ATTRIBUTE_ACTIVE_FACTORIES, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(obj instanceof ActiveIdentifierBundleFactories)) {
|
||||||
|
throw new IllegalStateException("Expected to find an instance of "
|
||||||
|
+ ActiveIdentifierBundleFactories.class.getName()
|
||||||
|
+ " in the context, but found an instance of "
|
||||||
|
+ obj.getClass().getName() + " instead.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ActiveIdentifierBundleFactories) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// the instance
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
private final List<IdentifierBundleFactory> factories = new ArrayList<IdentifierBundleFactory>();
|
||||||
|
|
||||||
|
private void addFactory(IdentifierBundleFactory factory) {
|
||||||
|
factories.add(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run through the active factories and get all Identifiers for this
|
||||||
|
* request.
|
||||||
|
*/
|
||||||
|
private IdentifierBundle getIdentifierBundle(HttpServletRequest request,
|
||||||
|
HttpSession session, ServletContext ctx) {
|
||||||
|
IdentifierBundle ib = new ArrayIdentifierBundle();
|
||||||
|
for (IdentifierBundleFactory ibf : factories) {
|
||||||
|
IdentifierBundle obj = ibf.getIdentifierBundle(request, session,
|
||||||
|
ctx);
|
||||||
|
if (obj != null) {
|
||||||
|
ib.addAll(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ib;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.auth.identifier;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a list of Identifiers that apply to the current request and cache them
|
||||||
|
* in the request.
|
||||||
|
*/
|
||||||
|
public class RequestIdentifiers {
|
||||||
|
private static final String ATTRIBUTE_ID_BUNDLE = RequestIdentifiers.class
|
||||||
|
.getName();
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// static methods
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the currently applicable Identifiers have been cached in the request,
|
||||||
|
* get them. If not, assemble them from the active factories, and cache them
|
||||||
|
* in the request.
|
||||||
|
*
|
||||||
|
* This method might return an empty bundle, but it never returns null.
|
||||||
|
*/
|
||||||
|
public static IdentifierBundle getIdBundleForRequest(ServletRequest request) {
|
||||||
|
if (!(request instanceof HttpServletRequest)) {
|
||||||
|
return new ArrayIdentifierBundle();
|
||||||
|
}
|
||||||
|
HttpServletRequest hreq = (HttpServletRequest) request;
|
||||||
|
|
||||||
|
Object obj = hreq.getAttribute(ATTRIBUTE_ID_BUNDLE);
|
||||||
|
if (obj == null) {
|
||||||
|
obj = ActiveIdentifierBundleFactories.getIdentifierBundle(hreq);
|
||||||
|
hreq.setAttribute(ATTRIBUTE_ID_BUNDLE, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(obj instanceof IdentifierBundle)) {
|
||||||
|
throw new IllegalStateException("Expected to find an instance of "
|
||||||
|
+ IdentifierBundle.class.getName()
|
||||||
|
+ " in the request, but found an instance of "
|
||||||
|
+ obj.getClass().getName() + " instead.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return (IdentifierBundle) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,87 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.auth.identifier;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
|
||||||
import javax.servlet.ServletRequest;
|
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is intended to provide access to a IdentifierBundleFactory in the
|
|
||||||
* servlet context.
|
|
||||||
*
|
|
||||||
* @author bdc34
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class ServletIdentifierBundleFactory extends ArrayList<IdentifierBundleFactory> implements IdentifierBundleFactory {
|
|
||||||
public static String IDENTIFIER_BUNDLE_FACTORY = "IdentifierBundleFactory";
|
|
||||||
public static String IDENTIFIER_BUNDLE = "IdentifierBundle";
|
|
||||||
|
|
||||||
/* ****************** static utility methods *************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Use this method to get an IdentifierBundleFactory for the servlet.
|
|
||||||
* @param sc
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static ServletIdentifierBundleFactory getIdentifierBundleFactory(ServletContext sc){
|
|
||||||
if( sc != null ){
|
|
||||||
Object obj = sc.getAttribute(IDENTIFIER_BUNDLE_FACTORY);
|
|
||||||
if( obj != null && obj instanceof ServletIdentifierBundleFactory ){
|
|
||||||
return (ServletIdentifierBundleFactory)obj;
|
|
||||||
}else{
|
|
||||||
ServletIdentifierBundleFactory sibf = new ServletIdentifierBundleFactory();
|
|
||||||
sc.setAttribute(IDENTIFIER_BUNDLE_FACTORY, sibf);
|
|
||||||
return sibf;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets IdentifierBundle for a request.
|
|
||||||
* Session may be null.
|
|
||||||
*/
|
|
||||||
public static IdentifierBundle getIdBundleForRequest(ServletRequest request, HttpSession session, ServletContext sc){
|
|
||||||
if( request == null ) return null;
|
|
||||||
IdentifierBundle ib = (IdentifierBundle)request.getAttribute(IDENTIFIER_BUNDLE);
|
|
||||||
if( ib != null ) return ib;
|
|
||||||
|
|
||||||
IdentifierBundleFactory ibf = getIdentifierBundleFactory(sc);
|
|
||||||
ib = ibf.getIdentifierBundle(request,session,sc);
|
|
||||||
request.setAttribute(IDENTIFIER_BUNDLE, ib);
|
|
||||||
return ib;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IdentifierBundle getExistingIdBundle(ServletRequest request){
|
|
||||||
if( request == null ) return null;
|
|
||||||
IdentifierBundle ib = (IdentifierBundle)request.getAttribute(IDENTIFIER_BUNDLE);
|
|
||||||
if( ib != null ) return ib;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addIdentifierBundleFactory(ServletContext sc, IdentifierBundleFactory ibfToAdd){
|
|
||||||
ServletIdentifierBundleFactory serverIbf = getIdentifierBundleFactory(sc);
|
|
||||||
serverIbf.add( ibfToAdd );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Consider using getIdBundleForRequest instead of this method.
|
|
||||||
*/
|
|
||||||
public IdentifierBundle getIdentifierBundle(ServletRequest request, HttpSession session, ServletContext context) {
|
|
||||||
IdentifierBundle ib = new ArrayIdentifierBundle();
|
|
||||||
for(IdentifierBundleFactory ibf : this){
|
|
||||||
if( ibf != null ){
|
|
||||||
IdentifierBundle obj = ibf.getIdentifierBundle(request,session, context);
|
|
||||||
if( obj != null )
|
|
||||||
ib.addAll( obj );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ib;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue