tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeanfrancois Arcand <jeanfrancois.arc...@sun.com>
Subject Re: cvs commit: jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote BaseHook.java
Date Sat, 11 Jan 2003 01:47:25 GMT
Hi Costin, (you beat me on the proposal :-) )

what about having a concept of a chain somewhere (meaning hooks chain 
(handler :-) ). This way handler doesn't need to know which comes next 
(or previous), but the handler chain knows it. What I was having in mind 
was being able to define somewhere:

<handler-configuration>
    <module name="org.apache.coyote>
       <handlerChain className="org.apache.coyote.CoyoteHandlerChain">
           <params>
               <param>
                   <param-name> key</param-name>
                   <param-value> value</param-value>
               </param>
          </params>
          <handlers>
                <handler 
className="org.apache.coyote.tomcat5.ActionHookHandler>
                      <params>
                            <param>
                                <param-name> babla </param-name>
                                <param-value> babla </param-value>
                            </param>
                      </params>
                </handler>
       </handlers>
    <handler-chain>
<handler-configuration>

Using that information, an HandlerChainDispatcher can generically load 
that information and then instanciate the proper HandlerChain/Handler.  
In the code, that will result in

public interface HandlerChain{
    public void addHandler(Handler);
    public void addHandler(int index, Handler);
    public boolean contains(Handler);
    public boolean  handle(HandlerChainContext);
// remove handler(Handler)
}

public interface Handler{
    public boolean handle(HandlerContext);
    public void setHandlerInfo(HandlerInfo);   // Same as ActionCode
    public HandlerInfo getHandlerInfo(HandlerInfo);
   
    public void init();
    public void destroy()
    public void recycle();
}

public interface HandlerContext(){
    public Object putAttribute(String,Object);
    public Object getAttribute(String);
    public Map getAttributes();
    public void removeAttribute(String);
    public void clear();
}

Example:
[------ In CoyoteAdapter...

            postParseRequest(req, request, res, response);
            // Calling the container
            connector.getContainer().invoke(request, response);
            response.finishResponse();

            req.action( ActionCode.ACTION_POST_REQUEST , null);
------]

We can easily replace those calls by something like:

...
HandlerChainContext context = new HandlerChainContext()
context.putAttribute(ACTION_POST_REQUEST);
coyoteHandlerChain.handle(context);
               
That will easily map to the current Pipeline/Valve architecture. We will 
define basic HandlerChain (ex: AuthenticationChain, AuthorizationChain, 
CoyoteChain, XercesChain (broken by default...just kidding ;-), etc.) 
and then "module" can get inserted in those HandlerChain using something 
like the xml format decribed above. A module will have to implement 
Handler (or HandlerChain).

Finally, that looks like a small proposal ;-)

--Jeanfrancois


costin@apache.org wrote:

>costin      2003/01/10 14:36:43
>
>  Added:       coyote/src/java/org/apache/coyote BaseHook.java
>  Log:
>  Added a base implementation of ActionHook - with some small additions :-)
>  
>  First, there is a getNext/setNext to allow multiple hooks to be chained.
>  Both recursive and iterative will be supported - you can call next directly or
>  just return it ( still need to tune this - only recursive works now )
>  
>  In addition, the hook implements MBeanRegistration ( again: we did vote on
>  JMX dependency ). Tomcat3.3 may be a problem ( since it's using the same code),
>  but if someone wants to use the new connector he can also add jmx in the
>  path. If anyone has a problem with that - please let me know, I can hack
>  some conditional compilation, but I would like to keep it simple.
>  
>  I'll change the 2 hook implementations to extend this after it settles down.
>  
>  Feel free to make changes - or ask for changes or just say -1.
>  
>  Revision  Changes    Path
>  1.1                  jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/BaseHook.java
>  
>  Index: BaseHook.java
>  ===================================================================
>  /*
>   * ====================================================================
>   *
>   * The Apache Software License, Version 1.1
>   *
>   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
>   * reserved.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
>   * are met:
>   *
>   * 1. Redistributions of source code must retain the above copyright
>   *    notice, this list of conditions and the following disclaimer. 
>   *
>   * 2. Redistributions in binary form must reproduce the above copyright
>   *    notice, this list of conditions and the following disclaimer in
>   *    the documentation and/or other materials provided with the
>   *    distribution.
>   *
>   * 3. The end-user documentation included with the redistribution, if
>   *    any, must include the following acknowlegement:  
>   *       "This product includes software developed by the 
>   *        Apache Software Foundation (http://www.apache.org/)."
>   *    Alternately, this acknowlegement may appear in the software itself,
>   *    if and wherever such third-party acknowlegements normally appear.
>   *
>   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
>   *    Foundation" must not be used to endorse or promote products derived
>   *    from this software without prior written permission. For written 
>   *    permission, please contact apache@apache.org.
>   *
>   * 5. Products derived from this software may not be called "Apache"
>   *    nor may "Apache" appear in their names without prior written
>   *    permission of the Apache Group.
>   *
>   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
>   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
>   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
>   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
>   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
>   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
>   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
>   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
>   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
>   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
>   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>   * SUCH DAMAGE.
>   * ====================================================================
>   *
>   * This software consists of voluntary contributions made by many
>   * individuals on behalf of the Apache Software Foundation.  For more
>   * information on the Apache Software Foundation, please see
>   * <http://www.apache.org/>.
>   *
>   * [Additional notices, if required by prior licensing conditions]
>   *
>   */ 
>  package org.apache.coyote;
>  
>  import javax.management.MBeanRegistration;
>  import javax.management.ObjectName;
>  import javax.management.MBeanServer;
>  
>  
>  /**
>   * Action hook.
>   *
>   * @author Remy Maucherat
>   * @author Costin Manolache
>   */
>  public class BaseHook implements ActionHook, MBeanRegistration {
>      protected BaseHook next;
>  
>      /**
>       * Send an action to the connector.
>       * Both recursive and iterative invocation is possible - the
>       * hook may call itself the next hook ( like catalina ) or the
>       * controller may call the next.
>       * 
>       * @param param Action parameter
>       * @return  A hook that can be executed next.
>       */
>      public BaseHook action(int code, Object param) {
>          if( next==null ) return next;
>          return next.action( code, param );
>      };
>  
>      /** Backward compat
>       *
>       * @param actionCode
>       * @param param
>       */
>      public void action( ActionCode actionCode, Object param) {
>         action( actionCode.getCode(), param );
>      }
>  
>      public void setNextHook(BaseHook next) {
>          this.next=next;
>      }
>  
>      public BaseHook getNextHook() {
>          return next;
>      }
>  
>      // -------------------- Mbean registration  --------------------
>  
>      protected String domain;
>      protected ObjectName oname;
>      protected MBeanServer mserver;
>  
>      public ObjectName getObjectName() {
>          return oname;
>      }
>  
>      public String getDomain() {
>          return domain;
>      }
>  
>      public ObjectName preRegister(MBeanServer server,
>                                    ObjectName name) throws Exception {
>          oname=name;
>          mserver=server;
>          domain=name.getDomain();
>          return name;
>      }
>  
>      public void postRegister(Boolean registrationDone) {
>      }
>  
>      public void preDeregister() throws Exception {
>      }
>  
>      public void postDeregister() {
>      }
>  
>  
>  }
>  
>  
>  
>
>--
>To unsubscribe, e-mail:   <mailto:tomcat-dev-unsubscribe@jakarta.apache.org>
>For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>
>
>
>  
>


--
To unsubscribe, e-mail:   <mailto:tomcat-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-dev-help@jakarta.apache.org>


Mime
View raw message