[jboss-cvs] JBossAS SVN: r99676 - in projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency: plugins/resolver and 5 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jan 20 15:36:31 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-01-20 15:36:31 -0500 (Wed, 20 Jan 2010)
New Revision: 99676
Added:
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolverFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/DependencyResolverFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcher.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcherFactory.java
Removed:
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/IndexingDependencyResolver2.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:
Refactor to support pluggable resolver matchers
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-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -38,8 +38,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.IndexingDependencyResolver2;
+import org.jboss.dependency.plugins.resolver.DependencyResolverAbstractFactory;
import org.jboss.dependency.plugins.tracker.AbstractContextRegistry;
import org.jboss.dependency.spi.CallbackItem;
import org.jboss.dependency.spi.Controller;
@@ -74,8 +73,7 @@
/** The lock */
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
-// AbstractDependencyResolver resolver = new DefaultDependencyResolver(this);
- AbstractDependencyResolver resolver = new IndexingDependencyResolver2(this);
+ private AbstractDependencyResolver resolver = DependencyResolverAbstractFactory.getInstance().getFactory(this).createResolver(this);
/**
* The executor used to install ASYNCHRONOUS contexts. It must have a saturation policy of
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-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -27,6 +27,7 @@
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
import org.jboss.dependency.spi.ControllerStateModel;
+import org.jboss.dependency.spi.DependencyInfo;
import org.jboss.dependency.spi.DependencyItem;
import org.jboss.logging.Logger;
@@ -110,6 +111,12 @@
controller.errorResolvingContext(ctx, fromState, toState, error, trace);
}
+ protected boolean canMoveToState(ControllerContext ctx, ControllerState state)
+ {
+ DependencyInfo dependencies = ctx.getDependencyInfo();
+ return dependencies == null || dependencies.resolveDependencies(ctx.getController(), state);
+ }
+
protected void resolveChildControllers(ControllerContext context, boolean trace)
{
// resolve child controllers
Deleted: 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-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultDependencyResolver.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -1,233 +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.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;
-
-/**
- * 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
- }
-
- @Override
- public void registerContext(ControllerContext context)
- {
- }
-
- @Override
- public void unregisterContext(ControllerContext context)
- {
- }
-
- @Override
- public void enableOnDemand(ControllerContext context, boolean trace)
- {
- }
-
-}
Deleted: 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 2010-01-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DefaultIncrementContextPlugin.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -1,41 +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 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/DependencyResolverAbstractFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -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 org.jboss.dependency.plugins.resolver.indexing.IndexingDependencyResolverFactory;
+import org.jboss.dependency.plugins.resolver.standard.StandardDependencyResolverFactory;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.resolver.DependencyResolverFactory;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class DependencyResolverAbstractFactory
+{
+ private static final DependencyResolverAbstractFactory INSTANCE = new DependencyResolverAbstractFactory();
+ private static final DependencyResolverFactory factory;
+ static
+ {
+ //TODO configure with system properties
+// Class<?> clazz = StandardDependencyResolverFactory.class;
+ Class<?> clazz = IndexingDependencyResolverFactory.class;
+ try
+ {
+ factory = (DependencyResolverFactory)clazz.newInstance();
+ }
+ catch(Exception e)
+ {
+ throw new IllegalStateException("Could not create create DependencyResolverFactory using " + clazz.getName(), e);
+ }
+ }
+
+ private DependencyResolverAbstractFactory()
+ {
+ }
+
+ public static DependencyResolverAbstractFactory getInstance()
+ {
+ return INSTANCE;
+ }
+
+ public DependencyResolverFactory getFactory(Controller controller)
+ {
+ return factory;
+ }
+}
Deleted: 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 2010-01-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IncrementContextPlugin.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -1,35 +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 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);
-}
Deleted: 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 2010-01-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -1,278 +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.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;
- }
-
- }
-}
Deleted: 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 2010-01-20 19:51:53 UTC (rev 99675)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/IndexingDependencyResolver2.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -1,252 +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.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-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.ControllerMode;
-import org.jboss.dependency.spi.ControllerState;
-import org.jboss.dependency.spi.DependencyInfo;
-import org.jboss.dependency.spi.DependencyItem;
-import org.jboss.util.collection.ConcurrentSet;
-
-/**
- * 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 ConcurrentSet<ControllerContext> enabledOnDemandContexts = new ConcurrentSet<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(getDependentState(item));
- if (contexts == null)
- {
- contexts = new CopyOnWriteArrayList<ControllerContext>();
- List<ControllerContext> old = contextsByState.putIfAbsent(getDependentState(item), 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(getDependentState(item));
- 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();
-
- while (getStateModel().isAfterState(context.getRequiredState(), fromState))
- {
- ControllerState nextState = getStateModel().getNextState(fromState);
-
- if (checkCanInstall(context, fromState, nextState, trace) == false)
- break;
- try
- {
- checkAndEnableOnDemandForContext(context, trace);
- if (plugin.canMoveToState(context, nextState))
- {
- if (incrementState(context, trace))
- fromState = context.getState();
- else
- break;
- }
- else
- {
- break;
- }
- }
- catch(Throwable t)
- {
- errorResolvingContext(context, fromState, nextState, t, trace);
- }
- finally
- {
- removeInstalling(context);
- }
- }
-
- while (true)
- {
- if (enabledOnDemandContexts.isEmpty())
- break;
- for (ControllerContext enabled : enabledOnDemandContexts)
- {
- enabledOnDemandContexts.remove(enabled);
- resolveContexts(enabled, trace);
- }
- }
- }
-
- @Override
- public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
- {
- return plugin.canMoveToState(ctx, state);
- }
-
- private Set<ControllerContext> getAllContextsDependentOn(ControllerContext incremented)
- {
- Set<ControllerContext> result = null;
- ConcurrentMap<ControllerState, List<ControllerContext>> contextsByDependentState = contextsByDependency.get(incremented.getName());
- result = addContextsDependentOn(result, incremented.getState(), contextsByDependentState);
-
- Set<Object> aliases = incremented.getAliases();
- if (aliases != null && aliases.size() > 0)
- {
- for (Object alias : aliases)
- {
- contextsByDependentState = contextsByDependency.get(alias);
- result = addContextsDependentOn(result, incremented.getState(), contextsByDependentState);
- }
- }
- return result;
- }
-
- private Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, ControllerState dependentState, Map<ControllerState, List<ControllerContext>> contextsByDependentState)
- {
- if (contextsByDependentState != null && !contextsByDependentState.isEmpty())
- {
- List<ControllerContext> contextsForName = contextsByDependentState.get(dependentState);
- if (contextsForName != null && !contextsForName.isEmpty())
- {
- if (result == null)
- result = new HashSet<ControllerContext>();
- result.addAll(contextsForName);
- }
- }
- return result;
- }
-
- @Override
- public void stateIncremented(ControllerContext incremented, boolean trace)
- {
- Set<ControllerContext> contexts = getAllContextsDependentOn(incremented);
- if (contexts == null || contexts.size() == 0)
- return;
-
- for (ControllerContext context : contexts)
- {
- if (context.getDependencyInfo() != null)
- {
- resolveContexts(context, trace);
- }
- }
- }
-
- @Override
- public void enableOnDemand(ControllerContext context, boolean trace)
- {
- enabledOnDemandContexts.add(context);
- }
-
- private void checkAndEnableOnDemandForContext(ControllerContext context, boolean trace) throws Throwable
- {
- boolean enabled = true;
- if (context.getMode() == ControllerMode.ON_DEMAND)
- {
- if (contextsByDependency.get(context.getName()) != null)
- getController().enableOnDemand(context);
-
- if (context.getAliases() != null && context.getAliases().size() > 0)
- {
- for (Object alias : context.getAliases())
- {
- if (contextsByDependency.get(alias) != null)
- getController().enableOnDemand(context);
- }
- }
- }
- }
-
-}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,43 @@
+/*
+* 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.indexing;
+
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.resolver.indexing.ResolverMatcher;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public abstract class AbstractDependencyResolverMatcher implements ResolverMatcher
+{
+ protected ControllerState getDependentState(DependencyItem item)
+ {
+ if (item.getDependentState() == null)
+ return ControllerState.INSTALLED;
+
+ return item.getDependentState();
+ }
+
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,239 @@
+/*
+* 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.indexing;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerMode;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.resolver.indexing.ResolverMatcher;
+import org.jboss.logging.Logger;
+import org.jboss.util.collection.ConcurrentSet;
+
+/**
+ * Optimized
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingDependencyResolver extends AbstractDependencyResolver
+{
+ Logger log = Logger.getLogger(this.getClass());
+ //Supply
+ //Qualifiers (Need some tests doing qualifiers with the dependency last)
+
+
+ //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 ConcurrentSet<ControllerContext> enabledOnDemandContexts = new ConcurrentSet<ControllerContext>();
+
+ private final Map<Class<? extends DependencyItem>, ResolverMatcher> matchers = new ConcurrentHashMap<Class<? extends DependencyItem>, ResolverMatcher>();
+
+ private final NameDependencyResolverMatcher nameMatcher = new NameDependencyResolverMatcher();
+
+ public IndexingDependencyResolver(Controller controller)
+ {
+ super(controller);
+ matchers.put(AbstractDependencyItem.class, nameMatcher);
+ }
+
+ public void addMatcher(Class<? extends DependencyItem> clazz, ResolverMatcher matcher)
+ {
+ matchers.put(clazz, matcher);
+ }
+
+ public void removeMatcher(Class<? extends DependencyItem> clazz)
+ {
+ matchers.remove(clazz);
+ }
+
+ private ResolverMatcher getMatcherForDependencyItem(DependencyItem item)
+ {
+ if (item == null)
+ throw new IllegalArgumentException("Null item");
+ ResolverMatcher matcher = matchers.get(item.getClass());
+
+ if (matcher == null)
+ {
+ log.warn("No matcher found for " + item.getClass() + ". Defaulting to " + NameDependencyResolverMatcher.class.getName() + " which is probably wrong");
+ matcher = nameMatcher;
+ }
+
+ return matcher;
+ }
+
+ @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)
+ {
+ ResolverMatcher matcher = getMatcherForDependencyItem(item);
+ matcher.registerDependency(context, item);
+ }
+ }
+ }
+ }
+
+ @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)
+ {
+ ResolverMatcher matcher = getMatcherForDependencyItem(item);
+ matcher.unregisterDependency(context, item);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void resolveContexts(ControllerContext context, boolean trace)
+ {
+ ControllerState fromState = context.getState();
+
+ while (getStateModel().isAfterState(context.getRequiredState(), fromState))
+ {
+ ControllerState nextState = getStateModel().getNextState(fromState);
+
+ if (checkCanInstall(context, fromState, nextState, trace) == false)
+ break;
+ try
+ {
+ checkAndEnableOnDemandForContext(context, trace);
+ if (canMoveToState(context, nextState))
+ {
+ if (incrementState(context, trace))
+ fromState = context.getState();
+ else
+ break;
+ }
+ else
+ {
+ break;
+ }
+ }
+ catch(Throwable t)
+ {
+ errorResolvingContext(context, fromState, nextState, t, trace);
+ }
+ finally
+ {
+ removeInstalling(context);
+ }
+ }
+
+ while (true)
+ {
+ if (enabledOnDemandContexts.isEmpty())
+ break;
+ for (ControllerContext enabled : enabledOnDemandContexts)
+ {
+ enabledOnDemandContexts.remove(enabled);
+ resolveContexts(enabled, trace);
+ }
+ }
+ }
+
+ @Override
+ public boolean resolveDependencies(ControllerContext ctx, ControllerState state)
+ {
+ return canMoveToState(ctx, state);
+ }
+
+ private Set<ControllerContext> getAllContextsDependentOn(ControllerContext incremented)
+ {
+ Set<ControllerContext> result = null;
+ for (ResolverMatcher matcher : matchers.values())
+ {
+ Set<ControllerContext> contexts = matcher.getMatchingContexts(incremented);
+ if (contexts != null)
+ {
+ if (result == null)
+ result = new HashSet<ControllerContext>();
+ result.addAll(contexts);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void stateIncremented(ControllerContext incremented, boolean trace)
+ {
+ Set<ControllerContext> contexts = getAllContextsDependentOn(incremented);
+ if (contexts == null || contexts.size() == 0)
+ return;
+
+ for (ControllerContext context : contexts)
+ {
+ if (context.getDependencyInfo() != null)
+ {
+ resolveContexts(context, trace);
+ }
+ }
+ }
+
+ @Override
+ public void enableOnDemand(ControllerContext context, boolean trace)
+ {
+ enabledOnDemandContexts.add(context);
+ }
+
+ private void checkAndEnableOnDemandForContext(ControllerContext context, boolean trace) throws Throwable
+ {
+ if (context.getMode() == ControllerMode.ON_DEMAND)
+ {
+ if (nameMatcher.hasDependencies(context.getName()))
+ getController().enableOnDemand(context);
+
+ if (context.getAliases() != null && context.getAliases().size() > 0)
+ {
+ for (Object alias : context.getAliases())
+ {
+ if (nameMatcher.hasDependencies(alias))
+ getController().enableOnDemand(context);
+ }
+ }
+ }
+ }
+
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,79 @@
+/*
+* 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.indexing;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.resolver.DependencyResolverFactory;
+import org.jboss.dependency.spi.resolver.indexing.ResolverMatcherFactory;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingDependencyResolverFactory implements DependencyResolverFactory
+{
+ private final Map<Class<? extends DependencyItem>, ResolverMatcherFactory> matchers = new HashMap<Class<? extends DependencyItem>, ResolverMatcherFactory>();
+
+ private Map<IndexingDependencyResolver, Boolean> weakResolvers = new WeakHashMap<IndexingDependencyResolver, Boolean>();
+
+ public synchronized AbstractDependencyResolver createResolver(Controller controller)
+ {
+ IndexingDependencyResolver resolver = new IndexingDependencyResolver(controller);
+ for (Map.Entry<Class<? extends DependencyItem>, ResolverMatcherFactory> entry : matchers.entrySet())
+ {
+ resolver.addMatcher(entry.getKey(), entry.getValue().createMatcher());
+ }
+ return resolver;
+ }
+
+ public synchronized void addMatcher(Class<? extends DependencyItem> itemClass, ResolverMatcherFactory matcherFactory)
+ {
+ if (itemClass == null)
+ throw new IllegalArgumentException("Null itemClass");
+ if (matcherFactory == null)
+ throw new IllegalArgumentException("Null matcherFactory");
+ if (matchers.containsKey(itemClass))
+ throw new IllegalArgumentException("Already have a matcher for class " + itemClass);
+
+ matchers.put(itemClass, matcherFactory);
+ for (IndexingDependencyResolver resolver : weakResolvers.keySet())
+ {
+ resolver.addMatcher(itemClass, matcherFactory.createMatcher());
+ }
+ }
+
+ public synchronized void removeMatcher(Class<? extends DependencyItem> itemClass)
+ {
+ matchers.remove(itemClass);
+ for (IndexingDependencyResolver resolver : weakResolvers.keySet())
+ {
+ resolver.removeMatcher(itemClass);
+ }
+ }
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcher.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,119 @@
+/*
+* 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.indexing;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class NameDependencyResolverMatcher extends AbstractDependencyResolverMatcher
+{
+ private final ConcurrentMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>> contextsByDependency = new ConcurrentHashMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>>();
+
+ public Set<ControllerContext> getMatchingContexts(ControllerContext context)
+ {
+ Set<ControllerContext> result = null;
+ ConcurrentMap<ControllerState, List<ControllerContext>> contextsByDependentState = contextsByDependency.get(context.getName());
+ result = addContextsDependentOn(result, context.getState(), contextsByDependentState);
+
+ Set<Object> aliases = context.getAliases();
+ if (aliases != null && aliases.size() > 0)
+ {
+ for (Object alias : aliases)
+ {
+ contextsByDependentState = contextsByDependency.get(alias);
+ result = addContextsDependentOn(result, context.getState(), contextsByDependentState);
+ }
+ }
+ return result;
+ }
+
+ private Set<ControllerContext> addContextsDependentOn(Set<ControllerContext> result, ControllerState dependentState, Map<ControllerState, List<ControllerContext>> contextsByDependentState)
+ {
+ if (contextsByDependentState != null && !contextsByDependentState.isEmpty())
+ {
+ List<ControllerContext> contextsForName = contextsByDependentState.get(dependentState);
+ if (contextsForName != null && !contextsForName.isEmpty())
+ {
+ if (result == null)
+ result = new HashSet<ControllerContext>();
+ result.addAll(contextsForName);
+ }
+ }
+ return result;
+ }
+
+ public void registerDependency(ControllerContext owner, DependencyItem item)
+ {
+ 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(getDependentState(item));
+ if (contexts == null)
+ {
+ contexts = new CopyOnWriteArrayList<ControllerContext>();
+ List<ControllerContext> old = contextsByState.putIfAbsent(getDependentState(item), contexts);
+ if (old != null)
+ contexts = old;
+ }
+ contexts.add(owner);
+ }
+
+ public void unregisterDependency(ControllerContext owner, DependencyItem item)
+ {
+ 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(getDependentState(item));
+ if (contexts == null)
+ throw new IllegalStateException("Inconsistent state");
+ if (!contexts.remove(owner))
+ throw new IllegalStateException("Inconsistent state");
+ }
+
+ public boolean hasDependencies(Object name)
+ {
+ return contextsByDependency.get(name) != null;
+ }
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,231 @@
+/*
+* 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.standard;
+
+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;
+
+/**
+ * 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 StandardDependencyResolver extends AbstractDependencyResolver
+{
+ public StandardDependencyResolver(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 canMoveToState(ctx, state);
+ }
+
+ @Override
+ public void stateIncremented(ControllerContext context, boolean trace)
+ {
+ //Noop
+ }
+
+ @Override
+ public void registerContext(ControllerContext context)
+ {
+ }
+
+ @Override
+ public void unregisterContext(ControllerContext context)
+ {
+ }
+
+ @Override
+ public void enableOnDemand(ControllerContext context, boolean trace)
+ {
+ }
+
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolverFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolverFactory.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,39 @@
+/*
+* 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.standard;
+
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.resolver.DependencyResolverFactory;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class StandardDependencyResolverFactory implements DependencyResolverFactory
+{
+ public AbstractDependencyResolver createResolver(Controller controller)
+ {
+ return new StandardDependencyResolver(controller);
+ }
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/DependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/DependencyResolverFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/DependencyResolverFactory.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -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.spi.resolver;
+
+import org.jboss.dependency.plugins.AbstractDependencyResolver;
+import org.jboss.dependency.spi.Controller;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface DependencyResolverFactory
+{
+ AbstractDependencyResolver createResolver(Controller controller);
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcher.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,39 @@
+/*
+* 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.spi.resolver.indexing;
+
+import java.util.Set;
+
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.DependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ResolverMatcher
+{
+ void registerDependency(ControllerContext owner, DependencyItem item);
+ void unregisterDependency(ControllerContext owner, DependencyItem item);
+ Set<ControllerContext> getMatchingContexts(ControllerContext context);
+}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcherFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/ResolverMatcherFactory.java 2010-01-20 20:36:31 UTC (rev 99676)
@@ -0,0 +1,32 @@
+/*
+* 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.spi.resolver.indexing;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ResolverMatcherFactory
+{
+ ResolverMatcher createMatcher();
+}
More information about the jboss-cvs-commits
mailing list