You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2016/08/15 10:40:01 UTC

[1/4] brooklyn-server git commit: Convenience predicates to test attributes + config by name.

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 215c02cb5 -> 374e01f41


Convenience predicates to test attributes + config by name.


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

Branch: refs/heads/master
Commit: f3f39938d75aaa4ebb1132952493a186399ad30f
Parents: 3364786
Author: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Authored: Fri Aug 5 14:26:20 2016 +0100
Committer: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Committed: Fri Aug 5 15:46:48 2016 +0100

----------------------------------------------------------------------
 .../brooklyn/core/entity/EntityPredicates.java  | 72 +++++++++++++++++---
 .../core/entity/EntityPredicatesTest.java       | 58 +++++++++++++---
 2 files changed, 112 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f3f39938/core/src/main/java/org/apache/brooklyn/core/entity/EntityPredicates.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityPredicates.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityPredicates.java
index a618784..41f016c 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityPredicates.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityPredicates.java
@@ -29,6 +29,8 @@ import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
+import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.util.collections.CollectionFunctionals;
 import org.apache.brooklyn.util.guava.SerializablePredicate;
 import org.apache.brooklyn.util.javalang.Reflections;
@@ -171,11 +173,35 @@ public class EntityPredicates {
     }
 
     // ---------------------------
-    
+
+    public static Predicate<Entity> attributeNotNull(final String attributeName) {
+        return attributeSatisfies(attributeName, Predicates.notNull());
+    }
+
+    public static <T> Predicate<Entity> attributeNotNull(final AttributeSensor<T> attribute) {
+        return attributeSatisfies(attribute, Predicates.<T>notNull());
+    }
+
+    public static Predicate<Entity> attributeEqualTo(final String attributeName, final Object val) {
+        return attributeSatisfies(attributeName, Predicates.equalTo(val));
+    }
+
     public static <T> Predicate<Entity> attributeEqualTo(final AttributeSensor<T> attribute, final T val) {
         return attributeSatisfies(attribute, Predicates.equalTo(val));
     }
-    
+
+    public static <T> Predicate<Entity> attributeNotEqualTo(final String attributeName, final Object val) {
+        return attributeSatisfies(attributeName, Predicates.not(Predicates.equalTo(val)));
+    }
+
+    public static <T> Predicate<Entity> attributeNotEqualTo(final AttributeSensor<T> attribute, final T val) {
+        return attributeSatisfies(attribute, Predicates.not(Predicates.equalTo(val)));
+    }
+
+    public static Predicate<Entity> attributeSatisfies(final String attributeName, final Predicate<Object> condition) {
+        return new AttributeSatisfies<Object>(Sensors.newSensor(Object.class, attributeName), condition);
+    }
+
     public static <T> Predicate<Entity> attributeSatisfies(final AttributeSensor<T> attribute, final Predicate<T> condition) {
         return new AttributeSatisfies<T>(attribute, condition);
     }
@@ -208,24 +234,52 @@ public class EntityPredicates {
         };
     }
     
-    public static <T> Predicate<Entity> attributeNotEqualTo(final AttributeSensor<T> attribute, final T val) {
-        return attributeSatisfies(attribute, Predicates.not(Predicates.equalTo(val)));
+    // ---------------------------
+
+    public static <T> Predicate<Entity> configNotNull(final String configKeyName) {
+        return configSatisfies(configKeyName, Predicates.notNull());
     }
 
-    // ---------------------------
+    public static <T> Predicate<Entity> configNotNull(final ConfigKey<T> configKey) {
+        return configSatisfies(configKey, Predicates.<T>notNull());
+    }
 
-    public static <T> Predicate<Entity> configEqualTo(final ConfigKey<T> configKey, final T val) {
-        return configSatisfies(configKey, Predicates.equalTo(val));
+    public static <T> Predicate<Entity> configNotNull(final HasConfigKey<T> configKey) {
+        return configNotNull(configKey.getConfigKey());
     }
 
-    public static <T> Predicate<Entity> configSatisfies(final ConfigKey<T> configKey, final Predicate<T> condition) {
-        return new ConfigKeySatisfies<T>(configKey, condition);
+    public static <T> Predicate<Entity> configEqualTo(final String configKeyName, final Object val) {
+        return configSatisfies(configKeyName, Predicates.equalTo(val));
+    }
+
+    public static <T> Predicate<Entity> configEqualTo(final ConfigKey<T> configKey, final T val) {
+        return configSatisfies(configKey, Predicates.equalTo(val));
     }
 
     public static <T> Predicate<Entity> configEqualTo(final HasConfigKey<T> configKey, final T val) {
         return configEqualTo(configKey.getConfigKey(), val);
     }
 
+    public static <T> Predicate<Entity> configNotEqualTo(final String configKeyName, final Object val) {
+        return configSatisfies(configKeyName, Predicates.not(Predicates.equalTo(val)));
+    }
+
+    public static <T> Predicate<Entity> configNotEqualTo(final ConfigKey<T> configKey, final T val) {
+        return configSatisfies(configKey, Predicates.not(Predicates.equalTo(val)));
+    }
+
+    public static <T> Predicate<Entity> configNotEqualTo(final HasConfigKey<T> configKey, final T val) {
+        return configNotEqualTo(configKey.getConfigKey(), val);
+    }
+
+    public static Predicate<Entity> configSatisfies(final String configKeyName, final Predicate<Object> condition) {
+        return new ConfigKeySatisfies<Object>(ConfigKeys.newConfigKey(Object.class, configKeyName), condition);
+    }
+
+    public static <T> Predicate<Entity> configSatisfies(final ConfigKey<T> configKey, final Predicate<T> condition) {
+        return new ConfigKeySatisfies<T>(configKey, condition);
+    }
+
     public static <T> Predicate<Entity> configSatisfies(final HasConfigKey<T> configKey, final Predicate<T> condition) {
         return new ConfigKeySatisfies<T>(configKey.getConfigKey(), condition);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f3f39938/core/src/test/java/org/apache/brooklyn/core/entity/EntityPredicatesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntityPredicatesTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntityPredicatesTest.java
index 1b75876..4cf6df3 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityPredicatesTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityPredicatesTest.java
@@ -40,7 +40,7 @@ public class EntityPredicatesTest extends BrooklynAppUnitTestSupport {
     private TestEntity entity;
     private BasicGroup group;
     private Location loc;
-    
+
     @BeforeMethod(alwaysRun=true)
     @Override
     public void setUp() throws Exception {
@@ -55,33 +55,73 @@ public class EntityPredicatesTest extends BrooklynAppUnitTestSupport {
         assertTrue(EntityPredicates.applicationIdEqualTo(app.getId()).apply(entity));
         assertFalse(EntityPredicates.applicationIdEqualTo("wrongid").apply(entity));
     }
-    
+
     @Test
     public void testIdEqualTo() throws Exception {
         assertTrue(EntityPredicates.idEqualTo(entity.getId()).apply(entity));
         assertFalse(EntityPredicates.idEqualTo("wrongid").apply(entity));
     }
-    
+
+    @Test
+    public void testAttributeNotNull() throws Exception {
+        entity.sensors().set(TestEntity.NAME, "myname");
+        assertTrue(EntityPredicates.attributeNotNull(TestEntity.NAME).apply(entity));
+        assertTrue(EntityPredicates.attributeNotNull(TestEntity.NAME.getName()).apply(entity));
+        assertFalse(EntityPredicates.attributeNotNull(TestEntity.SEQUENCE).apply(entity));
+        assertFalse(EntityPredicates.attributeNotNull(TestEntity.SEQUENCE.getName()).apply(entity));
+    }
+
     @Test
     public void testAttributeEqualTo() throws Exception {
         entity.sensors().set(TestEntity.NAME, "myname");
         assertTrue(EntityPredicates.attributeEqualTo(TestEntity.NAME, "myname").apply(entity));
+        assertTrue(EntityPredicates.attributeEqualTo(TestEntity.NAME.getName(), "myname").apply(entity));
         assertFalse(EntityPredicates.attributeEqualTo(TestEntity.NAME, "wrongname").apply(entity));
+        assertFalse(EntityPredicates.attributeEqualTo(TestEntity.NAME.getName(), "wrongname").apply(entity));
     }
-    
+
+    @Test
+    public void testAttributeNotEqualTo() throws Exception {
+        entity.sensors().set(TestEntity.NAME, "myname");
+        assertFalse(EntityPredicates.attributeNotEqualTo(TestEntity.NAME, "myname").apply(entity));
+        assertFalse(EntityPredicates.attributeNotEqualTo(TestEntity.NAME.getName(), "myname").apply(entity));
+        assertTrue(EntityPredicates.attributeNotEqualTo(TestEntity.NAME, "wrongname").apply(entity));
+        assertTrue(EntityPredicates.attributeNotEqualTo(TestEntity.NAME.getName(), "wrongname").apply(entity));
+    }
+
+    @Test
+    public void testConfigNotNull() throws Exception {
+        entity.config().set(TestEntity.CONF_NAME, "myname");
+        assertTrue(EntityPredicates.configNotNull(TestEntity.CONF_NAME).apply(entity));
+        assertTrue(EntityPredicates.configNotNull(TestEntity.CONF_NAME.getName()).apply(entity));
+        assertFalse(EntityPredicates.configNotNull(TestEntity.CONF_OBJECT).apply(entity));
+        assertFalse(EntityPredicates.configNotNull(TestEntity.CONF_OBJECT.getName()).apply(entity));
+    }
+
     @Test
     public void testConfigEqualTo() throws Exception {
         entity.config().set(TestEntity.CONF_NAME, "myname");
         assertTrue(EntityPredicates.configEqualTo(TestEntity.CONF_NAME, "myname").apply(entity));
+        assertTrue(EntityPredicates.configEqualTo(TestEntity.CONF_NAME.getName(), "myname").apply(entity));
         assertFalse(EntityPredicates.configEqualTo(TestEntity.CONF_NAME, "wrongname").apply(entity));
+        assertFalse(EntityPredicates.configEqualTo(TestEntity.CONF_NAME.getName(), "wrongname").apply(entity));
     }
-    
+
+    @Test
+    public void testConfigNotEqualTo() throws Exception {
+        entity.config().set(TestEntity.CONF_NAME, "myname");
+        assertFalse(EntityPredicates.configNotEqualTo(TestEntity.CONF_NAME, "myname").apply(entity));
+        assertFalse(EntityPredicates.configNotEqualTo(TestEntity.CONF_NAME.getName(), "myname").apply(entity));
+        assertTrue(EntityPredicates.configNotEqualTo(TestEntity.CONF_NAME, "wrongname").apply(entity));
+        assertTrue(EntityPredicates.configNotEqualTo(TestEntity.CONF_NAME.getName(), "wrongname").apply(entity));
+    }
+
     @Test
     public void testDisplayNameEqualTo() throws Exception {
         assertTrue(EntityPredicates.displayNameEqualTo("mydisplayname").apply(entity));
         assertFalse(EntityPredicates.displayNameEqualTo("wrongname").apply(entity));
     }
-    
+
     @Test
     public void testDisplayNameSatisfies() throws Exception {
         assertTrue(EntityPredicates.displayNameSatisfies(StringPredicates.matchesRegex("myd.*me")).apply(entity));
@@ -94,7 +134,7 @@ public class EntityPredicatesTest extends BrooklynAppUnitTestSupport {
         assertFalse(EntityPredicates.isChildOf(entity).apply(entity));
         assertFalse(EntityPredicates.isChildOf(entity).apply(app));
     }
-    
+
     @Test
     public void testIsMemberOf() throws Exception {
         group.addMember(entity);
@@ -102,14 +142,14 @@ public class EntityPredicatesTest extends BrooklynAppUnitTestSupport {
         assertFalse(EntityPredicates.isMemberOf(group).apply(app));
         assertFalse(EntityPredicates.isMemberOf(group).apply(group));
     }
-    
+
     @Test
     public void testManaged() throws Exception {
         assertTrue(EntityPredicates.isManaged().apply(entity));
         Entities.unmanage(entity);
         assertFalse(EntityPredicates.isManaged().apply(entity));
     }
-    
+
     @Test
     public void testWithLocation() throws Exception {
         entity.addLocations(ImmutableList.of(loc));


[3/4] brooklyn-server git commit: Improved $brooklyn:object() DSL.

Posted by al...@apache.org.
Improved $brooklyn:object() DSL.

- Support parameterised constructors
- Support static factory methods


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

Branch: refs/heads/master
Commit: 26af0a214f4ecfd593e821bf77bac5d9b8c7d116
Parents: f3f3993
Author: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Authored: Fri Aug 5 14:26:55 2016 +0100
Committer: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Committed: Fri Aug 5 15:46:49 2016 +0100

----------------------------------------------------------------------
 .../spi/dsl/methods/BrooklynDslCommon.java      | 133 +++++++++++++++----
 .../brooklyn/camp/brooklyn/ObjectsYamlTest.java |  64 +++++++++
 2 files changed, 173 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26af0a21/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 23cc3a3..d6dfddd 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
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.camp.brooklyn.spi.dsl.methods;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils.resolved;
 
 import java.util.Arrays;
 import java.util.Iterator;
@@ -38,10 +39,8 @@ import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator;
 import org.apache.brooklyn.camp.brooklyn.spi.creation.EntitySpecConfiguration;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslDeferredSupplier;
-import org.apache.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
 import org.apache.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
 import org.apache.brooklyn.core.config.external.ExternalConfigSupplier;
-import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.entity.EntityDynamicType;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.mgmt.internal.ExternalConfigSupplierRegistry;
@@ -66,6 +65,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
@@ -178,6 +178,9 @@ public class BrooklynDslCommon {
     public static Object object(Map<String, Object> arguments) {
         ConfigBag config = ConfigBag.newInstance(arguments);
         String typeName = BrooklynYamlTypeInstantiator.InstantiatorFromKey.extractTypeName("object", config).orNull();
+        List<Object> constructorArgs = (List<Object>) config.getStringKeyMaybe("constructor.args").or(ImmutableList.of());
+        String factoryMethodName = (String) config.getStringKeyMaybe("factoryMethod.name").orNull();
+        List<Object> factoryMethodArgs = (List<Object>) config.getStringKeyMaybe("factoryMethod.args").or(ImmutableList.of());
         Map<String,Object> objectFields = (Map<String, Object>) config.getStringKeyMaybe("object.fields").or(MutableMap.of());
         Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe(BrooklynCampReservedKeys.BROOKLYN_CONFIG).or(MutableMap.of());
         
@@ -187,17 +190,24 @@ public class BrooklynDslCommon {
             type = new ClassLoaderUtils(BrooklynDslCommon.class).loadClass(mappedTypeName);
         } catch (ClassNotFoundException e) {
             LOG.debug("Cannot load class " + typeName + " for DLS object; assuming it is in OSGi bundle; will defer its loading");
-            return new DslObject(mappedTypeName, objectFields, brooklynConfig);
+            return new DslObject(mappedTypeName, constructorArgs, objectFields, brooklynConfig);
         }
 
         if (!Reflections.hasNoArgConstructor(type)) {
             throw new IllegalStateException(String.format("Cannot construct %s bean: No public no-arg constructor available", type));
         }
-        if ((objectFields.isEmpty() || DslUtils.resolved(objectFields.values())) &&
-                (brooklynConfig.isEmpty() || DslUtils.resolved(brooklynConfig.values()))) {
-            return DslObject.create(type, objectFields, brooklynConfig);
+        if (resolved(constructorArgs) && resolved(factoryMethodArgs) && resolved(objectFields.values()) && resolved(brooklynConfig.values())) {
+            if (factoryMethodName == null) {
+                return DslObject.create(type, constructorArgs, objectFields, brooklynConfig);
+            } else {
+                return DslObject.create(type, factoryMethodName, factoryMethodArgs, objectFields, brooklynConfig);
+            }
         } else {
-            return new DslObject(type, objectFields, brooklynConfig);
+            if (factoryMethodName == null) {
+                return new DslObject(type, constructorArgs, objectFields, brooklynConfig);
+            } else {
+                return new DslObject(type, factoryMethodName, factoryMethodArgs, objectFields, brooklynConfig);
+            }
         }
     }
 
@@ -213,7 +223,7 @@ public class BrooklynDslCommon {
      * are not yet fully resolved.
      */
     public static Object formatString(final String pattern, final Object...args) {
-        if (DslUtils.resolved(args)) {
+        if (resolved(args)) {
             // if all args are resolved, apply the format string now
             return String.format(pattern, args);
         } else {
@@ -222,7 +232,7 @@ public class BrooklynDslCommon {
     }
 
     public static Object regexReplacement(final Object source, final Object pattern, final Object replacement) {
-        if (DslUtils.resolved(Arrays.asList(source, pattern, replacement))) {
+        if (resolved(Arrays.asList(source, pattern, replacement))) {
             return (new Functions.RegexReplacer(String.valueOf(pattern), String.valueOf(replacement))).apply(String.valueOf(source));
         } else {
             return new DslRegexReplacement(source, pattern, replacement);
@@ -327,18 +337,66 @@ public class BrooklynDslCommon {
 
         private static final long serialVersionUID = 8878388748085419L;
 
-        private String typeName;
-        private Class<?> type;
-        private Map<String,Object> fields, config;
+        private final String typeName;
+        private final String factoryMethodName;
+        private final Class<?> type;
+        private final List<Object> constructorArgs, factoryMethodArgs;
+        private final Map<String, Object> fields, config;
+
+        public DslObject(
+                String typeName,
+                List<Object> constructorArgs,
+                Map<String, Object> fields,
+                Map<String, Object> config) {
+            this.typeName = checkNotNull(typeName, "typeName");
+            this.type = null;
+            this.constructorArgs = constructorArgs;
+            this.factoryMethodName = null;
+            this.factoryMethodArgs = ImmutableList.of();
+            this.fields = MutableMap.copyOf(fields);
+            this.config = MutableMap.copyOf(config);
+        }
+
+        public DslObject(
+                Class<?> type,
+                List<Object> constructorArgs,
+                Map<String, Object> fields,
+                Map<String, Object> config) {
+            this.typeName = null;
+            this.type = checkNotNull(type, "type");
+            this.constructorArgs = constructorArgs;
+            this.factoryMethodName = null;
+            this.factoryMethodArgs = ImmutableList.of();
+            this.fields = MutableMap.copyOf(fields);
+            this.config = MutableMap.copyOf(config);
+        }
 
-        public DslObject(String typeName, Map<String,Object> fields,  Map<String,Object> config) {
+        public DslObject(
+                String typeName,
+                String factoryMethodName,
+                List<Object> factoryMethodArgs,
+                Map<String, Object> fields,
+                Map<String, Object> config) {
             this.typeName = checkNotNull(typeName, "typeName");
+            this.type = null;
+            this.constructorArgs = ImmutableList.of();
+            this.factoryMethodName = factoryMethodName;
+            this.factoryMethodArgs = factoryMethodArgs;
             this.fields = MutableMap.copyOf(fields);
             this.config = MutableMap.copyOf(config);
         }
-        
-        public DslObject(Class<?> type, Map<String,Object> fields,  Map<String,Object> config) {
+
+        public DslObject(
+                Class<?> type,
+                String factoryMethodName,
+                List<Object> factoryMethodArgs,
+                Map<String, Object> fields,
+                Map<String, Object> config) {
+            this.typeName = null;
             this.type = checkNotNull(type, "type");
+            this.constructorArgs = ImmutableList.of();
+            this.factoryMethodName = factoryMethodName;
+            this.factoryMethodArgs = factoryMethodArgs;
             this.fields = MutableMap.copyOf(fields);
             this.config = MutableMap.copyOf(config);
         }
@@ -346,6 +404,7 @@ public class BrooklynDslCommon {
         @SuppressWarnings("unchecked")
         @Override
         public Task<Object> newTask() {
+            Class<?> type = this.type;
             if (type == null) {
                 EntityInternal entity = entity();
                 try {
@@ -354,6 +413,8 @@ public class BrooklynDslCommon {
                     throw Exceptions.propagate(e);
                 }
             }
+            final Class<?> clazz = type;
+
             List<TaskAdaptable<Object>> tasks = Lists.newLinkedList();
             for (Object value : Iterables.concat(fields.values(), config.values())) {
                 if (value instanceof TaskAdaptable) {
@@ -362,8 +423,8 @@ public class BrooklynDslCommon {
                     tasks.add(((TaskFactory<TaskAdaptable<Object>>) value).newTask());
                 }
             }
-            
-            Map<String,?> flags = MutableMap.<String,String>of("displayName", "building '"+type+"' with "+tasks.size()+" task"+(tasks.size()!=1?"s":""));
+
+            Map<String,?> flags = MutableMap.<String,String>of("displayName", "building '"+clazz+"' with "+tasks.size()+" task"+(tasks.size()!=1?"s":""));
             return DependentConfiguration.transformMultiple(flags, new Function<List<Object>, Object>() {
                         @Override
                         public Object apply(List<Object> input) {
@@ -384,24 +445,48 @@ public class BrooklynDslCommon {
                                     config.put(name, ((DeferredSupplier<?>) value).get());
                                 }
                             }
-                            return create(type, fields, config);
+                            if (factoryMethodName == null) {
+                                return create(clazz, constructorArgs, fields, config);
+                            } else {
+                                return create(clazz, factoryMethodName, factoryMethodArgs, fields, config);
+                            }
                         }
                     }, tasks);
         }
 
-        public static <T> T create(Class<T> type, Map<String,?> fields, Map<String,?> config) {
+        public static <T> T create(Class<T> type, List<?> constructorArgs, Map<String,?> fields, Map<String,?> config) {
             try {
                 T bean;
                 try {
                     bean = (T) TypeCoercions.coerce(fields, type);
                 } catch (ClassCoercionException ex) {
-                    bean = Reflections.invokeConstructorFromArgs(type).get();
+                    bean = Reflections.invokeConstructorFromArgs(type, constructorArgs.toArray()).get();
+                    BeanUtils.populate(bean, fields);
+                }
+                if (bean instanceof Configurable && config.size() > 0) {
+                    ConfigBag configBag = ConfigBag.newInstance(config);
+                    FlagUtils.setFieldsFromFlags(bean, configBag);
+                    FlagUtils.setAllConfigKeys((Configurable) bean, configBag, true);
+                }
+                return bean;
+            } catch (Exception e) {
+                throw Exceptions.propagate(e);
+            }
+        }
+
+        public static Object create(Class<?> type, String factoryMethodName, List<Object> factoryMethodArgs, Map<String,?> fields, Map<String,?> config) {
+            try {
+                Object bean;
+                try {
+                    bean = TypeCoercions.coerce(fields, type);
+                } catch (ClassCoercionException ex) {
+                    bean = Reflections.invokeMethodFromArgs(type, factoryMethodName, factoryMethodArgs).get();
                     BeanUtils.populate(bean, fields);
                 }
                 if (bean instanceof Configurable && config.size() > 0) {
-                    ConfigBag brooklyn = ConfigBag.newInstance(config);
-                    FlagUtils.setFieldsFromFlags(bean, brooklyn);
-                    FlagUtils.setAllConfigKeys((Configurable) bean, brooklyn, true);
+                    ConfigBag configBag = ConfigBag.newInstance(config);
+                    FlagUtils.setFieldsFromFlags(bean, configBag);
+                    FlagUtils.setAllConfigKeys((Configurable) bean, configBag, true);
                 }
                 return bean;
             } catch (Exception e) {
@@ -485,7 +570,7 @@ public class BrooklynDslCommon {
 
     public static class Functions {
         public static Object regexReplacement(final Object pattern, final Object replacement) {
-            if (DslUtils.resolved(pattern, replacement)) {
+            if (resolved(pattern, replacement)) {
                 return new RegexReplacer(String.valueOf(pattern), String.valueOf(replacement));
             } else {
                 return new DslRegexReplacer(pattern, replacement);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/26af0a21/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ObjectsYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ObjectsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ObjectsYamlTest.java
index 147ae1e..ca4f91b 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ObjectsYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ObjectsYamlTest.java
@@ -53,8 +53,21 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         private Integer number;
         private Object object;
 
+        // Factory method.
+        public static TestObject newTestObject(String string, Integer number, Object object) {
+            return new TestObject(string + "-suffix", number + 1, object);
+        }
+
+        // No-arg constructor.
         public TestObject() { }
 
+        // Parameterised constructor.
+        public TestObject(String string, Integer number, Object object) {
+            this.string = string;
+            this.number = number;
+            this.object = object;
+        }
+
         public String getString() { return string; }
         public void setString(String string) { this.string = string; }
 
@@ -275,6 +288,57 @@ public class ObjectsYamlTest extends AbstractYamlTest {
         Assert.assertTrue(testObjectObject instanceof SimpleTestPojo, "Expected a SimpleTestPojo: "+testObjectObject);
     }
 
+    @Test
+    public void testBrooklynObjectWithParameterisedConstructor() throws Exception {
+        Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
+            "  brooklyn.config:",
+            "    test.confObject:",
+            "      $brooklyn:object:",
+            "        type: "+ObjectsYamlTest.class.getName()+"$TestObject",
+            "        constructor.args:",
+            "        - frog",
+            "        - 7",
+            "        - $brooklyn:object:",
+            "            type: org.apache.brooklyn.camp.brooklyn.SimpleTestPojo"
+        );
+
+        Object testObject = testEntity.getConfig(TestEntity.CONF_OBJECT);
+
+        Assert.assertTrue(testObject instanceof TestObject, "Expected a TestObject: "+testObject);
+        Assert.assertTrue(managementContextInjected.get());
+        Assert.assertEquals(((TestObject) testObject).getNumber(), Integer.valueOf(7));
+        Assert.assertEquals(((TestObject) testObject).getString(), "frog");
+
+        Object testObjectObject = ((TestObject) testObject).getObject();
+        Assert.assertTrue(testObjectObject instanceof SimpleTestPojo, "Expected a SimpleTestPojo: "+testObjectObject);
+    }
+
+    @Test
+    public void testBrooklynObjectWithFactoryMethod() throws Exception {
+        Entity testEntity = setupAndCheckTestEntityInBasicYamlWith(
+            "  brooklyn.config:",
+            "    test.confObject:",
+            "      $brooklyn:object:",
+            "        type: "+ObjectsYamlTest.class.getName()+"$TestObject",
+            "        factoryMethod.name: newTestObject",
+            "        factoryMethod.args:",
+            "        - frog",
+            "        - 7",
+            "        - $brooklyn:object:",
+            "            type: org.apache.brooklyn.camp.brooklyn.SimpleTestPojo"
+        );
+
+        Object testObject = testEntity.getConfig(TestEntity.CONF_OBJECT);
+
+        Assert.assertTrue(testObject instanceof TestObject, "Expected a TestObject: "+testObject);
+        Assert.assertTrue(managementContextInjected.get());
+        Assert.assertEquals(((TestObject) testObject).getNumber(), Integer.valueOf(8));
+        Assert.assertEquals(((TestObject) testObject).getString(), "frog-suffix");
+
+        Object testObjectObject = ((TestObject) testObject).getObject();
+        Assert.assertTrue(testObjectObject instanceof SimpleTestPojo, "Expected a SimpleTestPojo: "+testObjectObject);
+    }
+
     @Override
     protected Logger getLogger() {
         return log;


[4/4] brooklyn-server git commit: This closes #291

Posted by al...@apache.org.
This closes #291


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

Branch: refs/heads/master
Commit: 374e01f41812fcb82af3d3e2ee9b9b863e4c06e2
Parents: 215c02c 26af0a2
Author: Aled Sage <al...@gmail.com>
Authored: Mon Aug 15 11:31:13 2016 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Aug 15 11:31:13 2016 +0100

----------------------------------------------------------------------
 .../spi/dsl/methods/BrooklynDslCommon.java      | 133 +++++++++++++++----
 .../brooklyn/camp/brooklyn/ObjectsYamlTest.java |  64 +++++++++
 .../brooklyn/core/entity/EntityFunctions.java   |  54 +++++++-
 .../brooklyn/core/entity/EntityPredicates.java  |  72 ++++++++--
 .../core/entity/EntityFunctionsTest.java        |  14 +-
 .../core/entity/EntityPredicatesTest.java       |  58 ++++++--
 6 files changed, 348 insertions(+), 47 deletions(-)
----------------------------------------------------------------------



[2/4] brooklyn-server git commit: Convenience functions to access attributes + config by name.

Posted by al...@apache.org.
Convenience functions to access attributes + config by name.


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

Branch: refs/heads/master
Commit: 33647865f41649f48ce38cbda41a8cd4d9b0e94b
Parents: ddb6acc
Author: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Authored: Fri Aug 5 14:25:48 2016 +0100
Committer: Alasdair Hodge <gi...@alasdairhodge.co.uk>
Committed: Fri Aug 5 15:46:48 2016 +0100

----------------------------------------------------------------------
 .../brooklyn/core/entity/EntityFunctions.java   | 54 +++++++++++++++++++-
 .../core/entity/EntityFunctionsTest.java        | 14 +++--
 2 files changed, 63 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/33647865/core/src/main/java/org/apache/brooklyn/core/entity/EntityFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityFunctions.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityFunctions.java
index c65a176..7d8fa3d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityFunctions.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityFunctions.java
@@ -31,7 +31,9 @@ import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.objs.Identifiable;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
+import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.util.core.flags.TypeCoercions;
 import org.apache.brooklyn.util.guava.Functionals;
 
@@ -141,7 +143,11 @@ public class EntityFunctions {
         }
         return new AppsSupplier();
     }
-    
+
+    public static Function<Entity, Object> attribute(String attributeName) {
+        return attribute(Sensors.newSensor(Object.class, attributeName));
+    }
+
     public static <T> Function<Entity, T> attribute(AttributeSensor<T> attribute) {
         return new GetEntityAttributeFunction<T>(checkNotNull(attribute, "attribute"));
     }
@@ -156,6 +162,26 @@ public class EntityFunctions {
         }
     }
 
+    public static Function<Entity, String> attribute(String attributeName, String format) {
+        return attribute(Sensors.newSensor(Object.class, attributeName), format);
+    }
+
+    public static Function<Entity, String> attribute(AttributeSensor<?> attribute, String format) {
+        return new FormatEntityAttributeFunction(checkNotNull(attribute, "attribute"), checkNotNull(format, "format"));
+    }
+
+    protected static class FormatEntityAttributeFunction implements Function<Entity, String> {
+        private final AttributeSensor<?> attribute;
+        private final String format;
+        protected FormatEntityAttributeFunction(AttributeSensor<?> attribute, String format) {
+            this.attribute = attribute;
+            this.format = format;
+        }
+        @Override public String apply(Entity input) {
+            return (input == null) ? null : String.format(format, input.getAttribute(attribute));
+        }
+    }
+
     public static <T> Function<Object, T> attribute(Entity entity, AttributeSensor<T> attribute) {
         return new GetFixedEntityAttributeFunction<>(entity, attribute);
     }
@@ -172,6 +198,10 @@ public class EntityFunctions {
         }
     }
 
+    public static Function<Entity, Object> config(String keyName) {
+        return config(ConfigKeys.newConfigKey(Object.class, keyName));
+    }
+
     public static <T> Function<Entity, T> config(ConfigKey<T> key) {
         return new GetEntityConfigFunction<T>(checkNotNull(key, "key"));
     }
@@ -188,6 +218,28 @@ public class EntityFunctions {
         }
     }
 
+    public static Function<Entity, String> config(String keyName, String format) {
+        return config(ConfigKeys.newConfigKey(Object.class, keyName), format);
+    }
+
+    public static Function<Entity, String> config(ConfigKey<?> key, String format) {
+        return new FormatEntityConfigFunction(checkNotNull(key, "key"), checkNotNull(format, "format"));
+    }
+
+    protected static class FormatEntityConfigFunction implements Function<Entity, String> {
+        private final ConfigKey<?> key;
+        private final String format;
+
+        protected FormatEntityConfigFunction(ConfigKey<?> key, String format) {
+            this.key = key;
+            this.format = format;
+        }
+
+        @Override public String apply(Entity input) {
+            return (input == null) ? null : String.format(format, input.getConfig(key));
+        }
+    }
+
     public static Function<Entity, String> displayName() {
         return GetEntityDisplayName.INSTANCE;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/33647865/core/src/test/java/org/apache/brooklyn/core/entity/EntityFunctionsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntityFunctionsTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntityFunctionsTest.java
index 6bb9e35..898e5ab 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityFunctionsTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityFunctionsTest.java
@@ -49,6 +49,9 @@ public class EntityFunctionsTest extends BrooklynAppUnitTestSupport {
     public void testAttribute() throws Exception {
         entity.sensors().set(TestEntity.NAME, "myname");
         assertEquals(EntityFunctions.attribute(TestEntity.NAME).apply(entity), "myname");
+        assertEquals(EntityFunctions.attribute(TestEntity.NAME.getName()).apply(entity), "myname");
+        assertEquals(EntityFunctions.attribute(TestEntity.NAME, "%s - suffix").apply(entity), "myname - suffix");
+        assertEquals(EntityFunctions.attribute(TestEntity.NAME.getName(), "%s - suffix").apply(entity), "myname - suffix");
         assertNull(EntityFunctions.attribute(TestEntity.SEQUENCE).apply(entity));
     }
 
@@ -57,24 +60,27 @@ public class EntityFunctionsTest extends BrooklynAppUnitTestSupport {
         entity.sensors().set(TestEntity.NAME, "myname");
         assertEquals(EntityFunctions.attribute(entity, TestEntity.NAME).apply(new Object()), "myname");
     }
-    
+
     @Test
     public void testConfig() throws Exception {
         entity.config().set(TestEntity.CONF_NAME, "myname");
         assertEquals(EntityFunctions.config(TestEntity.CONF_NAME).apply(entity), "myname");
+        assertEquals(EntityFunctions.config(TestEntity.CONF_NAME.getName()).apply(entity), "myname");
+        assertEquals(EntityFunctions.config(TestEntity.CONF_NAME, "%s - suffix").apply(entity), "myname - suffix");
+        assertEquals(EntityFunctions.config(TestEntity.CONF_NAME.getName(), "%s - suffix").apply(entity), "myname - suffix");
         assertNull(EntityFunctions.config(TestEntity.CONF_OBJECT).apply(entity));
     }
-    
+
     @Test
     public void testDisplayName() throws Exception {
         assertEquals(EntityFunctions.displayName().apply(entity), "mydisplayname");
     }
-    
+
     @Test
     public void testId() throws Exception {
         assertEquals(EntityFunctions.id().apply(entity), entity.getId());
     }
-    
+
     @Test
     public void testLocationMatching() throws Exception {
         entity.addLocations(ImmutableList.of(loc));