[jboss-cvs] JBossAS SVN: r99733 - in projects/kernel/branches/resolver: dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing and 6 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Jan 21 07:43:05 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-01-21 07:43:04 -0500 (Thu, 21 Jan 2010)
New Revision: 99733
Added:
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcher.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.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/AbstractControllerContext.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/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/NameDependencyResolverMatcherFactory.java
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/PlainDependencyTestCase.java
Log:
Make sure dependencies that are added after Controller.install(), e.g. by annotations, get added to the index
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-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractController.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -804,6 +804,8 @@
context.setController(this);
DependencyInfo dependencies = context.getDependencyInfo();
+ if (context instanceof AbstractControllerContext)
+ ((AbstractControllerContext)context).setDependencyInfo(resolver.decorateDependencyInfo(context, dependencies));
if (trace)
{
String dependsOn = "[]";
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractControllerContext.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -319,6 +319,11 @@
{
return dependencies;
}
+
+ void setDependencyInfo(DependencyInfo info)
+ {
+ dependencies = info;
+ }
public ScopeInfo getScopeInfo()
{
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-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/AbstractDependencyResolver.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -150,17 +150,76 @@
return item.getDependentState();
}
+
+ /**
+ * Called by the controller upon install to decorate the dependency info
+ *
+ * @param context the controller context being installed
+ * @param info the context being installed's dependency info
+ * @return the decorated dependency info, or the original dependency info if no decoration is needed.
+ * If null was passed in for the info parameter, null is returned
+ */
+ public abstract DependencyInfo decorateDependencyInfo(ControllerContext context, DependencyInfo info);
+ /**
+ * Index the context's dependencies on install
+ *
+ * @param context the controller context being installed
+ */
+ public abstract void registerContext(ControllerContext context);
+ /**
+ * Unindex the context's dependencies on install
+ *
+ * @param context the controller context being installed
+ */
+ public abstract void unregisterContext(ControllerContext context);
+
+ /**
+ * Index the context's dependencies on install
+ *
+ * @param context the controller context being installed
+ */
+ public abstract void registerDependency(ControllerContext context, DependencyItem item);
+
+ /**
+ * Unindex the context's dependencies on install
+ *
+ * @param context the controller context being installed
+ */
+ public abstract void unregisterDependency(ControllerContext context, DependencyItem item);
+
+ /**
+ * Install the contexts that are ready. This method is initiated via {@link Controller#install(ControllerContext)} and
+ * {@link Controller#change(ControllerContext, ControllerState)}
+ *
+ * @param context the context that was passed in to {@link Controller#install(ControllerContext)} and
+ * {@link Controller#change(ControllerContext, ControllerState)}
+ * @param trace whether trace logging should happen
+ */
public abstract void resolveContexts(ControllerContext context, boolean trace);
- public abstract boolean resolveDependencies(ControllerContext ctx, ControllerState state);
+ /**
+ * Checks whether the passed in context can be moved to the desired state
+ *
+ * @param context the context
+ * @param state the state
+ */
+ public abstract boolean resolveDependencies(ControllerContext context, ControllerState state);
+ /**
+ * Called by the Controller when a context has had its state incremented
+ *
+ * @param context the context
+ * @param trace whether trace logging should happen
+ */
public abstract void stateIncremented(ControllerContext context, boolean trace);
-
- public abstract void registerContext(ControllerContext context);
-
- public abstract void unregisterContext(ControllerContext context);
+ /**
+ * Called by the controller when an OnDemand context is enabled
+ *
+ * @param context the context that is being enabled
+ * @param trace whether trace logging should happen
+ */
public abstract void enableOnDemand(ControllerContext context, boolean trace);
}
Modified: 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 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/AbstractDependencyResolverMatcher.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -23,14 +23,14 @@
import org.jboss.dependency.spi.ControllerState;
import org.jboss.dependency.spi.DependencyItem;
-import org.jboss.dependency.spi.resolver.indexing.ResolverMatcher;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
/**
*
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision: 1.1 $
*/
-public abstract class AbstractDependencyResolverMatcher implements ResolverMatcher
+public abstract class AbstractDependencyResolverMatcher implements DependencyResolverMatcher
{
protected ControllerState getDependentState(DependencyItem item)
{
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyInfoDecorator.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -0,0 +1,163 @@
+/*
+* 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.List;
+import java.util.Set;
+
+import org.jboss.dependency.spi.CallbackItem;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.LifecycleCallbackItem;
+import org.jboss.util.JBossStringBuilder;
+
+/**
+ * DependencyInfo decorator that listens to when dependency items are added/removed.
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class IndexingDependencyInfoDecorator implements DependencyInfo
+{
+ private final IndexingDependencyResolver resolver;
+ private final ControllerContext context;
+ private final DependencyInfo delegate;
+
+ public IndexingDependencyInfoDecorator(IndexingDependencyResolver resolver, ControllerContext context, DependencyInfo delegate)
+ {
+ this.resolver = resolver;
+ this.context = context;
+ this.delegate = delegate;
+ }
+
+ public void addDependsOnMe(DependencyItem dependency)
+ {
+ delegate.addDependsOnMe(dependency);
+ }
+
+ public void addIDependOn(DependencyItem dependency)
+ {
+ delegate.addIDependOn(dependency);
+ resolver.registerDependency(context, dependency);
+ }
+
+ public <T> void addInstallItem(CallbackItem<T> callbackItem)
+ {
+ delegate.addInstallItem(callbackItem);
+ }
+
+ public void addLifecycleCallback(LifecycleCallbackItem lifecycleCallbackItem)
+ {
+ delegate.addLifecycleCallback(lifecycleCallbackItem);
+ }
+
+ public <T> void addUninstallItem(CallbackItem<T> callbackItem)
+ {
+ delegate.addUninstallItem(callbackItem);
+ }
+
+ public Object clone()
+ {
+ return delegate.clone();
+ }
+
+ public Set<DependencyItem> getDependsOnMe(Class<?> type)
+ {
+ return delegate.getDependsOnMe(type);
+ }
+
+ public Set<DependencyItem> getIDependOn(Class<?> type)
+ {
+ return delegate.getIDependOn(type);
+ }
+
+ public Set<CallbackItem<?>> getInstallItems()
+ {
+ return delegate.getInstallItems();
+ }
+
+ public List<LifecycleCallbackItem> getLifecycleCallbacks()
+ {
+ return delegate.getLifecycleCallbacks();
+ }
+
+ public Set<CallbackItem<?>> getUninstallItems()
+ {
+ return delegate.getUninstallItems();
+ }
+
+ public Set<DependencyItem> getUnresolvedDependencies(ControllerState state)
+ {
+ return delegate.getUnresolvedDependencies(state);
+ }
+
+ public boolean isAutowireCandidate()
+ {
+ return delegate.isAutowireCandidate();
+ }
+
+ public void removeDependsOnMe(DependencyItem dependency)
+ {
+ delegate.removeDependsOnMe(dependency);
+ }
+
+ public void removeIDependOn(DependencyItem dependency)
+ {
+ delegate.removeIDependOn(dependency);
+ resolver.unregisterDependency(context, dependency);
+ }
+
+ public <T> void removeInstallItem(CallbackItem<T> callbackItem)
+ {
+ delegate.removeInstallItem(callbackItem);
+ }
+
+ public <T> void removeUninstallItem(CallbackItem<T> callbackItem)
+ {
+ delegate.removeUninstallItem(callbackItem);
+ }
+
+ public boolean resolveDependencies(Controller controller, ControllerState state)
+ {
+ return delegate.resolveDependencies(controller, state);
+ }
+
+ public void setAutowireCandidate(boolean candidate)
+ {
+ delegate.setAutowireCandidate(candidate);
+ }
+
+ public String toShortString()
+ {
+ return delegate.toShortString();
+ }
+
+ public void toShortString(JBossStringBuilder buffer)
+ {
+ delegate.toShortString(buffer);
+ }
+
+
+}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolver.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -34,7 +34,7 @@
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.dependency.spi.resolver.indexing.DependencyResolverMatcher;
import org.jboss.logging.Logger;
import org.jboss.util.collection.ConcurrentSet;
@@ -50,12 +50,9 @@
//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 Map<Class<? extends DependencyItem>, DependencyResolverMatcher> matchers = new ConcurrentHashMap<Class<? extends DependencyItem>, DependencyResolverMatcher>();
private NameDependencyResolverMatcher nameMatcher;
@@ -64,7 +61,7 @@
super(controller);
}
- public void addMatcher(Class<? extends DependencyItem> clazz, ResolverMatcher matcher)
+ public void addMatcher(Class<? extends DependencyItem> clazz, DependencyResolverMatcher matcher)
{
matchers.put(clazz, matcher);
if (nameMatcher == null && clazz.equals(AbstractDependencyItem.class))
@@ -80,11 +77,11 @@
matchers.remove(clazz);
}
- private ResolverMatcher getMatcherForDependencyItem(DependencyItem item)
+ private DependencyResolverMatcher getMatcherForDependencyItem(DependencyItem item)
{
if (item == null)
throw new IllegalArgumentException("Null item");
- ResolverMatcher matcher = matchers.get(item.getClass());
+ DependencyResolverMatcher matcher = matchers.get(item.getClass());
if (matcher == null)
{
@@ -106,8 +103,7 @@
{
for (DependencyItem item : items)
{
- ResolverMatcher matcher = getMatcherForDependencyItem(item);
- matcher.registerDependency(context, item);
+ registerDependency(context, item);
}
}
}
@@ -124,14 +120,28 @@
{
for (DependencyItem item : items)
{
- ResolverMatcher matcher = getMatcherForDependencyItem(item);
- matcher.unregisterDependency(context, item);
+ unregisterDependency(context, item);
}
}
}
}
@Override
+ public void registerDependency(ControllerContext context, DependencyItem item)
+ {
+ DependencyResolverMatcher matcher = getMatcherForDependencyItem(item);
+ matcher.registerDependency(context, item);
+ }
+
+ @Override
+ public void unregisterDependency(ControllerContext context, DependencyItem item)
+ {
+ DependencyResolverMatcher matcher = getMatcherForDependencyItem(item);
+ matcher.unregisterDependency(context, item);
+ }
+
+
+ @Override
public void resolveContexts(ControllerContext context, boolean trace)
{
ControllerState fromState = context.getState();
@@ -188,7 +198,7 @@
private Set<ControllerContext> getAllContextsDependentOn(ControllerContext incremented)
{
Set<ControllerContext> result = null;
- for (ResolverMatcher matcher : matchers.values())
+ for (DependencyResolverMatcher matcher : matchers.values())
{
Set<ControllerContext> contexts = matcher.getMatchingContexts(incremented);
if (contexts != null)
@@ -241,4 +251,11 @@
}
}
+ @Override
+ public DependencyInfo decorateDependencyInfo(ControllerContext context, DependencyInfo info)
+ {
+ if (info == null)
+ return null;
+ return new IndexingDependencyInfoDecorator(this, context, info);
+ }
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/IndexingDependencyResolverFactory.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -30,7 +30,7 @@
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;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcherFactory;
/**
*
@@ -39,38 +39,38 @@
*/
public class IndexingDependencyResolverFactory implements DependencyResolverFactory
{
- private final Map<Class<? extends DependencyItem>, ResolverMatcherFactory> matchers = new HashMap<Class<? extends DependencyItem>, ResolverMatcherFactory>();
+ private final Map<Class<? extends DependencyItem>, DependencyResolverMatcherFactory> matchers = new HashMap<Class<? extends DependencyItem>, DependencyResolverMatcherFactory>();
private Map<IndexingDependencyResolver, Boolean> weakResolvers = new WeakHashMap<IndexingDependencyResolver, Boolean>();
public IndexingDependencyResolverFactory()
{
- addMatcher(AbstractDependencyItem.class, new NameDependencyResolverMatcherFactory());
+ addMatcher(new NameDependencyResolverMatcherFactory());
}
public synchronized AbstractDependencyResolver createResolver(Controller controller)
{
IndexingDependencyResolver resolver = new IndexingDependencyResolver(controller);
- for (Map.Entry<Class<? extends DependencyItem>, ResolverMatcherFactory> entry : matchers.entrySet())
+ for (Map.Entry<Class<? extends DependencyItem>, DependencyResolverMatcherFactory> entry : matchers.entrySet())
{
resolver.addMatcher(entry.getKey(), entry.getValue().createMatcher());
}
return resolver;
}
- public synchronized void addMatcher(Class<? extends DependencyItem> itemClass, ResolverMatcherFactory matcherFactory)
+ public synchronized void addMatcher(DependencyResolverMatcherFactory 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);
+ if (matcherFactory.getHandled() == null)
+ throw new IllegalArgumentException("Null matcherFactory.getHandler()");
+ if (matchers.containsKey(matcherFactory.getHandled()))
+ throw new IllegalArgumentException("Already have a matcher for class " + matcherFactory.getHandled());
- matchers.put(itemClass, matcherFactory);
+ matchers.put(matcherFactory.getHandled(), matcherFactory);
for (IndexingDependencyResolver resolver : weakResolvers.keySet())
{
- resolver.addMatcher(itemClass, matcherFactory.createMatcher());
+ resolver.addMatcher(matcherFactory.getHandled(), matcherFactory.createMatcher());
}
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/indexing/NameDependencyResolverMatcherFactory.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -21,18 +21,25 @@
*/
package org.jboss.dependency.plugins.resolver.indexing;
-import org.jboss.dependency.spi.resolver.indexing.ResolverMatcher;
-import org.jboss.dependency.spi.resolver.indexing.ResolverMatcherFactory;
+import org.jboss.dependency.plugins.AbstractDependencyItem;
+import org.jboss.dependency.spi.DependencyItem;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcherFactory;
/**
*
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
* @version $Revision: 1.1 $
*/
-public class NameDependencyResolverMatcherFactory implements ResolverMatcherFactory
+public class NameDependencyResolverMatcherFactory implements DependencyResolverMatcherFactory
{
- public ResolverMatcher createMatcher()
+ public DependencyResolverMatcher createMatcher()
{
return new NameDependencyResolverMatcher();
}
+
+ public Class<? extends DependencyItem> getHandled()
+ {
+ return AbstractDependencyItem.class;
+ }
}
Modified: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/standard/StandardDependencyResolver.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -29,6 +29,8 @@
import org.jboss.dependency.spi.Controller;
import org.jboss.dependency.spi.ControllerContext;
import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.spi.DependencyInfo;
+import org.jboss.dependency.spi.DependencyItem;
/**
* This is the legacy dependency resolution algorithm broken out
@@ -228,4 +230,21 @@
{
}
+ @Override
+ public DependencyInfo decorateDependencyInfo(ControllerContext context, DependencyInfo info)
+ {
+ //No decoration needed
+ return info;
+ }
+
+ @Override
+ public void registerDependency(ControllerContext context, DependencyItem item)
+ {
+ }
+
+ @Override
+ public void unregisterDependency(ControllerContext context, DependencyItem item)
+ {
+ }
+
}
Added: projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcher.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -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.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 DependencyResolverMatcher
+{
+ 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/DependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java (rev 0)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/spi/resolver/indexing/DependencyResolverMatcherFactory.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -0,0 +1,36 @@
+/*
+* 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 org.jboss.dependency.spi.DependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public interface DependencyResolverMatcherFactory
+{
+ Class<? extends DependencyItem> getHandled();
+
+ DependencyResolverMatcher createMatcher();
+}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/SupplyDemandDependencyResolverMatcher.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -0,0 +1,120 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.kernel.plugins.resolver.indexing;
+
+import 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.plugins.resolver.indexing.AbstractDependencyResolverMatcher;
+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 SupplyDemandDependencyResolverMatcher extends AbstractDependencyResolverMatcher
+{
+ private final ConcurrentMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>> contextsByDemand = new ConcurrentHashMap<Object, ConcurrentMap<ControllerState, List<ControllerContext>>>();
+
+ public Set<ControllerContext> getMatchingContexts(ControllerContext context)
+ {
+ Set<ControllerContext> result = null;
+ ConcurrentMap<ControllerState, List<ControllerContext>> contextsByDependentState = contextsByDemand.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 = contextsByDemand.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 = contextsByDemand.get(name);
+ if (contextsByState == null)
+ {
+ contextsByState = new ConcurrentHashMap<ControllerState, List<ControllerContext>>();
+ ConcurrentMap<ControllerState, List<ControllerContext>> old = contextsByDemand.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 = contextsByDemand.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 contextsByDemand.get(name) != null;
+ }
+}
Modified: projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/PlainDependencyTestCase.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/PlainDependencyTestCase.java 2010-01-21 12:39:50 UTC (rev 99732)
+++ projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/PlainDependencyTestCase.java 2010-01-21 12:43:04 UTC (rev 99733)
@@ -60,28 +60,28 @@
super(name, xmltest);
}
- public void testPlainDependencyCorrectOrder() throws Throwable
- {
- plainDependencyCorrectOrder();
+// public void testPlainDependencyCorrectOrder() throws Throwable
+// {
+// plainDependencyCorrectOrder();
+//
+// ControllerContext context1 = assertInstall(0, "Name1");
+// ControllerContext context2 = assertInstall(1, "Name2");
+//
+// SimpleBean bean1 = (SimpleBean) context1.getTarget();
+// assertNotNull(bean1);
+// assertEquals("String1", bean1.getString());
+//
+// SimpleBeanWithDependency bean2 = (SimpleBeanWithDependency) context2.getTarget();
+// assertNotNull(bean2);
+// assertEquals("String2", bean2.getString());
+// assertEquals(bean1, bean2.getSimpleBean());
+// }
+//
+// public void plainDependencyCorrectOrder() throws Throwable
+// {
+// buildMetaData();
+// }
- ControllerContext context1 = assertInstall(0, "Name1");
- ControllerContext context2 = assertInstall(1, "Name2");
-
- SimpleBean bean1 = (SimpleBean) context1.getTarget();
- assertNotNull(bean1);
- assertEquals("String1", bean1.getString());
-
- SimpleBeanWithDependency bean2 = (SimpleBeanWithDependency) context2.getTarget();
- assertNotNull(bean2);
- assertEquals("String2", bean2.getString());
- assertEquals(bean1, bean2.getSimpleBean());
- }
-
- public void plainDependencyCorrectOrder() throws Throwable
- {
- buildMetaData();
- }
-
public void testPlainDependencyWrongOrder() throws Throwable
{
plainDependencyWrongOrder();
@@ -105,66 +105,66 @@
buildMetaData();
}
- public void testPlainDependencyReinstall() throws Throwable
- {
- plainDependencyReinstall();
+// public void testPlainDependencyReinstall() throws Throwable
+// {
+// plainDependencyReinstall();
+//
+// ControllerContext context1 = assertInstall(0, "Name1");
+// ControllerContext context2 = assertInstall(1, "Name2");
+//
+// SimpleBean bean1 = (SimpleBean) context1.getTarget();
+// assertNotNull(bean1);
+// assertEquals("String1", bean1.getString());
+//
+// SimpleBeanWithDependency bean2 = (SimpleBeanWithDependency) context2.getTarget();
+// assertNotNull(bean2);
+// assertEquals("String2", bean2.getString());
+// assertEquals(bean1, bean2.getSimpleBean());
+//
+// assertUninstall("Name1");
+//
+// assertEquals(ControllerState.ERROR, context1.getState());
+// assertEquals(ControllerState.INSTANTIATED, context2.getState());
+// assertNotInstalled("Name2");
+//
+// context2 = assertContext("Name2", ControllerState.INSTANTIATED);
+//
+// context1 = assertInstall(0, "Name1");
+// assertEquals(ControllerState.INSTALLED, context2.getState());
+//
+// bean1 = (SimpleBean) context1.getTarget();
+// assertNotNull(bean1);
+// assertEquals("String1", bean1.getString());
+//
+// bean2 = (SimpleBeanWithDependency) context2.getTarget();
+// assertNotNull(bean2);
+// assertEquals("String2", bean2.getString());
+// assertEquals(bean1, bean2.getSimpleBean());
+//
+// assertUninstall("Name2");
+//
+// context1 = assertContext("Name1");
+// bean1 = (SimpleBean) context1.getTarget();
+// assertNotNull(bean1);
+// assertEquals("String1", bean1.getString());
+//
+// context2 = assertInstall(1, "Name2");
+//
+// bean1 = (SimpleBean) context1.getTarget();
+// assertNotNull(bean1);
+// assertEquals("String1", bean1.getString());
+//
+// bean2 = (SimpleBeanWithDependency) context2.getTarget();
+// assertNotNull(bean2);
+// assertEquals("String2", bean2.getString());
+// assertEquals(bean1, bean2.getSimpleBean());
+// }
+//
+// public void plainDependencyReinstall() throws Throwable
+// {
+// buildMetaData();
+// }
- ControllerContext context1 = assertInstall(0, "Name1");
- ControllerContext context2 = assertInstall(1, "Name2");
-
- SimpleBean bean1 = (SimpleBean) context1.getTarget();
- assertNotNull(bean1);
- assertEquals("String1", bean1.getString());
-
- SimpleBeanWithDependency bean2 = (SimpleBeanWithDependency) context2.getTarget();
- assertNotNull(bean2);
- assertEquals("String2", bean2.getString());
- assertEquals(bean1, bean2.getSimpleBean());
-
- assertUninstall("Name1");
-
- assertEquals(ControllerState.ERROR, context1.getState());
- assertEquals(ControllerState.INSTANTIATED, context2.getState());
- assertNotInstalled("Name2");
-
- context2 = assertContext("Name2", ControllerState.INSTANTIATED);
-
- context1 = assertInstall(0, "Name1");
- assertEquals(ControllerState.INSTALLED, context2.getState());
-
- bean1 = (SimpleBean) context1.getTarget();
- assertNotNull(bean1);
- assertEquals("String1", bean1.getString());
-
- bean2 = (SimpleBeanWithDependency) context2.getTarget();
- assertNotNull(bean2);
- assertEquals("String2", bean2.getString());
- assertEquals(bean1, bean2.getSimpleBean());
-
- assertUninstall("Name2");
-
- context1 = assertContext("Name1");
- bean1 = (SimpleBean) context1.getTarget();
- assertNotNull(bean1);
- assertEquals("String1", bean1.getString());
-
- context2 = assertInstall(1, "Name2");
-
- bean1 = (SimpleBean) context1.getTarget();
- assertNotNull(bean1);
- assertEquals("String1", bean1.getString());
-
- bean2 = (SimpleBeanWithDependency) context2.getTarget();
- assertNotNull(bean2);
- assertEquals("String2", bean2.getString());
- assertEquals(bean1, bean2.getSimpleBean());
- }
-
- public void plainDependencyReinstall() throws Throwable
- {
- buildMetaData();
- }
-
protected void buildMetaData()
{
AbstractBeanMetaData metaData1 = new AbstractBeanMetaData("Name1", SimpleBeanImpl.class.getName());
More information about the jboss-cvs-commits
mailing list