Author: trustin
Date: Mon Mar 19 18:36:48 2007
New Revision: 520209

URL: http://svn.apache.org/viewvc?view=rev&rev=520209
Log:
Fixed issue: DIRMINA-357 (ConcurrentHashMap.put(key, null) throws an NPE 
effects BaseIOSession attachments/attributes)
* setAttribute() redirects the call to removeAttribute() if the specified key 
is null.
* Merged the changes in 1.1 to trunk


Modified:
    
mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java?view=diff&rev=520209&r1=520208&r2=520209
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
 Mon Mar 19 18:36:48 2007
@@ -181,7 +181,14 @@
 
     public Object setAttribute( String key, Object value )
     {
-        return attributes.put( key, value );
+        if( value == null )
+        {
+            return removeAttribute( key );
+        }
+        else
+        {
+            return attributes.put( key, value );
+        }
     }
 
     public Object setAttribute( String key )

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java?view=diff&rev=520209&r1=520208&r2=520209
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/support/BaseIoSession.java 
Mon Mar 19 18:36:48 2007
@@ -20,10 +20,10 @@
 package org.apache.mina.common.support;
 
 import java.net.SocketAddress;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.mina.common.CloseFuture;
 import org.apache.mina.common.IdleStatus;
@@ -42,7 +42,8 @@
  */
 public abstract class BaseIoSession implements IoSession
 {
-    private final Map<String, Object> attributes = new HashMap<String, 
Object>();
+    private final Object lock = new Object();
+    private final Map<String,Object> attributes = new 
ConcurrentHashMap<String, Object>( );
     private final long creationTime;
 
     /** 
@@ -89,9 +90,12 @@
         return !closeFuture.isClosed();
     }
     
-    public synchronized boolean isClosing()
+    public boolean isClosing()
     {
-        return closing || closeFuture.isClosed();
+        synchronized( lock )
+        {
+            return closing || closeFuture.isClosed();
+        }
     }
     
     public CloseFuture getCloseFuture()
@@ -101,7 +105,7 @@
     
     public CloseFuture close()
     {
-        synchronized( this )
+        synchronized( lock )
         {
             if( isClosing() )
             {
@@ -134,7 +138,7 @@
     
     public WriteFuture write( Object message, SocketAddress remoteAddress )
     {
-        synchronized( this )
+        synchronized( lock )
         {
             if( isClosing() || !isConnected() )
             {
@@ -163,31 +167,26 @@
     
     public Object getAttachment()
     {
-        synchronized( attributes )
-        {
-            return attributes.get( "" );
-        }
+        return attributes.get( "" );
     }
 
     public Object setAttachment( Object attachment )
     {
-        synchronized( attributes )
-        {
-            return attributes.put( "", attachment );
-        }
+        return attributes.put( "", attachment );
     }
 
     public Object getAttribute( String key )
     {
-        synchronized( attributes )
-        {
-            return attributes.get( key );
-        }
+        return attributes.get( key );
     }
 
     public Object setAttribute( String key, Object value )
     {
-        synchronized( attributes )
+        if( value == null )
+        {
+            return removeAttribute( key );
+        }
+        else
         {
             return attributes.put( key, value );
         }
@@ -200,10 +199,7 @@
     
     public Object removeAttribute( String key )
     {
-        synchronized( attributes )
-        {
-            return attributes.remove( key );
-        }
+        return attributes.remove( key );
     }
     
     public boolean containsAttribute( String key )
@@ -213,10 +209,7 @@
 
     public Set<String> getAttributeKeys()
     {
-        synchronized( attributes )
-        {
-            return new HashSet<String>( attributes.keySet() );
-        }
+        return new HashSet<String>( attributes.keySet() );
     }
     
     public int getIdleTime( IdleStatus status )


Reply via email to