[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