From 99887642a6576a9b4ccc975fea5711c86042f2ec Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Tue, 20 Jan 2015 20:08:58 +0100 Subject: [PATCH] [Bugfix] fixed bug where controllers aren't properly stopped - this occurred for controllers which had dependencies of other dependencies --- .../agent/impl/ComponentController.java | 2 +- .../impl/ComponentDependencyAnalyzer.java | 23 +++++++++++++++++-- .../ControllerDependencyTest.java | 22 ++++++++++-------- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentController.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentController.java index d60d3a6fd..d38eb691d 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentController.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentController.java @@ -45,7 +45,7 @@ public class ComponentController { return this.component; } - public String getComponentName() { + public String getName() { return this.component.getName(); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentDependencyAnalyzer.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentDependencyAnalyzer.java index f14863e4b..ac174d22c 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentDependencyAnalyzer.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentDependencyAnalyzer.java @@ -27,6 +27,7 @@ import li.strolch.runtime.configuration.StrolchConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ch.eitchnet.utils.dbc.DBC; import ch.eitchnet.utils.helper.StringHelper; public class ComponentDependencyAnalyzer { @@ -63,7 +64,7 @@ public class ComponentDependencyAnalyzer { private Set collectAllUpstreamDependencies(ComponentController controller) { Set upstreamDependencies = new HashSet<>(controller.getUpstreamDependencies()); - for (ComponentController upstream : upstreamDependencies) { + for (ComponentController upstream : controller.getUpstreamDependencies()) { upstreamDependencies.addAll(collectAllUpstreamDependencies(upstream)); } @@ -72,6 +73,15 @@ public class ComponentDependencyAnalyzer { public Set collectDirectUpstreamDependencies(Set controllers) { + // assert no upstream is in this list + for (ComponentController controller : controllers) { + Set upstreamDependencies = collectAllUpstreamDependencies(controller); + for (ComponentController upstream : upstreamDependencies) { + DBC.INTERIM.assertFalse("Upstream " + upstream.getName() + " is one of the input controllers!", + controllers.contains(upstream)); + } + } + Set directUpstreamDependencies = new HashSet<>(); // collect all direct upstream dependencies @@ -92,7 +102,7 @@ public class ComponentDependencyAnalyzer { private Set collectAllDownstreamDependencies(ComponentController controller) { Set downstreamDependencies = new HashSet<>(controller.getDownstreamDependencies()); - for (ComponentController downstream : downstreamDependencies) { + for (ComponentController downstream : controller.getDownstreamDependencies()) { downstreamDependencies.addAll(collectAllDownstreamDependencies(downstream)); } @@ -101,6 +111,15 @@ public class ComponentDependencyAnalyzer { public Set collectDirectDownstreamDependencies(Set controllers) { + // assert no downstream is in this list + for (ComponentController controller : controllers) { + Set downstreamDependencies = collectAllUpstreamDependencies(controller); + for (ComponentController downstream : downstreamDependencies) { + DBC.INTERIM.assertFalse("Downstream " + downstream.getName() + " is one of the input controllers!", + controllers.contains(downstream)); + } + } + Set directDownstreamDependencies = new HashSet<>(); // collect all direct downstream dependencies diff --git a/li.strolch.agent/src/test/java/li/strolch/runtime/configuration/ControllerDependencyTest.java b/li.strolch.agent/src/test/java/li/strolch/runtime/configuration/ControllerDependencyTest.java index b38515261..8f5ee301b 100644 --- a/li.strolch.agent/src/test/java/li/strolch/runtime/configuration/ControllerDependencyTest.java +++ b/li.strolch.agent/src/test/java/li/strolch/runtime/configuration/ControllerDependencyTest.java @@ -38,6 +38,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import ch.eitchnet.utils.dbc.DBC.DbcException; + @SuppressWarnings("nls") public class ControllerDependencyTest { @@ -201,9 +203,8 @@ public class ControllerDependencyTest { this.strolchConfiguration = ConfigurationParser.parseConfiguration("dev", rootPathF); for (ComponentController controller : this.controllerMap.values()) { ComponentConfiguration componentConfiguration = new ComponentConfiguration( - this.strolchConfiguration.getRuntimeConfiguration(), controller.getComponentName(), null, null, - null, null); - this.strolchConfiguration.addConfiguration(controller.getComponentName(), componentConfiguration); + this.strolchConfiguration.getRuntimeConfiguration(), controller.getName(), null, null, null, null); + this.strolchConfiguration.addConfiguration(controller.getName(), componentConfiguration); } } @@ -411,7 +412,7 @@ public class ControllerDependencyTest { .collectDirectUpstreamDependencies(controllers); assertEquals(1, directUpstreamDependencies.size()); - assertTrue(directUpstreamDependencies.contains(this.conA)); + assertTrue(directUpstreamDependencies.contains(this.conB)); } @Test @@ -448,17 +449,18 @@ public class ControllerDependencyTest { Set controllers = new HashSet<>(); controllers.add(this.conB1); - controllers.add(this.conC1); Set directUpstreamDependencies = dependencyAnalyzer .collectDirectUpstreamDependencies(controllers); assertEquals(1, directUpstreamDependencies.size()); - assertTrue(directUpstreamDependencies.contains(this.conA1)); + assertTrue(directUpstreamDependencies.contains(this.conC1)); } @Test - public void shouldCollectUpstreamDependencies4() { + public void shouldNotCollectUpstreamDependencies4() { + thrown.expect(DbcException.class); + thrown.expectMessage("Upstream C1 is one of the input controllers!"); assertModel(); ComponentDependencyAnalyzer dependencyAnalyzer = new ComponentDependencyAnalyzer(this.strolchConfiguration, @@ -489,7 +491,7 @@ public class ControllerDependencyTest { .collectDirectUpstreamDependencies(controllers); assertEquals(1, directUpstreamDependencies.size()); - assertTrue(directUpstreamDependencies.contains(this.conA1)); + assertTrue(directUpstreamDependencies.contains(this.conC1)); } // @@ -532,7 +534,7 @@ public class ControllerDependencyTest { .collectDirectUpstreamDependencies(controllers); assertEquals(1, directUpstreamDependencies.size()); - assertTrue(directUpstreamDependencies.contains(this.conA2)); + assertTrue(directUpstreamDependencies.contains(this.conB2)); } // +-> A2 @@ -590,7 +592,7 @@ public class ControllerDependencyTest { assertEquals(ComponentState.UNDEFINED, controller.getState()); ComponentConfiguration componentConfiguration = this.strolchConfiguration - .getComponentConfiguration(controller.getComponentName()); + .getComponentConfiguration(controller.getName()); controller.getComponent().setup(componentConfiguration); }