[jboss-cvs] JBossAS SVN: r99593 - in projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins: resolver and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jan 19 06:42:20 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-01-19 06:42:19 -0500 (Tue, 19 Jan 2010)
New Revision: 99593

Added:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultIncrementContextPlugin.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IncrementContextPlugin.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver.java
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.java
Removed:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/DefaultDependencyResolver.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
Log:
Add half-implemented IndexingDependencyResolver. This is a very crappy version, which will not end up in the final impl

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-19 11:32:14 UTC (rev 99592)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -38,6 +38,8 @@
 
 import org.jboss.dependency.plugins.action.ControllerContextAction;
 import org.jboss.dependency.plugins.action.SimpleControllerContextAction;
+import org.jboss.dependency.plugins.resolver.DefaultDependencyResolver;
+import org.jboss.dependency.plugins.resolver.IndexingDependencyResolver;
 import org.jboss.dependency.plugins.tracker.AbstractContextRegistry;
 import org.jboss.dependency.spi.CallbackItem;
 import org.jboss.dependency.spi.Controller;
@@ -72,7 +74,8 @@
    /** The lock */
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
-   AbstractDependencyResolver resolver = new DefaultDependencyResolver(this);
+   //AbstractDependencyResolver resolver = new DefaultDependencyResolver(this);
+   AbstractDependencyResolver resolver = new IndexingDependencyResolver(this);
    
    /**
     * The executor used to install ASYNCHRONOUS contexts. It must have a saturation policy of
@@ -840,7 +843,7 @@
          }
          if (ok)
          {
-            resolveContexts(trace);
+            resolveContexts(context, trace);
          }
          else
          {
@@ -885,7 +888,7 @@
          context.setRequiredState(state);
 
          if (stateModel.isBeforeState(context.getState(), state))
-            resolveContexts(trace);
+            resolveContexts(context, trace);
          else
          {
             while (stateModel.isAfterState(context.getState(), state))
@@ -982,6 +985,7 @@
          try
          {
             install(context, ControllerState.ERROR, initialState);
+            resolver.stateIncremented(context, trace);
          }
          catch (Throwable t)
          {
@@ -1044,6 +1048,10 @@
             context.setError(error);
             return false;
          }
+         else
+         {
+            resolver.stateIncremented(context, trace);
+         }
       }
 
       return true;
@@ -1054,11 +1062,12 @@
     * <p/>
     * This method must be invoked with the write lock taken
     *
+    * @param context the context that has been installed
     * @param trace whether trace is enabled
     */
-   protected void resolveContexts(boolean trace)
+   protected void resolveContexts(ControllerContext context, boolean trace)
    {
-      resolver.resolveContexts(trace);
+      resolver.resolveContexts(context, trace);
    }
 
    
@@ -2131,7 +2140,7 @@
             //The given context had its state changed, now see if anybody was dependent on it
             if (stateChanged && !interrupted)
             {
-               resolveContexts(trace);
+               resolveContexts(context, trace);
             }
          }
          catch (Throwable t)

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-19 11:32:14 UTC (rev 99592)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -36,7 +36,7 @@
  */
 public abstract class AbstractDependencyResolver
 {
-   Logger log = Logger.getLogger(this.getClass());
+   protected final Logger log = Logger.getLogger(this.getClass());
    
    private final AbstractController controller;
    
@@ -109,7 +109,7 @@
       controller.errorResolvingContext(ctx, fromState, toState, error, trace);
    }
    
-   protected void resolveChildControllers(boolean trace)
+   protected void resolveChildControllers(ControllerContext context, boolean trace)
    {
       // resolve child controllers
       for (AbstractController controller : getControllers())
@@ -117,7 +117,7 @@
          controller.lockWrite();
          try
          {
-            controller.resolveContexts(trace);
+            controller.resolveContexts(context, trace);
          }
          finally
          {
@@ -126,15 +126,18 @@
       }
    }
    
-   protected void resolveParentController(boolean trace)
+   protected void resolveParentController(ControllerContext context, boolean trace)
    {
       AbstractController parent = controller.getParentController();
       if (parent != null)
       {
-         parent.resolveContexts(trace);
+         parent.resolveContexts(context, trace);
       }
    }
    
-   public abstract void resolveContexts(boolean trace);
+   public abstract void resolveContexts(ControllerContext context, boolean trace);
+   
    public abstract boolean resolveDependencies(ControllerContext ctx, ControllerState state);
+   
+   public abstract void stateIncremented(ControllerContext context, boolean trace);
 }

Deleted: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/DefaultDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/DefaultDependencyResolver.java	2010-01-19 11:32:14 UTC (rev 99592)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/DefaultDependencyResolver.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -1,208 +0,0 @@
-/*
-* 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.dependency.plugins;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.jboss.dependency.spi.Controller;
-import org.jboss.dependency.spi.ControllerContext;
-import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.DependencyInfo;
-
-/**
- * 
- * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
- * @version $Revision: 1.1 $
- */
-public class DefaultDependencyResolver extends AbstractDependencyResolver
-{
-   public DefaultDependencyResolver(Controller controller)
-   {
-      super(controller);
-   }
-
-   /**
-    * Resolve unresolved contexts<p>
-    * <p/>
-    * This method must be invoked with the write lock taken
-    *
-    * @param trace whether trace is enabled
-    */
-   public void resolveContexts(boolean trace)
-   {
-      boolean wasOnDemandEnabled = false;
-      boolean resolutions = true;
-      while (resolutions || isOnDemandEnabled())
-      {
-         if (isOnDemandEnabled())
-            wasOnDemandEnabled = true;
-         
-         setOnDemandEnabled(false);
-         resolutions = false;
-         for (ControllerState fromState : getStateModel())
-         {
-            ControllerState toState = getStateModel().getNextState(fromState);
-            if (resolveContexts(fromState, toState, trace))
-            {
-               resolutions = true;
-               break;
-            }
-         }
-      }
-
-      if (trace)
-      {
-         for (ControllerState state : getStateModel())
-         {
-            ControllerState nextState = getStateModel().getNextState(state);
-            Set<ControllerContext> stillUnresolved = getContextsByState(state);
-            if (stillUnresolved.isEmpty() == false)
-            {
-               for (ControllerContext ctx : stillUnresolved)
-               {
-                  if (advance(ctx))
-                     log.trace("Still unresolved " + nextState.getStateString() + ": " + ctx);
-               }
-            }
-         }
-      }
-
-      // resolve child controllers
-      resolveChildControllers(trace);
-      
-      if (wasOnDemandEnabled)
-      {
-         resolveParentController(trace);
-      }
-   }
-
-   protected boolean resolveContexts(ControllerState fromState, ControllerState toState, boolean trace)
-   {
-      boolean resolutions = false;
-      Set<ControllerContext> unresolved = getContextsByState(fromState);
-      Set<ControllerContext> resolved = resolveContexts(unresolved, fromState, toState, trace);
-      if (resolved.isEmpty() == false)
-      {
-         Set<ControllerContext> toProcess = new HashSet<ControllerContext>();
-         for (ControllerContext context : resolved)
-         {
-            Object name = context.getName();
-            if (fromState.equals(context.getState()) == false)
-            {
-               if (trace)
-                  log.trace("Skipping already installed " + name + " for " + toState.getStateString());
-               removeInstalling(context);
-            }
-            else
-            {
-               toProcess.add(context);
-            }
-         }
-         try
-         {
-            if (toProcess.isEmpty() == false)
-            {
-               for (Iterator<ControllerContext> iter = toProcess.iterator(); iter.hasNext(); )
-               {
-                  ControllerContext context = iter.next();
-                  iter.remove();
-                  Object name = context.getName();
-                  try
-                  {
-                     if (fromState.equals(context.getState()) == false)
-                     {
-                        if (trace)
-                           log.trace("Skipping already installed " + name + " for " + toState.getStateString());
-                     }
-                     else
-                     {
-                        if (trace)
-                           log.trace("Dependencies resolved " + name + " for " + toState.getStateString());
-
-                        if (incrementState(context, trace))
-                        {
-                           resolutions = true;
-                           if (trace)
-                              log.trace(name + " " + toState.getStateString());
-                        }
-                        
-                     }
-                  }
-                  finally
-                  {
-                     removeInstalling(context);
-                  }
-               }
-            }
-         }
-         finally
-         {
-            // If we get here something has gone seriously wrong,
-            // but try to tidyup as much state as possible
-            if (toProcess.isEmpty() == false)
-            {
-               for (ControllerContext context : toProcess)
-                  removeInstalling(context);
-            }
-         }
-      }
-
-      return resolutions;
-   }
-
-   protected Set<ControllerContext> resolveContexts(Set<ControllerContext> contexts, ControllerState fromState, ControllerState toState, boolean trace)
-   {
-      HashSet<ControllerContext> result = new HashSet<ControllerContext>();
-
-      if (contexts.isEmpty() == false)
-      {
-         for (ControllerContext ctx : contexts)
-         {
-            if (checkCanInstall(ctx, fromState, toState, trace))
-            {
-               try
-               {
-                  if (resolveDependencies(ctx, toState))
-                     result.add(ctx);
-                  else
-                     removeInstalling(ctx);
-               }
-               catch (Throwable error)
-               {
-                  errorResolvingContext(ctx, fromState, toState, error, trace);
-               }
-            }
-         }
-      }
-
-      return result;
-   }
-
-   public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
-   {
-      DependencyInfo dependencies = ctx.getDependencyInfo();
-      return dependencies == null || dependencies.resolveDependencies(getController(), state);
-   }
-
-}

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -0,0 +1,219 @@
+/*
+* 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.dependency.plugins.resolver;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+
+/**
+ * This is the legacy dependency resolution algorithm broken out
+ * from AbstractController
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class DefaultDependencyResolver extends AbstractDependencyResolver
+{
+   IncrementContextPlugin<Boolean> incrementContextPlugin = new DefaultIncrementContextPlugin();
+   
+   public DefaultDependencyResolver(Controller controller)
+   {
+      super(controller);
+   }
+
+   /**
+    * Resolve unresolved contexts<p>
+    * <p/>
+    * This method must be invoked with the write lock taken
+    *
+    * @param context the context being installed
+    * @param trace whether trace is enabled
+    */
+   public void resolveContexts(ControllerContext context, boolean trace)
+   {
+      boolean wasOnDemandEnabled = false;
+      boolean resolutions = true;
+      while (resolutions || isOnDemandEnabled())
+      {
+         if (isOnDemandEnabled())
+            wasOnDemandEnabled = true;
+         
+         setOnDemandEnabled(false);
+         resolutions = false;
+         for (ControllerState fromState : getStateModel())
+         {
+            ControllerState toState = getStateModel().getNextState(fromState);
+            if (resolveContexts(fromState, toState, trace))
+            {
+               resolutions = true;
+               break;
+            }
+         }
+      }
+
+      if (trace)
+      {
+         for (ControllerState state : getStateModel())
+         {
+            ControllerState nextState = getStateModel().getNextState(state);
+            Set<ControllerContext> stillUnresolved = getContextsByState(state);
+            if (stillUnresolved.isEmpty() == false)
+            {
+               for (ControllerContext ctx : stillUnresolved)
+               {
+                  if (advance(ctx))
+                     log.trace("Still unresolved " + nextState.getStateString() + ": " + ctx);
+               }
+            }
+         }
+      }
+
+      // resolve child controllers
+      resolveChildControllers(context, trace);
+      
+      if (wasOnDemandEnabled)
+      {
+         resolveParentController(context, trace);
+      }
+   }
+
+   protected boolean resolveContexts(ControllerState fromState, ControllerState toState, boolean trace)
+   {
+      boolean resolutions = false;
+      Set<ControllerContext> unresolved = getContextsByState(fromState);
+      Set<ControllerContext> resolved = resolveContexts(unresolved, fromState, toState, trace);
+      if (resolved.isEmpty() == false)
+      {
+         Set<ControllerContext> toProcess = new HashSet<ControllerContext>();
+         for (ControllerContext context : resolved)
+         {
+            Object name = context.getName();
+            if (fromState.equals(context.getState()) == false)
+            {
+               if (trace)
+                  log.trace("Skipping already installed " + name + " for " + toState.getStateString());
+               removeInstalling(context);
+            }
+            else
+            {
+               toProcess.add(context);
+            }
+         }
+         try
+         {
+            if (toProcess.isEmpty() == false)
+            {
+               for (Iterator<ControllerContext> iter = toProcess.iterator(); iter.hasNext(); )
+               {
+                  ControllerContext context = iter.next();
+                  iter.remove();
+                  Object name = context.getName();
+                  try
+                  {
+                     if (fromState.equals(context.getState()) == false)
+                     {
+                        if (trace)
+                           log.trace("Skipping already installed " + name + " for " + toState.getStateString());
+                     }
+                     else
+                     {
+                        if (trace)
+                           log.trace("Dependencies resolved " + name + " for " + toState.getStateString());
+
+                        if (incrementState(context, trace))
+                        {
+                           resolutions = true;
+                           if (trace)
+                              log.trace(name + " " + toState.getStateString());
+                        }
+                        
+                     }
+                  }
+                  finally
+                  {
+                     removeInstalling(context);
+                  }
+               }
+            }
+         }
+         finally
+         {
+            // If we get here something has gone seriously wrong,
+            // but try to tidyup as much state as possible
+            if (toProcess.isEmpty() == false)
+            {
+               for (ControllerContext context : toProcess)
+                  removeInstalling(context);
+            }
+         }
+      }
+
+      return resolutions;
+   }
+
+   protected Set<ControllerContext> resolveContexts(Set<ControllerContext> contexts, ControllerState fromState, ControllerState toState, boolean trace)
+   {
+      HashSet<ControllerContext> result = new HashSet<ControllerContext>();
+
+      if (contexts.isEmpty() == false)
+      {
+         for (ControllerContext ctx : contexts)
+         {
+            if (checkCanInstall(ctx, fromState, toState, trace))
+            {
+               try
+               {
+                  if (resolveDependencies(ctx, toState))
+                     result.add(ctx);
+                  else
+                     removeInstalling(ctx);
+               }
+               catch (Throwable error)
+               {
+                  errorResolvingContext(ctx, fromState, toState, error, trace);
+               }
+            }
+         }
+      }
+
+      return result;
+   }
+
+   public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
+   {
+      return incrementContextPlugin.canMoveToState(ctx, state);
+   }
+
+   @Override
+   public void stateIncremented(ControllerContext context, boolean trace)
+   {
+      //Noop
+   }
+
+}

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultIncrementContextPlugin.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultIncrementContextPlugin.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultIncrementContextPlugin.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -0,0 +1,41 @@
+/*
+* 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.dependency.plugins.resolver;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class DefaultIncrementContextPlugin implements IncrementContextPlugin<Boolean>
+{
+   public Boolean canMoveToState(ControllerContext ctx, ControllerState state)
+   {
+      DependencyInfo dependencies = ctx.getDependencyInfo();
+      return dependencies == null || dependencies.resolveDependencies(ctx.getController(), state);
+   }
+
+}

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IncrementContextPlugin.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IncrementContextPlugin.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IncrementContextPlugin.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -0,0 +1,35 @@
+/*
+* 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.dependency.plugins.resolver;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface IncrementContextPlugin<T>
+{
+   T canMoveToState(ControllerContext ctx, ControllerState state);
+}

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -0,0 +1,278 @@
+/*
+* 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.dependency.plugins.resolver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+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.DependencyItem;
+
+/**
+ * Optimized  
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingDependencyResolver extends AbstractDependencyResolver
+{
+   private final ConcurrentMap<ControllerContext, UnresolvedEntry> unresolvedEntries = new ConcurrentHashMap<ControllerContext, UnresolvedEntry>();
+   private final ConcurrentMap<ControllerState, List<UnresolvedEntry>> unresolvedEntriesByDemandedState = new ConcurrentHashMap<ControllerState, List<UnresolvedEntry>>();
+   
+   //DependencyItem
+   private final IncrementContextPlugin<List<DependencyItem>> incrementContextPlugin = new UnresolvedDependenciesIncrementContextPlugin();
+   
+   public IndexingDependencyResolver(Controller controller)
+   {
+      super(controller);
+   }
+
+   @Override
+   public void resolveContexts(ControllerContext context, boolean trace)
+   {
+      ControllerState fromState = context.getState();
+      ControllerState toState = context.getRequiredState();
+      while (getStateModel().isAfterState(toState, fromState))
+      {
+         ControllerState nextState = getStateModel().getNextState(fromState);
+         List<DependencyItem> unresolvedDependencies = incrementContextPlugin.canMoveToState(context, nextState);
+         
+         if (unresolvedDependencies.isEmpty() == false)
+         {
+            unresolvedDependencies = incrementContextPlugin.canMoveToState(context, null);
+            recordUnresolvedEntries(context, unresolvedDependencies);
+            break;
+         }
+         else
+         {
+            incrementState(context, trace);
+            fromState = context.getState();
+         }
+      }
+   }
+   
+   private void recordUnresolvedEntries(ControllerContext context, List<DependencyItem> unresolvedDependencies)
+   {
+      UnresolvedEntry entry = unresolvedEntries.get(context);
+      if (entry == null)
+      {
+         entry = UnresolvedEntry.create(context, unresolvedDependencies);
+         unresolvedEntries.putIfAbsent(context, entry);
+         
+         for (ControllerState dependentState : entry.getDependentStates())
+         {
+            List<UnresolvedEntry> unresolvedEntriesForState = unresolvedEntriesByDemandedState.get(dependentState);
+            if (unresolvedEntriesForState == null)
+               unresolvedEntriesForState = new CopyOnWriteArrayList<UnresolvedEntry>();
+            List<UnresolvedEntry> old = unresolvedEntriesByDemandedState.putIfAbsent(dependentState, unresolvedEntriesForState);
+            if (old != null)
+               unresolvedEntriesForState = old;
+            unresolvedEntriesForState.add(entry);   
+         }
+      }
+   }
+   
+
+   @Override
+   public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
+   {
+      return incrementContextPlugin.canMoveToState(ctx, state).size() > 0;
+   }
+
+   @Override
+   public void stateIncremented(ControllerContext context, boolean trace)
+   {
+      List<UnresolvedEntry> entries = unresolvedEntriesByDemandedState.get(context.getState());
+      if (entries != null && entries.size() > 0)
+      {
+         for (Iterator<UnresolvedEntry> it = entries.iterator() ; it.hasNext() ; )
+         {
+            UnresolvedEntry entry = it.next();
+            if (entry == null)
+               continue;
+            
+            ControllerContext entryContext = entry.getContext();
+            while (getStateModel().isBeforeState(entryContext.getState(), entryContext.getRequiredState()))
+            {
+               boolean resolvedAll = true;
+               ControllerState nextState = getStateModel().getNextState(entryContext.getState());
+               if (nextState == null)
+                  break;
+               List<DependencyItem> unresolvedItems = entry.getItemsByState(context.getState(), nextState); 
+               for (DependencyItem item : unresolvedItems)
+               {
+                  if (item.isResolved() == false && 
+                        item.getDependentState().equals(context.getState()) && 
+                        item.getWhenRequired().equals(getStateModel().getPreviousState(entry.getContext().getState())))
+                  {
+                     if (item.resolve(getController()) == false)
+                     {
+                        resolvedAll = false;
+                        break;
+                     }
+                     else
+                     {
+                        entry.removeItemByState(context.getState(), nextState, item);
+                     }
+                  }
+               }
+               
+               if (resolvedAll)
+               {
+                  incrementState(entryContext, trace);
+                  unresolvedEntriesByDemandedState.remove(entry);
+                  if (!entry.hasItems())
+                  {
+                     unresolvedItems.remove(entry.getContext());
+                  }
+               }
+            }
+         }
+      }
+   }
+
+   private static class UnresolvedEntry
+   {
+      final ControllerContext context;
+      final List<DependencyItem> allItems;
+      final Map<ControllerState, Map<ControllerState, List<DependencyItem>>> itemsByState;
+      
+      static UnresolvedEntry create(ControllerContext context, List<DependencyItem> allItems)
+      {
+         Comparator<ControllerState> comparator = new ControllerStateComparator(context.getController().getStates());
+         //Index the dependencyItems
+         Map<ControllerState, Map<ControllerState, List<DependencyItem>>> itemsByState = new TreeMap<ControllerState, Map<ControllerState, List<DependencyItem>>>(comparator);
+         for (DependencyItem item : allItems)
+         {
+            if (item.getDependentState() == null)
+               throw new IllegalStateException("Null dependent state");
+            if (item.getWhenRequired() == null)
+               throw new IllegalStateException("Null required state");
+            Map<ControllerState, List<DependencyItem>> itemsByDependentState = itemsByState.get(item.getDependentState());
+            if (itemsByDependentState == null)
+            {
+               itemsByDependentState = new TreeMap<ControllerState, List<DependencyItem>>(comparator);
+               itemsByState.put(item.getDependentState(), itemsByDependentState);
+            }
+            
+            List<DependencyItem> itemsByRequiredState = itemsByDependentState.get(item.getWhenRequired());
+            if (itemsByRequiredState == null)
+            {
+               itemsByRequiredState = new ArrayList<DependencyItem>();
+               itemsByDependentState.put(item.getWhenRequired(), itemsByRequiredState);
+            }
+            itemsByRequiredState.add(item);
+         }
+         
+         return new UnresolvedEntry(context, allItems, itemsByState);
+      }
+      
+      UnresolvedEntry(ControllerContext context, List<DependencyItem> allItems, Map<ControllerState, Map<ControllerState, List<DependencyItem>>> itemsByState)
+      {
+         super();
+         this.context = context;
+         this.allItems = allItems;
+         this.itemsByState = itemsByState;
+      }
+
+      ControllerContext getContext()
+      {
+         return context;
+      }
+
+      Set<ControllerState> getDependentStates()
+      {
+         return itemsByState.keySet();
+      }
+      
+      Set<ControllerState> getRequiredStates(ControllerState dependentState)
+      {
+         Map<ControllerState, List<DependencyItem>> itemsByDependentState = itemsByState.get(dependentState);
+         if (itemsByDependentState == null)
+            return Collections.<ControllerState>emptySet();
+         
+         return itemsByDependentState.keySet();
+      }
+      
+      List<DependencyItem> getItemsByState(ControllerState dependentState, ControllerState requiredState)
+      {
+         Map<ControllerState, List<DependencyItem>> itemsByDependentState = itemsByState.get(dependentState);
+         if (itemsByDependentState != null)
+         {
+            List<DependencyItem> items = itemsByDependentState.get(requiredState);
+            if (items != null)
+               return items;
+         }
+         return Collections.<DependencyItem>emptyList();
+      }
+      
+      void removeItemByState(ControllerState dependentState, ControllerState requiredState, DependencyItem item)
+      {
+         Map<ControllerState, List<DependencyItem>> itemsByDependentState = itemsByState.get(dependentState);
+         if (itemsByDependentState != null)
+         {
+            List<DependencyItem> items = itemsByDependentState.get(requiredState);
+            items.remove(item);
+            allItems.remove(item);
+         }
+      }
+      
+      boolean hasItems()
+      {
+         return !allItems.isEmpty();
+      }
+   }
+      
+   
+   private static class ControllerStateComparator implements Comparator<ControllerState>
+   {
+      private final ControllerStateModel states;
+      
+      ControllerStateComparator(ControllerStateModel states)
+      {
+         this.states = states;
+      }
+      
+      public int compare(ControllerState o1, ControllerState o2)
+      {
+         if (o1.equals(o2))
+            return 0;
+         if (states.isBeforeState(o1, o2))
+            return -1;
+         return 1;
+      }
+      
+   }
+}

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.java	2010-01-19 11:42:19 UTC (rev 99593)
@@ -0,0 +1,66 @@
+/*
+* 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.dependency.plugins.resolver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class UnresolvedDependenciesIncrementContextPlugin implements IncrementContextPlugin<List<DependencyItem>>
+{
+   public List<DependencyItem> canMoveToState(ControllerContext ctx, ControllerState state)
+   {
+      List<DependencyItem> unresolved = null;
+      DependencyInfo dependencies = ctx.getDependencyInfo();
+      if (dependencies != null)
+      {
+         Set<DependencyItem> items = dependencies.getUnresolvedDependencies(state);
+         if (items.isEmpty() == false)
+         {
+            for (DependencyItem item : items)
+            {
+               if (item.resolve(ctx.getController()) == false)
+               {
+                  if (unresolved == null)
+                     unresolved = new ArrayList<DependencyItem>();
+                  unresolved.add(item);
+               }
+            }
+         }
+      }
+      if (unresolved != null)
+         return unresolved;
+      return Collections.<DependencyItem>emptyList();
+   }
+
+}




More information about the jboss-cvs-commits mailing list