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
[EMAIL PROTECTED] 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 [EMAIL PROTECTED]
*
* 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:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>