[jboss-cvs] JBossAS SVN: r96646 - in projects/kernel/trunk: dependency/src/main/java/org/jboss/dependency/plugins/helpers and 6 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Nov 20 11:42:42 EST 2009
Author: alesj
Date: 2009-11-20 11:42:40 -0500 (Fri, 20 Nov 2009)
New Revision: 96646
Added:
projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ContextTracker.java
Modified:
projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ScopedController.java
projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionDependencyItem.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionResolver.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionValueMetaData.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAttributeCallbackItem.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextKernelRegistryPlugin.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassSingleCallbackItem.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CollectionCallbackItem.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ScopedKernelController.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/StatelessKernelController.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/validation/AbstractKernelBeanValidator.java
projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelController.java
projects/kernel/trunk/weld-int/src/test/java/org/jboss/test/kernel/weld/mctowb/support/mock/MockController.java
Log:
[JBKERNEL-61]; move context tracking logic to dependency module level.
Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -40,6 +40,7 @@
import org.jboss.dependency.plugins.action.ControllerContextAction;
import org.jboss.dependency.plugins.action.SimpleControllerContextAction;
import org.jboss.dependency.spi.CallbackItem;
+import org.jboss.dependency.spi.ContextTracker;
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerContextActions;
@@ -64,7 +65,7 @@
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision$
*/
-public class AbstractController extends JBossObject implements Controller, GraphController, AbstractControllerMBean, AsynchronousController
+public class AbstractController extends JBossObject implements Controller, GraphController, AbstractControllerMBean, AsynchronousController, ContextTracker
{
/** The lock */
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
@@ -114,7 +115,10 @@
/** The install stats */
private volatile StateStatistics installStats = null;
-
+
+ /** The contexts by class Map<Class, Set<ControllerContext>> */
+ private Map<Class<?>, ClassContext> contextsByClass = new ConcurrentHashMap<Class<?>, ClassContext>();
+
/**
* Create an abstract controller
*/
@@ -504,6 +508,9 @@
try
{
ControllerContext result = getRegisteredControllerContext(name, false);
+ if (result == null && name instanceof Class) // check type matching
+ result = getContextByClass((Class<?>)name);
+
if (result != null && state != null && stateModel.isBeforeState(result.getState(), state))
{
return null;
@@ -2525,4 +2532,195 @@
}
}
}
+
+ /**
+ * Get contexts by class.
+ * This method should be taken with read lock.
+ *
+ * @param clazz the class type
+ * @return contexts by class
+ */
+ protected Set<ControllerContext> getContexts(Class<?> clazz)
+ {
+ ClassContext classContext = contextsByClass.get(clazz);
+ if (classContext != null)
+ {
+ if (log.isTraceEnabled())
+ {
+ log.trace("Marking class " + clazz + " as used.");
+ }
+ classContext.used = true;
+ return classContext.contexts;
+ }
+ return null;
+ }
+
+ /**
+ * Get instantiated contexts.
+ *
+ * @param clazz the class to match
+ * @return all instantiated contexts whose target is instance of this class clazz param
+ */
+ public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
+ {
+ lockRead();
+ try
+ {
+ Set<ControllerContext> contexts = getContexts(clazz);
+ return contexts != null && contexts.isEmpty() == false ? Collections.unmodifiableSet(contexts) : null;
+ }
+ finally
+ {
+ unlockRead();
+ }
+ }
+
+ public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
+ {
+ lockRead();
+ try
+ {
+ Set<ControllerContext> contexts = getContexts(clazz);
+ if (contexts != null && contexts.isEmpty() == false)
+ {
+ Set<ControllerContext> kccs = new HashSet<ControllerContext>();
+ for(ControllerContext context : contexts)
+ {
+ if (getStates().isBeforeState(context.getState(), state) == false)
+ kccs.add(context);
+ }
+ return kccs;
+ }
+ else
+ return null;
+ }
+ finally
+ {
+ unlockRead();
+ }
+ }
+
+ public void addInstantiatedContext(ControllerContext context)
+ {
+ prepareToTraverse(context, true);
+ }
+
+ public void removeInstantiatedContext(ControllerContext context)
+ {
+ prepareToTraverse(context, false);
+ }
+
+ protected void prepareToTraverse(ControllerContext context, boolean addition)
+ {
+ lockWrite();
+ try
+ {
+ Object target = addition ? context.getTarget() : context.ungetTarget();
+ if (target != null)
+ {
+ traverseBean(context, target.getClass(), addition, log.isTraceEnabled());
+ }
+ }
+ finally
+ {
+ unlockWrite();
+ }
+ }
+
+ /**
+ * Traverse over target and map it to all its superclasses
+ * and interfaces - using recursion.
+ *
+ * @param context context whose target is instance of clazz
+ * @param clazz current class to map context to
+ * @param addition whether this is an addition
+ * @param trace whether trace is enabled
+ */
+ protected void traverseBean(ControllerContext context, Class<?> clazz, boolean addition, boolean trace)
+ {
+ if (clazz == null || clazz == Object.class)
+ {
+ return;
+ }
+ ClassContext classContext = contextsByClass.get(clazz);
+ if (addition)
+ {
+ if (classContext == null)
+ {
+ classContext = new ClassContext();
+ classContext.contexts = new HashSet<ControllerContext>();
+ contextsByClass.put(clazz, classContext);
+ }
+ else if (classContext.used)
+ {
+ log.debug("Additional matching bean - contextual injection already used for class: " + clazz);
+ }
+ if (trace)
+ {
+ log.trace("Mapping contex " + context + " to class: " + clazz);
+ }
+ classContext.contexts.add(context);
+ }
+ else
+ {
+ if (classContext != null)
+ {
+ if (trace)
+ {
+ log.trace("Removing contex " + context + " to class: " + clazz);
+ }
+ classContext.contexts.remove(context);
+ }
+ }
+ // traverse superclass
+ traverseBean(context, clazz.getSuperclass(), addition, trace);
+ Class<?>[] interfaces = clazz.getInterfaces();
+ // traverse interfaces
+ for(Class<?> intface : interfaces)
+ {
+ traverseBean(context, intface, addition, trace);
+ }
+ }
+
+ private static class ClassContext
+ {
+ private boolean used;
+ private Set<ControllerContext> contexts;
+ }
+
+ /**
+ * If zero or multiple instances match class clazz
+ * a warning is issued, but no throwable is thrown
+ *
+ * @param clazz the class to match
+ * @return context whose target is instance of this class clazz param or null if zero or multiple such instances
+ */
+ public ControllerContext getContextByClass(Class<?> clazz)
+ {
+ Set<ControllerContext> contexts = getInstantiatedContexts(clazz);
+ int numberOfMatchingBeans = 0;
+ if (contexts != null)
+ {
+ numberOfMatchingBeans = contexts.size();
+ }
+
+ if (log.isTraceEnabled())
+ {
+ log.trace("Checking for contextual injection, current matches: " + numberOfMatchingBeans + " - " + clazz);
+ }
+
+ if (numberOfMatchingBeans != 1)
+ {
+ if (numberOfMatchingBeans > 1)
+ {
+ log.warn("Multiple beans match class type [enable trace log for details]: " + clazz);
+ if (log.isTraceEnabled())
+ {
+ log.trace("Matching contexts: " + contexts);
+ }
+ }
+ return null;
+ }
+ return contexts.iterator().next();
+ }
}
Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ScopedController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ScopedController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/ScopedController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -22,6 +22,8 @@
package org.jboss.dependency.plugins;
import java.util.concurrent.Executor;
+import java.util.Set;
+import java.util.HashSet;
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
@@ -154,6 +156,58 @@
super.removeControllerContext(context);
}
+ public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
+ {
+ lockRead();
+ try
+ {
+ Set<ControllerContext> contexts = new HashSet<ControllerContext>();
+ Set<ControllerContext> currentContexts = super.getInstantiatedContexts(clazz);
+ if (currentContexts != null && currentContexts.size() > 0)
+ {
+ contexts.addAll(currentContexts);
+ }
+ if (getParentController() != null)
+ {
+ Set<ControllerContext> parentContexts = getParentController().getInstantiatedContexts(clazz);
+ if (parentContexts != null && parentContexts.size() > 0)
+ {
+ contexts.addAll(parentContexts);
+ }
+ }
+ return contexts.size() > 0 ? contexts : null;
+ }
+ finally{
+ unlockRead();
+ }
+ }
+
+ public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
+ {
+ lockRead();
+ try
+ {
+ Set<ControllerContext> contexts = new HashSet<ControllerContext>();
+ Set<ControllerContext> currentContexts = super.getContexts(clazz, state);
+ if (currentContexts != null && currentContexts.size() > 0)
+ {
+ contexts.addAll(currentContexts);
+ }
+ if (getParentController() != null)
+ {
+ Set<ControllerContext> parentContexts = getParentController().getContexts(clazz, state);
+ if (parentContexts != null && parentContexts.size() > 0)
+ {
+ contexts.addAll(parentContexts);
+ }
+ }
+ return contexts.size() > 0 ? contexts : null;
+ }
+ finally{
+ unlockRead();
+ }
+ }
+
/**
* Add scope key info to toString.
*
Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -21,10 +21,14 @@
*/
package org.jboss.dependency.plugins.helpers;
+import java.util.Collections;
+import java.util.Set;
+
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.spi.ContextTracker;
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.plugins.AbstractController;
/**
* Stateless controller.
@@ -85,4 +89,32 @@
public void shutdown()
{
}
+
+ @Override
+ public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
+ {
+ if (controller instanceof ContextTracker)
+ return ContextTracker.class.cast(controller).getInstantiatedContexts(clazz);
+ else
+ return Collections.emptySet();
+ }
+
+ @Override
+ public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
+ {
+ if (controller instanceof ContextTracker)
+ return ContextTracker.class.cast(controller).getContexts(clazz, state);
+ else
+ return Collections.emptySet();
+ }
+
+ @Override
+ public void addInstantiatedContext(ControllerContext context)
+ {
+ }
+
+ @Override
+ public void removeInstantiatedContext(ControllerContext context)
+ {
+ }
}
\ No newline at end of file
Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ContextTracker.java (from rev 96594, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/Controller.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ContextTracker.java (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ContextTracker.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -0,0 +1,75 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.dependency.spi;
+
+import java.util.Set;
+
+/**
+ * Track contexts.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface ContextTracker
+{
+ /**
+ * Get all instantiated contexts of a given type
+ *
+ * @param clazz the type
+ * @return the contexts
+ */
+ Set<ControllerContext> getInstantiatedContexts(Class<?> clazz);
+
+ /**
+ * Get all contexts of a type which are in the given state or above
+ *
+ * @param clazz the type
+ * @param state the required state
+ * @return the contexts
+ */
+ Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state);
+
+ /**
+ * Get an instantiated context that is of the type passed in.
+ * If zero or multiple instances match class clazz
+ * a warning is issued, but no throwable is thrown
+ *
+ * @param clazz the type
+ * @return context whose target is instance of this class clazz param or null if zero or multiple such instances
+ */
+ ControllerContext getContextByClass(Class<?> clazz);
+
+ /**
+ * Add instantiated context into the map used by {@link #getContextByClass(Class)}.
+ * Look at all the context's target's superclasses and interfaces.
+ *
+ * @param context the context
+ */
+ void addInstantiatedContext(ControllerContext context);
+
+ /**
+ * Remove instantiated context from the map used by {@link #getContextByClass(Class)}.
+ * Look at all target's superclasses and interfaces.
+ *
+ * @param context the context
+ */
+ void removeInstantiatedContext(ControllerContext context);
+}
\ No newline at end of file
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionDependencyItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionDependencyItem.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionDependencyItem.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -24,10 +24,10 @@
import java.lang.annotation.Annotation;
import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.kernel.plugins.dependency.ClassDependencyItem;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
/**
* Web beans injection dependency item.
@@ -52,7 +52,7 @@
throw new IllegalArgumentException("Can only handle kernel controller: " + controller);
KernelController kernelController = (KernelController)controller;
- KernelControllerContext context = WBInjectionResolver.resolve(kernelController, getDemandClass(), annotations);
+ ControllerContext context = WBInjectionResolver.resolve(kernelController, getDemandClass(), annotations);
setResolved(context != null);
return isResolved();
}
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionResolver.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionResolver.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionResolver.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -22,20 +22,20 @@
package org.jboss.kernel.plugins.annotations.wb;
import java.lang.annotation.Annotation;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
-import java.util.List;
-import java.util.ArrayList;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
import org.jboss.logging.Logger;
import org.jboss.metadata.spi.MetaData;
-import org.jboss.beans.metadata.spi.ValueMetaData;
-import org.jboss.beans.metadata.api.annotations.Inject;
/**
* Web beans injection resolver.
@@ -48,7 +48,7 @@
private static final Logger log = Logger.getLogger(WBInjectionResolver.class);
/** The cache */
- private static final Map<CacheKey, Map<KernelControllerContext, Boolean>> cache = new WeakHashMap<CacheKey, Map<KernelControllerContext, Boolean>>();
+ private static final Map<CacheKey, Map<ControllerContext, Boolean>> cache = new WeakHashMap<CacheKey, Map<ControllerContext, Boolean>>();
/** The excluded annotation */
private static final Set<Class<? extends Annotation>> excludedAnnotations = new HashSet<Class<? extends Annotation>>();
@@ -98,7 +98,7 @@
* @param annotations the filter annotations
* @return single matching context or null if none or multiple
*/
- public static KernelControllerContext resolve(KernelController controller, Class<?> type, Annotation[] annotations)
+ public static ControllerContext resolve(KernelController controller, Class<?> type, Annotation[] annotations)
{
if (controller == null)
throw new IllegalArgumentException("Null controller");
@@ -107,19 +107,19 @@
if (annotations == null)
annotations = new Annotation[]{};
- Set<KernelControllerContext> contexts = controller.getContexts(type, ControllerState.INSTALLED);
+ Set<ControllerContext> contexts = controller.getContexts(type, ControllerState.INSTALLED);
if (contexts != null && contexts.isEmpty() == false)
{
CacheKey key = new CacheKey(type, annotations);
- Map<KernelControllerContext, Boolean> cachedResults = cache.get(key);
+ Map<ControllerContext, Boolean> cachedResults = cache.get(key);
if (cachedResults == null)
{
- cachedResults = new WeakHashMap<KernelControllerContext, Boolean>();
+ cachedResults = new WeakHashMap<ControllerContext, Boolean>();
cache.put(key, cachedResults);
}
- Set<KernelControllerContext> matchingContexts = new HashSet<KernelControllerContext>();
- for(KernelControllerContext context : contexts)
+ Set<ControllerContext> matchingContexts = new HashSet<ControllerContext>();
+ for(ControllerContext context : contexts)
{
Boolean match = cachedResults.get(context);
if (match == null)
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionValueMetaData.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionValueMetaData.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -25,6 +25,7 @@
import org.jboss.beans.metadata.plugins.AbstractValueMetaData;
import org.jboss.beans.metadata.spi.MetaDataVisitor;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.kernel.spi.dependency.KernelController;
import org.jboss.kernel.spi.dependency.KernelControllerContext;
import org.jboss.reflect.spi.TypeInfo;
@@ -69,10 +70,21 @@
public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
{
KernelController controller = context.getKernel().getController();
- KernelControllerContext result = WBInjectionResolver.resolve(controller, info.getType(), annotations);
+ ControllerContext result = WBInjectionResolver.resolve(controller, info.getType(), annotations);
if (result != null)
return result.getTarget();
else
throw new IllegalArgumentException("Should not be here, dependency not resolved: " + toString());
}
+
+ @SuppressWarnings("deprecation")
+ public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
+ {
+ KernelController controller = context.getKernel().getController();
+ ControllerContext result = WBInjectionResolver.resolve(controller, info.getType(), annotations);
+ if (result != null)
+ result.ungetTarget();
+
+ return null;
+ }
}
\ No newline at end of file
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -21,9 +21,7 @@
*/
package org.jboss.kernel.plugins.dependency;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -67,9 +65,6 @@
/** The supplies */
protected ConcurrentMap<Object, List<KernelControllerContext>> suppliers = new ConcurrentHashMap<Object, List<KernelControllerContext>>();
- /** The contexts by class Map<Class, Set<ControllerContext>> */
- protected Map<Class<?>, ClassContext> contextsByClass = new ConcurrentHashMap<Class<?>, ClassContext>();
-
/**
* Create an abstract kernel controller
*
@@ -119,8 +114,6 @@
if (list != null && list.isEmpty() == false)
return list.get(0);
- else if (name instanceof Class)
- return getContextByClass((Class<?>) name);
else
return null;
}
@@ -269,191 +262,4 @@
{
emitterDelegate.unregisterListener(listener, filter, handback);
}
-
- /**
- * Get contexts by class.
- * This method should be taken with read lock.
- *
- * @param clazz the class type
- * @return contexts by class
- */
- protected Set<KernelControllerContext> getContexts(Class<?> clazz)
- {
- ClassContext classContext = contextsByClass.get(clazz);
- if (classContext != null)
- {
- if (log.isTraceEnabled())
- {
- log.trace("Marking class " + clazz + " as used.");
- }
- classContext.used = true;
- return classContext.contexts;
- }
- return null;
- }
-
- /**
- * @return all instantiated contexts whose target is instance of this class clazz param
- */
- public Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz)
- {
- lockRead();
- try
- {
- Set<KernelControllerContext> contexts = getContexts(clazz);
- return contexts != null && contexts.isEmpty() == false ? Collections.unmodifiableSet(contexts) : null;
- }
- finally
- {
- unlockRead();
- }
- }
-
- public Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state)
- {
- lockRead();
- try
- {
- Set<KernelControllerContext> contexts = getContexts(clazz);
- if (contexts != null && contexts.isEmpty() == false)
- {
- Set<KernelControllerContext> kccs = new HashSet<KernelControllerContext>();
- for(KernelControllerContext context : contexts)
- {
- if (getStates().isBeforeState(context.getState(), state) == false)
- kccs.add(context);
- }
- return kccs;
- }
- else
- return null;
- }
- finally
- {
- unlockRead();
- }
- }
-
- public void addInstantiatedContext(KernelControllerContext context)
- {
- prepareToTraverse(context, true);
- }
-
- public void removeInstantiatedContext(KernelControllerContext context)
- {
- prepareToTraverse(context, false);
- }
-
- protected void prepareToTraverse(KernelControllerContext context, boolean addition)
- {
- lockWrite();
- try
- {
- Object target = context.getTarget();
- if (target != null)
- {
- traverseBean(context, target.getClass(), addition, log.isTraceEnabled());
- }
- }
- finally
- {
- unlockWrite();
- }
- }
-
- /**
- * Traverse over target and map it to all its superclasses
- * and interfaces - using recursion.
- *
- * @param context context whose target is instance of clazz
- * @param clazz current class to map context to
- * @param addition whether this is an addition
- * @param trace whether trace is enabled
- */
- protected void traverseBean(KernelControllerContext context, Class<?> clazz, boolean addition, boolean trace)
- {
- if (clazz == null || clazz == Object.class)
- {
- return;
- }
- ClassContext classContext = contextsByClass.get(clazz);
- if (addition)
- {
- if (classContext == null)
- {
- classContext = new ClassContext();
- classContext.contexts = new HashSet<KernelControllerContext>();
- contextsByClass.put(clazz, classContext);
- }
- else if (classContext.used)
- {
- log.debug("Additional matching bean - contextual injection already used for class: " + clazz);
- }
- if (trace)
- {
- log.trace("Mapping contex " + context + " to class: " + clazz);
- }
- classContext.contexts.add(context);
- }
- else
- {
- if (classContext != null)
- {
- if (trace)
- {
- log.trace("Removing contex " + context + " to class: " + clazz);
- }
- classContext.contexts.remove(context);
- }
- }
- // traverse superclass
- traverseBean(context, clazz.getSuperclass(), addition, trace);
- Class<?>[] interfaces = clazz.getInterfaces();
- // traverse interfaces
- for(Class<?> intface : interfaces)
- {
- traverseBean(context, intface, addition, trace);
- }
- }
-
- private static class ClassContext
- {
- private boolean used;
- private Set<KernelControllerContext> contexts;
- }
-
- /**
- * If zero or multiple instances match class clazz
- * a warning is issued, but no throwable is thrown
- *
- * @return context whose target is instance of this class clazz param or null if zero or multiple such instances
- */
- public KernelControllerContext getContextByClass(Class<?> clazz)
- {
- Set<KernelControllerContext> contexts = getInstantiatedContexts(clazz);
- int numberOfMatchingBeans = 0;
- if (contexts != null)
- {
- numberOfMatchingBeans = contexts.size();
- }
-
- if (log.isTraceEnabled())
- {
- log.trace("Checking for contextual injection, current matches: " + numberOfMatchingBeans + " - " + clazz);
- }
-
- if (numberOfMatchingBeans != 1)
- {
- if (numberOfMatchingBeans > 1)
- {
- log.warn("Multiple beans match class type [enable trace log for details]: " + clazz);
- if (log.isTraceEnabled())
- {
- log.trace("Matching contexts: " + contexts);
- }
- }
- return null;
- }
- return contexts.iterator().next();
- }
}
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CallbackDependencyItem.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -25,9 +25,9 @@
import org.jboss.dependency.spi.Cardinality;
import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
import org.jboss.util.HashCode;
import org.jboss.util.JBossStringBuilder;
@@ -53,7 +53,7 @@
return cardinality;
}
- protected Set<KernelControllerContext> getContexts(Controller controller)
+ protected Set<ControllerContext> getContexts(Controller controller)
{
if (controller instanceof KernelController == false)
throw new IllegalArgumentException("Controller not KernelController!");
@@ -64,14 +64,14 @@
public boolean resolve(Controller controller)
{
- Set<KernelControllerContext> contexts = getContexts(controller);
+ Set<ControllerContext> contexts = getContexts(controller);
int size = contexts != null ? contexts.size() : 0;
if (cardinality.isInRange(size))
{
setIDependOn(getIDependOn());
if (contexts != null)
{
- for (KernelControllerContext context : contexts)
+ for (ControllerContext context : contexts)
addDependsOnMe(controller, context);
}
setResolved(true);
@@ -88,7 +88,7 @@
if (getIDependOn() == null)
return true;
- Set<KernelControllerContext> contexts = getContexts(controller);
+ Set<ControllerContext> contexts = getContexts(controller);
// minus one, since this is called when unistalling dependent context
int size = contexts != null ? contexts.size() - 1 : 0;
return cardinality.isInRange(size) == false;
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAttributeCallbackItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAttributeCallbackItem.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassAttributeCallbackItem.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -29,7 +29,6 @@
import org.jboss.dependency.spi.DependencyItem;
import org.jboss.dependency.spi.dispatch.AttributeDispatchContext;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
/**
* Class callback item - class dependency.
@@ -56,7 +55,7 @@
if (controller instanceof KernelController)
{
KernelController kc = (KernelController)controller;
- KernelControllerContext context = kc.getContextByClass(getIDependOn());
+ ControllerContext context = kc.getContextByClass(getIDependOn());
if (context != null)
{
Object target = context.getTarget();
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextKernelRegistryPlugin.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextKernelRegistryPlugin.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassContextKernelRegistryPlugin.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -24,6 +24,7 @@
import org.jboss.kernel.spi.registry.KernelRegistryPlugin;
import org.jboss.kernel.spi.registry.KernelRegistryEntry;
import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.dependency.spi.ControllerContext;
/**
* Class aware KernelRegistryPlugin.
@@ -44,7 +45,9 @@
{
if (name instanceof Class)
{
- return controller.getContextByClass((Class)name);
+ ControllerContext context = controller.getContextByClass((Class)name);
+ if (context instanceof KernelRegistryEntry)
+ return KernelRegistryEntry.class.cast(context);
}
return null;
}
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassSingleCallbackItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassSingleCallbackItem.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassSingleCallbackItem.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -25,13 +25,12 @@
import org.jboss.dependency.plugins.SingleCallbackItem;
import org.jboss.dependency.spi.Cardinality;
+import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.dependency.spi.DependencyItem;
-import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
/**
* Class single dependency item - class dependency.
@@ -68,10 +67,10 @@
if (controller instanceof KernelController)
{
KernelController kc = (KernelController)controller;
- Set<KernelControllerContext> contexts = kc.getContexts(getIDependOn(), getDependentState());
+ Set<ControllerContext> contexts = kc.getContexts(getIDependOn(), getDependentState());
if (contexts != null && contexts.isEmpty() == false)
{
- for(KernelControllerContext context : contexts)
+ for(ControllerContext context : contexts)
{
Object target = context.getTarget();
if (signature == null)
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CollectionCallbackItem.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CollectionCallbackItem.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CollectionCallbackItem.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -32,7 +32,6 @@
import org.jboss.dependency.spi.DependencyItem;
import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
/**
* Collection callback item.
@@ -80,7 +79,7 @@
throw new IllegalArgumentException("Illegal collection holder, equals null!");
KernelController kernelController = (KernelController)controller;
- Set<KernelControllerContext> contexts = kernelController.getContexts(getIDependOn(), dependentState);
+ Set<ControllerContext> contexts = kernelController.getContexts(getIDependOn(), dependentState);
if (contexts != null && contexts.isEmpty() == false)
{
for(ControllerContext context : contexts)
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ScopedKernelController.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ScopedKernelController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ScopedKernelController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -39,7 +39,6 @@
import org.jboss.kernel.spi.config.KernelConfig;
import org.jboss.kernel.spi.config.KernelConfigurator;
import org.jboss.kernel.spi.dependency.KernelController;
-import org.jboss.kernel.spi.dependency.KernelControllerContext;
import org.jboss.kernel.spi.event.KernelEvent;
import org.jboss.kernel.spi.event.KernelEventFilter;
import org.jboss.kernel.spi.event.KernelEventListener;
@@ -195,58 +194,6 @@
}
}
- public Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz)
- {
- lockRead();
- try
- {
- Set<KernelControllerContext> contexts = new HashSet<KernelControllerContext>();
- Set<KernelControllerContext> currentContexts = super.getInstantiatedContexts(clazz);
- if (currentContexts != null && currentContexts.size() > 0)
- {
- contexts.addAll(currentContexts);
- }
- if (isParentKernelController())
- {
- Set<KernelControllerContext> parentContexts = getParentKernelController().getInstantiatedContexts(clazz);
- if (parentContexts != null && parentContexts.size() > 0)
- {
- contexts.addAll(parentContexts);
- }
- }
- return contexts.size() > 0 ? contexts : null;
- }
- finally{
- unlockRead();
- }
- }
-
- public Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state)
- {
- lockRead();
- try
- {
- Set<KernelControllerContext> contexts = new HashSet<KernelControllerContext>();
- Set<KernelControllerContext> currentContexts = super.getContexts(clazz, state);
- if (currentContexts != null && currentContexts.size() > 0)
- {
- contexts.addAll(currentContexts);
- }
- if (isParentKernelController())
- {
- Set<KernelControllerContext> parentContexts = getParentKernelController().getContexts(clazz, state);
- if (parentContexts != null && parentContexts.size() > 0)
- {
- contexts.addAll(parentContexts);
- }
- }
- return contexts.size() > 0 ? contexts : null;
- }
- finally{
- unlockRead();
- }
- }
-
// org.jboss.kernel.spi.registry.KernelRegistry plugin method
public KernelRegistryEntry getEntry(Object name)
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/StatelessKernelController.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/StatelessKernelController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/StatelessKernelController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -21,11 +21,8 @@
*/
package org.jboss.kernel.plugins.dependency;
-import java.util.Set;
-
import org.jboss.beans.metadata.spi.BeanMetaData;
import org.jboss.dependency.plugins.helpers.StatelessController;
-import org.jboss.dependency.spi.ControllerState;
import org.jboss.kernel.Kernel;
import org.jboss.kernel.spi.dependency.KernelController;
import org.jboss.kernel.spi.dependency.KernelControllerContext;
@@ -66,29 +63,6 @@
{
}
- public Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz)
- {
- return delegate.getInstantiatedContexts(clazz);
- }
-
- public Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state)
- {
- return delegate.getContexts(clazz, state);
- }
-
- public KernelControllerContext getContextByClass(Class<?> clazz)
- {
- return delegate.getContextByClass(clazz);
- }
-
- public void addInstantiatedContext(KernelControllerContext context)
- {
- }
-
- public void removeInstantiatedContext(KernelControllerContext context)
- {
- }
-
public Kernel getKernel()
{
return delegate.getKernel();
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/validation/AbstractKernelBeanValidator.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/validation/AbstractKernelBeanValidator.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/validation/AbstractKernelBeanValidator.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -22,6 +22,7 @@
package org.jboss.kernel.plugins.validation;
import org.jboss.beans.info.spi.PropertyInfo;
+import org.jboss.dependency.spi.ControllerContext;
import org.jboss.joinpoint.spi.Joinpoint;
import org.jboss.kernel.Kernel;
import org.jboss.kernel.plugins.AbstractKernelObject;
@@ -54,8 +55,20 @@
*/
protected BeanValidatorBridge getDelegate()
{
- KernelControllerContext context = controller.getContextByClass(BeanValidatorBridge.class);
- return context != null ? BeanValidatorBridge.class.cast(context.getTarget()) : null;
+ ControllerContext context = controller.getContextByClass(BeanValidatorBridge.class);
+ if (context != null)
+ {
+ Object target = context.getTarget();
+ try
+ {
+ return BeanValidatorBridge.class.cast(target);
+ }
+ finally
+ {
+ context.ungetTarget();
+ }
+ }
+ return null;
}
public void validateConstructorValues(KernelControllerContext context, Joinpoint joinpoint) throws Throwable
Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelController.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -21,9 +21,8 @@
*/
package org.jboss.kernel.spi.dependency;
-import java.util.Set;
-
import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.dependency.spi.ContextTracker;
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.kernel.Kernel;
@@ -41,7 +40,7 @@
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision$
*/
-public interface KernelController extends KernelObject, Controller
+public interface KernelController extends KernelObject, Controller, ContextTracker
{
/**
* Install a context from a {@link BeanMetaData}.
@@ -80,47 +79,4 @@
* @param context the context we want to check for supplies
*/
void removeSupplies(KernelControllerContext context);
-
- /**
- * Get all instantiated contexts of a given type
- *
- * @param clazz the type
- * @return the contexts
- */
- Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz);
-
- /**
- * Get all contexts of a type which are in the given state or above
- *
- * @param clazz the type
- * @param state the required state
- * @return the contexts
- */
- Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state);
-
- /**
- * Get an instantiated context that is of the type passed in.
- * If zero or multiple instances match class clazz
- * a warning is issued, but no throwable is thrown
- *
- * @param clazz the type
- * @return context whose target is instance of this class clazz param or null if zero or multiple such instances
- */
- KernelControllerContext getContextByClass(Class<?> clazz);
-
- /**
- * Add instantiated context into the map used by {@link #getContextByClass(Class)}.
- * Look at all the context's target's superclasses and interfaces.
- *
- * @param context the context
- */
- void addInstantiatedContext(KernelControllerContext context);
-
- /**
- * Remove instantiated context from the map used by {@link #getContextByClass(Class)}.
- * Look at all target's superclasses and interfaces.
- *
- * @param context the context
- */
- void removeInstantiatedContext(KernelControllerContext context);
}
Modified: projects/kernel/trunk/weld-int/src/test/java/org/jboss/test/kernel/weld/mctowb/support/mock/MockController.java
===================================================================
--- projects/kernel/trunk/weld-int/src/test/java/org/jboss/test/kernel/weld/mctowb/support/mock/MockController.java 2009-11-20 16:30:15 UTC (rev 96645)
+++ projects/kernel/trunk/weld-int/src/test/java/org/jboss/test/kernel/weld/mctowb/support/mock/MockController.java 2009-11-20 16:42:40 UTC (rev 96646)
@@ -43,7 +43,6 @@
*/
public class MockController extends JBossObject implements KernelController
{
-
public void addAlias(Object alias, Object original) throws Throwable
{
}
@@ -116,7 +115,7 @@
{
}
- public void addInstantiatedContext(KernelControllerContext context)
+ public void addInstantiatedContext(ControllerContext context)
{
}
@@ -124,17 +123,17 @@
{
}
- public KernelControllerContext getContextByClass(Class<?> clazz)
+ public ControllerContext getContextByClass(Class<?> clazz)
{
return null;
}
- public Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state)
+ public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
{
return null;
}
- public Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz)
+ public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
{
return null;
}
@@ -149,7 +148,7 @@
return null;
}
- public void removeInstantiatedContext(KernelControllerContext context)
+ public void removeInstantiatedContext(ControllerContext context)
{
}
@@ -179,5 +178,4 @@
throws Throwable
{
}
-
}
More information about the jboss-cvs-commits
mailing list