This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit f344691d0a8195f7c47eda68a46f296ebf844083 Author: Alex Heneveld <[email protected]> AuthorDate: Wed Feb 13 21:10:43 2019 +0000 control the order in which type coercions are applied --- .../apache/brooklyn/util/core/flags/TypeCoercions.java | 4 ++-- .../brooklyn/location/jclouds/JcloudsTypeCoercions.java | 4 ++-- .../util/javalang/coerce/CommonAdaptorTryCoercions.java | 12 ++++++------ .../util/javalang/coerce/CommonAdaptorTypeCoercions.java | 6 +++--- .../util/javalang/coerce/TypeCoercerExtensible.java | 15 +++++++++++---- .../util/javalang/coerce/TypeCoercerExtensibleTest.java | 3 ++- 6 files changed, 26 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java b/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java index 84b3b10..7c9abdb 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java @@ -87,8 +87,8 @@ public class TypeCoercions { } @Beta - public static void registerAdapter(TryCoercer fn) { - coercer.registerAdapter(fn); + public static void registerAdapter(String nameAndOrder, TryCoercer fn) { + coercer.registerAdapter(nameAndOrder, fn); } public static <T> Function<Object, T> function(final Class<T> type) { diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsTypeCoercions.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsTypeCoercions.java index 56534ed..c408ee2 100644 --- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsTypeCoercions.java +++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsTypeCoercions.java @@ -47,8 +47,8 @@ public class JcloudsTypeCoercions { public static void init() { synchronized (initialized) { if (initialized.compareAndSet(false, true)) { - TypeCoercions.registerAdapter(new CoercionFromAutoValueBuilder()); - TypeCoercions.registerAdapter(new CoercionFromAutoValueCreate()); + TypeCoercions.registerAdapter("20-jclouds-auto-value-builder", new CoercionFromAutoValueBuilder()); + TypeCoercions.registerAdapter("20-jclouds-auto-value-creator", new CoercionFromAutoValueCreate()); } } } diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTryCoercions.java b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTryCoercions.java index 890b8b7..4402cc8 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTryCoercions.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTryCoercions.java @@ -46,16 +46,16 @@ public class CommonAdaptorTryCoercions { } public CommonAdaptorTryCoercions registerAllAdapters() { - registerAdapter(new TryCoercerWithFromMethod()); - registerAdapter(new TryCoercerToEnum()); - registerAdapter(new TryCoercerToArray(coercer)); - registerAdapter(new TryCoercerForPrimitivesAndStrings()); + registerAdapter("11-with-from-method", new TryCoercerWithFromMethod()); + registerAdapter("12-enum", new TryCoercerToEnum()); + registerAdapter("13-toArray", new TryCoercerToArray(coercer)); + registerAdapter("15-primitives", new TryCoercerForPrimitivesAndStrings()); return this; } /** Registers an adapter for use with type coercion. */ - public synchronized void registerAdapter(TryCoercer fn) { - coercer.registerAdapter(fn); + public synchronized void registerAdapter(String nameAndOrder, TryCoercer fn) { + coercer.registerAdapter(nameAndOrder, fn); } protected static class TryCoercerWithFromMethod implements TryCoercer { diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTypeCoercions.java b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTypeCoercions.java index 0842f19..ede2afb 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTypeCoercions.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/CommonAdaptorTypeCoercions.java @@ -81,8 +81,8 @@ public class CommonAdaptorTypeCoercions { return coercer.registerAdapter(sourceType, targetType, fn); } /** Registers an adapter for use with type coercion. */ - public synchronized void registerAdapter(TryCoercer coerceFn) { - coercer.registerAdapter(coerceFn); + public synchronized void registerAdapter(String nameAndOrder, TryCoercer coerceFn) { + coercer.registerAdapter(nameAndOrder, coerceFn); } @SuppressWarnings("rawtypes") @@ -372,7 +372,7 @@ public class CommonAdaptorTypeCoercions { } public void registerCollectionJsonAdapters() { - registerAdapter(new CoerceStringToCollections()); + registerAdapter("20-strings-to-collections", new CoerceStringToCollections()); } /** Does a rough coercion of the string to the indicated Collection or Map type. diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java index 64e91b4..fd49ddb 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.util.javalang.coerce; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; @@ -41,6 +42,7 @@ import com.google.common.annotations.Beta; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.collect.HashBasedTable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -91,8 +93,10 @@ public class TypeCoercerExtensible implements TypeCoercer { /** Store the coercion {@link Function functions} in a {@link Table table}. */ private final Table<Class<?>, Class<?>, Function<?,?>> registry = HashBasedTable.create(); - /** Store the generic coercers. */ - private final List<TryCoercer> genericCoercers = Lists.newCopyOnWriteArrayList(); + /** Store the generic coercers, ordered by the name. */ + private final Map<String,TryCoercer> genericCoercersByName = Maps.newTreeMap(); + /** Put the list in a cache, reset each time the map is updated. */ + private List<TryCoercer> genericCoercers = new ArrayList<>(); @Override public <T> T coerce(Object value, Class<T> targetType) { @@ -320,7 +324,10 @@ public class TypeCoercerExtensible implements TypeCoercer { /** Registers a generic adapter for use with type coercion. */ @Beta - public synchronized void registerAdapter(TryCoercer fn) { - genericCoercers.add(fn); + public synchronized void registerAdapter(String nameAndOrder, TryCoercer fn) { + synchronized (genericCoercersByName) { + genericCoercersByName.put(nameAndOrder, fn); + genericCoercers = ImmutableList.copyOf(genericCoercersByName.values()); + } } } diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensibleTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensibleTest.java index afb10f9..a924ca8 100644 --- a/utils/common/src/test/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensibleTest.java +++ b/utils/common/src/test/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensibleTest.java @@ -23,6 +23,7 @@ import static org.testng.Assert.assertEquals; import java.util.Objects; import org.apache.brooklyn.util.guava.Maybe; +import org.apache.brooklyn.util.text.Strings; import org.testng.annotations.Test; import com.google.common.base.MoreObjects; @@ -41,7 +42,7 @@ public class TypeCoercerExtensibleTest { @Test public void testRegisterNewGenericCoercer() { - coercer.registerAdapter(new TryCoercer() { + coercer.registerAdapter("test-"+Strings.makeRandomId(4), new TryCoercer() { @Override @SuppressWarnings("unchecked") public <T> Maybe<T> tryCoerce(Object input, TypeToken<T> type) {
