JIRA: https://jira.spring.io/browse/INT-3967, https://jira.spring.io/browse/INT-3987 Based on the XD FLO object model, each node represents an endpoint or channel. The graph contains nodes and links where the links represent a connection (publish or consume) to/from a channel. From the test case... ``` { "nodes" : [ { "name" : "three", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "channel", "componentName" : "three", "nodeId" : 1 }, { "name" : "four", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "channel", "componentName" : "four", "nodeId" : 2 }, { "name" : "nullChannel", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "channel", "componentName" : "nullChannel", "nodeId" : 3 }, { "name" : "errorChannel", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "publish-subscribe-channel", "componentName" : "errorChannel", "nodeId" : 4 }, { "name" : "one", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "channel", "componentName" : "one", "nodeId" : 5 }, { "name" : "two", "output" : null, "input" : null, "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "sendCount" : 0, "sendErrorCount" : 0, "timeSinceLastSend" : 0.0, "meanSendRate" : 0.0, "meanErrorRate" : 0.0, "meanErrorRatio" : 0.0, "meanSendDuration" : 0.0, "minSendDuration" : 0.0, "maxSendDuration" : 0.0, "standardDeviationSendDuration" : 0.0, "sendDuration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "sendRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "errorRate" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 }, "available" : true }, "componentType" : "channel", "componentName" : "two", "nodeId" : 6 }, { "name" : "producer", "output" : "one", "input" : null, "stats" : null, "componentType" : "test-producer", "componentName" : "producer", "nodeId" : 7 }, { "name" : "polling", "output" : null, "input" : "four", "stats" : null, "componentType" : "unknown", "componentName" : "unknown", "nodeId" : 8 }, { "name" : "foreignMessageHandlerNoStats", "output" : null, "input" : "three", "stats" : null, "componentType" : "unknown", "componentName" : "unknown", "nodeId" : 9 }, { "name" : "_org.springframework.integration.errorLogger", "output" : null, "input" : "errorChannel", "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "handleCount" : 0, "errorCount" : 0, "meanDuration" : 0.0, "minDuration" : 0.0, "maxDuration" : 0.0, "standardDeviationDuration" : 0.0, "activeCount" : 0, "available" : true, "duration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 } }, "componentType" : "logging-channel-adapter", "componentName" : "_org.springframework.integration.errorLogger", "nodeId" : 10 }, { "name" : "services.foo.serviceActivator", "output" : "two", "input" : "one", "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "handleCount" : 0, "errorCount" : 0, "meanDuration" : 0.0, "minDuration" : 0.0, "maxDuration" : 0.0, "standardDeviationDuration" : 0.0, "activeCount" : 0, "available" : true, "duration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 } }, "componentType" : "service-activator", "componentName" : "services.foo.serviceActivator.handler", "nodeId" : 11 }, { "name" : "services.bar.serviceActivator", "output" : null, "input" : "two", "stats" : { "countsEnabled" : true, "statsEnabled" : true, "loggingEnabled" : true, "handleCount" : 0, "errorCount" : 0, "meanDuration" : 0.0, "minDuration" : 0.0, "maxDuration" : 0.0, "standardDeviationDuration" : 0.0, "activeCount" : 0, "available" : true, "duration" : { "count" : 0, "min" : 0.0, "max" : 0.0, "mean" : 0.0, "standardDeviation" : 0.0, "countLong" : 0 } }, "componentType" : "service-activator", "componentName" : "services.bar.serviceActivator.handler", "nodeId" : 12 } ], "links" : [ { "from" : 7, "to" : 5 }, { "from" : 2, "to" : 8 }, { "from" : 1, "to" : 9 }, { "from" : 4, "to" : 10 }, { "from" : 5, "to" : 11 }, { "from" : 11, "to" : 6 }, { "from" : 6, "to" : 12 } ] } ``` Polishing Only include stats if at least counts are enabled. More Polishing Polishing Polishing - PR Comments; isAvailable()->protected Make isAvailable protected so it doesn't appear in the JSON. More Polishing - PR Comments Yet More Polishing buildGraph() -> private, rebuild() returns graph
Spring Integration 
Checking out and Building
To check out the project and build from source, do the following:
git clone git://github.com/spring-projects/spring-integration.git
cd spring-integration
./gradlew build
NOTE: While Spring Integration runs with Java SE 6 or higher, a Java 8 compiler is required to build the project.
If you encounter out of memory errors during the build, increase available heap and permgen for Gradle:
GRADLE_OPTS='-XX:MaxPermSize=1024m -Xmx1024m'
To build and install jars into your local Maven cache:
./gradlew install
To build api Javadoc (results will be in build/api):
./gradlew api
To build reference documentation (results will be in build/reference):
./gradlew reference
To build complete distribution including -dist, -docs, and -schema zip files (results will be in build/distributions)
./gradlew dist
Using Eclipse
To generate Eclipse metadata (.classpath and .project files), do the following:
./gradlew eclipse
Once complete, you may then import the projects into Eclipse as usual:
File -> Import -> Existing projects into workspace
Browse to the 'spring-integration' root directory. All projects should import free of errors.
Using IntelliJ IDEA
To generate IDEA metadata (.iml and .ipr files), do the following:
./gradlew idea
Resources
For more information, please visit the Spring Integration website at: http://projects.spring.io/spring-integration