This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit bf4d4f6784e4a4466ac17a9aa0f1ecee0e040bd2
Author: Alex Heneveld <[email protected]>
AuthorDate: Thu Apr 13 17:48:55 2023 +0100

    fix and test for sub-workflows not running in entity context
    
    and fixes other places where entities get converted to maps
---
 .../brooklyn/camp/brooklyn/WorkflowYamlTest.java   | 54 ++++++++++++++++++++++
 .../workflow/WorkflowExpressionResolution.java     |  2 +-
 .../apache/brooklyn/util/collections/Jsonya.java   |  4 +-
 3 files changed, 57 insertions(+), 3 deletions(-)

diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
index 2624818432..51e4a1fe31 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WorkflowYamlTest.java
@@ -980,4 +980,58 @@ public class WorkflowYamlTest extends AbstractYamlTest {
         
Asserts.assertEquals(Iterables.getOnlyElement(entity.getChildren()).getDisplayName(),
 "Test");
     }
 
+    @Test
+    public void testSubWorkflowOnEntities() throws Exception {
+        Application app = createAndStartApplication(
+                "services:",
+                "- type: " + BasicEntity.class.getName(),
+                "  id: child");
+
+        doTestSubWorkflowOnEntities(app, false,
+                "steps:",
+                "  - type: workflow",
+                "    target: $brooklyn:child(\"child\")",
+                "    steps:",
+                "      - set-sensor boolean ran = true",
+                "      - return ${entity.id}");
+
+        doTestSubWorkflowOnEntities(app, true,
+                "steps:",
+                "  - type: workflow",
+                "    target:",
+                "      - $brooklyn:child(\"child\")",
+                "    steps:",
+                "      - set-sensor boolean ran = true",
+                "      - return ${entity.id}");
+
+        doTestSubWorkflowOnEntities(app, false,
+                "steps:",
+                "  - step: let child = $brooklyn:child(\"child\")",
+                "  - type: workflow",
+                "    target: ${child}",
+                "    steps:",
+                "      - set-sensor boolean ran = true",
+                "      - return ${entity.id}");
+
+        doTestSubWorkflowOnEntities(app, true,
+                "steps:",
+                "  - step: let children",
+                "    value:",
+                "      - $brooklyn:child(\"child\")",
+                "  - type: workflow",
+                "    target: ${children}",
+                "    steps:",
+                "      - set-sensor boolean ran = true",
+                "      - return ${entity.id}");
+    }
+
+    void doTestSubWorkflowOnEntities(Application app, boolean expectList, 
String ...steps) throws Exception {
+        Entity entity = Iterables.getOnlyElement(app.getChildren());
+        entity.sensors().set(Sensors.newBooleanSensor("ran"), false);
+        WorkflowExecutionContext x = WorkflowBasicTest.runWorkflow(app, 
Strings.lines(steps), "test");
+        Asserts.assertEquals(x.getTask(false).get().getUnchecked(),
+                expectList ? MutableList.of(entity.getId()) : entity.getId());
+        EntityAsserts.assertAttributeEquals(entity, 
Sensors.newBooleanSensor("ran"), true);
+    }
+
 }
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java
 
b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java
index b6b73dc4db..d9fad13f78 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/workflow/WorkflowExpressionResolution.java
@@ -344,7 +344,7 @@ public class WorkflowExpressionResolution {
     /** does not use templates */
     public <T> T resolveCoercingOnly(Object expression, TypeToken<T> type) {
         try {
-            if (expression==null || 
(Jsonya.isTypeJsonPrimitiveCompatible(expression) && !(expression instanceof 
Set))) {
+            if (expression==null || (Jsonya.isJsonPrimitiveDeep(expression) && 
!(expression instanceof Set))) {
                 // only try yaml coercion, as values are normally set from 
yaml and will be raw at this stage (but not if they are from a DSL)
                 // (might be better to always to TC.coerce)
                 return 
BeanWithTypeUtils.convert(context.getManagementContext(), expression, type, 
true,
diff --git 
a/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java 
b/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java
index e74db77e66..b79d5ca0ae 100644
--- 
a/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java
+++ 
b/utils/common/src/main/java/org/apache/brooklyn/util/collections/Jsonya.java
@@ -117,8 +117,8 @@ public class Jsonya {
     public static boolean isJsonPrimitiveDeep(Object x) {
         if (x==null) return true;
         if (x instanceof String || Boxing.isPrimitiveOrBoxedObject(x)) return 
true;
-        if (x instanceof Map) return 
((Map<?,?>)x).entrySet().stream().anyMatch(ent -> 
!isJsonPrimitiveDeep(ent.getKey()) || !isJsonPrimitiveDeep(ent.getValue()));
-        if (x instanceof Collection) return 
((Collection)x).stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent));
+        if (x instanceof Map) return 
!((Map<?,?>)x).entrySet().stream().anyMatch(ent -> 
!isJsonPrimitiveDeep(ent.getKey()) || !isJsonPrimitiveDeep(ent.getValue()));
+        if (x instanceof Collection) return 
!((Collection)x).stream().anyMatch(ent -> !isJsonPrimitiveDeep(ent));
         return false;
     }
 

Reply via email to