You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2002/06/03 12:02:01 UTC

cvs commit: xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components ApplicationHandler.java AuthenticationManager.java Handler.java HandlerManager.java

cziegeler    2002/06/03 03:02:01

  Modified:    src/java/org/apache/cocoon/components/treeprocessor
                        TreeProcessor.java
               src/java/org/apache/cocoon/webapps/authentication/components
                        ApplicationHandler.java AuthenticationManager.java
                        Handler.java HandlerManager.java
  Log:
  Rewrote authentication handler code
  
  Revision  Changes    Path
  1.13      +9 -7      xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java
  
  Index: TreeProcessor.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/treeprocessor/TreeProcessor.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- TreeProcessor.java	29 May 2002 12:50:21 -0000	1.12
  +++ TreeProcessor.java	3 Jun 2002 10:02:00 -0000	1.13
  @@ -94,7 +94,7 @@
    * Interpreted tree-traversal implementation of a pipeline assembly language.
    *
    * @author <a href="mailto:sylvain@apache.org">Sylvain Wallez</a>
  - * @version CVS $Id: TreeProcessor.java,v 1.12 2002/05/29 12:50:21 cziegeler Exp $
  + * @version CVS $Id: TreeProcessor.java,v 1.13 2002/06/03 10:02:00 cziegeler Exp $
    */
   
   public class TreeProcessor
  @@ -313,15 +313,17 @@
       }
   
       protected boolean process(Environment environment, InvokeContext context)
  -      throws Exception {
  +    throws Exception {
   
  -        CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel(), this);
  +        // first, check for sitemap changes
  +        if (this.rootNode == null ||
  +            (this.checkReload && this.source.getLastModified() > this.lastModified)) {
  +            setupRootNode(environment);
  +        }
   
  +        // and now process
  +        CocoonComponentManager.enterEnvironment(environment, environment.getObjectModel(), this);
           try {
  -            if (this.rootNode == null ||
  -                (this.checkReload && this.source.getLastModified() > this.lastModified)) {
  -                setupRootNode(environment);
  -            }
               return this.rootNode.invoke(environment, context);
           } finally {
               CocoonComponentManager.leaveEnvironment();
  
  
  
  1.4       +20 -15    xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/ApplicationHandler.java
  
  Index: ApplicationHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/ApplicationHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ApplicationHandler.java	29 May 2002 16:05:42 -0000	1.3
  +++ ApplicationHandler.java	3 Jun 2002 10:02:01 -0000	1.4
  @@ -67,7 +67,7 @@
    * inside a handler configuration.
    *
    * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
  - * @version CVS $Id: ApplicationHandler.java,v 1.3 2002/05/29 16:05:42 cziegeler Exp $
  + * @version CVS $Id: ApplicationHandler.java,v 1.4 2002/06/03 10:02:01 cziegeler Exp $
   */
   public final class ApplicationHandler
   implements java.io.Serializable {
  @@ -84,15 +84,15 @@
       /** Is the application loaded on demand */
       private boolean loadOnDemand = false;
   
  +    /** Is the application loaded ? */
  +    private boolean isLoaded = false;
  +
       /** The corresponding handler */
       private Handler handler;
   
       /** The configuration fragments */
       private Map configurations;
   
  -    /** The name of the context attribute, where isLoaded is stored */
  -    private String attributeName;
  -
       /**
        * Construct a new application handler
        */
  @@ -106,14 +106,23 @@
              throw new ProcessingException("application name must not contain one of the characters ':','_' or '/'.");
           }
           this.configurations = new HashMap(3, 2);
  -        this.attributeName = "authentication_AH_" + handler.getName() + "_" + this.name;
       }
   
       /**
        * Make a copy
        */
  -    public ApplicationHandler copy() {
  -        return null;
  +    public ApplicationHandler copy(Handler handler) {
  +        try {
  +            final ApplicationHandler ah = new ApplicationHandler(handler, this.name);
  +            ah.loadOnDemand = this.loadOnDemand;
  +            ah.loadResource = this.loadResource;
  +            ah.saveResource = this.saveResource;
  +            ah.configurations = this.configurations;
  +            return ah;
  +        } catch (ProcessingException pe) {
  +            // ignore it and keep the compiler happy
  +            return null;
  +        }
       }
   
       /**
  @@ -181,22 +190,18 @@
       }
   
   
  -    public boolean getIsLoaded(SessionContext context)
  +    public boolean getIsLoaded()
       throws ProcessingException {
           if (this.loadResource == null) {
               return true;
           } else {
  -            boolean result = false;
  -            Boolean bool = (Boolean)context.getAttribute(this.attributeName);
  -            if (bool != null) result = bool.booleanValue();
  -            return result;
  +            return this.isLoaded;
           }
       }
   
  -    public void setIsLoaded(SessionContext context, boolean value)
  +    public void setIsLoaded(boolean value)
       throws ProcessingException {
  -        Boolean bool = new Boolean(value);
  -        context.setAttribute(this.attributeName, bool);
  +        this.isLoaded = value;
       }
   
       public boolean getLoadOnDemand() { return loadOnDemand; }
  
  
  
  1.9       +32 -155   xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/AuthenticationManager.java
  
  Index: AuthenticationManager.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/AuthenticationManager.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AuthenticationManager.java	29 May 2002 15:58:21 -0000	1.8
  +++ AuthenticationManager.java	3 Jun 2002 10:02:01 -0000	1.9
  @@ -98,7 +98,7 @@
    *  This is the basis authentication component.
    *
    * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
  - * @version CVS $Id: AuthenticationManager.java,v 1.8 2002/05/29 15:58:21 cziegeler Exp $
  + * @version CVS $Id: AuthenticationManager.java,v 1.9 2002/06/03 10:02:01 cziegeler Exp $
   */
   public final class AuthenticationManager
   extends AbstractSessionComponent
  @@ -118,15 +118,6 @@
       /** The handler manager */
       private HandlerManager handlerManager = new HandlerManager();
   
  -    /** All Handlers hashed by their name */
  -    private Map     configuredHandlers;
  -
  -    /** All handlers of the current user */
  -    private Map     userHandlers;
  -
  -    /** The handler configuration */
  -    private Configuration  configuration;
  -
       /** The application name of the current resource */
       private String applicationName;
   
  @@ -172,7 +163,6 @@
           this.application = null;
           this.handler = null;
           this.handlerName = null;
  -        this.userHandlers = null;
   
           // clear handlers
           this.handlerManager.clearAvailableHandlers();
  @@ -183,15 +173,8 @@
        */
       public void setSitemapConfiguration(Configuration config)
       throws ConfigurationException {
  -        try {
  -            // synchronized
  -            this.configureHandlers(config);
  -        } catch (ProcessingException pe) {
  -            throw new ConfigurationException("Exception during configuration of handlers.");
  -        }
  -
  -        //this.handlerManager.addConfiguration( config, this.resolver, this.request );
  -        //this.handlerManager.addAvailableHandlers( config );
  +        this.handlerManager.addConfiguration( config, this.resolver, this.request );
  +        this.handlerManager.addAvailableHandlers( config );
       }
   
       /**
  @@ -230,8 +213,12 @@
       throws ConfigurationException {
           // no sync required
           Configuration mediaConf = myConfiguration.getChild("mediatypes", false);
  -        if (mediaConf == null) throw new ConfigurationException("AuthenticationManager needs mediatypes configuration");
  -        this.defaultMediaType = mediaConf.getAttribute("default");
  +        if (mediaConf == null) {
  +            // default configuration
  +            this.defaultMediaType = "html";
  +        } else {
  +            this.defaultMediaType = mediaConf.getAttribute("default", "html");
  +        }
           this.mediaTypeNames = new String[1];
           this.mediaTypeNames[0] = this.defaultMediaType;
           boolean found;
  @@ -265,74 +252,6 @@
               }
           }
           this.allMediaTypes = array;
  -        this.configuredHandlers = null;
  -    }
  -
  -    /**
  -     * Configure the handler
  -     */
  -    private void configureHandlers(Configuration configuration)
  -    throws ProcessingException {
  -        if (this.configuredHandlers == null
  -            || configuration.equals(this.configuration) == false) {
  -            this.configuration = configuration; // store the configuration
  -            try {
  -                this.configuredHandlers = new Hashtable(3, 2);
  -
  -                Configuration handlersConfiguration = configuration.getChild("handlers", false);
  -                Configuration currentHandlerConf;
  -
  -                if (handlersConfiguration != null) {
  -                    Configuration[] handlerConfs = handlersConfiguration.getChildren("handler");
  -                    if (handlerConfs != null) {
  -                        for(int i = 0; i < handlerConfs.length; i++) {
  -
  -                            currentHandlerConf = handlerConfs[i];
  -                            String        value;
  -
  -                            // get name
  -                            String name = currentHandlerConf.getAttribute("name");
  -
  -                            // test if handler is unique
  -                            if (this.configuredHandlers.get(name) != null) {
  -                                throw new ConfigurationException("Handler names must be unique: " + name);
  -                            }
  -
  -                            // create handler
  -                            Handler currentHandler = new Handler(name);
  -
  -                            // store handler
  -                            this.configuredHandlers.put(name, currentHandler);
  -
  -                            currentHandler.configure(this.resolver, this.request, currentHandlerConf);
  -                        }
  -                    }
  -                }
  -            } catch (IOException local) {
  -                throw new ProcessingException("IOException: " + local, local);
  -            } catch (SAXException local) {
  -                throw new ProcessingException("SAXException: " + local, local);
  -            } catch (ConfigurationException local) {
  -                throw new ProcessingException("ConfigurationException: " + local, local);
  -            }
  -        }
  -
  -    }
  -
  -    /**
  -     * Store the handlers in the session of the user
  -     */
  -    private void storeHandlers()
  -    throws ProcessingException {
  -        final Request req = ObjectModelHelper.getRequest( this.objectModel );
  -        final Session session = req.getSession();
  -        Map myHandlers = (Map)session.getAttribute(HandlerManager.SESSION_ATTRIBUTE_HANDLERS);
  -        if (myHandlers == null) {
  -            this.userHandlers = this.configuredHandlers;
  -            session.setAttribute(HandlerManager.SESSION_ATTRIBUTE_HANDLERS, this.userHandlers);
  -            this.configuredHandlers = null;
  -            this.configureHandlers(this.configuration);
  -        }
       }
   
       /**
  @@ -683,33 +602,7 @@
   
           // if no handler: authenticated
           if (name != null) {
  -            isAuthenticated = false;
  -
  -            // get the session context
  -            // if no session context: not authenticated
  -            SessionContext context = this.getAuthenticationSessionContext(false);
  -            if (context != null) {
  -                synchronized(context) {
  -
  -                    try {
  -                        // is result in cache (= context attribute)
  -                        if (context.getAttribute("COCOON_ISAUTHENTICATED:" + name) != null) {
  -                            isAuthenticated = true;
  -                        } else {
  -                            DocumentFragment id = context.getXML("/" + name + "/authentication/ID");
  -                            isAuthenticated = (id != null);
  -                            if (isAuthenticated == true) {
  -                                // cache result
  -                                context.setAttribute("COCOON_ISAUTHENTICATED:" + name, "YES");
  -                            }
  -                        }
  -                    } catch (ProcessingException local) {
  -                        // ignore this for now
  -                        this.getLogger().error("isAuthenticated");
  -                        isAuthenticated = false;
  -                    }
  -                }
  -            }
  +            isAuthenticated = this.handlerManager.hasUserHandler( name, this.request );
           }
   
           if (this.getLogger().isDebugEnabled() == true) {
  @@ -729,13 +622,6 @@
           }
           boolean isAuthenticated = true;
   
  -        // get user handlers (if available)
  -        final Request req = ObjectModelHelper.getRequest( this.objectModel );
  -        final Session session = req.getSession(false);
  -        if ( null != session ) {
  -            this.userHandlers = (Map)session.getAttribute(HandlerManager.SESSION_ATTRIBUTE_HANDLERS);
  -        }
  -
           // set the configuration for the handler
           final String newHandlerName = (String)this.request.getAttribute(AuthenticationConstants.REQUEST_ATTRIBUTE_HANDLER_NAME);
           final String newAppName     = (String)this.request.getAttribute(AuthenticationConstants.REQUEST_ATTRIBUTE_APPLICATION_NAME);
  @@ -801,12 +687,7 @@
        */
       private Handler getHandler(String name) {
           // synchronized
  -        if ( null == name ) return null;
  -        if ( null != this.userHandlers ) {
  -            return (Handler)this.userHandlers.get( name );
  -        } else {
  -            return (Handler)this.configuredHandlers.get( name );
  -        }
  +        return this.handlerManager.getHandler( name, this.request);
       }
   
       /**
  @@ -827,7 +708,7 @@
           DocumentFragment authenticationFragment = null;
           boolean          isValid                = false;
   
  -        final Handler myHandler = this.getHandler(loginHandlerName);
  +        Handler myHandler = this.getHandler(loginHandlerName);
           if (this.getLogger().isInfoEnabled() == true) {
               this.getLogger().info("AuthenticationManager: Trying to authenticate using handler '" + loginHandlerName +"'");
           }
  @@ -867,10 +748,8 @@
                   isValid = this.isValidAuthenticationFragment(authenticationFragment);
   
                   if (isValid == true) {
  -                    this.storeHandlers();
  -
                       if (this.getLogger().isInfoEnabled() == true) {
  -                        this.getLogger().info("AuthenticationManager: Success authenticated using handler '" + myHandler.getName()+"'");
  +                        this.getLogger().info("AuthenticationManager: User authenticated using handler '" + myHandler.getName()+"'");
                       }
                       // create session object if necessary, context etc and get it
                       if (this.getLogger().isDebugEnabled() == true) {
  @@ -880,6 +759,10 @@
                       if (this.getLogger().isDebugEnabled() == true) {
                           this.getLogger().debug("session created");
                       }
  +
  +                    myHandler = this.handlerManager.storeUserHandler(myHandler,
  +                                                                     this.request);
  +
                       synchronized(context) {
                           // add special nodes to the authentication block:
                           // useragent, type and media
  @@ -921,10 +804,10 @@
                                   this.loadApplicationXML((SessionContextImpl)this.getSessionManager().getContext(AuthenticationConstants.SESSION_CONTEXT_NAME),
                                                           appHandler, "/");
                               } else {
  -                                loaded = appHandler.getIsLoaded(context);
  +                                loaded = appHandler.getIsLoaded();
                               }
                           }
  -                        myHandler.setApplicationsLoaded(context, loaded);
  +                        myHandler.setApplicationsLoaded(loaded);
   
                       } // end sync
                   }
  @@ -1078,10 +961,6 @@
   
           if (context != null && logoutHandlerName != null) {
   
  -            // cached?
  -            if (context.getAttribute("COCOON_ISAUTHENTICATED:" + logoutHandlerName) != null) {
  -                context.setAttribute("COCOON_ISAUTHENTICATED:" + logoutHandlerName, null);
  -            }
               // remove context
               context.removeXML(logoutHandlerName);
               // FIXME (CZ): The sessionContextImpl should not be null, but
  @@ -1090,20 +969,11 @@
                           (this.getSessionManager().getContext(AuthenticationConstants.SESSION_CONTEXT_NAME));
               if (sessionContextImpl != null) {
                   sessionContextImpl.cleanParametersCache(logoutHandlerName);
  -            } else if (this.getLogger().isDebugEnabled()) {
  -                this.getLogger().debug("AuthenticationManager:logout() - sessionContextImpl is null");
  +            } else if (this.getLogger().isWarnEnabled()) {
  +                this.getLogger().warn("AuthenticationManager:logout() - sessionContextImpl is null");
               }
               Handler logoutHandler = (Handler)this.getHandler(logoutHandlerName);
   
  -            // reset application load status
  -            logoutHandler.setApplicationsLoaded(context, false);
  -            Iterator apps = logoutHandler.getApplications().values().iterator();
  -            ApplicationHandler current;
  -            while (apps.hasNext() == true) {
  -                current = (ApplicationHandler)apps.next();
  -                current.setIsLoaded(context, false);
  -            }
  -
               final List handlerContexts = logoutHandler.getHandlerContexts();
               final Iterator iter = handlerContexts.iterator();
               while ( iter.hasNext() ) {
  @@ -1111,6 +981,13 @@
                   this.getSessionManager().deleteContext( deleteContext.getName() );
               }
               logoutHandler.clearHandlerContexts();
  +            this.handlerManager.removeUserHandler( logoutHandler, this.request );
  +            if (logoutHandlerName.equals(this.handlerName)) {
  +                this.handlerName = null;
  +                this.handler = null;
  +                this.applicationName = null;
  +                this.application = null;
  +            }
           }
   
           if ( mode != null && mode.equalsIgnoreCase("terminateSession") ) {
  @@ -1447,7 +1324,7 @@
           Object o = this.getSessionManager().getSession(true);
           synchronized(o) {
   
  -            if (appHandler.getIsLoaded(context) == false) {
  +            if (appHandler.getIsLoaded() == false) {
   
                   final Resource loadResource     = appHandler.getLoadResource();
                   final String   loadResourceName = loadResource.getResourceIdentifier();
  @@ -1463,7 +1340,7 @@
                   fragment = this.getResourceConnector().loadXML(loadResourceType, null,
                                                                  loadResourceName, parameters);
   
  -                appHandler.setIsLoaded(context, true);
  +                appHandler.setIsLoaded(true);
   
                   context.setApplicationXML(appHandler.getHandler().getName(),
                                             appHandler.getName(),
  @@ -1474,9 +1351,9 @@
                   Iterator applications = appHandler.getHandler().getApplications().values().iterator();
                   boolean     allLoaded = true;
                   while (allLoaded == true && applications.hasNext() == true) {
  -                    allLoaded = ((ApplicationHandler)applications.next()).getIsLoaded(context);
  +                    allLoaded = ((ApplicationHandler)applications.next()).getIsLoaded();
                   }
  -                appHandler.getHandler().setApplicationsLoaded(context, allLoaded);
  +                appHandler.getHandler().setApplicationsLoaded(allLoaded);
               }
   
           } // end synchronized
  
  
  
  1.5       +10 -15    xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/Handler.java
  
  Index: Handler.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/Handler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Handler.java	29 May 2002 16:05:42 -0000	1.4
  +++ Handler.java	3 Jun 2002 10:02:01 -0000	1.5
  @@ -68,7 +68,7 @@
    * The authentication Handler.
    *
    * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
  - * @version CVS $Id: Handler.java,v 1.4 2002/05/29 16:05:42 cziegeler Exp $
  + * @version CVS $Id: Handler.java,v 1.5 2002/06/03 10:02:01 cziegeler Exp $
   */
   public final class Handler
   implements java.io.Serializable {
  @@ -115,25 +115,24 @@
       /** The change-user resource */
       private Resource changeUserResource;
   
  -    /** The name of the context attribute, where isLoaded is stored */
  -    private final String attributeName;
  -
       /** The handler contexts */
       private List handlerContexts = new ArrayList(2);
   
  +    /** Are all apps loaded? */
  +    private boolean appsLoaded = false;
  +
       /**
        * Create a new handler object.
        */
       public Handler(String name) {
           this.name = name;
  -        this.attributeName = "authentication_H_" + this.name;
       }
   
       /**
        * Make a copy
        */
       public Handler copy() {
  -        Handler copy = new Handler(this.name);
  +        final Handler copy = new Handler(this.name);
           copy.redirectURI = this.redirectURI;
           copy.redirectParameters = this.redirectParameters;
           copy.authenticationResource = this.authenticationResource;
  @@ -149,7 +148,7 @@
           Iterator iter = this.applications.keySet().iterator();
           while (iter.hasNext()) {
               final String name = (String)iter.next();
  -            copy.applications.put(name, ((ApplicationHandler)this.applications.get(name)).copy());
  +            copy.applications.put(name, ((ApplicationHandler)this.applications.get(name)).copy(copy));
           }
           return copy;
       }
  @@ -344,21 +343,17 @@
        */
       public Map getApplications() { return applications; }
   
  -    public void setApplicationsLoaded(SessionContext context, boolean value)
  +    public void setApplicationsLoaded(boolean value)
       throws ProcessingException {
  -        Boolean bool = new Boolean(value);
  -        context.setAttribute(this.attributeName, bool);
  +        this.appsLoaded = value;
       }
   
  -    public boolean getApplicationsLoaded(SessionContext context)
  +    public boolean getApplicationsLoaded()
       throws ProcessingException {
           if (this.applications.isEmpty() == true) {
               return true;
           } else {
  -            boolean result = false;
  -            Boolean bool = (Boolean)context.getAttribute(this.attributeName);
  -            if (bool != null) result = bool.booleanValue();
  -            return result;
  +            return this.appsLoaded;
           }
       }
   
  
  
  
  1.5       +34 -2     xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/HandlerManager.java
  
  Index: HandlerManager.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/webapps/authentication/components/HandlerManager.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HandlerManager.java	29 May 2002 15:58:21 -0000	1.4
  +++ HandlerManager.java	3 Jun 2002 10:02:01 -0000	1.5
  @@ -64,7 +64,7 @@
    *  This is a utility class managing the authentication handlers
    *
    * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
  - * @version CVS $Id: HandlerManager.java,v 1.4 2002/05/29 15:58:21 cziegeler Exp $
  + * @version CVS $Id: HandlerManager.java,v 1.5 2002/06/03 10:02:01 cziegeler Exp $
   */
   public final class HandlerManager {
   
  @@ -187,6 +187,7 @@
        */
       public Handler getHandler(String handlerName,
                                 Request request) {
  +        if ( null == handlerName) return null;
           if ( null == this.userHandlers) {
               final Session session = request.getSession(false);
               if ( null != session) {
  @@ -215,11 +216,42 @@
           if ( null == this.userHandlers ) {
               this.userHandlers = new HashMap(3);
           }
  -        // FIXME (CZ) - clone handler
  +        handler = handler.copy();
           this.userHandlers.put(handler.getName(), handler);
           // value did change, update attributes
           session.setAttribute(SESSION_ATTRIBUTE_HANDLERS, this.userHandlers);
   
           return handler;
  +    }
  +
  +    /**
  +     * Remove from user handler
  +     */
  +    public void removeUserHandler(Handler handler, Request request) {
  +        final Session session = request.getSession();
  +        if ( null == this.userHandlers) {
  +            this.userHandlers = (Map)session.getAttribute(SESSION_ATTRIBUTE_HANDLERS);
  +        }
  +        if ( null != this.userHandlers) {
  +            this.userHandlers.remove( handler.getName() );
  +            // value did change, update attributes
  +            session.setAttribute(SESSION_ATTRIBUTE_HANDLERS, this.userHandlers);
  +        }
  +    }
  +
  +    /**
  +     * Check, if a user handler is available (= is authenticated)
  +     */
  +    public boolean hasUserHandler(String name, Request request) {
  +        if ( null == this.userHandlers) {
  +            final Session session = request.getSession(false);
  +            if ( null != session) {
  +                this.userHandlers = (Map)session.getAttribute(SESSION_ATTRIBUTE_HANDLERS);
  +            }
  +        }
  +        if ( null != this.userHandlers) {
  +            return this.userHandlers.containsKey( name );
  +        }
  +        return false;
       }
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org