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:",
