[jboss-cvs] JBossAS SVN: r99603 - 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 13:53:33 EST 2010


Author: kabir.khan at jboss.com
Date: 2010-01-19 13:53:33 -0500 (Tue, 19 Jan 2010)
New Revision: 99603

Added:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver2.java
Removed:
   projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.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/DefaultDependencyResolver.java
Log:
Better initial idea. Precalculate all dependencies when installing the context, currently only works with name based lookups. Need something to handle supply/demand, contextual injection etc.

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 18:51:39 UTC (rev 99602)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java	2010-01-19 18:53:33 UTC (rev 99603)
@@ -39,7 +39,7 @@
 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.resolver.IndexingDependencyResolver2;
 import org.jboss.dependency.plugins.tracker.AbstractContextRegistry;
 import org.jboss.dependency.spi.CallbackItem;
 import org.jboss.dependency.spi.Controller;
@@ -75,7 +75,7 @@
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
    //AbstractDependencyResolver resolver = new DefaultDependencyResolver(this);
-   AbstractDependencyResolver resolver = new IndexingDependencyResolver(this);
+   AbstractDependencyResolver resolver = new IndexingDependencyResolver2(this);
    
    /**
     * The executor used to install ASYNCHRONOUS contexts. It must have a saturation policy of
@@ -827,6 +827,7 @@
                log.trace("Dependencies for " + name + ": " + dependsOn);
          }
 
+         resolver.registerContext(context);
          boolean ok = incrementState(context, trace);
          if (ok)
          {
@@ -1923,7 +1924,9 @@
    {
       if (name == null)
          throw new IllegalArgumentException("Null name");
-      allContexts.remove(name);
+      ControllerContext context = allContexts.remove(name);
+      if (context != null)
+         resolver.unregisterContext(context);
    }
 
    // --- alias dependency

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 18:51:39 UTC (rev 99602)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java	2010-01-19 18:53:33 UTC (rev 99603)
@@ -140,4 +140,8 @@
    public abstract boolean resolveDependencies(ControllerContext ctx, ControllerState state);
    
    public abstract void stateIncremented(ControllerContext context, boolean trace);
+   
+   public abstract void registerContext(ControllerContext context);
+   
+   public abstract void unregisterContext(ControllerContext context);
 }

Modified: 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	2010-01-19 18:51:39 UTC (rev 99602)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java	2010-01-19 18:53:33 UTC (rev 99603)
@@ -29,7 +29,6 @@
 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
@@ -216,4 +215,14 @@
       //Noop
    }
 
+   @Override
+   public void registerContext(ControllerContext context)
+   {
+   }
+
+   @Override
+   public void unregisterContext(ControllerContext context)
+   {
+   }
+
 }

Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver2.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver2.java	                        (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver2.java	2010-01-19 18:53:33 UTC (rev 99603)
@@ -0,0 +1,168 @@
+/*
+* 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.List;
+import java.util.Set;
+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.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ * Optimized  
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingDependencyResolver2 extends AbstractDependencyResolver
+{  
+   //So far this only works with name
+   private final ConcurrentMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>> contextsByDependency = new ConcurrentHashMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>>();
+   
+   private final IncrementContextPlugin<Boolean> plugin = new DefaultIncrementContextPlugin();
+   
+   public IndexingDependencyResolver2(Controller controller)
+   {
+      super(controller);
+   }
+
+   @Override
+   public void registerContext(ControllerContext context)
+   {
+      DependencyInfo dependencies = context.getDependencyInfo();
+      if (dependencies != null)
+      {
+         Set<DependencyItem> items = dependencies.getIDependOn(null);
+         if (items != null && items.size() > 0)
+         {
+            for (DependencyItem item : items)
+            {
+               //FIXME should support other lookup than name
+               Object name = item.getIDependOn();
+               
+               ConcurrentMap<ControllerState, List<ControllerContext>> contextsByState = contextsByDependency.get(name);
+               if (contextsByState == null)
+               {
+                  contextsByState = new ConcurrentHashMap<ControllerState, List<ControllerContext>>();
+                  ConcurrentMap<ControllerState, List<ControllerContext>> old = contextsByDependency.putIfAbsent(name, contextsByState);
+                  if (old != null)
+                     contextsByState = old;
+               }
+               List<ControllerContext> contexts = contextsByState.get(item.getDependentState());
+               if (contexts == null)
+               {
+                  contexts = new CopyOnWriteArrayList<ControllerContext>();
+                  List<ControllerContext> old = contextsByState.putIfAbsent(item.getDependentState(), contexts);
+                  if (old != null)
+                     contexts = old;
+               }
+               contexts.add(context);
+            }
+         }
+      }
+   }
+
+   @Override
+   public void unregisterContext(ControllerContext context)
+   {
+      DependencyInfo dependencies = context.getDependencyInfo();
+      if (dependencies != null)
+      {
+         Set<DependencyItem> items = dependencies.getIDependOn(null);
+         if (items != null && items.size() > 0)
+         {
+            for (DependencyItem item : items)
+            {
+               //FIXME should support other lookup than name
+               Object name = item.getIDependOn();
+
+               ConcurrentMap<ControllerState, List<ControllerContext>> contextsByState = contextsByDependency.get(name);
+               if (contextsByState == null)
+                  throw new IllegalStateException("Inconsistent state");
+               List<ControllerContext> contexts = contextsByState.get(item.getDependentState());
+               if (contexts == null)
+                  throw new IllegalStateException("Inconsistent state");
+               if (!contexts.remove(context))
+                  throw new IllegalStateException("Inconsistent state");
+            }
+         }
+      }
+   }
+   
+   @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);
+         if (plugin.canMoveToState(context, nextState))
+         {
+            if (incrementState(context, trace))
+               fromState = context.getState();
+            else
+               break;
+         }
+         else
+         {
+            break;
+         }
+      }
+   }
+   
+   @Override
+   public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
+   {
+      return plugin.canMoveToState(ctx, state);
+   }
+
+   @Override
+   public void stateIncremented(ControllerContext incremented, boolean trace)
+   {
+      //private final ConcurrentMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>> contextsByDependency = new ConcurrentHashMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>>();
+      ConcurrentMap<ControllerState, List<ControllerContext>> contextsByDependentState = contextsByDependency.get(incremented.getName());
+      if (contextsByDependentState == null || contextsByDependentState.size() == 0)
+         return;
+      List<ControllerContext> contexts = contextsByDependentState.get(incremented.getState());
+      if (contexts == null || contexts.size() == 0)
+         return;
+      
+      for (ControllerContext context : contexts)
+      {
+         if (context.getDependencyInfo() != null)
+         {
+            ControllerState nextState = getStateModel().getNextState(context.getState());
+            
+            // TODO Check that it is not being installed
+            resolveContexts(context, trace);
+         }
+      }
+   }
+
+}

Deleted: 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	2010-01-19 18:51:39 UTC (rev 99602)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/UnresolvedDependenciesIncrementContextPlugin.java	2010-01-19 18:53:33 UTC (rev 99603)
@@ -1,66 +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.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