Freemarker DSL: substitutions

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/dbaf6755
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/dbaf6755
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/dbaf6755

Branch: refs/heads/master
Commit: dbaf6755675a7cad60548ba38932300abcfc4156
Parents: ca02bfa
Author: Svetoslav Neykov <[email protected]>
Authored: Thu Aug 3 17:37:03 2017 +0300
Committer: Svetoslav Neykov <[email protected]>
Committed: Thu Aug 3 19:31:29 2017 +0300

----------------------------------------------------------------------
 .../spi/dsl/methods/BrooklynDslCommon.java      |  4 +++
 .../brooklyn/spi/dsl/methods/DslComponent.java  | 28 ++++++++++++++++++--
 .../camp/brooklyn/spi/dsl/DslYamlTest.java      | 17 ++++++++++--
 3 files changed, 45 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/dbaf6755/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
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 49cf855..f3f39e7 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
@@ -802,6 +802,10 @@ public class BrooklynDslCommon {
         return new DslComponent(Scope.THIS, "").template(template);
     }
 
+    public static Object template(Object template, Map<? ,?> substitutions) {
+        return new DslComponent(Scope.THIS, "").template(template, 
substitutions);
+    }
+
     public static class Functions {
         @DslAccessible
         public static Object regexReplacement(final Object pattern, final 
Object replacement) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/dbaf6755/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
index 1693099..9ecad76 100644
--- 
a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++ 
b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
@@ -20,6 +20,7 @@ package org.apache.brooklyn.camp.brooklyn.spi.dsl.methods;
 
 import static org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils.resolved;
 
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -744,14 +745,24 @@ public class DslComponent extends 
BrooklynDslDeferredSupplier<Entity> implements
         return new DslTemplate(this, template);
     }
 
+    public Object template(Object template, Map<?, ?> substitutions) {
+        return new DslTemplate(this, template, substitutions);
+    }
+
     protected final static class DslTemplate extends 
BrooklynDslDeferredSupplier<Object> {
         private static final long serialVersionUID = -585564936781673667L;
         private DslComponent component;
         private Object template;
+        private Map<?, ?> substitutions;
 
         public DslTemplate(DslComponent component, Object template) {
+            this(component, template, ImmutableMap.of());
+        }
+
+        public DslTemplate(DslComponent component, Object template, Map<?, ?> 
substitutions) {
             this.component = component;
             this.template = template;
+            this.substitutions = substitutions;
         }
         
         private String resolveTemplate(boolean immediately) {
@@ -766,17 +777,29 @@ public class DslComponent extends 
BrooklynDslDeferredSupplier<Entity> implements
                 .description("Resolving template from " + template)
                 .get();
         }
+        
+        @SuppressWarnings("unchecked")
+        private Map<String, ?> resolveSubstitutions(boolean immediately) {
+            return (Map<String, ?>) Tasks.resolving(substitutions)
+                    .as(Object.class)
+                    .context(findExecutionContext(this))
+                    .immediately(immediately)
+                    .deep(true)
+                    .description("Resolving substitutions " + substitutions + 
" for template " + template)
+                    .get();
+        }
 
         @Override
         public Maybe<Object> getImmediately() {
             String resolvedTemplate = resolveTemplate(true);
+            Map<String, ?> resolvedSubstitutions = resolveSubstitutions(true);
 
             Maybe<Entity> targetEntityMaybe = component.getImmediately();
             if (targetEntityMaybe.isAbsent()) return 
ImmediateValueNotAvailableException.newAbsentWrapping("Target entity is not 
available: "+component, targetEntityMaybe);
             Entity targetEntity = targetEntityMaybe.get();
 
             String evaluatedTemplate = 
TemplateProcessor.processTemplateContents(
-                    resolvedTemplate, (EntityInternal)targetEntity, 
ImmutableMap.<String, Object>of());
+                    resolvedTemplate, (EntityInternal)targetEntity, 
resolvedSubstitutions);
             return Maybe.of(evaluatedTemplate);
         }
 
@@ -786,8 +809,9 @@ public class DslComponent extends 
BrooklynDslDeferredSupplier<Entity> implements
                 @Override
                 public Object call() throws Exception {
                     Entity targetEntity = component.get();
+                    Map<String, ?> resolvedSubstitutions = 
resolveSubstitutions(false);
                     return TemplateProcessor.processTemplateContents(
-                            resolveTemplate(false), 
(EntityInternal)targetEntity, ImmutableMap.<String, Object>of());
+                            resolveTemplate(false), 
(EntityInternal)targetEntity, resolvedSubstitutions);
                 }
             }).build();
         }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/dbaf6755/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
----------------------------------------------------------------------
diff --git 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
index 99c1b62..7120150 100644
--- 
a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
+++ 
b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
@@ -38,14 +38,12 @@ import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.entity.stock.BasicApplication;
 import org.apache.brooklyn.entity.stock.BasicEntity;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.CompoundRuntimeException;
 import org.apache.brooklyn.util.guava.Maybe;
-import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -804,6 +802,21 @@ public class DslYamlTest extends AbstractYamlTest {
     }
 
     @Test
+    public void testDslTemplateSubstitutions() throws Exception {
+        final Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + BasicApplication.class.getName(),
+                "  brooklyn.config:",
+                "    test.sourceName: hello world",
+                "    test.substituteValue: and all",
+                "    dest: ",
+                "      $brooklyn:template:",
+                "      - ${config['test.sourceName']} ${key}",
+                "      - $brooklyn:literal(\"key\"): 
$brooklyn:config(\"test.substituteValue\")");
+        assertEquals(getConfigEventually(app, DEST), "hello world and all");
+    }
+
+    @Test
     public void testDslTemplateOnEntity() throws Exception {
         final Entity app = createAndStartApplication(
                 "services:",

Reply via email to