diff --git a/.gitignore b/.gitignore
index abbe282..1beb459 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
target
.settings
+.springBeans
diff --git a/.springBeans b/.springBeans
index 14e9505..d38365d 100644
--- a/.springBeans
+++ b/.springBeans
@@ -13,6 +13,9 @@
src/test/resources/META-INF/spring/integration/flows/subflow1/subflow1-context.xml
src/test/resources/TransactionalFlowTest-context.xml
src/test/resources/txmanager-config.xml
+ src/test/resources/autowired-referenced-beans.xml
+ src/test/resources/META-INF/spring/integration/flows/autowired/autowired-flow-context.xml
+ src/test/resources/FlowWithAutowireTest-context.xml
diff --git a/pom.xml b/pom.xml
index 1449578..424621e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,13 +63,7 @@
${spring.framework.version}
test
-
-
- org.springframework.integration
- spring-integration-jms
- ${spring.integration.version}
- test
-
+
org.springframework.integration
diff --git a/src/main/java/org/springframework/integration/flow/Flow.java b/src/main/java/org/springframework/integration/flow/Flow.java
index 5841158..b06d351 100644
--- a/src/main/java/org/springframework/integration/flow/Flow.java
+++ b/src/main/java/org/springframework/integration/flow/Flow.java
@@ -12,6 +12,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionValidationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@@ -139,7 +140,10 @@ public class Flow implements InitializingBean, BeanNameAware, ChannelResolver, A
this.flowContext.setConfigLocations(configLocations);
this.flowContext.refresh();
-
+
+ // Deep debug
+ // FlowUtils.displayBeansGraph(flowContext.getBeanFactory());
+ //
this.flowConfiguration = flowContext.getBean(FlowConfiguration.class);
Assert.notNull(flowConfiguration, "flow context does not contain a flow configuration");
@@ -247,7 +251,7 @@ public class Flow implements InitializingBean, BeanNameAware, ChannelResolver, A
List channelNames = Arrays.asList(this.flowContext.getBeanNamesForType(MessageChannel.class));
- Set referencedMessageChannels = FlowUtils.getReferencedMessageChannels(this.flowContext.getBeanFactory(),5);
+ Set referencedMessageChannels = FlowUtils.getReferencedMessageChannels(this.flowContext.getBeanFactory());
for (String referencedMessageChannel: referencedMessageChannels) {
if (!channelNames.contains(referencedMessageChannel)) {
diff --git a/src/main/java/org/springframework/integration/flow/config/FlowUtils.java b/src/main/java/org/springframework/integration/flow/config/FlowUtils.java
index 58ba810..b62eb28 100644
--- a/src/main/java/org/springframework/integration/flow/config/FlowUtils.java
+++ b/src/main/java/org/springframework/integration/flow/config/FlowUtils.java
@@ -17,8 +17,11 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -29,6 +32,7 @@ import org.springframework.integration.MessageChannel;
import org.springframework.integration.core.SubscribableChannel;
import org.springframework.integration.handler.BridgeHandler;
import org.springframework.util.ResourceUtils;
+import org.springframework.util.StringUtils;
/**
* Utility functions used by the flow parsers
@@ -109,12 +113,40 @@ public class FlowUtils {
}
}
- public static Set getReferencedMessageChannels(ConfigurableListableBeanFactory beanFactory, int max) {
+ public static void displayBeansGraph(ConfigurableListableBeanFactory beanFactory) {
+ String[] beans = beanFactory.getBeanNamesForType(Object.class);
+ _displayDependencies(beanFactory, beans, 0);
+ }
+
+ private static void _displayDependencies(ConfigurableListableBeanFactory beanFactory, String[] beans, int level) {
+ for (int i = 0; i < beans.length; i++) {
+
+ System.out.println(indent(level) + beans[i]);
+
+ String[] dependencies = beanFactory.getDependenciesForBean(beans[i]);
+ String[] depsArray = new String[dependencies.length];
+ int index = 0;
+ for (String dependency : dependencies) {
+ if (!dependency.equals(beans[i])) {
+
+ depsArray[index++] = dependency;
+ } else {
+ System.out.println(indent(level+1) + beans[i]);
+ }
+ }
+ if (depsArray.length > 0) {
+ _displayDependencies(beanFactory, Arrays.copyOf(depsArray, index), level + 1);
+ }
+
+ }
+
+ }
+
+ public static Set getReferencedMessageChannels(ConfigurableListableBeanFactory beanFactory) {
String[] beans = beanFactory.getBeanNamesForType(Object.class);
Set messageChannels = new HashSet();
_getReferencedMessageChannels(beanFactory, beans, messageChannels);
return Collections.unmodifiableSet(messageChannels);
-
}
private static void _getReferencedMessageChannels(ConfigurableListableBeanFactory beanFactory, String[] beans,
@@ -140,4 +172,13 @@ public class FlowUtils {
}
}
+ private static String indent(int size) {
+ String indent = "";
+ for (int i = 0; i < size; i++) {
+ indent += " ";
+ }
+ return indent;
+
+ }
+
}
diff --git a/src/test/java/org/springframework/integration/flow/FlowUtilsTest.java b/src/test/java/org/springframework/integration/flow/FlowUtilsTest.java
index 9c51f28..ed3261a 100644
--- a/src/test/java/org/springframework/integration/flow/FlowUtilsTest.java
+++ b/src/test/java/org/springframework/integration/flow/FlowUtilsTest.java
@@ -4,6 +4,8 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.Message;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.channel.PublishSubscribeChannel;
@@ -36,5 +38,11 @@ public class FlowUtilsTest {
assertSame(message, result);
}
+
+ @Test
+ public void displayDependencies() {
+ ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("META-INF/spring/integration/flows/subflow5/subflow5-context.xml");
+ FlowUtils.displayBeansGraph(ctx.getBeanFactory());
+ }
}
diff --git a/src/test/java/org/springframework/integration/flow/config/xml/Bar.java b/src/test/java/org/springframework/integration/flow/config/xml/Bar.java
new file mode 100644
index 0000000..b359f40
--- /dev/null
+++ b/src/test/java/org/springframework/integration/flow/config/xml/Bar.java
@@ -0,0 +1,5 @@
+package org.springframework.integration.flow.config.xml;
+
+public class Bar {
+
+}
diff --git a/src/test/java/org/springframework/integration/flow/config/xml/FlowWithAutowireTest.java b/src/test/java/org/springframework/integration/flow/config/xml/FlowWithAutowireTest.java
new file mode 100644
index 0000000..387aab0
--- /dev/null
+++ b/src/test/java/org/springframework/integration/flow/config/xml/FlowWithAutowireTest.java
@@ -0,0 +1,15 @@
+package org.springframework.integration.flow.config.xml;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:/FlowWithAutowireTest-context.xml")
+public class FlowWithAutowireTest {
+ @Test
+ public void test() {
+
+ }
+}
diff --git a/src/test/java/org/springframework/integration/flow/config/xml/Foo.java b/src/test/java/org/springframework/integration/flow/config/xml/Foo.java
new file mode 100644
index 0000000..6f61f7f
--- /dev/null
+++ b/src/test/java/org/springframework/integration/flow/config/xml/Foo.java
@@ -0,0 +1,8 @@
+package org.springframework.integration.flow.config.xml;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class Foo {
+ @Autowired
+ Bar bar;
+}
diff --git a/src/test/resources/FlowWithAutowireTest-context.xml b/src/test/resources/FlowWithAutowireTest-context.xml
new file mode 100644
index 0000000..879c71b
--- /dev/null
+++ b/src/test/resources/FlowWithAutowireTest-context.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/src/test/resources/META-INF/spring/integration/flows/autowired/autowired-flow-context.xml b/src/test/resources/META-INF/spring/integration/flows/autowired/autowired-flow-context.xml
new file mode 100644
index 0000000..9d46529
--- /dev/null
+++ b/src/test/resources/META-INF/spring/integration/flows/autowired/autowired-flow-context.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/autowired-referenced-beans.xml b/src/test/resources/autowired-referenced-beans.xml
new file mode 100644
index 0000000..59db78f
--- /dev/null
+++ b/src/test/resources/autowired-referenced-beans.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+