[Component-DSL] Better support for nested calls
git-svn-id: https://svn.apache.org/repos/asf/aries/trunk@1832575 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
index 8b9ef83..7a71455 100644
--- a/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
+++ b/component-dsl/src/main/java/org/apache/aries/component/dsl/internal/UpdateSupport.java
@@ -50,16 +50,14 @@
runnable.run();
}
finally {
+ isUpdate.set(false);
+
Deque<Runnable> terminators =
deferredTerminatorsStack.get().removeLast();
for (Runnable terminator : terminators) {
terminator.run();
}
-
- if (deferredTerminatorsStack.get().isEmpty()) {
- isUpdate.set(false);
- }
}
}
}
diff --git a/component-dsl/src/test/java/org/apache/aries/component/dsl/internal/UpdateSupportTest.java b/component-dsl/src/test/java/org/apache/aries/component/dsl/internal/UpdateSupportTest.java
index 985fcdf..1d3f531 100644
--- a/component-dsl/src/test/java/org/apache/aries/component/dsl/internal/UpdateSupportTest.java
+++ b/component-dsl/src/test/java/org/apache/aries/component/dsl/internal/UpdateSupportTest.java
@@ -46,6 +46,70 @@
}
@Test
+ public void testDeferNestedStack() {
+ List<Integer> list = new ArrayList<>();
+
+ UpdateSupport.runUpdate(() -> {
+ list.add(1);
+
+ UpdateSupport.defer(() -> list.add(6));
+
+ UpdateSupport.runUpdate(() -> {
+ list.add(2);
+
+ UpdateSupport.defer(() -> {
+ list.add(3);
+
+ UpdateSupport.defer(() ->
+ UpdateSupport.defer(() -> list.add(4)));
+
+ list.add(5);
+ });
+ });
+ });
+
+ assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), list);
+ }
+
+ @Test
+ public void testDeferNestedStackWithUpdate() {
+ List<Integer> list = new ArrayList<>();
+
+ UpdateSupport.runUpdate(() -> {
+ list.add(1);
+
+ UpdateSupport.defer(() -> list.add(9));
+
+ UpdateSupport.runUpdate(() -> {
+ list.add(2);
+
+ UpdateSupport.defer(() -> {
+ UpdateSupport.runUpdate(
+ () -> {
+ list.add(4);
+
+ UpdateSupport.defer(
+ () -> UpdateSupport.runUpdate(
+ () -> {
+ list.add(6);
+
+ UpdateSupport.defer(() -> list.add(8));
+
+ list.add(7);
+ }));
+
+ list.add(5);
+ });
+ });
+
+ list.add(3);
+ });
+ });
+
+ assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9), list);
+ }
+
+ @Test
public void testDeferStack() {
List<Integer> list = new ArrayList<>();