Return-Path: Delivered-To: apmail-incubator-directory-cvs-archive@www.apache.org Received: (qmail 61895 invoked from network); 14 Mar 2005 03:45:21 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 14 Mar 2005 03:45:21 -0000 Received: (qmail 64414 invoked by uid 500); 14 Mar 2005 03:45:20 -0000 Delivered-To: apmail-incubator-directory-cvs-archive@incubator.apache.org Received: (qmail 64309 invoked by uid 500); 14 Mar 2005 03:45:20 -0000 Mailing-List: contact directory-cvs-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: directory-dev@incubator.apache.org Delivered-To: mailing list directory-cvs@incubator.apache.org Received: (qmail 64294 invoked by uid 99); 14 Mar 2005 03:45:19 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Sun, 13 Mar 2005 19:45:19 -0800 Received: (qmail 61810 invoked by uid 65534); 14 Mar 2005 03:45:18 -0000 Message-ID: <20050314034518.61809.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Mailer: svnmailer-1.0.0-dev Date: Mon, 14 Mar 2005 03:45:18 -0000 Subject: svn commit: r157372 - directory/network/mina/trunk/src/java/org/apache/mina/protocol/DemuxingProtocolHandler.java To: directory-cvs@incubator.apache.org From: trustin@apache.org X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: trustin Date: Sun Mar 13 19:45:17 2005 New Revision: 157372 URL: http://svn.apache.org/viewcvs?view=3Drev&rev=3D157372 Log: Added: DemuxingProtocolHandler Added: directory/network/mina/trunk/src/java/org/apache/mina/protocol/Demuxing= ProtocolHandler.java (with props) Added: directory/network/mina/trunk/src/java/org/apache/mina/protocol/Demux= ingProtocolHandler.java URL: http://svn.apache.org/viewcvs/directory/network/mina/trunk/src/java/or= g/apache/mina/protocol/DemuxingProtocolHandler.java?view=3Dauto&rev=3D157372 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- directory/network/mina/trunk/src/java/org/apache/mina/protocol/Demuxing= ProtocolHandler.java (added) +++ directory/network/mina/trunk/src/java/org/apache/mina/protocol/Demuxing= ProtocolHandler.java Sun Mar 13 19:45:17 2005 @@ -0,0 +1,178 @@ +/* + * @(#) $Id$ + */ +package org.apache.mina.protocol; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * A {@link ProtocolHandler} that demuxes messageReceived eve= nts + * to the appropriate {@link MessageHandler}. + *=20 + * You can freely register and deregister {@link MessageHandler}s using + * {@link #registerMessageType(Class, MessageHandler)} and + * {@link #deregisterMessageType(Class)}. + *=20 + * @author The Apache Directory Project + * @version $Rev$, $Date$ + */ +public abstract class DemuxingProtocolHandler implements ProtocolHandler +{ + private final Map type2handler =3D new HashMap(); + + /** + * Creates a new instance with no registered {@link MessageHandler}s. + */ + protected DemuxingProtocolHandler() + { + } + + /** + * Registers a {@link MessageHandler} that receives the messages of + * the specified type. + */ + protected void registerMessageType( Class type, MessageHandler handler= ) + { + synchronized( type2handler ) + { + type2handler.put( type, handler ); + } + } + + /** + * Deregisters a {@link MessageHandler} that receives the messages of + * the specified type. + */ + protected void deregisterMessageType( Class clazz ) + { + synchronized( type2handler ) + { + type2handler.remove( clazz ); + } + } + + /** + * Forwards the received events into the appropriate {@link MessageHan= dler} + * which is registered by {@link #registerMessageType(Class, MessageHa= ndler)}. + */ + public void messageReceived( ProtocolSession session, Object message ) + { + MessageHandler handler =3D getHandler( message.getClass() ); + if( handler !=3D null ) + { + handler.messageReceived( session, message ); + } + else + { + throw new UnknownMessageTypeException( + "No message handler found for message: " + message ); + } + } + + private MessageHandler getHandler( Class type ) + { + MessageHandler handler =3D ( MessageHandler ) type2handler.get( ty= pe ); + if( handler =3D=3D null ) + { + handler =3D getHandler( type, new HashSet() ); + } + + return handler; + } + + private MessageHandler getHandler( Class type, Set triedClassNames ) + { + MessageHandler handler; + + String typeName =3D type.getName(); + if( triedClassNames.contains( typeName ) ) + return null; + triedClassNames.add( typeName ); + + handler =3D ( MessageHandler ) type2handler.get( typeName ); + if( handler =3D=3D null ) + { + handler =3D getHandler( type, triedClassNames ); + if( handler !=3D null ) + return handler; + + Class[] interfaces =3D type.getInterfaces(); + for( int i =3D 0; i < interfaces.length; i ++ ) + { + handler =3D getHandler( interfaces[ i ], triedClassNames ); + if( handler !=3D null ) + return handler; + } + + return null; + } + else + return handler; + } + + /** + * A handler interface that {@link DemuxingProtocolHandler} forwards + * messageReceived events to. You have to register your + * handler with the type of message you want to get notified using + * {@link DemuxingProtocolHandler#registerMessageType(Class, MessageHa= ndler)}. + *=20 + * @author The Apache Directory Project + * @version $Rev$, $Date$ + */ + public interface MessageHandler + { + /** + * A {@link MessageHandler} that does nothing. This is usefule wh= en + * you want to ignore messages of the specific type silently. + */ + static MessageHandler NOOP =3D new MessageHandler() + { + public void messageReceived( ProtocolSession session, Object m= essage ) + { + } + }; + =20 + /** + * Invoked when the specific type of message is received from the + * specified session. + */ + void messageReceived( ProtocolSession session, Object message ); + } + + /** + * An exception that is thrown when {@link DemuxingProtocolHandler} + * cannot find any {@link MessageHandler}s associated with the specific + * message type. You have to use + * {@link DemuxingProtocolHandler#registerMessageType(Class, MessageHa= ndler)} + * to associate a message type and a message handler.=20 + *=20 + * @author The Apache Directory Project + * @version $Rev$, $Date$ + */ + public class UnknownMessageTypeException extends RuntimeException + { + private static final long serialVersionUID =3D 3257290227428047158= L; + + public UnknownMessageTypeException() + { + } + + public UnknownMessageTypeException( String message, Throwable caus= e ) + { + super( message, cause ); + } + + public UnknownMessageTypeException( String message ) + { + super( message ); + } + + public UnknownMessageTypeException( Throwable cause ) + { + super( cause ); + } + } +} Propchange: directory/network/mina/trunk/src/java/org/apache/mina/protocol/= DemuxingProtocolHandler.java ---------------------------------------------------------------------------= --- svn:keywords =3D HeadURL Id LastChangedBy LastChangedDate LastChangedRe= vision