[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<>();