Hello,

It appears that in JBossCache-1.4.1.SP3 (and earlier versions) that doing a  
Map.remove() on a Map object in the PojoCache for a key that does not exist 
will result in the key being created in the Map without an associated value.  
After the remove() doing a containsKey() for that key will return 'true'.  From 
that point on the only way to remove the key from the Map is to first assign it 
a value and then doing another remove.

For example: 

The cache with an empty Map added:

/myProperties
_lock_: LOCK
__jboss:internal:class__: class java.util.HashMap
AOPInstance: [EMAIL PROTECTED]



The cache after doing a remove on the key 'MY_KEY'

/myProperties
_lock_: LOCK
__jboss:internal:class__: class java.util.HashMap
AOPInstance: [EMAIL PROTECTED]

    /MY_KEY
_lock_: LOCK


The following unit test demonstrates this problem.  In this test a HashMap is 
added to the cache and a key/value pair is added.  A remove is performed on the 
key and then verified that the key no longer exists in the Map.  A second 
removal on the same key is then done with the same verification which fails.

package org.jboss.cache.aop.collection;
  | 
  | import java.util.HashMap;
  | import java.util.Map;
  | 
  | import junit.framework.Test;
  | import junit.framework.TestCase;
  | import junit.framework.TestSuite;
  | 
  | import org.apache.commons.logging.Log;
  | import org.apache.commons.logging.LogFactory;
  | import org.jboss.cache.PropertyConfigurator;
  | import org.jboss.cache.aop.PojoCache;
  | 
  | 
  | public class MultiRemovalCacheMapAopTest extends TestCase
  | {
  |    Log log=LogFactory.getLog(MultiRemovalCacheMapAopTest.class);
  |    PojoCache cache_;
  |    Map hobbies;
  | 
  |    public MultiRemovalCacheMapAopTest(String name)
  |    {
  |       super(name);
  |    }
  | 
  |    protected void setUp() throws Exception
  |    {
  |       super.setUp();
  |       log.info("setUp() ....");
  |       String configFile = "META-INF/local-service.xml";
  |       cache_ = new PojoCache();
  |       PropertyConfigurator config = new PropertyConfigurator();
  |       config.configure(cache_, configFile); 
  |       cache_.start();
  |    }
  | 
  |    protected void tearDown() throws Exception
  |    {
  |       super.tearDown();
  |       cache_.stop();
  |    }
  | 
  |    public void testMultipleRemoves() throws Exception
  |    {
  |       final String key = "MY_KEY";
  |       
  |       HashMap properties = new HashMap();
  |       cache_.putObject( "/myProperties", properties );
  |       
  |       properties = (HashMap)cache_.getObject( "/myProperties" );
  |       
  |       properties.put( key, "value1");
  |       log.info( cache_.printDetails() );
  |       
  |       assertTrue( properties.containsKey( key ) );
  |       assertNotNull( properties.get(key));
  |       
  |       log.info( "removing Map key [" + key + "]" );
  |       properties.remove( key );
  |       log.info( cache_.printDetails() );
  |       
  |       assertTrue( !properties.containsKey( key ) );
  |       
  |       log.info( "Second removal of Map key [" + key + "]" );
  |       properties.remove( key );
  |       log.info( cache_.printDetails() );
  |       assertTrue( !properties.containsKey( key ) );
  |    }
  |    
  |    public static Test suite() throws Exception
  |    {
  |       return new TestSuite(MultiRemovalCacheMapAopTest.class);
  |    }
  | 
  |    public static void main(String[] args) throws Exception
  |    {
  |       junit.textui.TestRunner.run(suite());
  |    }
  | }
  | 

Any work-arounds other than checking first if the key exists prior to the 
remove would be appreciated.

Thanks.

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4047974#4047974

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4047974
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to