[jboss-cvs] JBossAS SVN: r96740 - in projects/kernel/trunk: dependency/src/main/java/org/jboss/dependency/plugins/helpers and 15 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Nov 23 11:36:32 EST 2009


Author: alesj
Date: 2009-11-23 11:36:31 -0500 (Mon, 23 Nov 2009)
New Revision: 96740

Added:
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextRegistry.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractLockHolder.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextQueries.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextRegistry.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracking.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/AbstractControllerContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AttributeCallbackItem.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/OwnerCallbackItem.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SingleCallbackItem.java
   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/tracker/AbstractContextTracker.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/Controller.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/AttributeDispatchContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/InvokeDispatchContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/helpers/UnmodifiableControllerContext.java
   projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java
   projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java
   projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/ServiceInjectionValueMetaData.java
   projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/microcontainer/ServiceControllerContext.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInstallMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/ThisValueMetaData.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/AbstractKernelControllerContext.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/dispatch/InvokeDispatchHelper.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/AbstractKernelRegistryEntry.java
   projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/BeanKernelRegistryEntry.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/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
Log:
[JBKERNEL-61]; context tracking initial impl.

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -39,10 +39,8 @@
 
 import org.jboss.dependency.plugins.action.ControllerContextAction;
 import org.jboss.dependency.plugins.action.SimpleControllerContextAction;
-import org.jboss.dependency.plugins.tracker.AbstractContextTracker;
+import org.jboss.dependency.plugins.tracker.AbstractContextRegistry;
 import org.jboss.dependency.spi.CallbackItem;
-import org.jboss.dependency.spi.tracker.ContextTracker;
-import org.jboss.dependency.spi.tracker.ContextFilter;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerContextActions;
@@ -56,6 +54,9 @@
 import org.jboss.dependency.spi.graph.GraphController;
 import org.jboss.dependency.spi.graph.LookupStrategy;
 import org.jboss.dependency.spi.graph.SearchInfo;
+import org.jboss.dependency.spi.tracker.ContextFilter;
+import org.jboss.dependency.spi.tracker.ContextQueries;
+import org.jboss.dependency.spi.tracker.ContextRegistry;
 import org.jboss.util.JBossObject;
 import org.jboss.util.collection.CollectionsFactory;
 
@@ -67,7 +68,7 @@
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @version $Revision$
  */
-public class AbstractController extends JBossObject implements Controller, GraphController, AbstractControllerMBean, AsynchronousController, ContextTracker
+public class AbstractController extends JBossObject implements Controller, GraphController, AbstractControllerMBean, AsynchronousController, ContextQueries, ContextRegistry
 {
    /** The lock */
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
@@ -119,7 +120,7 @@
    private volatile StateStatistics installStats = null;
 
    /** The context tracker */
-   private ContextTracker tracker;
+   private AbstractContextRegistry registry;
 
    /**
     * Create an abstract controller
@@ -135,10 +136,20 @@
       addState(ControllerState.START, null);
       addState(ControllerState.INSTALLED, null);
 
-      tracker = new AbstractContextTracker(this);
+      registry = createContextRegistry();
    }
 
    /**
+    * Create context registry.
+    *
+    * @return the context registry
+    */
+   protected AbstractContextRegistry createContextRegistry()
+   {
+      return new AbstractContextRegistry(this);
+   }
+
+   /**
     * Set the executor used to install ASYNCHRONOUS contexts. It must have a saturation policy of
     * (or semantically similar to) ThreadPoolExecutor.AbortPolicy or ThreadPoolExecutor.CallerRunsPolicy.
     *
@@ -1833,14 +1844,7 @@
    protected Collection<Class<?>> getClassesImplemented(ControllerContext context)
    {
       Object target = context.getTarget();
-      try
-      {
-         return getClassesImplemented(target);
-      }
-      finally
-      {
-         context.ungetTarget();
-      }
+      return getClassesImplemented(target);
    }
 
    /**
@@ -2537,45 +2541,45 @@
       }
    }
 
-   // Context tracker
+   // Context queries & registry
 
    public Set<ControllerContext> filter(Iterable<ControllerContext> contexts, ContextFilter filter)
    {
-      return tracker.filter(contexts, filter);
+      return registry.filter(contexts, filter);
    }
 
    public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
    {
-      return tracker.getInstantiatedContexts(clazz);
+      return registry.getInstantiatedContexts(clazz);
    }
 
    public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
    {
-      return tracker.getContexts(clazz, state);
+      return registry.getContexts(clazz, state);
    }
 
    public ControllerContext getContextByClass(Class<?> clazz)
    {
-      return tracker.getContextByClass(clazz);
+      return registry.getContextByClass(clazz);
    }
 
    public void addInstantiatedContext(ControllerContext context)
    {
-      tracker.addInstantiatedContext(context);
+      registry.addInstantiatedContext(context);
    }
 
    public void registerInstantiatedContext(ControllerContext context, Class<?>... classes)
    {
-      tracker.registerInstantiatedContext(context, classes);
+      registry.registerInstantiatedContext(context, classes);
    }
 
    public void unregisterInstantiatedContext(ControllerContext context, Class<?>... classes)
    {
-      tracker.unregisterInstantiatedContext(context, classes);
+      registry.unregisterInstantiatedContext(context, classes);
    }
 
    public void removeInstantiatedContext(ControllerContext context)
    {
-      tracker.removeInstantiatedContext(context);
+      registry.removeInstantiatedContext(context);
    }
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -35,6 +35,8 @@
 import org.jboss.dependency.spi.DependencyInfo;
 import org.jboss.dependency.spi.ErrorHandlingMode;
 import org.jboss.dependency.spi.ScopeInfo;
+import org.jboss.dependency.spi.tracker.ContextTracker;
+import org.jboss.dependency.spi.tracker.ContextTracking;
 import org.jboss.util.JBossObject;
 import org.jboss.util.JBossStringBuilder;
 
@@ -44,7 +46,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public class AbstractControllerContext extends JBossObject implements ControllerContext
+public class AbstractControllerContext extends JBossObject implements ControllerContext, ContextTracking
 {
    /** The name */
    private Object name;
@@ -309,11 +311,6 @@
       return target;
    }
 
-   public Object ungetTarget()
-   {
-      return target;
-   }
-
    /**
     * Set the target
     *
@@ -356,6 +353,63 @@
       actions.uninstall(this, fromState, toState);
    }
 
+   public ContextTracker getContextTracker()
+   {
+      return null; // TODO
+   }
+
+   public Object getTarget(ControllerContext user)
+   {
+      Object result = getTarget();
+      if (result != null)
+      {
+         ContextTracker myTracker = getContextTracker();
+         if (myTracker != null)
+            myTracker.addInUseContext(user, this);
+
+         if (user instanceof ContextTracking)
+         {
+            ContextTracking ct = ContextTracking.class.cast(user);
+            ContextTracker otherTracker = ct.getContextTracker();
+            if (otherTracker != null)
+               otherTracker.addInUseContext(user, this);
+         }
+      }
+      return result;
+   }
+
+   public Object ungetTarget(ControllerContext user)
+   {
+      Object result = getTarget();
+      if (result != null)
+      {
+         ContextTracker myTracker = getContextTracker();
+         if (myTracker != null)
+            myTracker.removeInUseContext(user, this);
+
+         if (user instanceof ContextTracking)
+         {
+            ContextTracking ct = ContextTracking.class.cast(user);
+            ContextTracker otherTracker = ct.getContextTracker();
+            if (otherTracker != null)
+               otherTracker.removeInUseContext(user, this);
+         }
+      }
+      return result;
+   }
+
+   public Object getTarget(ContextTracker tracker)
+   {
+      Object result = getTarget();
+      tracker.addUsing(this);
+      return result;
+   }
+
+   public void ungetTarget(ContextTracker tracker)
+   {
+      tracker.removeUsing(this);
+   }
+
    public void toString(JBossStringBuilder buffer)
    {
       buffer.append("name=").append(name);

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AttributeCallbackItem.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AttributeCallbackItem.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/AttributeCallbackItem.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -50,7 +50,7 @@
 
    protected void changeCallback(ControllerContext context, boolean isInstallPhase) throws Throwable
    {
-      Object target = isInstallPhase ? context.getTarget() : context.ungetTarget();
+      Object target = getTarget(context, isInstallPhase);
       execute(target);
    }
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/OwnerCallbackItem.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/OwnerCallbackItem.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/OwnerCallbackItem.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -25,6 +25,7 @@
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.tracker.ContextTracking;
 import org.jboss.util.JBossStringBuilder;
 
 /**
@@ -52,6 +53,33 @@
    }
 
    /**
+    * Get target.
+    *
+    * @param context the context to get target from
+    * @param isInstallPhase is it install phase
+    * @return context's target
+    */
+   protected Object getTarget(ControllerContext context, boolean isInstallPhase)
+   {
+      Object target;
+      if (isInstallPhase)
+      {
+         if (context instanceof ContextTracking && owner instanceof ControllerContext)
+            target = ContextTracking.class.cast(context).getTarget(ControllerContext.class.cast(owner));
+         else
+            target = context.getTarget();
+      }
+      else
+      {
+         if (context instanceof ContextTracking && owner instanceof ControllerContext)
+            target = ContextTracking.class.cast(context).ungetTarget(ControllerContext.class.cast(owner));
+         else
+            target = context.getTarget();
+      }
+      return target;
+   }
+
+   /**
     * Add dependency.
     *
     * @param controller the controller

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SingleCallbackItem.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SingleCallbackItem.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/SingleCallbackItem.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -59,7 +59,7 @@
 
    protected void changeCallback(ControllerContext context, boolean isInstallPhase) throws Throwable
    {
-      Object target = isInstallPhase ? context.getTarget() : context.ungetTarget();
+      Object target = getTarget(context, isInstallPhase);
       if (target != null)
       {
          if (signature == null)

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -25,10 +25,10 @@
 import java.util.Set;
 
 import org.jboss.dependency.plugins.AbstractController;
-import org.jboss.dependency.spi.tracker.ContextTracker;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.tracker.ContextQueries;
 
 /**
  * Stateless controller.
@@ -93,8 +93,8 @@
    @Override
    public Set<ControllerContext> getInstantiatedContexts(Class<?> clazz)
    {
-      if (controller instanceof ContextTracker)
-         return ContextTracker.class.cast(controller).getInstantiatedContexts(clazz);
+      if (controller instanceof ContextQueries)
+         return ContextQueries.class.cast(controller).getInstantiatedContexts(clazz);
       else
          return Collections.emptySet();
    }
@@ -102,8 +102,8 @@
    @Override
    public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
    {
-      if (controller instanceof ContextTracker)
-         return ContextTracker.class.cast(controller).getContexts(clazz, state);
+      if (controller instanceof ContextQueries)
+         return ContextQueries.class.cast(controller).getContexts(clazz, state);
       else
          return Collections.emptySet();
    }

Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextRegistry.java (from rev 96720, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextTracker.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextRegistry.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextRegistry.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -0,0 +1,335 @@
+/*
+* 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.plugins.tracker;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.ControllerStateModel;
+import org.jboss.dependency.spi.tracker.ContextFilter;
+import org.jboss.dependency.spi.tracker.ContextQueries;
+import org.jboss.dependency.spi.tracker.ContextRegistry;
+
+/**
+ * Abstract context registry
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class AbstractContextRegistry extends AbstractLockHolder implements ContextQueries, ContextRegistry
+{
+   /** The contexts by class Map<Class, Set<ControllerContext>> */
+   private Map<Class<?>, ClassContext> contextsByClass = new ConcurrentHashMap<Class<?>, ClassContext>();
+
+   /** The controller */
+   private Controller controller;
+
+   public AbstractContextRegistry(Controller controller)
+   {
+      if (controller == null)
+         throw new IllegalArgumentException("Null controller");
+      this.controller = controller;
+   }
+
+   public ControllerContext getContext(Object name, ControllerState state)
+   {
+      return controller.getContext(name, state);
+   }
+
+   public ControllerContext getInstalledContext(Object name)
+   {
+      return controller.getInstalledContext(name);
+   }
+
+   public Set<ControllerContext> getNotInstalled()
+   {
+      return controller.getNotInstalled();
+   }
+
+   public Set<ControllerContext> getContextsByState(ControllerState state)
+   {
+      return controller.getContextsByState(state);
+   }
+
+   public Set<ControllerContext> filter(Iterable<ControllerContext> contexts, ContextFilter filter)
+   {
+      if (contexts == null)
+         return null;
+
+      Set<ControllerContext> set = new HashSet<ControllerContext>();
+      for (ControllerContext context : contexts)
+      {
+         if (filter == null || filter.accepts(context))
+            set.add(context);
+      }
+      return set;
+   }
+
+   /**
+    * 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)
+         {
+            ControllerStateModel model = controller.getStates();
+            Set<ControllerContext> kccs = new HashSet<ControllerContext>();
+            for(ControllerContext context : contexts)
+            {
+               if (model.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 registerInstantiatedContext(ControllerContext context, Class<?>... classes)
+   {
+      handleInstantiatedContext(context, true, classes);
+   }
+
+   /**
+    * Register / unregister contexts against explicit classes.
+    *
+    * @param context the context
+    * @param addition whether this is an addition
+    * @param classes the exposed classes
+    */
+   protected void handleInstantiatedContext(ControllerContext context, boolean addition, Class<?>... classes)
+   {
+      if (classes != null && classes.length > 0)
+      {
+         boolean trace = log.isTraceEnabled();
+
+         lockWrite();
+         try
+         {
+            for (Class<?> clazz : classes)
+               handleContext(context, clazz, addition, trace);
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+   }
+
+   public void unregisterInstantiatedContext(ControllerContext context, Class<?>... classes)
+   {
+      handleInstantiatedContext(context, false, classes);
+   }
+
+   public void removeInstantiatedContext(ControllerContext context)
+   {
+      prepareToTraverse(context, false);
+   }
+
+   protected void prepareToTraverse(ControllerContext 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(ControllerContext context, Class<?> clazz, boolean addition, boolean trace)
+   {
+      if (clazz == null || clazz == Object.class)
+      {
+         return;
+      }
+
+      handleContext(context, clazz, addition, trace);
+
+      // traverse superclass
+      traverseBean(context, clazz.getSuperclass(), addition, trace);
+      Class<?>[] interfaces = clazz.getInterfaces();
+      // traverse interfaces
+      for(Class<?> intface : interfaces)
+      {
+         traverseBean(context, intface, addition, trace);
+      }
+   }
+
+   /**
+    * Map or remove context against class.
+    * This method should be used with write lock taken before.
+    *
+    * @param context the context
+    * @param clazz the class
+    * @param addition whether this is an addition
+    * @param trace trace is enabled
+    */
+   protected void handleContext(ControllerContext context, Class<?> clazz, boolean addition, boolean trace)
+   {
+      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);
+         }
+      }
+   }
+
+   /**
+    * 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();
+   }
+
+   private static class ClassContext
+   {
+      private boolean used;
+      private Set<ControllerContext> contexts;
+   }
+}
\ No newline at end of file

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextTracker.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextTracker.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextTracker.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -22,337 +22,136 @@
 package org.jboss.dependency.plugins.tracker;
 
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.HashSet;
 
-import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.ControllerStateModel;
-import org.jboss.dependency.spi.tracker.ContextFilter;
 import org.jboss.dependency.spi.tracker.ContextTracker;
-import org.jboss.util.JBossObject;
+import org.jboss.dependency.plugins.AbstractControllerContext;
 
 /**
  * Abstract context tracker
  *
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
  */
-public class AbstractContextTracker extends JBossObject implements ContextTracker
+public class AbstractContextTracker extends AbstractLockHolder implements ContextTracker
 {
-   /** The lock */
-   private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+   /** The dummy */
+   private static final ControllerContext DUMMY = new AbstractControllerContext("DUMMY", null);
 
-   /** The contexts by class Map<Class, Set<ControllerContext>> */
-   private Map<Class<?>, ClassContext> contextsByClass = new ConcurrentHashMap<Class<?>, ClassContext>();
+   /** The mapping */
+   private Map<ControllerContext, Map<ControllerContext, Integer>> map = new HashMap<ControllerContext, Map<ControllerContext, Integer>>();
 
-   /** The controller */
-   private Controller controller;
-
-   public AbstractContextTracker(Controller controller)
+   public void addInUseContext(ControllerContext target, ControllerContext used)
    {
-      if (controller == null)
-         throw new IllegalArgumentException("Null controller");
-      this.controller = controller;
-   }
-
-   public Set<ControllerContext> filter(Iterable<ControllerContext> contexts, ContextFilter filter)
-   {
-      if (contexts == null)
-         return null;
-
-      Set<ControllerContext> set = new HashSet<ControllerContext>();
-      for (ControllerContext context : contexts)
+      lockWrite();
+      try
       {
-         if (filter == null || filter.accepts(context))
-            set.add(context);
-      }
-      return set;
-   }
-
-   /**
-    * 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())
+         Map<ControllerContext, Integer> counter = map.get(used);
+         if (counter == null)
          {
-            log.trace("Marking class " + clazz + " as used.");
+            counter = new HashMap<ControllerContext, Integer>();
+            map.put(used, counter);
          }
-         classContext.used = true;
-         return classContext.contexts;
-      }
-      return null;
-   }
+         Integer count = counter.get(target);
+         if (count == null)
+            count = 0;
 
-   /**
-    * 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;
+         counter.put(target, ++count);
       }
       finally
       {
-         unlockRead();
+         unlockWrite();
       }
    }
 
-   public Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state)
+   public void addUsing(ControllerContext used)
    {
-      lockRead();
+      addInUseContext(DUMMY, used);
+   }
+
+   public void removeInUseContext(ControllerContext target, ControllerContext used)
+   {
+      lockWrite();
       try
       {
-         Set<ControllerContext> contexts = getContexts(clazz);
-         if (contexts != null && contexts.isEmpty() == false)
+         Map<ControllerContext, Integer> counter = map.get(used);
+         if (counter != null)
          {
-            ControllerStateModel model = controller.getStates();
-            Set<ControllerContext> kccs = new HashSet<ControllerContext>();
-            for(ControllerContext context : contexts)
+            Integer count = counter.get(target);
+            if (count == null || count <= 1)
             {
-               if (model.isBeforeState(context.getState(), state) == false)
-                  kccs.add(context);
+               counter.remove(target);
+
+               if (counter.isEmpty())
+                  map.remove(used);
             }
-            return kccs;
+            else
+            {
+               counter.put(target, --count);
+            }
          }
-         else
-            return null;
       }
       finally
       {
-         unlockRead();
+         unlockWrite();
       }
    }
 
-   public void addInstantiatedContext(ControllerContext context)
+   public void removeUsing(ControllerContext used)
    {
-      prepareToTraverse(context, true);
+      removeInUseContext(DUMMY, used);
    }
 
-   public void registerInstantiatedContext(ControllerContext context, Class<?>... classes)
+   public boolean isContextInUse(ControllerContext used)
    {
-      handleInstantiatedContext(context, true, classes);
-   }
-
-   /**
-    * Register / unregister contexts against explicit classes.
-    *
-    * @param context the context
-    * @param addition whether this is an addition
-    * @param classes the exposed classes
-    */
-   protected void handleInstantiatedContext(ControllerContext context, boolean addition, Class<?>... classes)
-   {
-      if (classes != null && classes.length > 0)
-      {
-         boolean trace = log.isTraceEnabled();
-
-         lockWrite();
-         try
-         {
-            for (Class<?> clazz : classes)
-               handleContext(context, clazz, addition, trace);
-         }
-         finally
-         {
-            unlockWrite();
-         }
-      }
-   }
-
-   public void unregisterInstantiatedContext(ControllerContext context, Class<?>... classes)
-   {
-      handleInstantiatedContext(context, false, classes);
-   }
-
-   public void removeInstantiatedContext(ControllerContext context)
-   {
-      prepareToTraverse(context, false);
-   }
-
-   protected void prepareToTraverse(ControllerContext context, boolean addition)
-   {
-      lockWrite();
+      lockRead();
       try
       {
-         Object target = context.getTarget();
-         try
-         {
-            if (target != null)
-            {
-               traverseBean(context, target.getClass(), addition, log.isTraceEnabled());
-            }
-         }
-         finally
-         {
-            context.ungetTarget();
-         }
+         return map.get(used) != null;
       }
       finally
       {
-         unlockWrite();
+         unlockRead();
       }
    }
 
-   /**
-    * 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)
+   public Set<ControllerContext> getUsingContexts(ControllerContext used)
    {
-      if (clazz == null || clazz == Object.class)
+      lockRead();
+      try
       {
-         return;
-      }
-
-      handleContext(context, clazz, addition, trace);
-
-      // traverse superclass
-      traverseBean(context, clazz.getSuperclass(), addition, trace);
-      Class<?>[] interfaces = clazz.getInterfaces();
-      // traverse interfaces
-      for(Class<?> intface : interfaces)
-      {
-         traverseBean(context, intface, addition, trace);
-      }
-   }
-
-   /**
-    * Map or remove context against class.
-    * This method should be used with write lock taken before.
-    *
-    * @param context the context
-    * @param clazz the class
-    * @param addition whether this is an addition
-    * @param trace trace is enabled
-    */
-   protected void handleContext(ControllerContext context, Class<?> clazz, boolean addition, boolean trace)
-   {
-      ClassContext classContext = contextsByClass.get(clazz);
-      if (addition)
-      {
-         if (classContext == null)
+         Map<ControllerContext, Integer> counter = map.get(used);
+         if (counter != null)
          {
-            classContext = new ClassContext();
-            classContext.contexts = new HashSet<ControllerContext>();
-            contextsByClass.put(clazz, classContext);
+            Set<ControllerContext> contexts = counter.keySet();
+            Set<ControllerContext> copy = new HashSet<ControllerContext>(contexts);
+            copy.remove(DUMMY);
+            return copy;
          }
-         else if (classContext.used)
+         else
          {
-            log.debug("Additional matching bean - contextual injection already used for class: " + clazz);
+            return Collections.emptySet();
          }
-         if (trace)
-         {
-            log.trace("Mapping contex " + context + " to class: " + clazz);
-         }
-         classContext.contexts.add(context);
       }
-      else
+      finally
       {
-         if (classContext != null)
-         {
-            if (trace)
-            {
-               log.trace("Removing contex " + context + " to class: " + clazz);
-            }
-            classContext.contexts.remove(context);
-         }
+         unlockRead();
       }
    }
 
-   /**
-    * 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)
+   public Set<ControllerContext> getUsedContexts()
    {
-      Set<ControllerContext> contexts = getInstantiatedContexts(clazz);
-      int numberOfMatchingBeans = 0;
-      if (contexts != null)
+      lockRead();
+      try
       {
-         numberOfMatchingBeans = contexts.size();
+         return Collections.unmodifiableSet(map.keySet());
       }
-
-      if (log.isTraceEnabled())
+      finally
       {
-         log.trace("Checking for contextual injection, current matches: " + numberOfMatchingBeans + " - " + clazz);
+         unlockRead();
       }
-
-      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();
    }
-
-   /**
-    * Lock for read
-    */
-   protected void lockRead()
-   {
-      lock.readLock().lock();
-   }
-
-   /**
-    * Unlock for read
-    */
-   protected void unlockRead()
-   {
-      lock.readLock().unlock();
-   }
-
-   /**
-    * Lock for write
-    */
-   protected void lockWrite()
-   {
-      lock.writeLock().lock();
-   }
-
-   /**
-    * Unlock for write
-    */
-   protected void unlockWrite()
-   {
-      lock.writeLock().unlock();
-   }
-
-   private static class ClassContext
-   {
-      private boolean used;
-      private Set<ControllerContext> contexts;
-   }
 }
\ No newline at end of file

Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractLockHolder.java (from rev 96720, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractContextTracker.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractLockHolder.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/plugins/tracker/AbstractLockHolder.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -0,0 +1,69 @@
+/*
+* 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.plugins.tracker;
+
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.jboss.util.JBossObject;
+
+/**
+ * Abstract lock holder
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public abstract class AbstractLockHolder extends JBossObject
+{
+   /** The lock */
+   private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+   /**
+    * Lock for read
+    */
+   protected void lockRead()
+   {
+      lock.readLock().lock();
+   }
+
+   /**
+    * Unlock for read
+    */
+   protected void unlockRead()
+   {
+      lock.readLock().unlock();
+   }
+
+   /**
+    * Lock for write
+    */
+   protected void lockWrite()
+   {
+      lock.writeLock().lock();
+   }
+
+   /**
+    * Unlock for write
+    */
+   protected void unlockWrite()
+   {
+      lock.writeLock().unlock();
+   }
+}
\ No newline at end of file

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/Controller.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/Controller.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/Controller.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -39,6 +39,7 @@
  * be installed in the Microcontainer.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
 public interface Controller extends JBossInterface

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/ControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -70,29 +70,13 @@
     * Get the target of the context. This will normally be the bean instance, available after 
     * the context reaches the {@link ControllerState#INSTANTIATED} state. 
     *
-    * Note: invoke this only with matching ungetTarget!
+    * Note: this should be used with care, any external system should use ContextTracking.
     *
     * @return the target
     */
    Object getTarget();
 
    /**
-    * Unget context's target.
-    *
-    * Some component models track target/service usage,
-    * hence we need an explicit unget call to release our usage.
-    *
-    * We still need to return the right target,
-    * but it should be the job of the framework not to
-    * allow "abuse" of this released target.
-    *
-    * e.g. uncallback would re-use the target to do proper cleanup
-    *
-    * @return the target, but with release invoked
-    */
-   Object ungetTarget();
-
-   /**
     * Get the controller that manages this controller context
     * 
     * @return the controller

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/AttributeDispatchContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/AttributeDispatchContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/AttributeDispatchContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -21,8 +21,6 @@
 */
 package org.jboss.dependency.spi.dispatch;
 
-import org.jboss.beans.info.spi.BeanInfo;
-
 /**
  * The API similar to the DynamicMBean API
  * where there are methods to get/set Properties/Attributes.
@@ -53,15 +51,4 @@
     * @throws Throwable for any error
     */
    void set(String name, Object value) throws Throwable;
-
-   /**
-    * Get bean info.
-    * This can be null if cannot be determined.
-    *
-    * This is used to determine property access.
-    * This way we don't need to access target.
-    *
-    * @return the bean info
-    */
-   BeanInfo getBeanInfo();
 }

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/InvokeDispatchContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/InvokeDispatchContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/dispatch/InvokeDispatchContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -21,8 +21,6 @@
 */
 package org.jboss.dependency.spi.dispatch;
 
-import org.jboss.reflect.spi.ClassInfo;
-
 /**
  * The API similar to the DynamicMBean API
  * where there are methods to get/set Properties/Attributes and invoke on
@@ -46,18 +44,6 @@
    Object invoke(String name, Object parameters[], String[] signature) throws Throwable;
 
    /**
-    * Get context's classinfo.
-    * This can be null if it cannot be determined.
-    *
-    * Used when determining type info for parameter and
-    * getting the parameter actual value.
-    * This way we don't require target for more exact parameter matching.
-    *
-    * @return classinfo or null
-    */
-   ClassInfo getClassInfo();
-
-   /**
     * Get context's classloader.
     *
     * Used when determining type info for parameter and

Modified: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/helpers/UnmodifiableControllerContext.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/helpers/UnmodifiableControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/helpers/UnmodifiableControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -88,11 +88,6 @@
       return delegate.getTarget();
    }
 
-   public Object ungetTarget()
-   {
-      return delegate.ungetTarget();
-   }
-
    public Controller getController()
    {
       return delegate.getController();

Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextQueries.java (from rev 96720, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextQueries.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextQueries.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -0,0 +1,103 @@
+/*
+* 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.tracker;
+
+import java.util.Set;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * Query contexts.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface ContextQueries
+{
+   /**
+    * Get a context that has reached at least the passed in state
+    *
+    * @param name the name of the component
+    * @param state the state (pass null for any state)
+    * @return the context
+    */
+   ControllerContext getContext(Object name, ControllerState state);
+
+   /**
+    * Get an installed context
+    *
+    * @param name the name of the component
+    * @return the context
+    */
+   ControllerContext getInstalledContext(Object name);
+
+   /**
+    * Get the contexts not installed
+    *
+    * @return Set<ControllerContext>
+    */
+   Set<ControllerContext> getNotInstalled();
+
+   /**
+    * Get the contexts in certain state
+    *
+    * @param state controller state to get contexts for
+    * @return set of contexts in certain state
+    */
+   Set<ControllerContext> getContextsByState(ControllerState state);
+
+   /**
+    * 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);
+
+   /**
+    * Filter existing contexts.
+    *
+    * @param contexts the contexts
+    * @param filter the filter
+    * @return filtered contexts
+    */
+   Set<ControllerContext> filter(Iterable<ControllerContext> contexts, ContextFilter filter);
+}
\ No newline at end of file

Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextRegistry.java (from rev 96720, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextRegistry.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextRegistry.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -0,0 +1,69 @@
+/*
+* 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.tracker;
+
+import org.jboss.dependency.spi.ControllerContext;
+
+/**
+ * Register contexts.
+ *
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface ContextRegistry
+{
+   /**
+    * Add instantiated context into the map used by {@link ContextQueries#getContextByClass(Class)}.
+    * Look at all the context's target's superclasses and interfaces.
+    *
+    * @param context the context
+    */
+   void addInstantiatedContext(ControllerContext context);
+
+   /**
+    * Add instantiated context into the map used by {@link ContextQueries#getContextByClass(Class)}.
+    * Only map against explicit classes.
+    *
+    * Note: it is up to the caller to make sure the context's target implements
+    * all of the exposed classes.
+    *
+    * @param context the context
+    * @param classes the classes to expose
+    */
+   void registerInstantiatedContext(ControllerContext context, Class<?>... classes);
+
+   /**
+    * Remove instantiated context from the map used by {@link ContextQueries#getContextByClass(Class)}.
+    * Only remove explicit classes.
+    *
+    * @param context the context
+    * @param classes the classes to expose
+    */
+   void unregisterInstantiatedContext(ControllerContext context, Class<?>... classes);
+
+   /**
+    * Remove instantiated context from the map used by {@link ContextQueries#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/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -24,85 +24,65 @@
 import java.util.Set;
 
 import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ControllerState;
 
 /**
  * Track contexts.
  *
  * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
  */
 public interface ContextTracker
 {
    /**
-    * Filter existing contexts.
+    * Target context is using my "used" context.
     *
-    * @param contexts the contexts
-    * @param filter the filter
-    * @return filtered contexts
+    * @param target the target context
+    * @param used the used context
     */
-   Set<ControllerContext> filter(Iterable<ControllerContext> contexts, ContextFilter filter);
+   void addInUseContext(ControllerContext target, ControllerContext used);
 
    /**
-    * Get all instantiated contexts of a given type
+    * Add my usage of "used" context.
     *
-    * @param clazz the type
-    * @return the contexts
+    * @param used the used context
     */
-   Set<ControllerContext> getInstantiatedContexts(Class<?> clazz);
+   void addUsing(ControllerContext used);
 
    /**
-    * Get all contexts of a type which are in the given state or above
+    * Remove the "target's" usage of my "used" context.
     *
-    * @param clazz the type
-    * @param state the required state
-    * @return the contexts
+    * @param target the target context
+    * @param used the used context
     */
-   Set<ControllerContext> getContexts(Class<?> clazz, ControllerState state);
+   void removeInUseContext(ControllerContext target, ControllerContext used);
 
    /**
-    * 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
+    * Remove my usage of "used" context.
     *
-    * @param clazz the type
-    * @return context whose target is instance of this class clazz param or null if zero or multiple such instances
+    * @param used the used context
     */
-   ControllerContext getContextByClass(Class<?> clazz);
+   void removeUsing(ControllerContext used);
 
    /**
-    * Add instantiated context into the map used by {@link #getContextByClass(Class)}.
-    * Look at all the context's target's superclasses and interfaces.
+    * Is someone using "used"?
     *
-    * @param context the context
+    * @param used the context to check
+    * @return true if the used context is in use
     */
-   void addInstantiatedContext(ControllerContext context);
+   boolean isContextInUse(ControllerContext used);
 
    /**
-    * Add instantiated context into the map used by {@link #getContextByClass(Class)}.
-    * Only map against explicit classes.
+    * Who all is using "used" contexts?
     *
-    * Note: it is up to the caller to make sure the context's target implements
-    * all of the exposed classes.
-    *
-    * @param context the context
-    * @param classes the classes to expose
+    * @param used the context to check
+    * @return used using contexts
     */
-   void registerInstantiatedContext(ControllerContext context, Class<?>... classes);
+   Set<ControllerContext> getUsingContexts(ControllerContext used);
 
    /**
-    * Remove instantiated context from the map used by {@link #getContextByClass(Class)}.
-    * Only remove explicit classes.
+    * Which contexts do I use?
     *
-    * @param context the context
-    * @param classes the classes to expose
+    * @return all used contexts
     */
-   void unregisterInstantiatedContext(ControllerContext context, Class<?>... classes);
-
-   /**
-    * 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);
+   Set<ControllerContext> getUsedContexts();
 }
\ No newline at end of file

Copied: projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracking.java (from rev 96720, projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracker.java)
===================================================================
--- projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracking.java	                        (rev 0)
+++ projects/kernel/trunk/dependency/src/main/java/org/jboss/dependency/spi/tracker/ContextTracking.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -0,0 +1,71 @@
+/*
+* 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.tracker;
+
+import org.jboss.dependency.spi.ControllerContext;
+
+/**
+ * Tracking mixin.
+ *
+ * @author <a href="adrian at jboss.org">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
+ */
+public interface ContextTracking
+{
+   /**
+    * Get the context tracker associated with this context
+    *
+    * @return the tracker or null if it doesn't have one
+    */
+   ContextTracker getContextTracker();
+
+   /**
+    * Get the target and update the context tracking
+    *
+    * @param user the controller context that will use the target
+    * @return the object
+    */
+   Object getTarget(ControllerContext user);
+
+   /**
+    * Unget the target and update the context tracking
+    *
+    * @param user the controller context that used the target
+    * @return the object
+    */
+   Object ungetTarget(ControllerContext user);
+
+   /**
+    * Get the target and update context tracking.
+    *
+    * @param tracker the tracker that will use the target
+    * @return the object
+    */
+   Object getTarget(ContextTracker tracker);
+
+   /**
+    * Get the target and update context tracking.
+    *
+    * @param tracker the tracker that will use the target
+    */
+   void ungetTarget(ContextTracker tracker);
+}
\ No newline at end of file

Modified: projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java
===================================================================
--- projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/AbstractMetaDataVisitorNode.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -25,6 +25,8 @@
 import java.util.Set;
 
 import org.jboss.util.collection.CollectionsFactory;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.tracker.ContextTracking;
 
 /**
  * AbstractMetaDataVisitorNode.
@@ -47,6 +49,27 @@
    }
 
    /**
+    * Get target.
+    * Try tracking.
+    *
+    * @param user the target's user
+    * @param used the target's owner
+    * @return target
+    */
+   protected static Object getTarget(ControllerContext user, ControllerContext used)
+   {
+      if (used instanceof ContextTracking)
+      {
+         ContextTracking ct = ContextTracking.class.cast(used);
+         return ct.getTarget(user);
+      }
+      else
+      {
+         return used.getTarget();
+      }
+   }
+
+   /**
     * This is a helper method so we don't have to explicitly
     * implement this on every sub-metadata class.
     * 
@@ -60,6 +83,24 @@
       return null;
    }
 
+   /**
+    * Unget target.
+    * Try tracking.
+    *
+    * @param user the target's user
+    * @param used the target's owner
+    * @return target
+    */
+   protected static Object ungetTarget(ControllerContext user, ControllerContext used)
+   {
+      if (used instanceof ContextTracking)
+      {
+         ContextTracking ct = ContextTracking.class.cast(used);
+         ct.ungetTarget(user);
+      }
+      return null;
+   }
+
    public void visit(ServiceMetaDataVisitor visitor)
    {
       visitor.visit(this);

Modified: projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/ServiceInjectionValueMetaData.java
===================================================================
--- projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/ServiceInjectionValueMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/metadata/ServiceInjectionValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -196,7 +196,7 @@
       }
       else
       {
-         return context.getTarget();
+         return getTarget(null, context); // TODO - fix null
       }
    }
 
@@ -214,7 +214,7 @@
          ControllerContext context = controller.getContext(dependency, state);
          if (context != null)
          {
-            context.ungetTarget();
+            ungetTarget(null, context); // TODO - fix null
             return null;
          }
       }

Modified: projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/microcontainer/ServiceControllerContext.java
===================================================================
--- projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/microcontainer/ServiceControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/jmx-mc-int/src/main/java/org/jboss/system/microcontainer/ServiceControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -36,16 +36,12 @@
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyItem;
 import org.jboss.dependency.spi.dispatch.LifecycleDispatchContext;
-import org.jboss.kernel.Kernel;
-import org.jboss.kernel.spi.config.KernelConfigurator;
-import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.system.Service;
 import org.jboss.system.ServiceContext;
 import org.jboss.system.ServiceController;
 import org.jboss.system.metadata.ServiceMetaData;
 import org.jboss.system.metadata.ServiceMetaDataVisitor;
 import org.jboss.system.metadata.ServiceMetaDataVisitorNode;
-import org.jboss.beans.info.spi.BeanInfo;
 
 /**
  * ServiceControllerContext. Represents an MBean that is being installed in the Microcontainer and
@@ -193,35 +189,11 @@
       getMBeanServer().setAttribute(objectName, attribute);
    }
 
-   public BeanInfo getBeanInfo()
-   {
-      Object target = getTarget();
-      if (target == null)
-         return null;
-
-      try
-      {
-         Kernel kernel = serviceController.getKernel();
-         KernelConfigurator configurator = kernel.getConfigurator();
-         return configurator.getBeanInfo(target.getClass());
-      }
-      catch (Throwable ignored)
-      {
-         return null;
-      }
-   }
-
    public Object invoke(String name, Object parameters[], String[] signature) throws Throwable
    {
       return getMBeanServer().invoke(objectName, name, parameters, signature);
    }
 
-   public ClassInfo getClassInfo()
-   {
-      BeanInfo beanInfo = getBeanInfo();
-      return (beanInfo != null) ? beanInfo.getClassInfo() : null;
-   }
-
    public ClassLoader getClassLoader() throws Throwable
    {
       if (serviceMetaData != null)

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractDependencyValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -305,7 +305,7 @@
       }
       else
       {
-         result = lookup.getTarget();
+         result = getTarget(context, lookup);
       }
       
       return info != null ? info.convertValue(result) : result;
@@ -322,8 +322,7 @@
          ControllerContext lookup = getControllerContext(getUnderlyingValue(), state);
          if (lookup != null)
          {
-            lookup.ungetTarget();
-            return null;
+            return ungetTarget(context, lookup);
          }
       }
 

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInjectionValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -195,8 +195,9 @@
                return null;
             }
          }
+
          // TODO - add progression here, then fix BeanMetaData as well
-         return lookup.getTarget();
+         return getTarget(context, lookup);
       }
       return super.getValue(info, cl);
    }
@@ -209,7 +210,7 @@
          ControllerContext lookup = getControllerContext(info.getType(), ControllerState.INSTALLED);
          if (lookup != null)
          {
-            lookup.ungetTarget();
+            ungetTarget(context, lookup);
             return null;
          }
       }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInstallMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInstallMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractInstallMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -32,9 +32,9 @@
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
 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;
+import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.util.JBossStringBuilder;
 
@@ -118,10 +118,11 @@
       {
          KernelController controller = (KernelController) context.getController();
          ControllerContext beanContext = controller.getContext(bean, ControllerState.INSTANTIATED);
-         if (beanContext != null && beanContext instanceof InvokeDispatchContext)
+         if (beanContext != null)
          {
-            InvokeDispatchContext idc = InvokeDispatchContext.class.cast(beanContext);
-            return idc.getClassInfo();
+            Object target = beanContext.getTarget();
+            KernelConfigurator configurator = controller.getKernel().getConfigurator();
+            return configurator.getClassInfo(target.getClass());
          }
          else
          {

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractTypeMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -36,14 +36,13 @@
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.dispatch.AttributeDispatchContext;
+import org.jboss.joinpoint.spi.Joinpoint;
 import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.config.KernelConfigurator;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossStringBuilder;
-import org.jboss.joinpoint.spi.Joinpoint;
 
 /**
  * A typed value.
@@ -174,17 +173,14 @@
          {
             Controller controller = context.getController();
             ControllerContext context = controller.getContext(beanName, ControllerState.INSTANTIATED);
-            if (context != null && context instanceof AttributeDispatchContext)
+            if (context != null)
             {
-               AttributeDispatchContext adc = AttributeDispatchContext.class.cast(context);
-               BeanInfo beanInfo = adc.getBeanInfo();
-               if (beanInfo != null)
+               Object target = context.getTarget(); // we're instantiated
+               BeanInfo beanInfo = configurator.getBeanInfo(target.getClass());
+               PropertyInfo pi = beanInfo.getProperty(propertyName);
+               if (pi.isReadable())
                {
-                  PropertyInfo pi = beanInfo.getProperty(propertyName);
-                  if (pi.isReadable())
-                  {
-                     result = adc.get(propertyName);
-                  }
+                  result = pi.get(target);
                }
             }
          }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/AbstractValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -25,12 +25,15 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Stack;
+
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.jboss.beans.metadata.spi.MetaDataVisitor;
 import org.jboss.beans.metadata.spi.MetaDataVisitorNode;
 import org.jboss.beans.metadata.spi.ValueMetaData;
 import org.jboss.dependency.plugins.JMXObjectNameFix;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.tracker.ContextTracking;
 import org.jboss.reflect.spi.TypeInfo;
 import org.jboss.util.JBossObject;
 import org.jboss.util.JBossStringBuilder;
@@ -111,6 +114,27 @@
       return info != null ? info.convertValue(value) : value;
    }
 
+   /**
+    * Get target.
+    * Try tracking.
+    *
+    * @param user the target's user
+    * @param used the target's owner
+    * @return target
+    */
+   protected static Object getTarget(ControllerContext user, ControllerContext used)
+   {
+      if (used instanceof ContextTracking)
+      {
+         ContextTracking ct = ContextTracking.class.cast(used);
+         return ct.getTarget(user);
+      }
+      else
+      {
+         return used.getTarget();
+      }
+   }
+
    public void initialVisit(MetaDataVisitor visitor)
    {
       visitor.initialVisit(this);
@@ -149,6 +173,24 @@
       return null; // plain null
    }
 
+   /**
+    * Unget target.
+    * Try tracking.
+    *
+    * @param user the target's user
+    * @param used the target's owner
+    * @return target
+    */
+   protected static Object ungetTarget(ControllerContext user, ControllerContext used)
+   {
+      if (used instanceof ContextTracking)
+      {
+         ContextTracking ct = ContextTracking.class.cast(used);
+         ct.ungetTarget(user);
+      }
+      return null;
+   }
+
    @XmlTransient
    public Iterator<? extends MetaDataVisitorNode> getChildren()
    {

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/ThisValueMetaData.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/ThisValueMetaData.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/beans/metadata/plugins/ThisValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -58,20 +58,21 @@
    public Object getValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
       Controller controller = context.getController();
-      ControllerContext context = controller.getContext(getUnderlyingValue(), ControllerState.INSTANTIATED);
-      if (context == null)
+      ControllerContext lookup = controller.getContext(getUnderlyingValue(), ControllerState.INSTANTIATED);
+      if (lookup == null)
          throw new Error("Could not deference this " + this);
+
       // TODO - add progression, see BeanMetaData, InjectionMetaData
-      return context.getTarget();
+      return getTarget(context, lookup);
    }
 
    @Override
    public Object ungetValue(TypeInfo info, ClassLoader cl) throws Throwable
    {
       Controller controller = context.getController();
-      ControllerContext context = controller.getContext(getUnderlyingValue(), ControllerState.INSTANTIATED);
-      if (context != null)
-         context.ungetTarget();
+      ControllerContext lookup = controller.getContext(getUnderlyingValue(), ControllerState.INSTANTIATED);
+      if (lookup != null)
+         ungetTarget(this.context, lookup);
 
       return super.ungetValue(info, cl);
    }

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/annotations/wb/WBInjectionValueMetaData.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -72,7 +72,7 @@
       KernelController controller = context.getKernel().getController();
       ControllerContext result = WBInjectionResolver.resolve(controller, info.getType(), annotations);
       if (result != null)
-         return result.getTarget();
+         return getTarget(context, result);
       else
          throw new IllegalArgumentException("Should not be here, dependency not resolved: " + toString());
    }
@@ -83,7 +83,7 @@
       KernelController controller = context.getKernel().getController();
       ControllerContext result = WBInjectionResolver.resolve(controller, info.getType(), annotations);
       if (result != null)
-         result.ungetTarget();
+         ungetTarget(context, result);
 
       return null;
    }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -48,7 +48,6 @@
 import org.jboss.kernel.spi.dependency.KernelController;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
 import org.jboss.reflect.spi.MethodInfo;
-import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.util.JBossStringBuilder;
 
 /**
@@ -305,11 +304,6 @@
       return getInfo().invoke(getTarget(), name, signature, parameters);
    }
 
-   public ClassInfo getClassInfo()
-   {
-      return getInfo().getClassInfo();
-   }
-
    // todo - remove or better security
    public ClassLoader getClassLoader() throws Throwable
    {

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dependency/CollectionCallbackItem.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -84,7 +84,7 @@
          {
             for(ControllerContext context : contexts)
             {
-               holder.add(context.getTarget());
+               holder.add(getTarget(context, true));
             }
          }
          return holder;
@@ -137,6 +137,6 @@
     */
    protected void removeUninstallingContext(T holder, ControllerContext context)
    {
-      holder.remove(context.ungetTarget());
+      holder.remove(getTarget(context, false));
    }
 }

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/dispatch/InvokeDispatchHelper.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -25,6 +25,7 @@
 
 import org.jboss.beans.metadata.spi.ParameterMetaData;
 import org.jboss.beans.metadata.spi.ValueMetaData;
+import org.jboss.dependency.spi.ControllerContext;
 import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
 import org.jboss.kernel.plugins.config.Configurator;
 import org.jboss.kernel.spi.config.KernelConfigurator;
@@ -69,12 +70,13 @@
       }
       else
       {
-         ClassInfo classInfo = context.getClassInfo(); // no need for target
+         Object target = (context instanceof ControllerContext) ? ControllerContext.class.cast(context).getTarget() : null; 
          int size = params.size();
          signature = Configurator.getParameterTypes(log.isTraceEnabled(), params);
          ClassLoader classLoader = SecurityActions.getClassLoader(context);
-         if (classInfo != null)
+         if (target != null)
          {
+            ClassInfo classInfo = configurator.getClassInfo(target.getClass());
             MethodInfo methodInfo = Configurator.findMethodInfo(classInfo, methodName, signature);
             TypeInfo[] infos = methodInfo.getParameterTypes();
             parameters = Configurator.handleParameters(log.isTraceEnabled(), classLoader, infos, params, unget);

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/AbstractKernelRegistryEntry.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/AbstractKernelRegistryEntry.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/AbstractKernelRegistryEntry.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -28,8 +28,8 @@
 import org.jboss.dependency.spi.ControllerMode;
 import org.jboss.dependency.spi.ControllerState;
 import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.ErrorHandlingMode;
 import org.jboss.dependency.spi.ScopeInfo;
-import org.jboss.dependency.spi.ErrorHandlingMode;
 import org.jboss.kernel.spi.registry.KernelRegistryEntry;
 import org.jboss.util.JBossObject;
 import org.jboss.util.JBossStringBuilder;
@@ -39,6 +39,7 @@
  * Abstract Kernel registry entry.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author <a href="ales.justin at jboss.org">Ales Justin</a>
  * @version $Revision$
  */
 public class AbstractKernelRegistryEntry extends JBossObject implements KernelRegistryEntry
@@ -173,7 +174,6 @@
    public void setError(Throwable error)
    {
       throw new NotImplementedException("NYI setError");
-      
    }
 
    public void uninstall(ControllerState fromState, ControllerState toState)

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/BeanKernelRegistryEntry.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/BeanKernelRegistryEntry.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/registry/BeanKernelRegistryEntry.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -23,7 +23,6 @@
 
 import org.jboss.beans.info.spi.BeanInfo;
 import org.jboss.dependency.spi.dispatch.InvokeDispatchContext;
-import org.jboss.reflect.spi.ClassInfo;
 
 /**
  * Bean Kernel registry entry.
@@ -58,21 +57,11 @@
       beanInfo.setProperty(target, name, value);
    }
 
-   public BeanInfo getBeanInfo()
-   {
-      return beanInfo;
-   }
-
    public Object invoke(String name, Object parameters[], String[] signature) throws Throwable
    {
       return beanInfo.invoke(target, name, signature, parameters);
    }
 
-   public ClassInfo getClassInfo()
-   {
-      return beanInfo.getClassInfo();
-   }
-
    public ClassLoader getClassLoader() throws Throwable
    {
       if (target == null)

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/plugins/validation/AbstractKernelBeanValidator.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -58,15 +58,8 @@
       ControllerContext context = controller.getContextByClass(BeanValidatorBridge.class);
       if (context != null)
       {
-         Object target = context.getTarget();
-         try
-         {
-            return BeanValidatorBridge.class.cast(target);           
-         }
-         finally
-         {
-            context.ungetTarget();
-         }
+         Object target = context.getTarget(); // OK, let's go directly, no tracking
+         return BeanValidatorBridge.class.cast(target);
       }
       return null;
    }

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-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/KernelController.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -22,9 +22,10 @@
 package org.jboss.kernel.spi.dependency;
 
 import org.jboss.beans.metadata.spi.BeanMetaData;
-import org.jboss.dependency.spi.tracker.ContextTracker;
 import org.jboss.dependency.spi.Controller;
 import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.tracker.ContextQueries;
+import org.jboss.dependency.spi.tracker.ContextRegistry;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.KernelObject;
 
@@ -40,7 +41,7 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision$
  */
-public interface KernelController extends KernelObject, Controller, ContextTracker
+public interface KernelController extends KernelObject, Controller, ContextQueries, ContextRegistry
 {
    /**
     * Install a context from a {@link BeanMetaData}.

Modified: projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java
===================================================================
--- projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2009-11-23 16:01:07 UTC (rev 96739)
+++ projects/kernel/trunk/kernel/src/main/java/org/jboss/kernel/spi/dependency/helpers/UnmodifiableKernelControllerContext.java	2009-11-23 16:36:31 UTC (rev 96740)
@@ -28,7 +28,6 @@
 import org.jboss.dependency.spi.helpers.UnmodifiableControllerContext;
 import org.jboss.kernel.Kernel;
 import org.jboss.kernel.spi.dependency.KernelControllerContext;
-import org.jboss.reflect.spi.ClassInfo;
 
 /**
  * A wrapper around a {@link KernelControllerContext} that throws UnsupportedOperationException when any
@@ -114,11 +113,6 @@
       throw new UnsupportedOperationException("Cannot execute invoke on unmodifiable wrapper.");
    }
 
-   public ClassInfo getClassInfo()
-   {
-      return getDelegate().getClassInfo();
-   }
-
    public ClassLoader getClassLoader() throws Throwable
    {
       return getDelegate().getClassLoader();




More information about the jboss-cvs-commits mailing list