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

Reply via email to