[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