You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by tb...@apache.org on 2020/01/07 16:18:40 UTC

[brooklyn-server] branch master updated: Add support for use of DSL when specifying the pattern for $brooklyn:formatString()

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7d61a9d  Add support for use of DSL when specifying the pattern for $brooklyn:formatString()
     new f2160cb  Merge pull request #1081 from tbouron/fix/dsl-format-string
7d61a9d is described below

commit 7d61a9d7c8e3eb118083bc130c7b7ef62bc5088e
Author: Thomas Bouron <th...@cloudsoftcorp.com>
AuthorDate: Mon Jan 6 17:31:21 2020 +0000

    Add support for use of DSL when specifying the pattern for $brooklyn:formatString()
---
 .../spi/dsl/methods/BrooklynDslCommon.java         | 14 ++++++-------
 .../brooklyn/spi/dsl/DslParseComponentsTest.java   | 12 +++++++++++
 .../core/sensor/DependentConfiguration.java        | 24 ++++++++++++++--------
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index 518b501..3c398ab 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -368,10 +368,10 @@ public class BrooklynDslCommon {
      * are not yet fully resolved.
      */
     @DslAccessible
-    public static Object formatString(final String pattern, final Object...args) {
-        if (resolved(args)) {
+    public static Object formatString(final Object pattern, final Object...args) {
+        if (resolved(Lists.asList(pattern, args))) {
             // if all args are resolved, apply the format string now
-            return String.format(pattern, args);
+            return String.format(String.valueOf(pattern), args);
         } else {
             return new DslFormatString(pattern, args);
         }
@@ -433,16 +433,16 @@ public class BrooklynDslCommon {
     /**
      * Deferred execution of String formatting.
      *
-     * @see DependentConfiguration#formatString(String, Object...)
+     * @see DependentConfiguration#formatString(Object, Object...)
      */
     protected static class DslFormatString extends BrooklynDslDeferredSupplier<String> {
 
         private static final long serialVersionUID = -4849297712650560863L;
 
-        private final String pattern;
+        private final Object pattern;
         private final Object[] args;
 
-        public DslFormatString(String pattern, Object ...args) {
+        public DslFormatString(Object pattern, Object ...args) {
             this.pattern = pattern;
             this.args = args;
         }
@@ -526,7 +526,7 @@ public class BrooklynDslCommon {
     @SuppressWarnings({ "serial", "unused" })
     @Deprecated
     private static class FormatString extends DslFormatString {
-        public FormatString(String pattern, Object[] args) {
+        public FormatString(Object pattern, Object[] args) {
             super(pattern, args);
         }
     }
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
index 1e8ccb8..ddd8a1f 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslParseComponentsTest.java
@@ -57,6 +57,7 @@ public class DslParseComponentsTest extends AbstractYamlTest {
                     "  brooklyn.config:",
                     "    dest: 1",
                     "    dest2: 1",
+                    "    pattern: '%s-%s'",
                     "  brooklyn.children:",
                     "  - type: "+BasicEntity.class.getName(),
                     "    id: two",
@@ -133,6 +134,17 @@ public class DslParseComponentsTest extends AbstractYamlTest {
     }
 
     @Test
+    public void testFormatStringWithDslPatternEvaluation() throws Exception {
+        app();
+
+        Object y1 = parseDslExpression("$brooklyn:formatString($brooklyn:config(\"pattern\"), $brooklyn:config(\"dest\"), $brooklyn:config(\"dest2\"))");
+        Assert.assertEquals(y1.toString(), "$brooklyn:formatString(config(\"pattern\"), config(\"dest\"), config(\"dest2\"))");
+
+        String y2 = Tasks.resolveValue(y1, String.class, ((EntityInternal) find("one")).getExecutionContext());
+        Assert.assertEquals(y2.toString(), "1-1");
+    }
+
+    @Test
     public void testEntityReferenceAndAttributeWhenReady() throws Exception {
         app();
         find("one").sensors().set(Attributes.ADDRESS, "1");
diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
index c2a9804..0e1a22a 100644
--- a/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
+++ b/core/src/main/java/org/apache/brooklyn/core/sensor/DependentConfiguration.java
@@ -510,27 +510,29 @@ public class DependentConfiguration {
      * </pre>
      */
     @SuppressWarnings("unchecked")
-    public static Task<String> formatString(final String spec, final Object ...args) {
+    public static Task<String> formatString(final Object spec, final Object ...args) {
         List<TaskAdaptable<Object>> taskArgs = Lists.newArrayList();
-        for (Object arg: args) {
+
+        Object[] newArgs = Lists.asList(spec, args).toArray();
+        for (Object arg: newArgs) {
             if (arg instanceof TaskAdaptable) taskArgs.add((TaskAdaptable<Object>)arg);
             else if (arg instanceof TaskFactory) taskArgs.add( ((TaskFactory<TaskAdaptable<Object>>)arg).newTask() );
         }
         
         return transformMultiple(
-            MutableMap.<String,String>of("displayName", "formatting '"+spec+"' with "+taskArgs.size()+" task"+(taskArgs.size()!=1?"s":"")), 
+            MutableMap.<String,String>of("displayName", "formatting '"+spec.toString()+"' with "+taskArgs.size()+" task"+(taskArgs.size()!=1?"s":"")),
             new Function<List<Object>, String>() {
                 @Override public String apply(List<Object> input) {
                     Iterator<?> tri = input.iterator();
-                    Object[] vv = new Object[args.length];
+                    Object[] vv = new Object[newArgs.length];
                     int i=0;
-                    for (Object arg : args) {
+                    for (Object arg : newArgs) {
                         if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) vv[i] = tri.next();
                         else if (arg instanceof DeferredSupplier) vv[i] = ((DeferredSupplier<?>) arg).get();
                         else vv[i] = arg;
                         i++;
                     }
-                    return String.format(spec, vv);
+                    return String.format(vv[0].toString(), Arrays.copyOfRange(vv, 1, vv.length));
                 }},
             taskArgs);
     }
@@ -538,7 +540,13 @@ public class DependentConfiguration {
     /**
      * @throws ImmediateSupplier.ImmediateUnsupportedException if cannot evaluate this in a timely manner
      */
-    public static Maybe<String> formatStringImmediately(final String spec, final Object ...args) {
+    public static Maybe<String> formatStringImmediately(final Object spec, final Object ...args) {
+        String pattern = "";
+        Maybe<?> resolvedSpec = resolveImmediately(spec);
+        if (resolvedSpec.isPresent()) {
+            pattern = resolvedSpec.get().toString();
+        }
+
         List<Object> resolvedArgs = Lists.newArrayList();
         for (Object arg : args) {
             Maybe<?> argVal = resolveImmediately(arg);
@@ -546,7 +554,7 @@ public class DependentConfiguration {
             resolvedArgs.add(argVal.get());
         }
 
-        return Maybe.of(String.format(spec, resolvedArgs.toArray()));
+        return Maybe.of(String.format(pattern, resolvedArgs.toArray()));
     }
 
     /**