[jboss-cvs] JBossAS SVN: r99916 - in projects/kernel/branches/resolver: dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jan 25 13:44:30 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-01-25 13:44:29 -0500 (Mon, 25 Jan 2010)
New Revision: 99916

Modified:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java
Log:
Use normal maps in matchers w/ r/w locks and add toString() methods

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -1041,6 +1041,7 @@
     */
    protected void resolveContexts(ControllerContext context, boolean trace)
    {
+      System.out.println("========= Controller - Resolve Contexts " + context);
       dependencyResolver.resolveContexts(context, trace);
    }
 

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -30,6 +30,7 @@
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.logging.Logger;
+import org.jboss.util.JBossObject;
 
 /**
  * Class used by the controller to resolve dependencies
@@ -37,7 +38,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public abstract class AbstractDependencyResolver
+public abstract class AbstractDependencyResolver extends JBossObject
 {
    protected final Logger log = Logger.getLogger(this.getClass());
    

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -21,17 +21,22 @@
 */ 
 package org.jboss.dependency.plugins.resolver.indexing;
 
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
+import org.jboss.util.JBossObject;
 
 /**
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public abstract class AbstractDependencyResolverMatcher implements DependencyResolverMatcher
+public abstract class AbstractDependencyResolverMatcher extends JBossObject implements DependencyResolverMatcher
 {
+   private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+   
    protected ControllerState getDependentState(DependencyItem item)
    {
       if (item.getDependentState() == null)
@@ -45,5 +50,35 @@
       throw new IllegalStateException("Inconsistent state cleaning up " + item);
    }
 
+   /**
+    * Lock for read
+    */
+   protected void lockRead()
+   {
+      lock.readLock().lock();
+   }
 
+   /**
+    * Unlock for read
+    */
+   protected void unlockRead()
+   {
+      lock.readLock().unlock();
+   }
+
+   /**
+    * Lock for write
+    */
+   protected void lockWrite()
+   {
+      lock.writeLock().lock();
+   }
+
+   /**
+    * Unlock for write
+    */
+   protected void unlockWrite()
+   {
+      lock.writeLock().unlock();
+   }
 }

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -31,6 +31,7 @@
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.LifecycleCallbackItem;
+import org.jboss.util.JBossObject;
 import org.jboss.util.JBossStringBuilder;
 
 /**
@@ -39,7 +40,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public class IndexingDependencyInfoDecorator implements DependencyInfo
+public class IndexingDependencyInfoDecorator extends JBossObject implements DependencyInfo
 {
    private final IndexingDependencyResolver resolver;
    private final ControllerContext context;
@@ -65,27 +66,32 @@
    public void addDependsOnMe(DependencyItem dependency)
    {
       delegate.addDependsOnMe(dependency);
+      flushJBossObjectCache();
    }
 
    public void addIDependOn(DependencyItem dependency)
    {
       delegate.addIDependOn(dependency);
       resolver.registerDependency(context, dependency);
+      flushJBossObjectCache();
    }
 
    public <T> void addInstallItem(CallbackItem<T> callbackItem)
    {
       delegate.addInstallItem(callbackItem);
+      flushJBossObjectCache();
    }
 
    public void addLifecycleCallback(LifecycleCallbackItem lifecycleCallbackItem)
    {
       delegate.addLifecycleCallback(lifecycleCallbackItem);
+      flushJBossObjectCache();
    }
 
    public <T> void addUninstallItem(CallbackItem<T> callbackItem)
    {
       delegate.addUninstallItem(callbackItem);
+      flushJBossObjectCache();
    }
 
    public Object clone()
@@ -131,22 +137,26 @@
    public void removeDependsOnMe(DependencyItem dependency)
    {
       delegate.removeDependsOnMe(dependency);
+      flushJBossObjectCache();
    }
 
    public void removeIDependOn(DependencyItem dependency)
    {
       delegate.removeIDependOn(dependency);
       resolver.unregisterDependency(context, dependency);
+      flushJBossObjectCache();
    }
 
    public <T> void removeInstallItem(CallbackItem<T> callbackItem)
    {
       delegate.removeInstallItem(callbackItem);
+      flushJBossObjectCache();
    }
 
    public <T> void removeUninstallItem(CallbackItem<T> callbackItem)
    {
       delegate.removeUninstallItem(callbackItem);
+      flushJBossObjectCache();
    }
 
    public boolean resolveDependencies(Controller controller, ControllerState state)
@@ -168,4 +178,11 @@
    {
       delegate.toShortString(buffer);
    }
+   
+   @Override
+   protected void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("delegate:" + delegate.toString());
+   }
+   
 }

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -36,6 +36,7 @@
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
 import org.jboss.logging.Logger;
+import org.jboss.util.JBossStringBuilder;
 import org.jboss.util.collection.ConcurrentSet;
 
 /**
@@ -70,11 +71,13 @@
             throw new IllegalArgumentException("AbstractDependencyItem should be handled by a " + NameDependencyResolverMatcher.class.getName());
          nameMatcher = (NameDependencyResolverMatcher)matcher;
       }
+      flushJBossObjectCache();
    }
    
    public void removeMatcher(Class<? extends DependencyItem> clazz)
    {
       matchers.remove(clazz);
+      flushJBossObjectCache();
    }
    
    private DependencyResolverMatcher getMatcherForDependencyItem(DependencyItem item)
@@ -149,6 +152,7 @@
    {
       DependencyResolverMatcher matcher = getMatcherForDependencyItem(item);
       matcher.registerDependency(context, item.getClass().cast(item));
+      flushJBossObjectCache();
    }
 
    @Override
@@ -156,6 +160,7 @@
    {
       DependencyResolverMatcher matcher = getMatcherForDependencyItem(item);
       matcher.unregisterDependency(context, item);
+      flushJBossObjectCache();
    }
 
    
@@ -296,4 +301,10 @@
          return null;
       return new IndexingDependencyInfoDecorator(this, context, info);
    }
+
+   @Override
+   protected void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("matchers:" + matchers.toString());
+   }
 }

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -21,18 +21,17 @@
 */ 
 package org.jboss.dependency.plugins.resolver.indexing;
 
+import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.dependency.plugins.AbstractDependencyItem;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.util.JBossStringBuilder;
 
 /**
  * 
@@ -41,32 +40,39 @@
  */
 public class NameDependencyResolverMatcher extends AbstractDependencyResolverMatcher
 {
-   private final ConcurrentMap<ControllerState, ConcurrentMap<Object, List<ControllerContext>>> contextsByState = new ConcurrentHashMap<ControllerState, ConcurrentMap<Object, List<ControllerContext>>>();
+   private final Map<ControllerState, Map<Object, Set<ControllerContext>>> contextsByState = new HashMap<ControllerState, Map<Object, Set<ControllerContext>>>();
 
    public Set<ControllerContext> getMatchingContexts(ControllerContext context)
    {
-      Set<ControllerContext> result = null;
-      
-      ConcurrentMap<Object, List<ControllerContext>> contextsByName = contextsByState.get(context.getState());
-      result = addContextsDependentOn(result, context.getName(), contextsByName);
-      
-      Set<Object> aliases = context.getAliases();
-      if (aliases != null && aliases.size() > 0)
+      lockRead();
+      try
       {
-         for (Object alias : aliases)
+         Set<ControllerContext> result = null;
+         
+         Map<Object, Set<ControllerContext>> contextsByName = contextsByState.get(context.getState());
+         result = addContextsDependentOn(result, context.getName(), contextsByName);
+         
+         Set<Object> aliases = context.getAliases();
+         if (aliases != null && aliases.size() > 0)
          {
-            result = addContextsDependentOn(result, alias, contextsByName);
+            for (Object alias : aliases)
+            {
+               result = addContextsDependentOn(result, alias, contextsByName);
+            }
          }
+         return result;
       }
-      return result;
-
+      finally
+      {
+         unlockRead();
+      }
    }
    
-   protected Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, Object name, Map<Object, List<ControllerContext>> contextsByName)
+   protected Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, Object name, Map<Object, Set<ControllerContext>> contextsByName)
    {
       if (contextsByName != null && !contextsByName.isEmpty())
       {
-         List<ControllerContext> contextsForName = contextsByName.get(name);
+         Set<ControllerContext> contextsForName = contextsByName.get(name);
          if (contextsForName != null && !contextsForName.isEmpty())
          {
             if (result == null)
@@ -85,26 +91,31 @@
       if (item instanceof AbstractDependencyItem == false)
          throw new IllegalStateException("item is not an instance of AbstractDependencyItem");
       
-      Object name = item.getIDependOn();
-      
-      ConcurrentMap<Object, List<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
-      if (contextsByName == null)
+      lockWrite();
+      try
       {
-         contextsByName = new ConcurrentHashMap<Object, List<ControllerContext>>();
-         ConcurrentMap<Object, List<ControllerContext>> old = contextsByState.putIfAbsent(getDependentState(item), contextsByName);
-         if (old != null)
-            contextsByName = old;
+         Object name = item.getIDependOn();
+         
+         Map<Object, Set<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
+         if (contextsByName == null)
+         {
+            contextsByName = new HashMap<Object, Set<ControllerContext>>();
+            contextsByState.put(getDependentState(item), contextsByName);
+         }
+         Set<ControllerContext> contexts = contextsByName.get(name);
+         if (contexts == null)
+         {
+            contexts = new LinkedHashSet<ControllerContext>();
+            contextsByName.put(name, contexts);
+         }
+         contexts.add(owner);
+   
+         flushJBossObjectCache();
       }
-      List<ControllerContext> contexts = contextsByName.get(name);
-      if (contexts == null)
+      finally
       {
-         contexts = new CopyOnWriteArrayList<ControllerContext>();
-         List<ControllerContext> old = contextsByName.putIfAbsent(name, contexts);
-         if (old != null)
-            contexts = old;
+         unlockWrite();
       }
-      
-      contexts.add(owner);
    }
 
    public void unregisterDependency(ControllerContext owner, DependencyItem item)
@@ -114,25 +125,50 @@
       if (item instanceof AbstractDependencyItem == false)
          throw new IllegalStateException("item is not an instance of AbstractDependencyItem");
 
-      Object name = item.getIDependOn();
-
-      ConcurrentMap<Object, List<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
-      if (contextsByName == null)
-         handleCleanUpError(item);
-      List<ControllerContext> contexts = contextsByName.get(name);
-      if (contexts == null)
-         handleCleanUpError(item);
-      if (!contexts.remove(owner))
-         handleCleanUpError(item);
+      lockWrite();
+      try
+      {
+         Object name = item.getIDependOn();
+   
+         Map<Object, Set<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
+         if (contextsByName == null)
+            handleCleanUpError(item);
+         Set<ControllerContext> contexts = contextsByName.get(name);
+         if (contexts == null)
+            handleCleanUpError(item);
+         if (!contexts.remove(owner))
+            handleCleanUpError(item);
+   
+         flushJBossObjectCache();
+      }
+      finally
+      {
+         unlockWrite();
+      }
    }
    
    public boolean hasDependencies(Object name)
    {
-      for (ConcurrentMap<Object, List<ControllerContext>> contextsByName : contextsByState.values())
+      lockRead();
+      try
       {
-         if (contextsByName.get(name) != null)
-            return true;
+         for (Map<Object, Set<ControllerContext>> contextsByName : contextsByState.values())
+         {
+            if (contextsByName.get(name) != null)
+               return true;
+         }
+         return false;
       }
-      return false;      
+      finally
+      {
+         unlockRead();
+      }
    }
+   
+   @Override
+   protected void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("contextsByState:" + contextsByState.toString());
+   }
+
 }

Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -21,17 +21,17 @@
 */ 
 package org.jboss.kernel.plugins.resolver.indexing;
 
+import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
+import java.util.LinkedHashSet;
+import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.dependency.plugins.resolver.indexing.AbstractDependencyResolverMatcher;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.util.JBossStringBuilder;
 
 /**
  * 
@@ -40,25 +40,33 @@
  */
 public abstract class AbstractClassDependencyResolverMatcher<T extends DependencyItem> extends AbstractDependencyResolverMatcher
 {
-   private final ConcurrentMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>> contextsByState = new ConcurrentHashMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>>();
+   private final Map<ControllerState, Map<Class<?>, Set<ControllerContext>>> contextsByState = new HashMap<ControllerState, Map<Class<?>, Set<ControllerContext>>>();
 
    public Set<ControllerContext> getMatchingContexts(ControllerContext context)
    {
-      ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(context.getState());
-      if (contextsByClass != null)
+      lockRead();
+      try
       {
-         if (context.getTarget() == null)
-            throw new IllegalStateException("Null target");
-         return addMatchingContexts(null, context.getTarget().getClass(), contextsByClass);
+         Map<Class<?>, Set<ControllerContext>> contextsByClass = contextsByState.get(context.getState());
+         if (contextsByClass != null)
+         {
+            if (context.getTarget() == null)
+               throw new IllegalStateException("Null target");
+            return addMatchingContexts(null, context.getTarget().getClass(), contextsByClass);
+         }
+         return null;
       }
-      return null;
+      finally
+      {
+         unlockRead();
+      }
    }
    
-   private Set<ControllerContext> addMatchingContexts(Set<ControllerContext> result, Class<?> clazz, ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass)
+   private Set<ControllerContext> addMatchingContexts(Set<ControllerContext> result, Class<?> clazz, Map<Class<?>, Set<ControllerContext>> contextsByClass)
    {
       if (clazz != null)
       {
-         List<ControllerContext> contexts = contextsByClass.get(clazz);
+         Set<ControllerContext> contexts = contextsByClass.get(clazz);
          if (contexts != null)
          {
             if (result == null)
@@ -88,26 +96,31 @@
       if (owner.getController().getStates().isBeforeState(getDependentState(item), ControllerState.INSTANTIATED))
          throw new IllegalArgumentException(item + " has a dependent state of " + getDependentState(item) + " which is before the first allowed: " + ControllerState.INSTANTIATED);
       
-      Class<?> clazz = getDependencyClass(item);
-      
-      ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
-      if (contextsByClass == null)
+      lockWrite();
+      try
       {
-         contextsByClass = new ConcurrentHashMap<Class<?>, List<ControllerContext>>();
-         ConcurrentMap<Class<?>, List<ControllerContext>> old = contextsByState.putIfAbsent(getDependentState(item), contextsByClass);
-         if (old != null)
-            contextsByClass = old;
+         Class<?> clazz = getDependencyClass(item);
+         
+         Map<Class<?>, Set<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
+         if (contextsByClass == null)
+         {
+            contextsByClass = new HashMap<Class<?>, Set<ControllerContext>>();
+            contextsByState.put(getDependentState(item), contextsByClass);
+         }
+         Set<ControllerContext> contexts = contextsByClass.get(clazz);
+         if (contexts == null)
+         {
+            contexts = new LinkedHashSet<ControllerContext>();
+            contextsByClass.put(clazz, contexts);
+         }
+         contexts.add(owner);
+         
+         flushJBossObjectCache();
       }
-      List<ControllerContext> contexts = contextsByClass.get(clazz);
-      if (contexts == null)
+      finally
       {
-         contexts = new CopyOnWriteArrayList<ControllerContext>();
-         List<ControllerContext> old = contextsByClass.putIfAbsent(clazz, contexts);
-         if (old != null)
-            contexts = old;
+         unlockWrite();
       }
-      contexts.add(owner);
-      
    }
 
    public void unregisterDependency(ControllerContext owner, DependencyItem item)
@@ -117,21 +130,38 @@
       if (!getDependencyItemClass().isAssignableFrom(item.getClass()))
          throw new IllegalStateException("item is not an instance of " + getDependencyItemClass().getSimpleName() + ": " + item.getClass());
 
-      ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
-      if (contextsByClass == null)
-         handleCleanUpError(item);
-      
-      //Return if dependency has been unset
-      if (getDependencyClass(item) == null)
-         return;
-      List<ControllerContext> contexts = contextsByClass.get(getDependencyClass(item));
-      if (contexts == null)
-         handleCleanUpError(item);
-      if (!contexts.remove(owner))
-         handleCleanUpError(item);
+      lockWrite();
+      try
+      {
+         Map<Class<?>, Set<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
+         if (contextsByClass == null)
+            handleCleanUpError(item);
+         
+         //Return if dependency has been unset
+         if (getDependencyClass(item) == null)
+            return;
+         Set<ControllerContext> contexts = contextsByClass.get(getDependencyClass(item));
+         if (contexts == null)
+            handleCleanUpError(item);
+         if (!contexts.remove(owner))
+            handleCleanUpError(item);
+         
+         flushJBossObjectCache();
+      }
+      finally
+      {
+         unlockWrite();
+      }
    }
 
    protected abstract Class<T> getDependencyItemClass();
    
    protected abstract Class<?> getDependencyClass(DependencyItem item);
+   
+   @Override
+   protected void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("contextsByState:" + contextsByState.toString());
+   }
+
 }

Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java	2010-01-25 18:17:57 UTC (rev 99915)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java	2010-01-25 18:44:29 UTC (rev 99916)
@@ -22,17 +22,17 @@
 package org.jboss.kernel.plugins.resolver.indexing;
 
 import java.util.HashSet;
-import java.util.List;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.dependency.plugins.resolver.indexing.AbstractDependencyResolverMatcher;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.util.JBossStringBuilder;
 
 /**
  * Simple SupplyDemandDependencyResolverMatcher.
@@ -43,39 +43,68 @@
  */
 public class SupplyDemandDependencyResolverMatcher extends AbstractDependencyResolverMatcher
 {
-   private final ConcurrentMap<ControllerState, List<ControllerContext>> contextsByState = new ConcurrentHashMap<ControllerState, List<ControllerContext>>();
+   private final ConcurrentMap<ControllerState, Set<ControllerContext>> contextsByState = new ConcurrentHashMap<ControllerState, Set<ControllerContext>>();
 
    public Set<ControllerContext> getMatchingContexts(ControllerContext context)
    {
       if (context instanceof KernelControllerContext == false)
          return null;
       
-      List<ControllerContext> contexts = contextsByState.get(context.getState());
-      if (contexts != null && contexts.size() > 0)
-         return new HashSet<ControllerContext>(contexts);
-      
-      return null;
+      lockRead();
+      try
+      {
+         Set<ControllerContext> contexts = contextsByState.get(context.getState());
+         if (contexts != null && contexts.size() > 0)
+            return new HashSet<ControllerContext>(contexts);
+         
+         return null;
+      }
+      finally
+      {
+         unlockRead();
+      }
    }
    
    public void registerDependency(ControllerContext owner, DependencyItem item)
    {
-      List<ControllerContext> contexts = contextsByState.get(getDependentState(item));
-      if (contexts == null)
+      lockWrite();
+      try
       {
-         contexts = new CopyOnWriteArrayList<ControllerContext>();
-         List<ControllerContext> old = contextsByState.putIfAbsent(getDependentState(item), contexts);
-         if (old != null)
-            contexts = old;
+         Set<ControllerContext> contexts = contextsByState.get(getDependentState(item));
+         if (contexts == null)
+         {
+            contexts = new LinkedHashSet<ControllerContext>();
+            contextsByState.put(getDependentState(item), contexts);
+         }
+         contexts.add(owner);
       }
-      contexts.add(owner);
+      finally
+      {
+         unlockWrite();
+      }
    }
 
    public void unregisterDependency(ControllerContext owner, DependencyItem item)
    {
-      List<ControllerContext> contexts = contextsByState.get(getDependentState(item));
-      if (contexts == null)
-         handleCleanUpError(item);
-      if (!contexts.remove(owner))
-         handleCleanUpError(item);
+      lockWrite();
+      try
+      {
+         Set<ControllerContext> contexts = contextsByState.get(getDependentState(item));
+         if (contexts == null)
+            handleCleanUpError(item);
+         if (!contexts.remove(owner))
+            handleCleanUpError(item);
+      }
+      finally
+      {
+         unlockWrite();
+      }
    }
+   
+   @Override
+   protected void toString(JBossStringBuilder buffer)
+   {
+      buffer.append("dependencies:" + contextsByState.toString());
+   }
+
 }




More information about the jboss-cvs-commits mailing list