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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jan 21 13:27:14 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-01-21 13:27:14 -0500 (Thu, 21 Jan 2010)
New Revision: 99761

Added:
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcherFactory.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
Modified:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.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/IndexingDependencyResolver.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
   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/NameDependencyResolverMatcherFactory.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifiersKey.java
   projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifierKey.java
Log:
Contextual injection resolver matcher

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -21,8 +21,6 @@
 */ 
 package org.jboss.dependency.plugins.resolver;
 
-import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolverFactory;
-import org.jboss.dependency.plugins.resolver.standard.StandardDependencyResolverFactory;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.resolver.DependencyResolverFactory;
 
@@ -38,10 +36,21 @@
    static
    {
       //TODO configure with system properties
-//      Class<?> clazz = StandardDependencyResolverFactory.class;
-      Class<?> clazz = IndexingDependencyResolverFactory.class;
+      
+//    Class<?> clazz = StandardDependencyResolverFactory.class;
+      Class<?> clazz;
       try
       {
+         clazz = Class.forName("org.jboss.kernel.plugins.resolver.indexing.IndexingKernelDependencyResolverFactory");
+      }
+      catch (ClassNotFoundException e1)
+      {
+         // AutoGenerated
+         throw new RuntimeException(e1);
+      }
+
+      try
+      {
          factory = (DependencyResolverFactory)clazz.newInstance();
       }
       catch(Exception e)

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-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -39,5 +39,7 @@
       
       return item.getDependentState();
    }
+   
 
+
 }

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-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -81,12 +81,12 @@
    {
       if (item == null)
          throw new IllegalArgumentException("Null item");
-      DependencyResolverMatcher matcher = matchers.get(item.getClass());
-      
-      if (matcher == null)
+      Class<?> clazz = item.getClass();
+      DependencyResolverMatcher matcher = null;
+      while (matcher == null)
       {
-         log.warn("No matcher found for " + item.getClass() + ". Defaulting to " + NameDependencyResolverMatcher.class.getName() + " which is probably wrong");
-         matcher = nameMatcher;
+         matcher = matchers.get(clazz);
+         clazz = clazz.getSuperclass();
       }
       
       return matcher;
@@ -95,42 +95,60 @@
    @Override
    public void registerContext(ControllerContext context)
    {
-      DependencyInfo dependencies = context.getDependencyInfo();
-      if (dependencies != null)
+      try
       {
-         Set<DependencyItem> items = dependencies.getIDependOn(null);
-         if (items != null && items.size() > 0)
+         DependencyInfo dependencies = context.getDependencyInfo();
+         if (dependencies != null)
          {
-            for (DependencyItem item : items)
+            Set<DependencyItem> items = dependencies.getIDependOn(null);
+            if (items != null && items.size() > 0)
             {
-               registerDependency(context, item);
+               for (DependencyItem item : items)
+               {
+                  registerDependency(context, item);
+               }
             }
          }
       }
+      catch(Throwable t)
+      {
+         //TODO get rid of this catch block
+         t.printStackTrace();
+         throw new IllegalStateException(t);
+      }
    }
 
    @Override
    public void unregisterContext(ControllerContext context)
    {
-      DependencyInfo dependencies = context.getDependencyInfo();
-      if (dependencies != null)
+      try
       {
-         Set<DependencyItem> items = dependencies.getIDependOn(null);
-         if (items != null && items.size() > 0)
+         DependencyInfo dependencies = context.getDependencyInfo();
+         if (dependencies != null)
          {
-            for (DependencyItem item : items)
+            Set<DependencyItem> items = dependencies.getIDependOn(null);
+            if (items != null && items.size() > 0)
             {
-               unregisterDependency(context, item);
+               for (DependencyItem item : items)
+               {
+                  unregisterDependency(context, item);
+               }
             }
          }
       }
+      catch(Throwable t)
+      {
+         //TODO get rid of this catch block
+         t.printStackTrace();
+         throw new IllegalStateException(t);
+      }
    }
    
    @Override
    public void registerDependency(ControllerContext context, DependencyItem item)
    {
       DependencyResolverMatcher matcher = getMatcherForDependencyItem(item);
-      matcher.registerDependency(context, item);
+      matcher.registerDependency(context, item.getClass().cast(item));
    }
 
    @Override
@@ -237,6 +255,7 @@
    {
       if (context.getMode() == ControllerMode.ON_DEMAND)
       {
+         //TODO Should maybe not be specific to name matcher, since the dependencies might come from other types of dependency?
          if (nameMatcher.hasDependencies(context.getName()))
             getController().enableOnDemand(context);
          

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -25,7 +25,6 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
-import org.jboss.dependency.plugins.AbstractDependencyItem;
 import org.jboss.dependency.plugins.AbstractDependencyResolver;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.DependencyItem;
@@ -39,7 +38,7 @@
  */
 public class IndexingDependencyResolverFactory implements DependencyResolverFactory
 {
-   private final Map<Class<? extends DependencyItem>, DependencyResolverMatcherFactory> matchers = new HashMap<Class<? extends DependencyItem>, DependencyResolverMatcherFactory>();
+   private final Map<Class<? extends DependencyItem>, DependencyResolverMatcherFactory<?>> matchers = new HashMap<Class<? extends DependencyItem>, DependencyResolverMatcherFactory<?>>();
    
    private Map<IndexingDependencyResolver, Boolean> weakResolvers = new WeakHashMap<IndexingDependencyResolver, Boolean>();
    
@@ -51,14 +50,14 @@
    public synchronized AbstractDependencyResolver createResolver(Controller controller)
    {
       IndexingDependencyResolver resolver = new IndexingDependencyResolver(controller);
-      for (Map.Entry<Class<? extends DependencyItem>, DependencyResolverMatcherFactory> entry : matchers.entrySet())
+      for (Map.Entry<Class<? extends DependencyItem>, DependencyResolverMatcherFactory<?>> entry : matchers.entrySet())
       {
          resolver.addMatcher(entry.getKey(), entry.getValue().createMatcher());
       }
       return resolver;
    }
    
-   public synchronized void addMatcher(DependencyResolverMatcherFactory matcherFactory)
+   public synchronized void addMatcher(DependencyResolverMatcherFactory<?> matcherFactory)
    {
       if (matcherFactory == null)
          throw new IllegalArgumentException("Null matcherFactory");
@@ -74,12 +73,16 @@
       }
    }
    
-   public synchronized void removeMatcher(Class<? extends DependencyItem> itemClass)
+   public synchronized void removeMatcher(DependencyResolverMatcherFactory<?> matcherFactory)
    {
-      matchers.remove(itemClass);
+      if (matcherFactory == null)
+         throw new IllegalArgumentException("Null matcherFactory");
+      if (matcherFactory.getHandled() == null)
+         throw new IllegalArgumentException("Null matcherFactory.getHandler()");
+      matchers.remove(matcherFactory.getHandled());
       for (IndexingDependencyResolver resolver : weakResolvers.keySet())
       {
-         resolver.removeMatcher(itemClass);
+         resolver.removeMatcher(matcherFactory.getHandled());
       }
    }
 }

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-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -29,6 +29,7 @@
 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;
@@ -40,31 +41,32 @@
  */
 public class NameDependencyResolverMatcher extends AbstractDependencyResolverMatcher
 {
-   private final ConcurrentMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>> contextsByDependency = new ConcurrentHashMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>>();
+   private final ConcurrentMap<ControllerState, ConcurrentMap<Object, List<ControllerContext>>> contextsByState = new ConcurrentHashMap<ControllerState, ConcurrentMap<Object, List<ControllerContext>>>();
 
    public Set<ControllerContext> getMatchingContexts(ControllerContext context)
    {
       Set<ControllerContext> result = null;
-      ConcurrentMap<ControllerState, List<ControllerContext>> contextsByDependentState = contextsByDependency.get(context.getName());
-      result = addContextsDependentOn(result, context.getState(), contextsByDependentState);
       
+      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)
       {
          for (Object alias : aliases)
          {
-            contextsByDependentState = contextsByDependency.get(alias);
-            result = addContextsDependentOn(result, context.getState(), contextsByDependentState);
+            result = addContextsDependentOn(result, alias, contextsByName);
          }
       }
       return result;
+
    }
    
-   private Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, ControllerState dependentState, Map<ControllerState, List<ControllerContext>> contextsByDependentState)
+   protected Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, Object name, Map<Object, List<ControllerContext>> contextsByName)
    {
-      if (contextsByDependentState != null && !contextsByDependentState.isEmpty())
+      if (contextsByName != null && !contextsByName.isEmpty())
       {
-         List<ControllerContext> contextsForName = contextsByDependentState.get(dependentState);
+         List<ControllerContext> contextsForName = contextsByName.get(name);
          if (contextsForName != null && !contextsForName.isEmpty())
          {
             if (result == null)
@@ -75,45 +77,63 @@
       return result;
    }
 
+   
    public void registerDependency(ControllerContext owner, DependencyItem item)
    {
+      if (owner == null)
+         throw new IllegalStateException("Null owner");
+      if (item instanceof AbstractDependencyItem == false)
+         throw new IllegalStateException("item is not an instance of AbstractDependencyItem");
+      
       Object name = item.getIDependOn();
       
-      ConcurrentMap<ControllerState, List<ControllerContext>> contextsByState = contextsByDependency.get(name);
-      if (contextsByState == null)
+      ConcurrentMap<Object, List<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
+      if (contextsByName == null)
       {
-         contextsByState = new ConcurrentHashMap<ControllerState, List<ControllerContext>>();
-         ConcurrentMap<ControllerState, List<ControllerContext>> old = contextsByDependency.putIfAbsent(name, contextsByState);
+         contextsByName = new ConcurrentHashMap<Object, List<ControllerContext>>();
+         ConcurrentMap<Object, List<ControllerContext>> old = contextsByState.putIfAbsent(getDependentState(item), contextsByName);
          if (old != null)
-            contextsByState = old;
+            contextsByName = old;
       }
-      List<ControllerContext> contexts = contextsByState.get(getDependentState(item));
+      List<ControllerContext> contexts = contextsByName.get(name);
       if (contexts == null)
       {
          contexts = new CopyOnWriteArrayList<ControllerContext>();
-         List<ControllerContext> old = contextsByState.putIfAbsent(getDependentState(item), contexts);
+         List<ControllerContext> old = contextsByName.putIfAbsent(name, contexts);
          if (old != null)
             contexts = old;
       }
+      
       contexts.add(owner);
    }
 
    public void unregisterDependency(ControllerContext owner, DependencyItem item)
    {
+      if (owner == null)
+         throw new IllegalStateException("Null owner");
+      if (item instanceof AbstractDependencyItem == false)
+         throw new IllegalStateException("item is not an instance of AbstractDependencyItem");
+
       Object name = item.getIDependOn();
 
-      ConcurrentMap<ControllerState, List<ControllerContext>> contextsByState = contextsByDependency.get(name);
-      if (contextsByState == null)
+      ConcurrentMap<Object, List<ControllerContext>> contextsByName = contextsByState.get(getDependentState(item));
+      if (contextsByName == null)
          throw new IllegalStateException("Inconsistent state");
-      List<ControllerContext> contexts = contextsByState.get(getDependentState(item));
+      List<ControllerContext> contexts = contextsByName.get(name);
       if (contexts == null)
          throw new IllegalStateException("Inconsistent state");
       if (!contexts.remove(owner))
          throw new IllegalStateException("Inconsistent state");
+
    }
 
    public boolean hasDependencies(Object name)
    {
-      return contextsByDependency.get(name) != null;      
+      for (ConcurrentMap<Object, List<ControllerContext>> contextsByName : contextsByState.values())
+      {
+         if (contextsByName.get(name) != null)
+            return true;
+      }
+      return false;      
    }
 }

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -22,7 +22,6 @@
 package org.jboss.dependency.plugins.resolver.indexing;
 
 import org.jboss.dependency.plugins.AbstractDependencyItem;
-import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
 import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcherFactory;
 
@@ -31,14 +30,14 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public class NameDependencyResolverMatcherFactory implements DependencyResolverMatcherFactory
+public class NameDependencyResolverMatcherFactory implements DependencyResolverMatcherFactory<AbstractDependencyItem>
 {
    public DependencyResolverMatcher createMatcher()
    {
       return new NameDependencyResolverMatcher();
    }
 
-   public Class<? extends DependencyItem> getHandled()
+   public Class<AbstractDependencyItem> getHandled()
    {
       return AbstractDependencyItem.class;
    }

Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -28,9 +28,9 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision: 1.1 $
  */
-public interface DependencyResolverMatcherFactory
+public interface DependencyResolverMatcherFactory<T extends DependencyItem>
 {
-   Class<? extends DependencyItem> getHandled();
+   Class<T> getHandled();
    
    DependencyResolverMatcher createMatcher();
 }

Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifiersKey.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifiersKey.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAndQualifiersKey.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -259,4 +259,9 @@
    {
       toString(buffer);
    }
+
+   public Class<?> getType()
+   {
+      return type;
+   }
 }

Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifierKey.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifierKey.java	2010-01-21 18:11:21 UTC (rev 99760)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/QualifierKey.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -36,6 +36,13 @@
 public interface QualifierKey
 {
    /**
+    * Get the class that should be injected
+    * 
+    * @return the class
+    */
+   Class<?> getType();
+   
+   /**
     * Find matching controller context, null if not found.
     *
     * @param controller the controller

Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java	                        (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -0,0 +1,141 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.jboss.beans.metadata.plugins.ContextualInjectionDependencyItem;
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+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.plugins.dependency.QualifierKey;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ContextualInjectionDependencyResolverMatcher extends AbstractDependencyResolverMatcher
+{
+   private final ConcurrentMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>> contextsByState = new ConcurrentHashMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>>();
+
+   public Set<ControllerContext> getMatchingContexts(ControllerContext context)
+   {
+      ConcurrentMap<Class<?>, List<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;
+   }
+   
+   private Set<ControllerContext> addMatchingContexts(Set<ControllerContext> result, Class<?> clazz, ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass)
+   {
+      if (clazz != null)
+      {
+         List<ControllerContext> contexts = contextsByClass.get(clazz);
+         if (contexts != null)
+         {
+            if (result == null)
+               result = new HashSet<ControllerContext>();
+            result.addAll(contexts);
+         }
+         
+         result = addMatchingContexts(result, clazz.getSuperclass(), contextsByClass);
+         Class<?>[] interfaces = clazz.getInterfaces();
+         if (interfaces != null)
+         {
+            for (int i = 0 ; i < interfaces.length ; i++)
+            {
+               result = addMatchingContexts(result, interfaces[i], contextsByClass);
+            }
+         }
+      }
+      return result;
+   }
+
+   public void registerDependency(ControllerContext owner, DependencyItem item)
+   {
+      if (owner == null)
+         throw new IllegalStateException("Null owner");
+      if (item instanceof ContextualInjectionDependencyItem == false)
+         throw new IllegalStateException("item is not an instance of ContextualInjectionDependencyItem");
+      
+      //TODO throw an error is state < INSTANTIATED
+      
+      Object dependency = item.getIDependOn();
+      if (dependency instanceof QualifierKey == false && dependency instanceof Class<?> == false)
+         throw new IllegalStateException("Dependency is not a QualifierKey or a class: '" + dependency + "' in " + item);
+      Class<?> clazz = dependency instanceof QualifierKey ? ((QualifierKey)dependency).getType() : (Class<?>)dependency;
+      
+      ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(clazz);
+      if (contextsByClass == null)
+      {
+         contextsByClass = new ConcurrentHashMap<Class<?>, List<ControllerContext>>();
+         ConcurrentMap<Class<?>, List<ControllerContext>> old = contextsByState.putIfAbsent(getDependentState(item), contextsByClass);
+         if (old != null)
+            contextsByClass = old;
+      }
+      List<ControllerContext> contexts = contextsByClass.get(getDependentState(item));
+      if (contexts == null)
+      {
+         contexts = new CopyOnWriteArrayList<ControllerContext>();
+         List<ControllerContext> old = contextsByClass.putIfAbsent(clazz, contexts);
+         if (old != null)
+            contexts = old;
+      }
+      contexts.add(owner);
+      
+   }
+
+   public void unregisterDependency(ControllerContext owner, DependencyItem item)
+   {
+      if (owner == null)
+         throw new IllegalStateException("Null owner");
+      if (item instanceof AbstractDependencyItem == false)
+         throw new IllegalStateException("item is not an instance of AbstractDependencyItem");
+
+      Object dependency = item.getIDependOn();
+      if (dependency instanceof QualifierKey == false)
+         throw new IllegalStateException("Dependency is not a QualifierKey '" + dependency + "' in " + item);
+      Class<?> clazz = ((QualifierKey)dependency).getType();
+
+      ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
+      if (contextsByState == null)
+         throw new IllegalStateException("Inconsistent state");
+      List<ControllerContext> contexts = contextsByClass.get(clazz);
+      if (contexts == null)
+         throw new IllegalStateException("Inconsistent state");
+      if (!contexts.remove(owner))
+         throw new IllegalStateException("Inconsistent state");
+   }
+
+}

Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcherFactory.java	                        (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcherFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -0,0 +1,45 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import org.jboss.beans.metadata.plugins.ContextualInjectionDependencyItem;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcherFactory;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ContextualInjectionDependencyResolverMatcherFactory implements DependencyResolverMatcherFactory<ContextualInjectionDependencyItem>
+{
+   public ContextualInjectionDependencyResolverMatcher createMatcher()
+   {
+      return new ContextualInjectionDependencyResolverMatcher();
+   }
+
+   public Class<ContextualInjectionDependencyItem> getHandled()
+   {
+      return ContextualInjectionDependencyItem.class;
+   }
+
+
+}

Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java	                        (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java	2010-01-21 18:27:14 UTC (rev 99761)
@@ -0,0 +1,39 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolverFactory;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingKernelDependencyResolverFactory extends IndexingDependencyResolverFactory
+{
+
+   public IndexingKernelDependencyResolverFactory()
+   {
+      addMatcher(new ContextualInjectionDependencyResolverMatcherFactory());
+   }
+   
+}




More information about the jboss-cvs-commits mailing list