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/04/23 19:43:27 UTC

svn commit: r164404 - in /directory/network/trunk: src/examples/org/apache/mina/examples/echoserver/ssl/ src/examples/org/apache/mina/examples/httpserver/ src/java/org/apache/mina/io/ src/java/org/apache/mina/io/handler/ src/java/org/apache/mina/protocol/ xdocs/

Author: trustin
Date: Sat Apr 23 10:43:26 2005
New Revision: 164404

URL: http://svn.apache.org/viewcvs?rev=164404&view=rev
Log:
* Added StreamIoHandler that enables stream-based I/O for MINA
* Added HTTP server example
* Added some JavaDocs

Added:
    directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html   (with props)
    directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/
    directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java   (with props)
    directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java   (with props)
    directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html   (with props)
    directory/network/trunk/src/java/org/apache/mina/io/handler/
    directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java   (with props)
    directory/network/trunk/src/java/org/apache/mina/io/handler/package.html   (with props)
Modified:
    directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
    directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
    directory/network/trunk/xdocs/index.xml

Added: directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+SSL support classes.
+</body>
+</html>

Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/echoserver/ssl/package.html
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,127 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 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.examples.httpserver;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+
+import org.apache.mina.io.IoSession;
+import org.apache.mina.io.handler.StreamIoHandler;
+
+/**
+ * A simplistic HTTP protocol handler that replies back the URL and headers
+ * which a client requested.
+ * 
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class HttpProtocolHandler extends StreamIoHandler
+{
+    protected void processStreamIo( IoSession session, InputStream in,
+                                    OutputStream out )
+    {
+        // You *MUST* execute stream I/O logic in a separate thread.
+        new Worker( in, out ).start();
+    }
+    
+    private static class Worker extends Thread
+    {
+        private final InputStream in;
+        private final OutputStream out;
+        
+        public Worker( InputStream in, OutputStream out )
+        {
+            setDaemon( true );
+            this.in = in;
+            this.out = out;
+        }
+        
+        public void run()
+        {
+            String url;
+            Map headers = new TreeMap();
+            BufferedReader in = new BufferedReader(
+                    new InputStreamReader( this.in ) );
+            PrintWriter out = new PrintWriter(
+                    new BufferedWriter( new OutputStreamWriter( this.out ) ) );
+            
+            try
+            {
+                // Get request URL.
+                url = in.readLine().split( " " )[1];
+                
+                // Read header
+                String line;
+                while ( ( line = in.readLine() ) != null && !line.equals( "" ) )
+                {
+                    String[] tokens = line.split(": ");
+                    headers.put( tokens[0], tokens[1] );
+                }
+                
+                // Write header
+                out.println( "HTTP/1.0 200 OK" );
+                out.println( "Content-Type: text/html" );
+                out.println( "Server: MINA Example" );
+                out.println();
+                
+                // Write content
+                out.println( "<html><head></head><body>" );
+                out.println( "<h3>Request Summary for: " + url + "</h3>" );
+                out.println( "<table border=\"1\"><tr><th>Key</th><th>Value</th></tr>" );
+                
+                Iterator it = headers.entrySet().iterator();
+                while( it.hasNext() )
+                {
+                    Entry e = ( Entry ) it.next();
+                    out.println( "<tr><td>" + e.getKey() + "</td><td>" + e.getValue() + "</td></tr>" );
+                }
+                
+                out.println( "</table>" );
+                out.println( "</body></html>" );
+            }
+            catch( Exception e )
+            {
+                e.printStackTrace();
+            }
+            finally
+            {
+                out.flush();
+                out.close();
+                try
+                {
+                    in.close();
+                }
+                catch( IOException e )
+                {
+                }
+            }
+        }
+    }
+}

Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/HttpProtocolHandler.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,71 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 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.examples.httpserver;
+
+import java.net.InetSocketAddress;
+
+import org.apache.mina.examples.echoserver.ssl.BogusSSLContextFactory;
+import org.apache.mina.io.IoAcceptor;
+import org.apache.mina.io.filter.IoThreadPoolFilter;
+import org.apache.mina.io.filter.SSLFilter;
+import org.apache.mina.io.socket.SocketAcceptor;
+
+/**
+ * (<b>Entry point</b>) HTTP server
+ * 
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public class Main
+{
+    /** Choose your favorite port number. */
+    private static final int PORT = 8080;
+    
+    /** Set this to true if you want to make the server SSL */
+    private static final boolean USE_SSL = false;
+
+    public static void main( String[] args ) throws Exception
+    {
+        // Create a I/O thread pool filter 
+        IoThreadPoolFilter threadPoolFilter = new IoThreadPoolFilter();
+        threadPoolFilter.start(); // and start it
+
+        // Create a TCP/IP acceptor
+        IoAcceptor acceptor = new SocketAcceptor();
+
+        // Add thread pool filter
+        // MINA runs in a single thread if you don't add this filter.
+        acceptor.getFilterChain().addFirst( "threadPool", threadPoolFilter );
+
+        // Add SSL filter if SSL is enabled.
+        if( USE_SSL )
+        {
+            System.out.println( "SSL is enabled." );
+            SSLFilter sslFilter = new SSLFilter( BogusSSLContextFactory
+                    .getInstance( true ) );
+            acceptor.getFilterChain().addLast( "sslFilter", sslFilter );
+        }
+
+        // Bind
+        acceptor.bind( new InetSocketAddress( PORT ),
+                new HttpProtocolHandler() );
+
+        System.out.println( "Listening on port " + PORT );
+    }
+}

Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/Main.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html (added)
+++ directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+Simplistic HTTP server which demonstates stream-based I/O support.
+</body>
+</html>

Propchange: directory/network/trunk/src/examples/org/apache/mina/examples/httpserver/package.html
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/io/AbstractIoHandlerFilterChain.java Sat Apr 23 10:43:26 2005
@@ -1,3 +1,21 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 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.io;
 
 import java.util.ArrayList;
@@ -28,7 +46,7 @@
  * finally to be written to the underlying transport layer (e.g. socket)
  * 
  * @author The Apache Directory Project
- * @version $Rev$, $Date$,
+ * @version $Rev$, $Date$
  */
 public abstract class AbstractIoHandlerFilterChain implements IoHandlerFilterChain
 {

Added: directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java (added)
+++ directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java Sat Apr 23 10:43:26 2005
@@ -0,0 +1,290 @@
+package org.apache.mina.io.handler;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PipedOutputStream;
+import java.net.SocketTimeoutException;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.io.IoHandlerAdapter;
+import org.apache.mina.io.IoSession;
+
+/**
+ * A {@lin IoHandler} that adapts asynchronous MINA events to stream I/O.
+ * <p>
+ * Please extend this class and implement
+ * {@link #processStreamIo(IoSession, InputStream, OutputStream)} to
+ * execute your stream I/O logic; <b>please note that you must forward
+ * the process request to other thread or thread pool.</b>
+ * 
+ * @author The Apache Directory Project (dev@directory.apache.org)
+ * @author Trustin Lee (trustin@apache.org)
+ * @version $Rev$, $Date$
+ */
+public abstract class StreamIoHandler extends IoHandlerAdapter
+{
+    private static final String KEY_IN = "BlockingIoHandler.in";
+    private static final String KEY_OUT = "BlockingIoHandler.out";
+    private static final String KEY_STARTED = "BlockingIoHandler.started";
+    
+    private int readTimeout;
+    
+    private int writeTimeout;
+    
+    protected StreamIoHandler()
+    {
+    }
+    
+    /**
+     * Implement this method to execute your stream I/O logic;
+     * <b>please note that you must forward the process request to other
+     * thread or thread pool.</b>
+     */
+    protected abstract void processStreamIo( IoSession session,
+                                             InputStream in, OutputStream out );
+    
+    /**
+     * Returns read timeout in seconds.
+     * The default value is <tt>0</tt> (disabled).
+     */
+    public int getReadTimeout()
+    {
+        return readTimeout;
+    }
+    
+    /**
+     * Sets read timeout in seconds.
+     * The default value is <tt>0</tt> (disabled).
+     */
+    public void setReadTimeout( int readTimeout )
+    {
+        this.readTimeout = readTimeout;
+    }
+    
+    /**
+     * Returns write timeout in seconds.
+     * The default value is <tt>0</tt> (disabled).
+     */
+    public int getWriteTimeout()
+    {
+        return writeTimeout;
+    }
+    
+    /**
+     * Sets write timeout in seconds.
+     * The default value is <tt>0</tt> (disabled).
+     */
+    public void setWriteTimeout( int writeTimeout )
+    {
+        this.writeTimeout = writeTimeout;
+    }
+
+    /**
+     * Initializes streams and timeout settings.
+     */
+    public void sessionOpened( IoSession session )
+    {
+        // Set timeouts
+        session.getConfig().setWriteTimeout( writeTimeout );
+        session.getConfig().setIdleTime( IdleStatus.READER_IDLE, readTimeout );
+
+        // Create streams
+        PipedOutputStream out = new PipedOutputStream();
+        session.setAttribute( KEY_OUT, out );
+        try
+        {
+            session.setAttribute( KEY_IN, new PipedInputStream( out ) );
+        }
+        catch( IOException e )
+        {
+            throw new StreamIoException( e );
+        }
+    }
+    
+    /**
+     * Closes input stream.
+     */
+    public void sessionClosed( IoSession session )
+    {
+        final PipedOutputStream out = ( PipedOutputStream ) session.getAttribute( KEY_OUT );
+        try {
+            out.close();
+        }
+        catch( IOException e )
+        {
+            throw new StreamIoException( e );
+        }
+    }
+
+    /**
+     * Forwards read data to input stream.
+     */
+    public void dataRead( IoSession session, ByteBuffer buf )
+    {
+        final PipedInputStream in = ( PipedInputStream ) session.getAttribute( KEY_IN );
+        final PipedOutputStream out = ( PipedOutputStream ) session.getAttribute( KEY_OUT );
+        
+        java.nio.ByteBuffer nioBuf = buf.buf();
+        int offset = nioBuf.position();
+        int length = nioBuf.limit() - offset;
+        if( !nioBuf.hasArray() )
+        {
+            ByteBuffer heapBuf = ByteBuffer.allocate( length, false );
+            heapBuf.put( buf );
+            heapBuf.flip();
+            nioBuf = heapBuf.buf();
+            offset = 0;
+        }
+        
+        try
+        {
+            out.write( nioBuf.array(), offset, length );
+        }
+        catch( IOException e )
+        {
+            throw new StreamIoException( e );
+        }
+        finally
+        {
+            beginService( session, in );
+        }
+    }
+
+    /**
+     * Forwards caught exceptions to input stream.
+     */
+    public void exceptionCaught( IoSession session, Throwable cause )
+    {
+        final PipedInputStream in = ( PipedInputStream ) session.getAttribute( KEY_IN );
+        
+        IOException e = null;
+        if( cause instanceof StreamIoException )
+        {
+            e = ( IOException ) cause.getCause();
+        }
+        else if( cause instanceof IOException )
+        {
+            e = ( IOException ) cause;
+        }
+        
+        if( e != null && in != null )
+        {
+            in.setException( e );
+            beginService( session, in );
+        }
+        else
+        {
+            cause.printStackTrace();
+            session.close();
+        }
+    }
+
+    /**
+     * Handles read timeout.
+     */
+    public void sessionIdle( IoSession session, IdleStatus status )
+    {
+        if( status == IdleStatus.READER_IDLE )
+        {
+            throw new StreamIoException(
+                    new SocketTimeoutException( "Read timeout" ) );
+        }
+    }
+
+    private void beginService( IoSession session, PipedInputStream in )
+    {
+        if( session.getAttribute( KEY_STARTED ) == null )
+        {
+            session.setAttribute( KEY_STARTED, Boolean.TRUE );
+            processStreamIo( session, in, new ServiceOutputStream( session ) );
+        }
+    }
+
+    private static class PipedInputStream extends java.io.PipedInputStream
+    {
+        private IOException exception;
+
+        public PipedInputStream(PipedOutputStream src) throws IOException
+        {
+            super( src );
+        }
+        
+        public void setException( IOException e )
+        {
+            this.exception = e;
+        }
+
+        public synchronized int read() throws IOException
+        {
+            throwException();
+            return super.read();
+        }
+
+        public synchronized int read( byte[] b, int off, int len ) throws IOException
+        {
+            throwException();
+            return super.read( b, off, len );
+        }
+        
+        private void throwException() throws IOException
+        {
+            if( exception != null )
+            {
+                throw exception;
+            }
+        }
+    }
+
+    private static class ServiceOutputStream extends OutputStream
+    {
+        private final IoSession session;
+        
+        public ServiceOutputStream( IoSession session )
+        {
+            this.session = session;
+        }
+
+        public void close()
+        {
+            session.close( true );
+        }
+
+        public void flush()
+        {
+        }
+
+        public void write( byte[] b, int off, int len )
+        {
+            ByteBuffer buf = ByteBuffer.wrap( b, off, len );
+            buf.acquire(); // prevent from being pooled.
+            session.write( buf, null );
+        }
+
+        public void write( byte[] b )
+        {
+            ByteBuffer buf = ByteBuffer.wrap( b );
+            buf.acquire(); // prevent from being pooled.
+            session.write( buf, null );
+        }
+
+        public void write( int b )
+        {
+            ByteBuffer buf = ByteBuffer.allocate( 1 );
+            buf.put( ( byte ) b );
+            buf.flip();
+            session.write( buf, null );
+        }
+    }
+    
+    private static class StreamIoException extends RuntimeException
+    {
+        private static final long serialVersionUID = 3976736960742503222L;
+
+        public StreamIoException( IOException cause )
+        {
+            super(cause);
+        }
+    }
+}

Propchange: directory/network/trunk/src/java/org/apache/mina/io/handler/StreamIoHandler.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/network/trunk/src/java/org/apache/mina/io/handler/package.html
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/io/handler/package.html?rev=164404&view=auto
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/io/handler/package.html (added)
+++ directory/network/trunk/src/java/org/apache/mina/io/handler/package.html Sat Apr 23 10:43:26 2005
@@ -0,0 +1,8 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body>
+Useful <code>IoHandler</code> implementations.
+</body>
+</html>

Propchange: directory/network/trunk/src/java/org/apache/mina/io/handler/package.html
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Modified: directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/protocol/AbstractProtocolHandlerFilterChain.java Sat Apr 23 10:43:26 2005
@@ -1,3 +1,21 @@
+/*
+ *   @(#) $Id$
+ *
+ *   Copyright 2004 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.protocol;
 
 import java.util.ArrayList;
@@ -10,6 +28,25 @@
 import org.apache.mina.common.IdleStatus;
 import org.apache.mina.protocol.ProtocolHandlerFilter.NextFilter;
 
+/**
+ * An abstract implementation of {@link ProtocolHandlerFilterChain} that provides
+ * common operations for developers to extend protocol layer.
+ * <p>
+ * All methods has been implemented.  The list of filters is maintained
+ * as a doublely linked list.  You can fire any MINA events which is filtered
+ * by this chain using these public methods:
+ * <ul>
+ *   <li></li>
+ * </ul>
+ * 
+ * The only method a developer should implement is {@link #doWrite(ProtocolSession, Object)}.
+ * This method is invoked when filter chain is evaluated for
+ * {@link ProtocolHandlerFilter#filterWrite(NextFilter, ProtocolSession, Object)} and 
+ * finally to be written out.
+ * 
+ * @author The Apache Directory Project
+ * @version $Rev$, $Date$
+ */
 public abstract class AbstractProtocolHandlerFilterChain implements ProtocolHandlerFilterChain
 {
     private final ProtocolHandlerFilter HEAD_FILTER = new ProtocolHandlerFilter()

Modified: directory/network/trunk/xdocs/index.xml
URL: http://svn.apache.org/viewcvs/directory/network/trunk/xdocs/index.xml?rev=164404&r1=164403&r2=164404&view=diff
==============================================================================
--- directory/network/trunk/xdocs/index.xml (original)
+++ directory/network/trunk/xdocs/index.xml Sat Apr 23 10:43:26 2005
@@ -68,6 +68,11 @@
                         <td>Client</td>
                     </tr>
                     <tr>
+                        <td><a target="classFrame" href="xref-examples/org/apache/mina/examples/httpserver/package-summary.html">HTTP server</a></td>
+                        <td>Stream-based I/O support.</td>
+                        <td>Server</td>
+                    </tr>
+                    <tr>
                         <td><a target="classFrame" href="xref-examples/org/apache/mina/examples/tennis/package-summary.html">Tennis</a></td>
                         <td>In-VM pipe support in protocol layer.</td>
                         <td>Both</td>