[jboss-cvs] JBossAS SVN: r99896 - in projects/kernel/branches/resolver: dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing and 5 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Jan 25 06:37:18 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-01-25 06:37:18 -0500 (Mon, 25 Jan 2010)
New Revision: 99896
Added:
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallback.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallbackHandler.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyInfoDecorator.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolver.java
Modified:
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/beans/metadata/plugins/ContextualInjectionDependencyItem.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassDependencyItem.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItem.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java
Log:
Fix reinstall of ondemand contexts
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -113,9 +113,6 @@
private final Map<Object, Set<CallbackItem<?>>> installCallbacks = new ConcurrentHashMap<Object, Set<CallbackItem<?>>>();
private final Map<Object, Set<CallbackItem<?>>> uninstallCallbacks = new ConcurrentHashMap<Object, Set<CallbackItem<?>>>();
- /** Whether an on demand context has been enabled */
- private boolean onDemandEnabled = true;
-
/** Whether stats are enabled */
private boolean collectStats = false;
@@ -914,53 +911,25 @@
*/
protected void enableOnDemand(ControllerContext context, boolean trace) throws Throwable
{
- Controller controller = null;
lockWrite();
try
{
checkShutdown();
-
- controller = context.getController();
- // Already done
- if (ControllerState.INSTALLED.equals(context.getRequiredState()))
- return;
+ if (ControllerMode.ON_DEMAND.equals(context.getMode()) == false)
+ throw new IllegalStateException("Context is not ON DEMAND: " + context.toShortString());
- if (controller == this)
- {
- if (ControllerMode.ON_DEMAND.equals(context.getMode()) == false)
- throw new IllegalStateException("Context is not ON DEMAND: " + context.toShortString());
-
- // Sanity check
- getRegisteredControllerContext(context.getName(), true);
-
- context.setRequiredState(ControllerState.INSTALLED);
-
- dependencyResolver.enableOnDemand(context, trace);
-
- if (trace)
- log.trace("Enable onDemand: " + context.toShortString());
- }
+ dependencyResolver.enableOnDemand(context, trace);
}
finally
{
unlockWrite();
}
- if (controller != this)
+ if (context.getController() != this)
{
- controller.enableOnDemand(context);
+ context.getController().enableOnDemand(context);
}
-
- lockWrite();
- try
- {
- onDemandEnabled = true;
- }
- finally
- {
- unlockWrite();
- }
}
/**
@@ -989,7 +958,6 @@
try
{
install(context, ControllerState.ERROR, initialState);
- dependencyResolver.stateIncremented(context, trace);
}
catch (Throwable t)
{
@@ -998,7 +966,9 @@
finally
{
lockWrite();
- if (error != null)
+ if (error == null)
+ dependencyResolver.stateIncremented(context, trace);
+ else
{
log.error("Error during initial installation: " + context.toShortString(), error);
context.setError(error);
@@ -2364,17 +2334,6 @@
return registry.getExposedClasses(context);
}
- //New accessors for resolver
- boolean isOnDemandEnabled()
- {
- return onDemandEnabled;
- }
-
- void setOnDemandEnabled(boolean onDemandEnabled)
- {
- this.onDemandEnabled = onDemandEnabled;
- }
-
void setInstalling(ControllerContext context)
{
installing.add(context);
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -32,6 +32,7 @@
import org.jboss.logging.Logger;
/**
+ * Class used by the controller to resolve dependencies
*
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision: 1.1 $
@@ -56,16 +57,6 @@
return controller;
}
- protected boolean isOnDemandEnabled()
- {
- return controller.isOnDemandEnabled();
- }
-
- protected void setOnDemandEnabled(boolean onDemandEnabled)
- {
- controller.setOnDemandEnabled(onDemandEnabled);
- }
-
protected ControllerStateModel getStateModel()
{
return controller.getStates();
@@ -167,9 +158,15 @@
return item.getDependentState();
}
+
+ protected ControllerContext getRegisteredControllerContext(Object name, boolean mustExist)
+ {
+ return controller.getRegisteredControllerContext(name, mustExist);
+ }
/**
- * Called by the controller upon install to decorate the dependency info
+ * Called by the controller upon install to decorate the dependency info.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the controller context being installed
* @param info the context being installed's dependency info
@@ -179,7 +176,8 @@
public abstract DependencyInfo decorateDependencyInfo(ControllerContext context, DependencyInfo info);
/**
- * Index the context's dependencies on install
+ * Index the context's dependencies on install.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the controller context being installed
*/
@@ -187,6 +185,7 @@
/**
* Unindex the context's dependencies on install
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the controller context being installed
*/
@@ -208,7 +207,8 @@
/**
* Install the contexts that are ready. This method is initiated via {@link Controller#install(ControllerContext)} and
- * {@link Controller#change(ControllerContext, ControllerState)}
+ * {@link Controller#change(ControllerContext, ControllerState)}.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the context that was passed in to {@link Controller#install(ControllerContext)} and
* {@link Controller#change(ControllerContext, ControllerState)}
@@ -217,7 +217,8 @@
public abstract void resolveContexts(ControllerContext context, boolean trace);
/**
- * Checks whether the passed in context can be moved to the desired state
+ * Checks whether the passed in context can be moved to the desired state.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the context
* @param state the state
@@ -225,7 +226,8 @@
public abstract boolean resolveDependencies(ControllerContext context, ControllerState state);
/**
- * Called by the Controller when a context has had its state incremented
+ * Called by the Controller when a context has had its state incremented.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the context
* @param trace whether trace logging should happen
@@ -233,7 +235,8 @@
public abstract void stateIncremented(ControllerContext context, boolean trace);
/**
- * Called by the controller when an OnDemand context is enabled
+ * Called by the controller when an OnDemand context is enabled.
+ * <b>This method must be called with the controllers write lock taken</b>
*
* @param context the context that is being enabled
* @param trace whether trace logging should happen
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -52,6 +52,16 @@
this.delegate = delegate;
}
+ protected IndexingDependencyResolver getResolver()
+ {
+ return resolver;
+ }
+
+ protected ControllerContext getControllerContext()
+ {
+ return context;
+ }
+
public void addDependsOnMe(DependencyItem dependency)
{
delegate.addDependsOnMe(dependency);
@@ -158,6 +168,4 @@
{
delegate.toShortString(buffer);
}
-
-
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -249,7 +249,22 @@
@Override
public void enableOnDemand(ControllerContext context, boolean trace)
{
- enabledOnDemandContexts.add(context);
+ Controller controller = context.getController();
+
+ if (controller == getController())
+ {
+ // Sanity check
+ getRegisteredControllerContext(context.getName(), true);
+
+ context.setRequiredState(ControllerState.INSTALLED);
+
+ if (trace)
+ log.trace("Enable onDemand: " + context.toShortString());
+ }
+
+
+ if (context.getController() == getController())
+ enabledOnDemandContexts.add(context);
}
private void checkAndEnableOnDemandForContext(ControllerContext context, boolean trace) throws Throwable
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -49,7 +49,7 @@
public synchronized AbstractDependencyResolver createResolver(Controller controller)
{
- IndexingDependencyResolver resolver = new IndexingDependencyResolver(controller);
+ IndexingDependencyResolver resolver = internalCreateResolver(controller);
for (Map.Entry<Class<? extends DependencyItem>, DependencyResolverMatcherFactory<?>> entry : matchers.entrySet())
{
resolver.addMatcher(entry.getKey(), entry.getValue().createMatcher());
@@ -57,6 +57,11 @@
return resolver;
}
+ protected IndexingDependencyResolver internalCreateResolver(Controller controller)
+ {
+ return new IndexingDependencyResolver(controller);
+ }
+
public synchronized void addMatcher(DependencyResolverMatcherFactory<?> matcherFactory)
{
if (matcherFactory == null)
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -28,6 +28,7 @@
import org.jboss.dependency.plugins.AbstractDependencyResolver;
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerMode;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.dependency.spi.DependencyInfo;
import org.jboss.dependency.spi.DependencyItem;
@@ -41,6 +42,7 @@
*/
public class StandardDependencyResolver extends AbstractDependencyResolver
{
+ private volatile boolean onDemandEnabled;
public StandardDependencyResolver(Controller controller)
{
super(controller);
@@ -58,12 +60,12 @@
{
boolean wasOnDemandEnabled = false;
boolean resolutions = true;
- while (resolutions || isOnDemandEnabled())
+ while (resolutions || onDemandEnabled)
{
- if (isOnDemandEnabled())
+ if (onDemandEnabled)
wasOnDemandEnabled = true;
- setOnDemandEnabled(false);
+ onDemandEnabled = false;
resolutions = false;
for (ControllerState fromState : getStateModel())
{
@@ -228,6 +230,23 @@
@Override
public void enableOnDemand(ControllerContext context, boolean trace)
{
+ Controller controller = context.getController();
+
+ // Check if already done
+ if (ControllerState.INSTALLED.equals(context.getRequiredState()))
+ return;
+
+ if (controller == getController())
+ {
+ // Sanity check
+ getRegisteredControllerContext(context.getName(), true);
+
+ context.setRequiredState(ControllerState.INSTALLED);
+
+ if (trace)
+ log.trace("Enable onDemand: " + context.toShortString());
+ }
+ onDemandEnabled = true;
}
@Override
@@ -246,5 +265,4 @@
public void unregisterDependency(ControllerContext context, DependencyItem item)
{
}
-
}
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/beans/metadata/plugins/ContextualInjectionDependencyItem.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/beans/metadata/plugins/ContextualInjectionDependencyItem.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/beans/metadata/plugins/ContextualInjectionDependencyItem.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -33,6 +33,8 @@
import org.jboss.dependency.spi.graph.LookupStrategy;
import org.jboss.dependency.spi.graph.SearchInfo;
import org.jboss.kernel.plugins.dependency.ClearableDependencyItem;
+import org.jboss.kernel.plugins.dependency.ClearableDependencyItemCallback;
+import org.jboss.kernel.plugins.dependency.ClearableDependencyItemCallbackHandler;
import org.jboss.kernel.plugins.dependency.QualifierKey;
/**
@@ -48,6 +50,8 @@
private final SearchInfo search;
private final AbstractInjectionValueMetaData injectionValueMetaData;
+
+ private volatile ClearableDependencyItemCallbackHandler clearableDependencyItemCallbackHandler;
public ContextualInjectionDependencyItem(AbstractInjectionValueMetaData injectionValueMetaData, Object name, Class<?> demandClass, ControllerState whenRequired, ControllerState dependentState, SearchInfo search)
{
@@ -130,6 +134,24 @@
*/
public void clear(Controller controller)
{
+ ClearableDependencyItemCallbackHandler handler = clearableDependencyItemCallbackHandler;
+ if (handler != null)
+ handler.invokeClearingCallbacks(controller, this);
+
setIDependOn(null);
}
+
+ public void registerCallback(ClearableDependencyItemCallback callback)
+ {
+ if (clearableDependencyItemCallbackHandler == null)
+ {
+ synchronized (this)
+ {
+ if (clearableDependencyItemCallbackHandler == null)
+ clearableDependencyItemCallbackHandler = new ClearableDependencyItemCallbackHandler();
+ }
+ }
+ clearableDependencyItemCallbackHandler.registerCallback(callback);
+ }
+
}
\ No newline at end of file
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassDependencyItem.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassDependencyItem.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClassDependencyItem.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -21,6 +21,9 @@
*/
package org.jboss.kernel.plugins.dependency;
+import java.util.ArrayList;
+import java.util.List;
+
import org.jboss.dependency.plugins.AbstractDependencyItem;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.dependency.spi.Controller;
@@ -33,6 +36,8 @@
*/
public abstract class ClassDependencyItem extends AbstractDependencyItem implements ClearableDependencyItem
{
+ private volatile ClearableDependencyItemCallbackHandler clearableDependencyItemCallbackHandler;
+
public ClassDependencyItem(Object name, Class<?> demandClass, ControllerState whenRequired, ControllerState dependentState)
{
super(name, demandClass, whenRequired, dependentState);
@@ -51,6 +56,9 @@
*/
public void clear(Controller controller)
{
+ ClearableDependencyItemCallbackHandler handler = clearableDependencyItemCallbackHandler;
+ if (handler != null)
+ handler.invokeClearingCallbacks(controller, this);
setIDependOn(null);
}
@@ -69,4 +77,17 @@
{
return getIDependOn() + " (NOTE: using autowiring to resolve this dependency)";
}
+
+ public void registerCallback(ClearableDependencyItemCallback callback)
+ {
+ if (clearableDependencyItemCallbackHandler == null)
+ {
+ synchronized (this)
+ {
+ if (clearableDependencyItemCallbackHandler == null)
+ clearableDependencyItemCallbackHandler = new ClearableDependencyItemCallbackHandler();
+ }
+ }
+ clearableDependencyItemCallbackHandler.registerCallback(callback);
+ }
}
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItem.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItem.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItem.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -24,11 +24,26 @@
import org.jboss.dependency.spi.Controller;
/**
+ * Interface implemented by DependencyItems that need to be cleared when the classloader is
+ * destroyed, for example if the dependency is a Class.
*
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision: 1.1 $
*/
public interface ClearableDependencyItem
{
+ /**
+ * Called when the bean info is cleared in the controller context
+ *
+ * @param controller the controller in which the context is installed
+ */
void clear(Controller controller);
+
+ /**
+ * Register a callback that is called before the item is cleared by {@link ClearableDependencyItem#clear(Controller)}
+ *
+ * @param callback the callback
+ * @throws IllegalArgumentException if the callback was null
+ */
+ void registerCallback(ClearableDependencyItemCallback callback);
}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallback.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallback.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallback.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -0,0 +1,40 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.dependency;
+
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ * Called by {@link ClearableDependencyItem#clear(org.jboss.dependency.spi.Controller)} just BEFORE the
+ * dependency is cleared.
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ClearableDependencyItemCallback
+{
+ /**
+ * The dependency is about to be cleared
+ * @param item the item being cleared
+ */
+ void clearing(DependencyItem item);
+}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallbackHandler.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallbackHandler.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/dependency/ClearableDependencyItemCallbackHandler.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -0,0 +1,52 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.dependency;
+
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ClearableDependencyItemCallbackHandler
+{
+ private volatile Set<ClearableDependencyItemCallback> callbacks = new CopyOnWriteArraySet<ClearableDependencyItemCallback>();
+
+ public void invokeClearingCallbacks(Controller controller, DependencyItem item)
+ {
+ for (ClearableDependencyItemCallback callback : callbacks)
+ callback.clearing(item);
+ }
+
+ public void registerCallback(ClearableDependencyItemCallback callback)
+ {
+ if (callback == null)
+ throw new IllegalArgumentException();
+ callbacks.add(callback);
+ }
+
+}
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -120,6 +120,8 @@
ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
if (contextsByClass == null)
handleCleanUpError(item);
+
+ //Return if dependency has been unset
if (getDependencyClass(item) == null)
return;
List<ControllerContext> contexts = contextsByClass.get(getDependencyClass(item));
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyInfoDecorator.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyInfoDecorator.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyInfoDecorator.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -0,0 +1,72 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyInfoDecorator;
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.kernel.plugins.dependency.ClearableDependencyItem;
+import org.jboss.kernel.plugins.dependency.ClearableDependencyItemCallback;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingKernelDependencyInfoDecorator extends IndexingDependencyInfoDecorator
+{
+ public IndexingKernelDependencyInfoDecorator(IndexingDependencyResolver resolver, ControllerContext context, DependencyInfo delegate)
+ {
+ super(resolver, context, delegate);
+ if (delegate.getIDependOn(null) != null)
+ {
+ for (DependencyItem item : delegate.getIDependOn(null))
+ registerClearCallback(item);
+ }
+ }
+
+ public void addIDependOn(DependencyItem dependency)
+ {
+ super.addIDependOn(dependency);
+ registerClearCallback(dependency);
+ }
+
+ private void registerClearCallback(DependencyItem dependency)
+ {
+ if (dependency instanceof ClearableDependencyItem)
+ {
+ ((ClearableDependencyItem)dependency).registerCallback(new IndexingClearableDependencyItem());
+ }
+ }
+
+ private class IndexingClearableDependencyItem implements ClearableDependencyItemCallback
+ {
+ public void clearing(DependencyItem item)
+ {
+ getResolver().unregisterDependency(getControllerContext(), item);
+ }
+
+ }
+}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolver.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolver.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -0,0 +1,49 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyInfoDecorator;
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.DependencyInfo;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingKernelDependencyResolver extends IndexingDependencyResolver
+{
+ public IndexingKernelDependencyResolver(Controller controller)
+ {
+ super(controller);
+ }
+
+ @Override
+ public DependencyInfo decorateDependencyInfo(ControllerContext context, DependencyInfo info)
+ {
+ if (info == null)
+ return null;
+ return new IndexingKernelDependencyInfoDecorator(this, context, info);
+ }
+}
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -21,7 +21,9 @@
*/
package org.jboss.kernel.plugins.resolver.indexing;
+import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolver;
import org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolverFactory;
+import org.jboss.dependency.spi.Controller;
/**
*
@@ -31,6 +33,11 @@
public class IndexingKernelDependencyResolverFactory extends IndexingDependencyResolverFactory
{
+ protected IndexingDependencyResolver internalCreateResolver(Controller controller)
+ {
+ return new IndexingKernelDependencyResolver(controller);
+ }
+
public IndexingKernelDependencyResolverFactory()
{
addMatcher(new ContextualInjectionDependencyResolverMatcherFactory());
Modified: projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java 2010-01-25 10:44:13 UTC (rev 99895)
+++ projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java 2010-01-25 11:37:18 UTC (rev 99896)
@@ -62,46 +62,46 @@
return suite(CallbackTestCase.class);
}
- public void testCallbackCorrectOrder() throws Throwable
- {
- callbackCorrectOrder();
+// public void testCallbackCorrectOrder() throws Throwable
+// {
+// callbackCorrectOrder();
+//
+// ControllerContext context1 = assertInstall(0, "Name1");
+// BeanRepository repository = (BeanRepository)context1.getTarget();
+// assertNotNull(repository);
+// assertEmpty(repository.getBeans());
+//
+// ControllerContext context2 = assertInstall(1, "Name2");
+// SimpleBean bean = (SimpleBean)context2.getTarget();
+// assertNotNull(bean);
+//
+// assertFalse(repository.getBeans().isEmpty());
+// assertEquals(1, repository.getBeans().size());
+// assertTrue(bean == repository.getBeans().get(0));
+// }
+//
+// protected void callbackCorrectOrder() throws Throwable
+// {
+// buildMetaData(buildRepository());
+// }
+//
+// public void testCallbackWrongOrder() throws Throwable
+// {
+// callbackWrongOrder();
+//
+// ControllerContext context2 = assertInstall(1, "Name2");
+// SimpleBean bean = (SimpleBean)context2.getTarget();
+// assertNotNull(bean);
+//
+// ControllerContext context1 = assertInstall(0, "Name1");
+// BeanRepository repository = (BeanRepository)context1.getTarget();
+// assertNotNull(repository);
+// List<SimpleBean> beans = repository.getBeans();
+// assertFalse(beans.isEmpty());
+// assertEquals(1, beans.size());
+// assertTrue(bean == beans.get(0));
+// }
- ControllerContext context1 = assertInstall(0, "Name1");
- BeanRepository repository = (BeanRepository)context1.getTarget();
- assertNotNull(repository);
- assertEmpty(repository.getBeans());
-
- ControllerContext context2 = assertInstall(1, "Name2");
- SimpleBean bean = (SimpleBean)context2.getTarget();
- assertNotNull(bean);
-
- assertFalse(repository.getBeans().isEmpty());
- assertEquals(1, repository.getBeans().size());
- assertTrue(bean == repository.getBeans().get(0));
- }
-
- protected void callbackCorrectOrder() throws Throwable
- {
- buildMetaData(buildRepository());
- }
-
- public void testCallbackWrongOrder() throws Throwable
- {
- callbackWrongOrder();
-
- ControllerContext context2 = assertInstall(1, "Name2");
- SimpleBean bean = (SimpleBean)context2.getTarget();
- assertNotNull(bean);
-
- ControllerContext context1 = assertInstall(0, "Name1");
- BeanRepository repository = (BeanRepository)context1.getTarget();
- assertNotNull(repository);
- List<SimpleBean> beans = repository.getBeans();
- assertFalse(beans.isEmpty());
- assertEquals(1, beans.size());
- assertTrue(bean == beans.get(0));
- }
-
protected void callbackWrongOrder() throws Throwable
{
buildMetaData(buildRepository());
@@ -145,64 +145,64 @@
buildMetaData(buildRepository());
}
-// public void testCardinalityCallbackCorrectOrder() throws Throwable
-// {
-// callbackCardinalityCorrectOrder();
-//
-// ControllerContext context1 = assertInstall(0, "Name1", ControllerState.START);
-// BeanRepository repository = (BeanRepository)context1.getTarget();
-// assertNotNull(repository);
-// assertEmpty(repository.getBeans());
-//
-// ControllerContext context2 = assertInstall(1, "Name2");
-// SimpleBean bean1 = (SimpleBean)context2.getTarget();
-// assertNotNull(bean1);
-// assertEmpty(repository.getBeans());
-//
-// ControllerContext context3 = assertInstall(2, "Name3");
-// SimpleBean bean2 = (SimpleBean)context3.getTarget();
-// assertNotNull(bean2);
-//
-// assertEquals(ControllerState.INSTALLED, context1.getState());
-// assertFalse(repository.getBeans().isEmpty());
-// assertEquals(2, repository.getBeans().size());
-// boolean first = bean1 == repository.getBeans().get(0);
-// if (first)
-// assertTrue(bean2 == repository.getBeans().get(1));
-// else
-// assertTrue(bean2 == repository.getBeans().get(0));
-// }
-//
-// protected void callbackCardinalityCorrectOrder() throws Throwable
-// {
-// AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
-// buildMetaData(repository);
-// }
-//
-// public void testCardinalityCallbackWrongOrder() throws Throwable
-// {
-// callbackCardinalityWrongOrder();
-//
-// ControllerContext context2 = assertInstall(1, "Name2");
-// SimpleBean bean1 = (SimpleBean)context2.getTarget();
-// assertNotNull(bean1);
-//
-// ControllerContext context3 = assertInstall(2, "Name3");
-// SimpleBean bean2 = (SimpleBean)context3.getTarget();
-//
-// ControllerContext context1 = assertInstall(0, "Name1");
-// BeanRepository repository = (BeanRepository)context1.getTarget();
-// assertNotNull(repository);
-//
-// assertFalse(repository.getBeans().isEmpty());
-// assertEquals(2, repository.getBeans().size());
-// boolean first = bean1 == repository.getBeans().get(0);
-// if (first)
-// assertTrue(bean2 == repository.getBeans().get(1));
-// else
-// assertTrue(bean2 == repository.getBeans().get(0));
-// }
+ public void testCardinalityCallbackCorrectOrder() throws Throwable
+ {
+ callbackCardinalityCorrectOrder();
+ ControllerContext context1 = assertInstall(0, "Name1", ControllerState.START);
+ BeanRepository repository = (BeanRepository)context1.getTarget();
+ assertNotNull(repository);
+ assertEmpty(repository.getBeans());
+
+ ControllerContext context2 = assertInstall(1, "Name2");
+ SimpleBean bean1 = (SimpleBean)context2.getTarget();
+ assertNotNull(bean1);
+ assertEmpty(repository.getBeans());
+
+ ControllerContext context3 = assertInstall(2, "Name3");
+ SimpleBean bean2 = (SimpleBean)context3.getTarget();
+ assertNotNull(bean2);
+
+ assertEquals(ControllerState.INSTALLED, context1.getState());
+ assertFalse(repository.getBeans().isEmpty());
+ assertEquals(2, repository.getBeans().size());
+ boolean first = bean1 == repository.getBeans().get(0);
+ if (first)
+ assertTrue(bean2 == repository.getBeans().get(1));
+ else
+ assertTrue(bean2 == repository.getBeans().get(0));
+ }
+
+ protected void callbackCardinalityCorrectOrder() throws Throwable
+ {
+ AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
+ buildMetaData(repository);
+ }
+
+ public void testCardinalityCallbackWrongOrder() throws Throwable
+ {
+ callbackCardinalityWrongOrder();
+
+ ControllerContext context2 = assertInstall(1, "Name2");
+ SimpleBean bean1 = (SimpleBean)context2.getTarget();
+ assertNotNull(bean1);
+
+ ControllerContext context3 = assertInstall(2, "Name3");
+ SimpleBean bean2 = (SimpleBean)context3.getTarget();
+
+ ControllerContext context1 = assertInstall(0, "Name1");
+ BeanRepository repository = (BeanRepository)context1.getTarget();
+ assertNotNull(repository);
+
+ assertFalse(repository.getBeans().isEmpty());
+ assertEquals(2, repository.getBeans().size());
+ boolean first = bean1 == repository.getBeans().get(0);
+ if (first)
+ assertTrue(bean2 == repository.getBeans().get(1));
+ else
+ assertTrue(bean2 == repository.getBeans().get(0));
+ }
+
protected void callbackCardinalityWrongOrder() throws Throwable
{
AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
More information about the jboss-cvs-commits
mailing list