[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