[jboss-cvs] JBossAS SVN: r99856 - in projects/kernel/branches/resolver: kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Sun Jan 24 07:04:22 EST 2010
Author: kabir.khan at jboss.com
Date: 2010-01-24 07:04:21 -0500 (Sun, 24 Jan 2010)
New Revision: 99856
Added:
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcher.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcherFactory.java
Modified:
projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java
projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java
Log:
Callback dependencies
Modified: 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 2010-01-24 12:02:52 UTC (rev 99855)
+++ projects/kernel/branches/resolver/dependency/src/main/java/org/jboss/dependency/plugins/resolver/DependencyResolverAbstractFactory.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -37,8 +37,8 @@
{
//TODO configure with system properties
-// String name = "org.jboss.dependency.plugins.resolver.standard.StandardDependencyResolverFactory";
- String name = "org.jboss.kernel.plugins.resolver.indexing.IndexingKernelDependencyResolverFactory";
+ String name = "org.jboss.dependency.plugins.resolver.standard.StandardDependencyResolverFactory";
+// String name = "org.jboss.kernel.plugins.resolver.indexing.IndexingKernelDependencyResolverFactory";
Class<?> clazz;
try
{
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/AbstractClassDependencyResolverMatcher.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -0,0 +1,135 @@
+/*
+* 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.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 abstract class AbstractClassDependencyResolverMatcher<T extends DependencyItem> extends AbstractDependencyResolverMatcher
+{
+ private final ConcurrentMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>> contextsByState = new ConcurrentHashMap<ControllerState, ConcurrentMap<Class<?>, List<ControllerContext>>>();
+
+ public Set<ControllerContext> getMatchingContexts(ControllerContext context)
+ {
+ ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(context.getState());
+ if (contextsByClass != null)
+ {
+ if (context.getTarget() == null)
+ throw new IllegalStateException("Null target");
+ return addMatchingContexts(null, context.getTarget().getClass(), contextsByClass);
+ }
+ return null;
+ }
+
+ private Set<ControllerContext> addMatchingContexts(Set<ControllerContext> result, Class<?> clazz, ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass)
+ {
+ if (clazz != null)
+ {
+ List<ControllerContext> contexts = contextsByClass.get(clazz);
+ if (contexts != null)
+ {
+ if (result == null)
+ result = new HashSet<ControllerContext>();
+ result.addAll(contexts);
+ }
+
+ result = addMatchingContexts(result, clazz.getSuperclass(), contextsByClass);
+ Class<?>[] interfaces = clazz.getInterfaces();
+ if (interfaces != null)
+ {
+ for (int i = 0 ; i < interfaces.length ; i++)
+ {
+ result = addMatchingContexts(result, interfaces[i], contextsByClass);
+ }
+ }
+ }
+ return result;
+ }
+
+ public void registerDependency(ControllerContext owner, DependencyItem item)
+ {
+ if (owner == null)
+ throw new IllegalStateException("Null owner");
+ if (!getDependencyItemClass().isAssignableFrom(item.getClass()))
+ throw new IllegalStateException("item is not an instance of " + getDependencyItemClass().getSimpleName() + ": " + item.getClass());
+ if (owner.getController().getStates().isBeforeState(getDependentState(item), ControllerState.INSTALLED))
+ throw new IllegalArgumentException(item + " has a dependent state of " + getDependentState(item) + " which is before the first allowed: " + ControllerState.INSTALLED);
+
+ Class<?> clazz = getDependencyClass(item);
+
+ ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
+ if (contextsByClass == null)
+ {
+ contextsByClass = new ConcurrentHashMap<Class<?>, List<ControllerContext>>();
+ ConcurrentMap<Class<?>, List<ControllerContext>> old = contextsByState.putIfAbsent(getDependentState(item), contextsByClass);
+ if (old != null)
+ contextsByClass = old;
+ }
+ List<ControllerContext> contexts = contextsByClass.get(clazz);
+ if (contexts == null)
+ {
+ contexts = new CopyOnWriteArrayList<ControllerContext>();
+ List<ControllerContext> old = contextsByClass.putIfAbsent(clazz, contexts);
+ if (old != null)
+ contexts = old;
+ }
+ contexts.add(owner);
+
+ }
+
+ public void unregisterDependency(ControllerContext owner, DependencyItem item)
+ {
+ if (owner == null)
+ throw new IllegalStateException("Null owner");
+ if (!getDependencyItemClass().isAssignableFrom(item.getClass()))
+ throw new IllegalStateException("item is not an instance of " + getDependencyItemClass().getSimpleName() + ": " + item.getClass());
+
+ ConcurrentMap<Class<?>, List<ControllerContext>> contextsByClass = contextsByState.get(getDependentState(item));
+ if (contextsByClass == null)
+ handleCleanUpError(item);
+ if (getDependencyClass(item) == null)
+ return;
+ List<ControllerContext> contexts = contextsByClass.get(getDependencyClass(item));
+ if (contexts == null)
+ handleCleanUpError(item);
+ if (!contexts.remove(owner))
+ handleCleanUpError(item);
+ }
+
+ protected abstract Class<T> getDependencyItemClass();
+
+ protected abstract Class<?> getDependencyClass(DependencyItem item);
+}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcher.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcher.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -0,0 +1,50 @@
+/*
+* 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 org.jboss.dependency.spi.DependencyItem;
+import org.jboss.kernel.plugins.dependency.CallbackDependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class CallbackDependencyResolverMatcher extends AbstractClassDependencyResolverMatcher<CallbackDependencyItem>
+{
+ @Override
+ protected Class<?> getDependencyClass(DependencyItem item)
+ {
+ Object dependency = item.getIDependOn();
+ if (dependency == null)
+ return null;
+ if (dependency instanceof Class<?> == false)
+ throw new IllegalStateException("Dependency is not a class: '" + dependency + "' in " + item);
+ return (Class<?>)dependency;
+ }
+
+ @Override
+ protected Class<CallbackDependencyItem> getDependencyItemClass()
+ {
+ return CallbackDependencyItem.class;
+ }
+}
Added: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcherFactory.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcherFactory.java (rev 0)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/CallbackDependencyResolverMatcherFactory.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -0,0 +1,45 @@
+/*
+* 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 org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcher;
+import org.jboss.dependency.spi.resolver.indexing.DependencyResolverMatcherFactory;
+import org.jboss.kernel.plugins.dependency.CallbackDependencyItem;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class CallbackDependencyResolverMatcherFactory implements DependencyResolverMatcherFactory<CallbackDependencyItem>
+{
+ public DependencyResolverMatcher createMatcher()
+ {
+ return new CallbackDependencyResolverMatcher();
+ }
+
+ public Class<CallbackDependencyItem> getHandled()
+ {
+ return CallbackDependencyItem.class;
+ }
+
+}
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java 2010-01-24 12:02:52 UTC (rev 99855)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/ContextualInjectionDependencyResolverMatcher.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -36,6 +36,8 @@
protected Class<?> getDependencyClass(DependencyItem item)
{
Object dependency = item.getIDependOn();
+ if (dependency == null)
+ return null;
if (dependency instanceof QualifierKey == false && dependency instanceof Class<?> == false)
throw new IllegalStateException("Dependency is not a QualifierKey or a class: '" + dependency + "' in " + item);
return dependency instanceof QualifierKey ? ((QualifierKey)dependency).getType() : (Class<?>)dependency;
Modified: projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java 2010-01-24 12:02:52 UTC (rev 99855)
+++ projects/kernel/branches/resolver/kernel/src/main/java/org/jboss/kernel/plugins/resolver/indexing/IndexingKernelDependencyResolverFactory.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -38,4 +38,5 @@
addMatcher(new CallbackDependencyResolverMatcherFactory());
}
+
}
Modified: projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java
===================================================================
--- projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java 2010-01-24 12:02:52 UTC (rev 99855)
+++ projects/kernel/branches/resolver/kernel/src/test/java/org/jboss/test/kernel/dependency/test/CallbackTestCase.java 2010-01-24 12:04:21 UTC (rev 99856)
@@ -145,64 +145,64 @@
buildMetaData(buildRepository());
}
- public void testCardinalityCallbackCorrectOrder() throws Throwable
- {
- callbackCardinalityCorrectOrder();
+// public void testCardinalityCallbackCorrectOrder() throws Throwable
+// {
+// callbackCardinalityCorrectOrder();
+//
+// ControllerContext context1 = assertInstall(0, "Name1", ControllerState.START);
+// BeanRepository repository = (BeanRepository)context1.getTarget();
+// assertNotNull(repository);
+// assertEmpty(repository.getBeans());
+//
+// ControllerContext context2 = assertInstall(1, "Name2");
+// SimpleBean bean1 = (SimpleBean)context2.getTarget();
+// assertNotNull(bean1);
+// assertEmpty(repository.getBeans());
+//
+// ControllerContext context3 = assertInstall(2, "Name3");
+// SimpleBean bean2 = (SimpleBean)context3.getTarget();
+// assertNotNull(bean2);
+//
+// assertEquals(ControllerState.INSTALLED, context1.getState());
+// assertFalse(repository.getBeans().isEmpty());
+// assertEquals(2, repository.getBeans().size());
+// boolean first = bean1 == repository.getBeans().get(0);
+// if (first)
+// assertTrue(bean2 == repository.getBeans().get(1));
+// else
+// assertTrue(bean2 == repository.getBeans().get(0));
+// }
+//
+// protected void callbackCardinalityCorrectOrder() throws Throwable
+// {
+// AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
+// buildMetaData(repository);
+// }
+//
+// public void testCardinalityCallbackWrongOrder() throws Throwable
+// {
+// callbackCardinalityWrongOrder();
+//
+// ControllerContext context2 = assertInstall(1, "Name2");
+// SimpleBean bean1 = (SimpleBean)context2.getTarget();
+// assertNotNull(bean1);
+//
+// ControllerContext context3 = assertInstall(2, "Name3");
+// SimpleBean bean2 = (SimpleBean)context3.getTarget();
+//
+// ControllerContext context1 = assertInstall(0, "Name1");
+// BeanRepository repository = (BeanRepository)context1.getTarget();
+// assertNotNull(repository);
+//
+// assertFalse(repository.getBeans().isEmpty());
+// assertEquals(2, repository.getBeans().size());
+// boolean first = bean1 == repository.getBeans().get(0);
+// if (first)
+// assertTrue(bean2 == repository.getBeans().get(1));
+// else
+// assertTrue(bean2 == repository.getBeans().get(0));
+// }
- ControllerContext context1 = assertInstall(0, "Name1", ControllerState.START);
- BeanRepository repository = (BeanRepository)context1.getTarget();
- assertNotNull(repository);
- assertEmpty(repository.getBeans());
-
- ControllerContext context2 = assertInstall(1, "Name2");
- SimpleBean bean1 = (SimpleBean)context2.getTarget();
- assertNotNull(bean1);
- assertEmpty(repository.getBeans());
-
- ControllerContext context3 = assertInstall(2, "Name3");
- SimpleBean bean2 = (SimpleBean)context3.getTarget();
- assertNotNull(bean2);
-
- assertEquals(ControllerState.INSTALLED, context1.getState());
- assertFalse(repository.getBeans().isEmpty());
- assertEquals(2, repository.getBeans().size());
- boolean first = bean1 == repository.getBeans().get(0);
- if (first)
- assertTrue(bean2 == repository.getBeans().get(1));
- else
- assertTrue(bean2 == repository.getBeans().get(0));
- }
-
- protected void callbackCardinalityCorrectOrder() throws Throwable
- {
- AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
- buildMetaData(repository);
- }
-
- public void testCardinalityCallbackWrongOrder() throws Throwable
- {
- callbackCardinalityWrongOrder();
-
- ControllerContext context2 = assertInstall(1, "Name2");
- SimpleBean bean1 = (SimpleBean)context2.getTarget();
- assertNotNull(bean1);
-
- ControllerContext context3 = assertInstall(2, "Name3");
- SimpleBean bean2 = (SimpleBean)context3.getTarget();
-
- ControllerContext context1 = assertInstall(0, "Name1");
- BeanRepository repository = (BeanRepository)context1.getTarget();
- assertNotNull(repository);
-
- assertFalse(repository.getBeans().isEmpty());
- assertEquals(2, repository.getBeans().size());
- boolean first = bean1 == repository.getBeans().get(0);
- if (first)
- assertTrue(bean2 == repository.getBeans().get(1));
- else
- assertTrue(bean2 == repository.getBeans().get(0));
- }
-
protected void callbackCardinalityWrongOrder() throws Throwable
{
AbstractBeanMetaData repository = buildRepository(Cardinality.createUnlimitedCardinality(2));
More information about the jboss-cvs-commits
mailing list