You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/12/06 02:46:58 UTC
svn commit: r354255 - in
/directory/network/trunk/src/java/org/apache/mina/handler/chain: Chain.java
ChainBase.java Command.java Context.java Filter.java impl/
Author: trustin
Date: Mon Dec 5 17:46:50 2005
New Revision: 354255
URL: http://svn.apache.org/viewcvs?rev=354255&view=rev
Log:
Refactoring chain implementation to make it similar to MINA filter interfaces.
Added:
directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java (with props)
Removed:
directory/network/trunk/src/java/org/apache/mina/handler/chain/Context.java
directory/network/trunk/src/java/org/apache/mina/handler/chain/impl/
Modified:
directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java (contents, props changed)
directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java (contents, props changed)
directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java (contents, props changed)
Modified: directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java?rev=354255&r1=354254&r2=354255&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java Mon Dec 5 17:46:50 2005
@@ -16,6 +16,8 @@
*/
package org.apache.mina.handler.chain;
+import org.apache.mina.common.IoSession;
+
/**
* <p>A {@link Chain} represents a configured list of
* {@link Command}s that will be executed in order to perform processing
@@ -108,5 +110,5 @@
* of this {@link Context} should be delegated to a subsequent
* {@link Command} in an enclosing {@link Chain}
*/
- boolean execute( Context context ) throws Exception;
+ boolean execute( IoSession session, Object message ) throws Exception;
}
Propchange: directory/network/trunk/src/java/org/apache/mina/handler/chain/Chain.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java?rev=354255&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java Mon Dec 5 17:46:50 2005
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.mina.handler.chain;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.mina.common.IoSession;
+import org.apache.mina.handler.chain.Chain;
+import org.apache.mina.handler.chain.Command;
+import org.apache.mina.handler.chain.Context;
+import org.apache.mina.handler.chain.Filter;
+
+/**
+ * <p>A {@link Chain} represents a configured list of
+ * {@link Command}s that will be executed in order to perform processing
+ * on a specified {@link Context}. Each included {@link Command} will be
+ * executed in turn, until either one of them returns <code>true</code>,
+ * one of the executed {@link Command}s throws an exception,
+ * or the end of the chain has been reached. The {@link Chain} itself will
+ * return the return value of the last {@link Command} that was executed
+ * (if no exception was thrown), or rethrow the thrown exception.</p>
+ *
+ * <p>Note that {@link Chain} extends {@link Command}, so that the two can
+ * be used interchangeably when a {@link Command} is expected. This makes it
+ * easy to assemble workflows in a hierarchical manner by combining subchains
+ * into an overall processing chain.</p>
+ *
+ * <p>To protect applications from evolution of this interface, specialized
+ * implementations of {@link Chain} should generally be created by extending
+ * the provided base class {@link org.apache.mina.handler.chain.impl.ChainBase})
+ * rather than directly implementing this interface.</p>
+ *
+ * <p>{@link Chain} implementations should be designed in a thread-safe
+ * manner, suitable for execution on multiple threads simultaneously. In
+ * general, this implies that the state information identifying which
+ * {@link Command} is currently being executed should be maintained in a
+ * local variable inside the <code>execute()</code> method, rather than
+ * in an instance variable. The {@link Command}s in a {@link Chain} may be
+ * configured (via calls to <code>addCommand()</code>) at any time before
+ * the <code>execute()</code> method of the {@link Chain} is first called.
+ * After that, the configuration of the {@link Chain} is frozen.</p>
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ChainBase implements Command
+{
+ // ----------------------------------------------------------- Constructors
+
+ /**
+ * <p>Construct a {@link Chain} with no configured {@link Command}s.</p>
+ */
+ public ChainBase()
+ {
+
+ }
+
+ /**
+ * <p>Construct a {@link Chain} configured with the specified
+ * {@link Command}.</p>
+ *
+ * @param command The {@link Command} to be configured
+ *
+ * @exception IllegalArgumentException if <code>command</code>
+ * is <code>null</code>
+ */
+ public ChainBase( Command command )
+ {
+ addCommand( command );
+ }
+
+ /**
+ * <p>Construct a {@link Chain} configured with the specified
+ * {@link Command}s.</p>
+ *
+ * @param commands The {@link Command}s to be configured
+ *
+ * @exception IllegalArgumentException if <code>commands</code>,
+ * or one of the individual {@link Command} elements,
+ * is <code>null</code>
+ */
+ public ChainBase( Command[] commands )
+ {
+ if ( commands == null )
+ {
+ throw new IllegalArgumentException();
+ }
+
+ for ( int i = 0; i < commands.length; i++ )
+ {
+ addCommand( commands[ i ] );
+ }
+ }
+
+ /**
+ * <p>Construct a {@link Chain} configured with the specified
+ * {@link Command}s.</p>
+ *
+ * @param commands The {@link Command}s to be configured
+ *
+ * @exception IllegalArgumentException if <code>commands</code>,
+ * or one of the individual {@link Command} elements,
+ * is <code>null</code>
+ */
+ public ChainBase( Collection commands )
+ {
+ if ( commands == null )
+ {
+ throw new IllegalArgumentException();
+ }
+
+ Iterator elements = commands.iterator();
+ while ( elements.hasNext() )
+ {
+ addCommand( (Command) elements.next() );
+ }
+ }
+
+ // ----------------------------------------------------- Instance Variables
+
+ /**
+ * <p>The list of {@link Command}s configured for this {@link Chain}, in
+ * the order in which they may delegate processing to the remainder of
+ * the {@link Chain}.</p>
+ */
+ protected Command[] commands = new Command[ 0 ];
+
+ /**
+ * <p>Flag indicating whether the configuration of our commands list
+ * has been frozen by a call to the <code>execute()</code> method.</p>
+ */
+ protected boolean frozen = false;
+
+ // ---------------------------------------------------------- Chain Methods
+
+ // Documented in Chain interface
+ public void addCommand( Command command )
+ {
+ if ( command == null )
+ {
+ throw new IllegalArgumentException();
+ }
+
+ if ( frozen )
+ {
+ throw new IllegalStateException();
+ }
+
+ Command[] results = new Command[ commands.length + 1 ];
+ System.arraycopy( commands, 0, results, 0, commands.length );
+ results[ commands.length ] = command;
+ commands = results;
+ }
+
+ // Documented in Chain interface
+ public boolean execute( IoSession session, Object message ) throws Exception
+ {
+ // Verify our parameters
+ if ( context == null )
+ {
+ throw new IllegalArgumentException();
+ }
+
+ // Freeze the configuration of the command list
+ frozen = true;
+
+ // Execute the commands in this list until one returns true
+ // or throws an exception
+ boolean saveResult = false;
+ Exception saveException = null;
+ int i = 0;
+ int n = commands.length;
+
+ for ( i = 0; i < n; i++ )
+ {
+ try
+ {
+ saveResult = commands[ i ].execute( context );
+ if ( saveResult )
+ {
+ break;
+ }
+ }
+ catch ( Exception e )
+ {
+ saveException = e;
+ break;
+ }
+ }
+
+ // Call postprocess methods on Filters in reverse order
+ if ( i >= n )
+ { // Fell off the end of the chain
+ i--;
+ }
+ boolean handled = false;
+ boolean result = false;
+ for ( int j = i; j >= 0; j-- )
+ {
+ if ( commands[ j ] instanceof Filter )
+ {
+ try
+ {
+ result = ( (Filter) commands[ j ] ).postprocess( context, saveException );
+ if ( result )
+ {
+ handled = true;
+ }
+ }
+ catch ( Exception e )
+ {
+ // Silently ignore
+ }
+ }
+ }
+
+ // Return the exception or result state from the last execute()
+ if ( ( saveException != null ) && !handled )
+ {
+ throw saveException;
+ }
+
+ return ( saveResult );
+ }
+
+ // -------------------------------------------------------- Package Methods
+
+ /**
+ * <p>Return an array of the configured {@link Command}s for this
+ * {@link Chain}. This method is package private, and is used only
+ * for the unit tests.</p>
+ */
+ Command[] getCommands()
+ {
+ return ( commands );
+ }
+}
Propchange: directory/network/trunk/src/java/org/apache/mina/handler/chain/ChainBase.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Modified: directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java?rev=354255&r1=354254&r2=354255&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java Mon Dec 5 17:46:50 2005
@@ -16,6 +16,8 @@
*/
package org.apache.mina.handler.chain;
+import org.apache.mina.common.IoSession;
+
/**
* <p>A {@link Command} encapsulates a unit of processing work to be
* performed, whose purpose is to examine and/or modify the state of a
@@ -97,5 +99,5 @@
* of this {@link Context} should be delegated to a subsequent
* {@link Command} in an enclosing {@link Chain}
*/
- boolean execute( Context context ) throws Exception;
+ boolean execute( IoSession session ) throws Exception;
}
Propchange: directory/network/trunk/src/java/org/apache/mina/handler/chain/Command.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Modified: directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java?rev=354255&r1=354254&r2=354255&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java Mon Dec 5 17:46:50 2005
@@ -16,6 +16,8 @@
*/
package org.apache.mina.handler.chain;
+import org.apache.mina.common.IoSession;
+
/**
* <p>A {@link Filter} is a specialized {@link Command} that also expects
* the {@link Chain} that is executing it to call the
@@ -59,5 +61,5 @@
* method (and therefore need not be rethrown), return <code>true</code>;
* otherwise return <code>false</code>
*/
- boolean postprocess( Context context, Exception exception );
+ boolean postprocess( IoSession session, Object message, Exception exception );
}
Propchange: directory/network/trunk/src/java/org/apache/mina/handler/chain/Filter.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision