You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pr...@apache.org on 2006/04/28 23:45:59 UTC
svn commit: r398024 - in
/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support:
AbstractIoFilterChain.java IoFilterLifeCycleManager.java
ReferenceCountingIoFilterWrapper.java
Author: proyal
Date: Fri Apr 28 14:45:56 2006
New Revision: 398024
URL: http://svn.apache.org/viewcvs?rev=398024&view=rev
Log:
DIRMINA-185 - Reference-counting based init/destroy of IoFilters has been moved into a wrapper class that can be used when users desire that behavior. By default, MINA will not init/destroy IoFilter instances.
Added:
directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java (contents, props changed)
- copied, changed from r397283, directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoFilterLifeCycleManager.java
Removed:
directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoFilterLifeCycleManager.java
Modified:
directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java
Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java?rev=398024&r1=398023&r2=398024&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/AbstractIoFilterChain.java Fri Apr 28 14:45:56 2006
@@ -18,23 +18,23 @@
*/
package org.apache.mina.common.support;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoFilter;
+import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.common.IoFilter.WriteRequest;
import org.apache.mina.common.IoFilterAdapter;
import org.apache.mina.common.IoFilterChain;
import org.apache.mina.common.IoFilterLifeCycleException;
import org.apache.mina.common.IoSession;
-import org.apache.mina.common.IoFilter.NextFilter;
-import org.apache.mina.common.IoFilter.WriteRequest;
import org.apache.mina.util.ByteBufferUtil;
import org.apache.mina.util.SessionLog;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
/**
* An abstract implementation of {@link IoFilterChain} that provides
* common operations for developers to implement their own transport layer.
@@ -42,9 +42,9 @@
* The only method a developer should implement is
* {@link #doWrite(IoSession, IoFilter.WriteRequest)}. This method is invoked
* when filter chain is evaluated for
- * {@link IoFilter#filterWrite(NextFilter, IoSession, IoFilter.WriteRequest)} and
+ * {@link IoFilter#filterWrite(NextFilter, IoSession, IoFilter.WriteRequest)} and
* finally to be written out.
- *
+ *
* @author The Apache Directory Project (mina-dev@directory.apache.org)
* @version $Rev$, $Date$
*/
@@ -53,7 +53,7 @@
private final IoSession session;
private final Map name2entry = new HashMap();
-
+
private final EntryImpl head;
private final EntryImpl tail;
@@ -63,13 +63,13 @@
{
throw new NullPointerException( "session" );
}
-
+
this.session = session;
head = new EntryImpl( null, null, "head", createHeadFilter() );
tail = new EntryImpl( head, null, "tail", createTailFilter() );
head.nextEntry = tail;
}
-
+
/**
* Override this method to create custom head of this filter chain.
*/
@@ -115,7 +115,7 @@
{
nextFilter.messageSent( session, message );
}
-
+
public void filterWrite( NextFilter nextFilter, IoSession session,
WriteRequest writeRequest ) throws Exception
{
@@ -126,7 +126,7 @@
else
{
throw new IllegalStateException(
- "Write requests must be transformed to " +
+ "Write requests must be transformed to " +
session.getTransportType().getEnvelopeType() +
": " + writeRequest );
}
@@ -138,7 +138,7 @@
}
};
}
-
+
/**
* Override this method to create custom head of this filter chain.
*/
@@ -218,12 +218,12 @@
}
};
}
-
+
public IoSession getSession()
{
return session;
}
-
+
public Entry getEntry( String name )
{
Entry e = ( Entry ) name2entry.get( name );
@@ -233,7 +233,7 @@
}
return e;
}
-
+
public IoFilter get( String name )
{
Entry e = getEntry( name );
@@ -241,10 +241,10 @@
{
return null;
}
-
+
return e.getFilter();
}
-
+
public NextFilter getNextFilter( String name )
{
Entry e = getEntry( name );
@@ -252,10 +252,10 @@
{
return null;
}
-
+
return e.getNextFilter();
}
-
+
public synchronized void addFirst( String name,
IoFilter filter )
{
@@ -308,58 +308,55 @@
{
EntryImpl newEntry = new EntryImpl( prevEntry, prevEntry.nextEntry, name, filter );
- IoFilterLifeCycleManager lifeCycleManager = IoFilterLifeCycleManager.getInstance();
-
- synchronized( lifeCycleManager )
- {
- lifeCycleManager.callInitIfNecessary( filter );
- try
- {
- lifeCycleManager.callOnPreAdd( this, name, filter, newEntry.getNextFilter() );
- }
- finally
- {
- lifeCycleManager.callDestroyIfNecessary( filter );
- }
+ try
+ {
+ filter.onPreAdd( this, name, newEntry.getNextFilter() );
+ }
+ catch( Exception e )
+ {
+ throw new IoFilterLifeCycleException( "onPreAdd(): " + name + ':' + filter + " in " + getSession(), e );
+ }
- prevEntry.nextEntry.prevEntry = newEntry;
- prevEntry.nextEntry = newEntry;
- name2entry.put( name, newEntry );
+ prevEntry.nextEntry.prevEntry = newEntry;
+ prevEntry.nextEntry = newEntry;
+ name2entry.put( name, newEntry );
- try
- {
- lifeCycleManager.callOnPostAdd( this, name, filter, newEntry.getNextFilter() );
- }
- catch( IoFilterLifeCycleException e )
- {
- deregister0( newEntry );
- throw e;
- }
- finally
- {
- lifeCycleManager.callDestroyIfNecessary( filter );
- }
+ try
+ {
+ filter.onPostAdd( this, name, newEntry.getNextFilter() );
+ }
+ catch( Exception e )
+ {
+ deregister0( newEntry );
+ throw new IoFilterLifeCycleException( "onPostAdd(): " + name + ':' + filter + " in " + getSession(), e );
}
}
-
+
private void deregister( EntryImpl entry )
{
IoFilter filter = entry.getFilter();
- IoFilterLifeCycleManager lifeCycleManager = IoFilterLifeCycleManager.getInstance();
-
- lifeCycleManager.callOnPreRemove( this, entry.getName(), filter, entry.getNextFilter() );
-
+
+ try
+ {
+ filter.onPreRemove( this, entry.getName(), entry.getNextFilter() );
+ }
+ catch( Exception e )
+ {
+ throw new IoFilterLifeCycleException( "onPreRemove(): " + entry.getName() + ':' + filter
+ + " in " + getSession(), e );
+ }
+
deregister0( entry );
try
{
- lifeCycleManager.callOnPostRemove(
- this, entry.getName(), filter, entry.getNextFilter() );
+ filter.onPostRemove( this, entry.getName(), entry.getNextFilter() );
}
- finally
+ catch( Exception e )
{
- lifeCycleManager.callDestroyIfNecessary( filter );
+ throw new IoFilterLifeCycleException( "onPostRemove(): " + entry.getName() + ':' + filter
+ + " in " + getSession(), e );
}
}
@@ -449,7 +446,7 @@
{
exceptionCaught( session, t );
}
-
+
// And start the chain.
Entry head = this.head;
callNextSessionClosed(head, session);
@@ -461,7 +458,7 @@
try
{
entry.getFilter().sessionClosed( entry.getNextFilter(), session );
-
+
}
catch( Throwable e )
{
@@ -537,7 +534,7 @@
private void callNextMessageSent( Entry entry,
IoSession session,
- Object message )
+ Object message )
{
try
{
@@ -570,7 +567,7 @@
"Unexpected exception from exceptionCaught handler.", e );
}
}
-
+
public void filterWrite( IoSession session, WriteRequest writeRequest )
{
Entry tail = this.tail;
@@ -634,7 +631,7 @@
}
return list;
}
-
+
public boolean contains( String name )
{
return getEntry( name ) != null;
@@ -672,9 +669,9 @@
{
StringBuffer buf = new StringBuffer();
buf.append( "{ " );
-
+
boolean empty = true;
-
+
EntryImpl e = head.nextEntry;
while( e != tail )
{
@@ -686,7 +683,7 @@
{
empty = false;
}
-
+
buf.append( '(' );
buf.append( e.getName() );
buf.append( ':' );
@@ -700,13 +697,13 @@
{
buf.append( "empty" );
}
-
+
buf.append( " }" );
-
+
return buf.toString();
}
-
+
protected void finalize() throws Throwable
{
try
@@ -720,7 +717,7 @@
}
protected abstract void doWrite( IoSession session, WriteRequest writeRequest ) throws Exception;
-
+
protected abstract void doClose( IoSession session ) throws Exception;
private class EntryImpl implements Entry
@@ -730,11 +727,11 @@
private EntryImpl nextEntry;
private final String name;
-
+
private final IoFilter filter;
private final NextFilter nextFilter;
-
+
private EntryImpl( EntryImpl prevEntry, EntryImpl nextEntry,
String name, IoFilter filter )
{
@@ -746,7 +743,7 @@
{
throw new NullPointerException( "name" );
}
-
+
this.prevEntry = prevEntry;
this.nextEntry = nextEntry;
this.name = name;
@@ -795,7 +792,7 @@
Entry nextEntry = EntryImpl.this.nextEntry;
callNextMessageSent( nextEntry, session, message );
}
-
+
public void filterWrite( IoSession session, WriteRequest writeRequest )
{
Entry nextEntry = EntryImpl.this.prevEntry;
Copied: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java (from r397283, directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoFilterLifeCycleManager.java)
URL: http://svn.apache.org/viewcvs/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java?p2=directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java&p1=directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoFilterLifeCycleManager.java&r1=397283&r2=398024&rev=398024&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/IoFilterLifeCycleManager.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java Fri Apr 28 14:45:56 2006
@@ -18,183 +18,114 @@
*/
package org.apache.mina.common.support;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
+import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoFilter;
import org.apache.mina.common.IoFilterChain;
-import org.apache.mina.common.IoFilterLifeCycleException;
-import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.common.IoSession;
/**
- * Manages the life cycle of {@link IoFilter}s globally.
+ * An {@link IoFilter}s wrapper that keeps track of the number of usages of this filter and will call init/destroy
+ * when the filter is not in use.
*
* @author The Apache Directory Project (mina-dev@directory.apache.org)
* @version $Rev$, $Date$
*/
-public class IoFilterLifeCycleManager
+public class ReferenceCountingIoFilterWrapper implements IoFilter
{
- private static final IoFilterLifeCycleManager INSTANCE = new IoFilterLifeCycleManager();
-
- public static IoFilterLifeCycleManager getInstance()
+ private final IoFilter filter;
+ private int count = 0;
+
+ public ReferenceCountingIoFilterWrapper( IoFilter filter )
{
- return INSTANCE;
+ this.filter = filter;
}
-
- private Map counts = new IdentityHashMap();
-
- private IoFilterLifeCycleManager()
+
+ public void init() throws Exception
{
+ // no-op, will init on-demand in pre-add if count == 0
}
-
- public synchronized void callInitIfNecessary( IoFilter filter )
+
+ public void destroy() throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null )
- {
- count = new ReferenceCount();
- counts.put( filter, count );
- try
- {
- filter.init();
- }
- catch( Throwable t )
- {
- throw new IoFilterLifeCycleException(
- "init(): " + filter, t );
- }
- }
+ //no-op, will destroy on-demand in post-remove if count == 0
}
-
- public synchronized void callOnPreAdd( IoFilterChain chain, String name, IoFilter filter, NextFilter nextFilter )
+
+ public synchronized void onPreAdd( IoFilterChain parent, String name, NextFilter nextFilter ) throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null )
+ if( 0 == count )
{
- throw new IllegalStateException();
- }
-
- count.increase();
+ filter.init();
- try
- {
- filter.onPreAdd( chain, name, nextFilter );
- }
- catch( Throwable t )
- {
- throw new IoFilterLifeCycleException(
- "onPreAdd(): " + name + ':' + filter + " in " +
- chain.getSession(), t );
+ ++count;
}
+
+ filter.onPreAdd( parent, name, nextFilter );
}
- public synchronized void callOnPreRemove( IoFilterChain chain, String name, IoFilter filter, NextFilter nextFilter )
+ public synchronized void onPostRemove( IoFilterChain parent, String name, NextFilter nextFilter ) throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null || count.get() == 0 )
- {
- return;
- }
+ filter.onPostRemove( parent, name, nextFilter );
- try
- {
- filter.onPreRemove( chain, name, nextFilter);
- }
- catch( Throwable t )
- {
- throw new IoFilterLifeCycleException(
- "onPreRemove(): " + name + ':' + filter + " in " +
- chain.getSession(), t );
+ --count;
+
+ if( 0 == count ) {
+ filter.destroy();
}
}
-
- public synchronized void callOnPostAdd( IoFilterChain chain, String name, IoFilter filter, NextFilter nextFilter )
+
+ public void exceptionCaught( NextFilter nextFilter, IoSession session, Throwable cause ) throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null )
- {
- throw new IllegalStateException();
- }
-
- try
- {
- filter.onPostAdd( chain, name, nextFilter );
- }
- catch( Throwable t )
- {
- // Revert back the reference count.
- count.decrease();
+ filter.exceptionCaught( nextFilter, session, cause );
+ }
- throw new IoFilterLifeCycleException(
- "onPostAdd(): " + name + ':' + filter + " in " +
- chain.getSession(), t );
- }
+ public void filterClose( NextFilter nextFilter, IoSession session ) throws Exception
+ {
+ filter.filterClose( nextFilter, session );
}
- public synchronized void callOnPostRemove( IoFilterChain chain, String name, IoFilter filter, NextFilter nextFilter )
+ public void filterWrite( NextFilter nextFilter, IoSession session, WriteRequest writeRequest )
+ throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null || count.get() == 0 )
- {
- return;
- }
+ filter.filterWrite( nextFilter, session, writeRequest );
+ }
- try
- {
- filter.onPostRemove( chain, name, nextFilter);
- }
- catch( Throwable t )
- {
- throw new IoFilterLifeCycleException(
- "onPostRemove(): " + name + ':' + filter + " in " +
- chain.getSession(), t );
- }
- finally
- {
- count.decrease();
- }
+ public void messageReceived( NextFilter nextFilter, IoSession session, Object message ) throws Exception
+ {
+ filter.messageReceived( nextFilter, session, message );
}
- public synchronized void callDestroyIfNecessary( IoFilter filter )
+ public void messageSent( NextFilter nextFilter, IoSession session, Object message ) throws Exception
{
- ReferenceCount count = ( ReferenceCount ) counts.get( filter );
- if( count == null )
- {
- return;
- }
-
- if( count.get() == 0 )
- {
- counts.remove( filter );
- try
- {
- filter.destroy();
- }
- catch( Throwable t2 )
- {
- throw new IoFilterLifeCycleException( "Failed to destroy: " + filter, t2 );
- }
- }
+ filter.messageSent( nextFilter, session, message );
}
-
- /** Maintains the reference count of an {@link IoFilter}. */
- private static class ReferenceCount
- {
- private int count;
-
- public int get()
- {
- return count;
- }
-
- public int increase()
- {
- return count ++;
- }
-
- public int decrease()
- {
- return -- count;
- }
+
+ public void onPostAdd( IoFilterChain parent, String name, NextFilter nextFilter ) throws Exception
+ {
+ filter.onPostAdd( parent, name, nextFilter );
+ }
+
+ public void onPreRemove( IoFilterChain parent, String name, NextFilter nextFilter ) throws Exception
+ {
+ filter.onPreRemove( parent, name, nextFilter );
+ }
+
+ public void sessionClosed( NextFilter nextFilter, IoSession session ) throws Exception
+ {
+ filter.sessionClosed( nextFilter, session );
+ }
+
+ public void sessionCreated( NextFilter nextFilter, IoSession session ) throws Exception
+ {
+ filter.sessionCreated( nextFilter, session );
+ }
+
+ public void sessionIdle( NextFilter nextFilter, IoSession session, IdleStatus status ) throws Exception
+ {
+ filter.sessionIdle( nextFilter, session, status );
+ }
+
+ public void sessionOpened( NextFilter nextFilter, IoSession session ) throws Exception
+ {
+ filter.sessionOpened( nextFilter, session );
}
}
Propchange: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/ReferenceCountingIoFilterWrapper.java
------------------------------------------------------------------------------
svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision