[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