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));