diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2020-08-21 17:41:51 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2020-08-21 17:41:51 +0200 |
commit | dbcc9107e3ae49e61270e002e241d9a07864facd (patch) | |
tree | 761f8a8199bdfb4475324c9c080181eebdb2a07e /container-di | |
parent | 67e528443cca68cc527e50c2714ad1717563c458 (diff) |
Call deconstruct in reverse dependency order
Diffstat (limited to 'container-di')
2 files changed, 38 insertions, 2 deletions
diff --git a/container-di/src/main/java/com/yahoo/container/di/componentgraph/core/ComponentGraph.java b/container-di/src/main/java/com/yahoo/container/di/componentgraph/core/ComponentGraph.java index 2e4db01fb1b..a054ef5ffe0 100644 --- a/container-di/src/main/java/com/yahoo/container/di/componentgraph/core/ComponentGraph.java +++ b/container-di/src/main/java/com/yahoo/container/di/componentgraph/core/ComponentGraph.java @@ -15,6 +15,8 @@ import com.yahoo.config.ConfigInstance; import com.yahoo.container.di.componentgraph.Provider; import com.yahoo.container.di.componentgraph.cycle.CycleFinder; import com.yahoo.container.di.componentgraph.cycle.Graph; + +import java.util.Collections; import java.util.logging.Level; import com.yahoo.vespa.config.ConfigKey; @@ -164,8 +166,10 @@ public class ComponentGraph { } } - public Collection<Object> allConstructedComponentsAndProviders() { - return nodes().stream().map(node -> node.constructedInstance().get()).collect(Collectors.toList()); + public List<Object> allConstructedComponentsAndProviders() { + List<Node> orderedNodes = topologicalSort(nodes()); + Collections.reverse(orderedNodes); + return orderedNodes.stream().map(node -> node.constructedInstance().get()).collect(Collectors.toList()); } private void completeComponentRegistryNode(ComponentRegistryNode registry) { diff --git a/container-di/src/test/java/com/yahoo/container/di/componentgraph/core/ComponentGraphTest.java b/container-di/src/test/java/com/yahoo/container/di/componentgraph/core/ComponentGraphTest.java index e7b269e5172..2a30d71c338 100644 --- a/container-di/src/test/java/com/yahoo/container/di/componentgraph/core/ComponentGraphTest.java +++ b/container-di/src/test/java/com/yahoo/container/di/componentgraph/core/ComponentGraphTest.java @@ -27,6 +27,7 @@ import org.junit.Test; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -87,6 +88,28 @@ public class ComponentGraphTest { } @Test + public void all_created_components_are_returned_in_reverse_topological_order() { + Node innerComponent = mockComponentNode(SimpleComponent.class); + Node middleComponent = mockComponentNode(ComponentTakingComponent.class); + Node outerComponent = mockComponentNode(ComponentTakingComponentTakingComponent.class); + middleComponent.inject(innerComponent); + outerComponent.inject(innerComponent); + + ComponentGraph componentGraph = new ComponentGraph(); + componentGraph.add(innerComponent); + componentGraph.add(middleComponent); + componentGraph.add(outerComponent); + componentGraph.complete(); + + innerComponent.constructInstance(); + middleComponent.constructInstance(); + outerComponent.constructInstance(); + + assertEquals(List.of(outerComponent.constructedInstance().get(), middleComponent.constructedInstance().get(), innerComponent.constructedInstance().get()), + componentGraph.allConstructedComponentsAndProviders()); + } + + @Test public void component_can_be_injected_into_another_component() { Node injectedComponent = mockComponentNode(SimpleComponent.class); Node targetComponent = mockComponentNode(ComponentTakingComponent.class); @@ -526,6 +549,15 @@ public class ComponentGraphTest { } } + public static class ComponentTakingComponentTakingComponent extends AbstractComponent { + private final ComponentTakingComponent injectedComponent; + + public ComponentTakingComponentTakingComponent(ComponentTakingComponent injectedComponent) { + assertThat(injectedComponent, notNullValue()); + this.injectedComponent = injectedComponent; + } + } + @SuppressWarnings("unused") public static class ComponentTakingConfigAndComponent extends AbstractComponent { private final TestConfig config; |