org.apache.commons.chain.generic
Class DispatchLookupCommand

java.lang.Object
  extended by org.apache.commons.chain.generic.LookupCommand
      extended by org.apache.commons.chain.generic.DispatchLookupCommand
All Implemented Interfaces:
Command, Filter

public class DispatchLookupCommand
extends LookupCommand
implements Filter

This command combines elements of the LookupCommand with the DispatchCommand. Look up a specified Command (which could also be a Chain) in a Catalog, and delegate execution to it. Introspection is used to lookup the appropriate method to delegate execution to. If the delegated-to Command is also a Filter, its postprocess() method will also be invoked at the appropriate time.

The name of the Command can be specified either directly (via the name property) or indirectly (via the nameKey property). Exactly one of these must be set.

The name of the method to be called can be specified either directly (via the method property) or indirectly (via the methodKey property). Exactly one of these must be set.

If the optional property is set to true, failure to find the specified command in the specified catalog will be silently ignored. Otherwise, a lookup failure will trigger an IllegalArgumentException.

Since:
Chain 1.1
Version:
$Revision: 480477 $
Author:
Sean Schofield

Field Summary
private static java.lang.Class[] DEFAULT_SIGNATURE
          The base implementation expects dispatch methods to take a Context as their only argument.
private  java.lang.String method
           
private  java.lang.String methodKey
           
private  java.util.WeakHashMap methods
           
 
Fields inherited from interface org.apache.commons.chain.Command
CONTINUE_PROCESSING, PROCESSING_COMPLETE
 
Constructor Summary
DispatchLookupCommand()
          Create an instance with an unspecified catalogFactory property.
DispatchLookupCommand(CatalogFactory factory)
          Create an instance and initialize the catalogFactory property to given factory.
 
Method Summary
 boolean execute(Context context)
          Look up the specified command, and (if found) execute it.
private  java.lang.reflect.Method extractMethod(Command command, Context context)
          Extract the dispatch method.
protected  java.lang.Object[] getArguments(Context context)
          Get the arguments to be passed into the dispatch method.
 java.lang.String getMethod()
          Return the method name.
 java.lang.String getMethodKey()
          Return the Context key for the method name.
protected  java.lang.Class[] getSignature()
          Return a Class[] describing the expected signature of the method.
 void setMethod(java.lang.String method)
          Set the method name.
 void setMethodKey(java.lang.String methodKey)
          Set the Context key for the method name.
 
Methods inherited from class org.apache.commons.chain.generic.LookupCommand
getCatalog, getCatalogFactory, getCatalogName, getCommand, getCommandName, getName, getNameKey, isIgnoreExecuteResult, isIgnorePostprocessResult, isOptional, postprocess, setCatalogFactory, setCatalogName, setIgnoreExecuteResult, setIgnorePostprocessResult, setName, setNameKey, setOptional
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.apache.commons.chain.Filter
postprocess
 

Field Detail

DEFAULT_SIGNATURE

private static final java.lang.Class[] DEFAULT_SIGNATURE
The base implementation expects dispatch methods to take a Context as their only argument.


methods

private java.util.WeakHashMap methods

method

private java.lang.String method

methodKey

private java.lang.String methodKey
Constructor Detail

DispatchLookupCommand

public DispatchLookupCommand()
Create an instance with an unspecified catalogFactory property. This property can be set later using setProperty, or if it is not set, the static singleton instance from CatalogFactory.getInstance() will be used.


DispatchLookupCommand

public DispatchLookupCommand(CatalogFactory factory)
Create an instance and initialize the catalogFactory property to given factory.

Parameters:
factory - The Catalog Factory.
Method Detail

getMethod

public java.lang.String getMethod()
Return the method name.

Returns:
The method name.

getMethodKey

public java.lang.String getMethodKey()
Return the Context key for the method name.

Returns:
The Context key for the method name.

setMethod

public void setMethod(java.lang.String method)
Set the method name.

Parameters:
method - The method name.

setMethodKey

public void setMethodKey(java.lang.String methodKey)
Set the Context key for the method name.

Parameters:
methodKey - The Context key for the method name.

execute

public boolean execute(Context context)
                throws java.lang.Exception

Look up the specified command, and (if found) execute it.

Specified by:
execute in interface Command
Overrides:
execute in class LookupCommand
Parameters:
context - The context for this request
Returns:
the result of executing the looked-up command's method, or false if no command is found.
Throws:
java.lang.Exception - if no such Command can be found and the optional property is set to false

getSignature

protected java.lang.Class[] getSignature()

Return a Class[] describing the expected signature of the method. The default is a signature that just accepts the command's Context. The method can be overidden to provide a different method signature.

Returns:
the expected method signature

getArguments

protected java.lang.Object[] getArguments(Context context)
Get the arguments to be passed into the dispatch method. Default implementation simply returns the context which was passed in, but subclasses could use this to wrap the context in some other type, or extract key values from the context to pass in. The length and types of values returned by this must coordinate with the return value of getSignature()

Parameters:
context - The context associated with the request
Returns:
the method arguments to be used

extractMethod

private java.lang.reflect.Method extractMethod(Command command,
                                               Context context)
                                        throws java.lang.NoSuchMethodException
Extract the dispatch method. The base implementation uses the command's method property at the name of a method to look up, or, if that is not defined, uses the methodKey to lookup the method name in the context.

Parameters:
command - The commmand that contains the method to be executed.
context - The context associated with this request
Returns:
the dispatch method
Throws:
java.lang.NoSuchMethodException - if no method can be found under the specified name.
java.lang.NullPointerException - if no methodName can be determined