You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ge...@apache.org on 2018/02/26 09:05:40 UTC

[1/3] brooklyn-server git commit: Support iteration of hashes in templates

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 52c23b44a -> 449789f34


Support iteration of hashes in templates

DotSplittingTemplateModel implements TemplateHashModelEx2 (rather than
just TemplateHashModel), meaning config/sensor map key/vals can be
iterated in templates.


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

Branch: refs/heads/master
Commit: 6fa75adb0edb0e9c80c53586fe4c2686d5ca8c26
Parents: 9489884
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Thu Feb 22 16:45:30 2018 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Thu Feb 22 16:45:50 2018 +0000

----------------------------------------------------------------------
 .../util/core/text/TemplateProcessor.java       | 26 +++++++++++++++++---
 .../util/core/text/TemplateProcessorTest.java   | 15 ++++++++---
 2 files changed, 34 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6fa75adb/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java b/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
index 0c78a7c..eaa0034 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
@@ -36,7 +36,6 @@ import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.location.internal.LocationInternal;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
 import org.apache.brooklyn.core.sensor.DependentConfiguration;
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.util.collections.MutableMap;
@@ -54,8 +53,11 @@ import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapperBuilder;
 import freemarker.template.MapKeyValuePairIterator;
 import freemarker.template.ObjectWrapper;
+import freemarker.template.SimpleCollection;
 import freemarker.template.Template;
+import freemarker.template.TemplateCollectionModel;
 import freemarker.template.TemplateHashModel;
+import freemarker.template.TemplateHashModelEx2;
 import freemarker.template.TemplateModel;
 import freemarker.template.TemplateModelException;
 
@@ -64,7 +66,7 @@ import freemarker.template.TemplateModelException;
  * and accessing {@link ManagementContext} brooklyn.properties 
  * and {@link Entity}, {@link EntityDriver}, and {@link Location} methods and config.
  * <p>
- * See {@link #processTemplateContents(String, ManagementContextInternal, Map)} for
+ * See {@link #processTemplateContents(String, ManagementContext, Map)} for
  * a description of how management access is done.
  */
 public class TemplateProcessor {
@@ -126,7 +128,7 @@ public class TemplateProcessor {
      * <p>
      * However if "a" <b>and</b> "a.b" are in the map, this will <b>not</b> currently do the deep mapping.
      * (It does not have enough contextual information from Freemarker to handle this case.) */
-    public static final class DotSplittingTemplateModel implements TemplateHashModel {
+    public static final class DotSplittingTemplateModel implements TemplateHashModelEx2 {
         protected final Map<?,?> map;
 
         protected DotSplittingTemplateModel(Map<?,?> map) {
@@ -150,7 +152,7 @@ public class TemplateProcessor {
         }
         
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) {
             if (map==null) return null;
             try {
                 if (map.containsKey(key)) 
@@ -179,6 +181,22 @@ public class TemplateProcessor {
         public String toString() {
             return getClass().getName()+"["+map+"]";
         }
+
+        public int size() {
+            return map.size();
+        }
+
+        public TemplateCollectionModel keys() {
+            return new SimpleCollection(map.keySet(), WRAPPER);
+        }
+
+        public TemplateCollectionModel values() {
+            return new SimpleCollection(map.values(), WRAPPER);
+        }
+
+        public KeyValuePairIterator keyValuePairIterator() {
+            return new MapKeyValuePairIterator(map, WRAPPER);
+        }
     }
     
     /** FreeMarker {@link TemplateHashModel} which resolves keys inside the given entity or management context.

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6fa75adb/core/src/test/java/org/apache/brooklyn/util/core/text/TemplateProcessorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/text/TemplateProcessorTest.java b/core/src/test/java/org/apache/brooklyn/util/core/text/TemplateProcessorTest.java
index d9f235b..d2c07e4 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/text/TemplateProcessorTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/text/TemplateProcessorTest.java
@@ -149,12 +149,13 @@ public class TemplateProcessorTest extends BrooklynAppUnitTestSupport {
         String result = TemplateProcessor.processTemplateContents(templateContents, location, ImmutableMap.<String,Object>of());
         assertEquals(result, location.getId());
     }
-    
-    @Test
+
+    // Test takes 2.5s.
+    @Test(groups = "Integration")
     public void testLocationConfig() {
         LocalhostMachineProvisioningLocation location = app.newLocalhostProvisioningLocation(ImmutableMap.of("mykey", "myval"));
         String templateContents = "${config['mykey']}";//"+TestEntity.CONF_NAME.getName()+"']}";
-        String result = TemplateProcessor.processTemplateContents(templateContents, location, ImmutableMap.<String,Object>of());
+        String result = TemplateProcessor.processTemplateContents(templateContents, location, ImmutableMap.<String, Object>of());
         assertEquals(result, "myval");
     }
     
@@ -247,4 +248,12 @@ public class TemplateProcessorTest extends BrooklynAppUnitTestSupport {
         }
     }
 
+    @Test
+    public void testIterateHash() {
+        String templateContents = "<#list h as k,v>${k} = ${v}</#list>";
+        String result = TemplateProcessor.processTemplateContents(templateContents, (ManagementContextInternal) null,
+                ImmutableMap.of("h", ImmutableMap.of("war", "peace")));
+        assertEquals(result, "war = peace");
+    }
+
 }


[3/3] brooklyn-server git commit: Closes #951

Posted by ge...@apache.org.
Closes #951

Support iteration of hashes in templates

DotSplittingTemplateModel implements `TemplateHashModelEx2` (rather than just `TemplateHashModel`), meaning config/sensor map key/vals can be iterated in templates.

For example:
```
<#list config['sections'] as k, v>
  ${k} = ${v}
</#list>
```

Until now a snippet like this would have caused an exception with message "NonExtendedHashException: For "#list" list source: Expected an extended hash, but this has evaluated to a hash (wrapper: org.apache.brooklyn.util.core.text.TemplateProcessor$DotSplittingTemplateModel)"


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

Branch: refs/heads/master
Commit: 449789f342725ff74608f35dda4ec71622c09841
Parents: 52c23b4 6fa75ad
Author: Geoff Macartney <ge...@cloudsoftcorp.com>
Authored: Mon Feb 26 09:05:19 2018 +0000
Committer: Geoff Macartney <ge...@cloudsoftcorp.com>
Committed: Mon Feb 26 09:05:19 2018 +0000

----------------------------------------------------------------------
 .../util/core/text/TemplateProcessor.java       | 32 +++++++++++++++++---
 .../util/core/text/TemplateProcessorTest.java   | 15 +++++++--
 2 files changed, 39 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[2/3] brooklyn-server git commit: Replace deprecated constant with equivalent

Posted by ge...@apache.org.
Replace deprecated constant with equivalent


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

Branch: refs/heads/master
Commit: 948988418eef29ec7a7e33b90dc35be348ad2202
Parents: 52c23b4
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Thu Feb 22 16:45:13 2018 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Thu Feb 22 16:45:50 2018 +0000

----------------------------------------------------------------------
 .../org/apache/brooklyn/util/core/text/TemplateProcessor.java  | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/94898841/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java b/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
index c3b8246..0c78a7c 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/text/TemplateProcessor.java
@@ -51,6 +51,8 @@ import com.google.common.io.Files;
 
 import freemarker.cache.StringTemplateLoader;
 import freemarker.template.Configuration;
+import freemarker.template.DefaultObjectWrapperBuilder;
+import freemarker.template.MapKeyValuePairIterator;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.Template;
 import freemarker.template.TemplateHashModel;
@@ -68,10 +70,12 @@ import freemarker.template.TemplateModelException;
 public class TemplateProcessor {
 
     private static final Logger log = LoggerFactory.getLogger(TemplateProcessor.class);
+    private static final ObjectWrapper WRAPPER =
+            new DefaultObjectWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build();
 
     protected static TemplateModel wrapAsTemplateModel(Object o) throws TemplateModelException {
         if (o instanceof Map) return new DotSplittingTemplateModel((Map<?,?>)o);
-        return ObjectWrapper.DEFAULT_WRAPPER.wrap(o);
+        return WRAPPER.wrap(o);
     }
     
     /** As per {@link #processTemplateContents(String, Map)}, but taking a file. */