You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/04/24 09:47:30 UTC
[1/2] brooklyn-server git commit: BROOKLYN-482: yaml config key
default vals immutable
Repository: brooklyn-server
Updated Branches:
refs/heads/master b08c48298 -> 547feec96
BROOKLYN-482: yaml config key default vals immutable
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/15da8e50
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/15da8e50
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/15da8e50
Branch: refs/heads/master
Commit: 15da8e50aa4cb8618da3948cbefa614c50877bc5
Parents: eb4992e
Author: Aled Sage <al...@gmail.com>
Authored: Thu Apr 20 16:34:50 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 20 16:43:43 2017 +0100
----------------------------------------------------------------------
.../camp/brooklyn/ConfigParametersYamlTest.java | 67 ++++++++++++++++++++
.../brooklyn/core/objs/BasicSpecParameter.java | 26 +++++++-
2 files changed, 92 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/15da8e50/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
index f3ce7f7..53193aa 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ConfigParametersYamlTest.java
@@ -23,10 +23,12 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.Callable;
import org.apache.brooklyn.api.entity.Entity;
@@ -67,7 +69,9 @@ import org.testng.annotations.Test;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
public class ConfigParametersYamlTest extends AbstractYamlRebindTest {
@@ -528,6 +532,69 @@ public class ConfigParametersYamlTest extends AbstractYamlRebindTest {
assertEquals(env.get("TEST"), "myDefaultParamVal", "env="+env);
}
+ @Test
+ public void testDefaultValsImmutable() throws Exception {
+ addCatalogItems(
+ "brooklyn.catalog:",
+ " itemType: entity",
+ " items:",
+ " - id: entity-with-keys",
+ " item:",
+ " type: "+TestEntity.class.getName(),
+ " brooklyn.parameters:",
+ " - name: my.list.key",
+ " type: java.util.List",
+ " default: [\"myDefaultVal\"]",
+ " - name: my.set.key",
+ " type: "+java.util.Set.class.getName(),
+ " default: [\"myDefaultVal\"]",
+ " - name: my.collection.key",
+ " type: "+java.util.Collection.class.getName(),
+ " default: [\"myDefaultVal\"]",
+ " - name: my.map.key",
+ " type: "+java.util.Map.class.getName(),
+ " default: {\"myDefaultKey\":\"myDefaultVal\"}");
+
+ String yaml = Joiner.on("\n").join(
+ "services:",
+ "- type: entity-with-keys");
+ Entity app = createStartWaitAndLogApplication(yaml);
+ TestEntity entity = (TestEntity) Iterables.getOnlyElement(app.getChildren());
+ List<?> list = (List<?>) entity.config().get(entity.getEntityType().getConfigKey("my.list.key"));
+ Set<?> set = (Set<?>) entity.config().get(entity.getEntityType().getConfigKey("my.set.key"));
+ Collection<?> collection = (Collection<?>) entity.config().get(entity.getEntityType().getConfigKey("my.set.key"));
+ Map<?, ?> map = (Map<?, ?>) entity.config().get(entity.getEntityType().getConfigKey("my.map.key"));
+
+ assertEquals(list, ImmutableList.of("myDefaultVal"));
+ assertEquals(set, ImmutableSet.of("myDefaultVal"));
+ assertEquals(collection, ImmutableList.of("myDefaultVal"));
+ assertEquals(map, ImmutableMap.of("myDefaultKey", "myDefaultVal"));
+ assertImmutable(list);
+ assertImmutable(set);
+ assertImmutable(collection);
+ assertImmutable(map);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void assertImmutable(Collection<?> val) {
+ try {
+ ((Collection<Object>)val).add("myNewVal");
+ Asserts.shouldHaveFailedPreviously("Collection of type " + val.getClass().getName() + " was mutable");
+ } catch (UnsupportedOperationException e) {
+ // expected - success
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void assertImmutable(Map<?,?> val) {
+ try {
+ ((Map<Object, Object>)val).put("myNewKey", "myNewVal");
+ Asserts.shouldHaveFailedPreviously("Map of type " + val.getClass().getName() + " was mutable");
+ } catch (UnsupportedOperationException e) {
+ // expected - success
+ }
+ }
+
// See https://issues.apache.org/jira/browse/BROOKLYN-328
@Test
public void testConfigParameterOverridingJavaConfig() throws Exception {
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/15da8e50/core/src/main/java/org/apache/brooklyn/core/objs/BasicSpecParameter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/BasicSpecParameter.java b/core/src/main/java/org/apache/brooklyn/core/objs/BasicSpecParameter.java
index 0dbc450..e6194fe 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/BasicSpecParameter.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/BasicSpecParameter.java
@@ -28,6 +28,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.brooklyn.api.catalog.CatalogConfig;
import org.apache.brooklyn.api.entity.Entity;
@@ -52,6 +53,7 @@ import org.apache.brooklyn.core.config.ConfigKeys.InheritanceContext;
import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.collections.MutableSet;
import org.apache.brooklyn.util.guava.Maybe;
import org.apache.brooklyn.util.text.StringPredicates;
import org.apache.brooklyn.util.time.Duration;
@@ -290,10 +292,12 @@ public class BasicSpecParameter<T> implements SpecParameter<T>{
boolean hasType = type!=null;
TypeToken typeToken = inferType(type, loader);
+ Object immutableDefaultValue = tryToImmutable(defaultValue, typeToken);
+
Builder builder = BasicConfigKey.builder(typeToken)
.name(name)
.description(description)
- .defaultValue(defaultValue)
+ .defaultValue(immutableDefaultValue)
.constraint(constraint)
.runtimeInheritance(runtimeInheritance)
.typeInheritance(typeInheritance);
@@ -309,6 +313,26 @@ public class BasicSpecParameter<T> implements SpecParameter<T>{
hasType, hasDefaultValue, hasConstraints, hasRuntimeInheritance, hasTypeInheritance);
}
+ private static Object tryToImmutable(Object val, TypeToken<?> type) {
+ Object result;
+ if (Set.class.isAssignableFrom(type.getRawType()) && val instanceof Iterable) {
+ result = Collections.unmodifiableSet(MutableSet.copyOf((Iterable<?>)val));
+ } else if (val instanceof Iterable) {
+ result = Collections.unmodifiableList(MutableList.copyOf((Iterable<?>)val));
+ } else if (val instanceof Map) {
+ result = Collections.unmodifiableMap(MutableMap.copyOf((Map<?, ?>)val));
+ } else {
+ return val;
+ }
+
+ if (type != null && !type.isAssignableFrom(result.getClass())) {
+ log.warn("Unable to convert parameter default value (type "+type+") to immutable");
+ return val;
+ } else {
+ return result;
+ }
+ }
+
@SuppressWarnings({ "rawtypes" })
private static TypeToken inferType(String typeRaw, BrooklynClassLoadingContext loader) {
if (typeRaw == null) return TypeToken.of(String.class);
[2/2] brooklyn-server git commit: This closes #642
Posted by dr...@apache.org.
This closes #642
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/547feec9
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/547feec9
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/547feec9
Branch: refs/heads/master
Commit: 547feec962e127d7b5c784a3a7860c4b77a42fec
Parents: b08c482 15da8e5
Author: Duncan Godwin <dr...@googlemail.com>
Authored: Mon Apr 24 10:47:14 2017 +0100
Committer: Duncan Godwin <dr...@googlemail.com>
Committed: Mon Apr 24 10:47:14 2017 +0100
----------------------------------------------------------------------
.../camp/brooklyn/ConfigParametersYamlTest.java | 67 ++++++++++++++++++++
.../brooklyn/core/objs/BasicSpecParameter.java | 26 +++++++-
2 files changed, 92 insertions(+), 1 deletion(-)
----------------------------------------------------------------------