You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2017/09/13 16:45:06 UTC

[2/5] brooklyn-server git commit: optimization: cache common type tokens

optimization: cache common type tokens


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

Branch: refs/heads/master
Commit: 22acd5d6301898e0d226588fae0f7dd8344cd465
Parents: 98dfee2
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Mon Sep 11 23:14:59 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Tue Sep 12 22:12:36 2017 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/util/guava/TypeTokens.java  | 23 +++++++++++++++++---
 .../javalang/coerce/TypeCoercerExtensible.java  | 15 ++++++++-----
 2 files changed, 30 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/22acd5d6/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java b/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
index 188f328..657a790 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/guava/TypeTokens.java
@@ -24,6 +24,14 @@ import com.google.common.reflect.TypeToken;
 
 public class TypeTokens {
 
+    // creating TypeToken is surprisingly expensive so cache these common ones
+    public static TypeToken<String> STRING = TypeToken.of(String.class);
+    public static TypeToken<Object> OBJECT = TypeToken.of(Object.class);
+    public static TypeToken<Integer> INTEGER = TypeToken.of(Integer.class);
+    public static TypeToken<Boolean> BOOLEAN = TypeToken.of(Boolean.class);
+    public static TypeToken<Double> DOUBLE = TypeToken.of(Double.class);
+    public static TypeToken<Long> LONG = TypeToken.of(Long.class);
+    
     /** returns raw type, if it's raw, else null;
      * used e.g. to set only one of the raw type or the type token,
      * for instance to make serialized output nicer */
@@ -47,9 +55,10 @@ public class TypeTokens {
     }
     
     /** given either a token or a raw type, returns the raw type */
-    public static <T> Class<? super T> getRawType(TypeToken<T> token, Class<? super T> raw) {
+    @SuppressWarnings("unchecked")
+    public static <T,U extends T> Class<T> getRawType(TypeToken<U> token, Class<T> raw) {
         if (raw!=null) return raw;
-        if (token!=null) return token.getRawType();
+        if (token!=null) return (Class<T>) token.getRawType();
         throw new IllegalStateException("Both indicators of type are null");
     }
     
@@ -58,7 +67,15 @@ public class TypeTokens {
     @SuppressWarnings("unchecked")
     public static <T> TypeToken<T> getTypeToken(TypeToken<T> token, Class<? super T> raw) {
         if (token!=null) return token;
-        if (raw!=null) return TypeToken.of((Class<T>)raw);
+        if (raw!=null) {
+            if (String.class.equals(raw)) return (TypeToken<T>) STRING;
+            if (Object.class.equals(raw)) return (TypeToken<T>) OBJECT;
+            if (Integer.class.equals(raw)) return (TypeToken<T>) INTEGER;
+            if (Boolean.class.equals(raw)) return (TypeToken<T>) BOOLEAN;
+            if (Double.class.equals(raw)) return (TypeToken<T>) DOUBLE;
+            if (Long.class.equals(raw)) return (TypeToken<T>) LONG;
+            return TypeToken.of((Class<T>)raw);
+        }
         throw new IllegalStateException("Both indicators of type are null");
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/22acd5d6/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java
----------------------------------------------------------------------
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 fdf1940..3465c09 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
@@ -28,6 +28,7 @@ import java.util.Set;
 
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe;
+import org.apache.brooklyn.util.guava.TypeTokens;
 import org.apache.brooklyn.util.javalang.Boxing;
 import org.apache.brooklyn.util.javalang.Reflections;
 import org.apache.brooklyn.util.time.Duration;
@@ -103,24 +104,27 @@ public class TypeCoercerExtensible implements TypeCoercer {
     
     @Override
     public <T> Maybe<T> tryCoerce(Object input, Class<T> type) {
-        return tryCoerce(input, TypeToken.of(type));
+        return changeExceptionSupplier( tryCoerceInternal(input, null, type) );
     }
 
     @Override
     public <T> Maybe<T> tryCoerce(Object value, TypeToken<T> targetTypeToken) {
-        Maybe<T> result = tryCoerceInternal(value, targetTypeToken);
+        return changeExceptionSupplier( tryCoerceInternal(value, targetTypeToken, null) );
+    }
+
+    protected <T> Maybe<T> changeExceptionSupplier(Maybe<T> result) {
         return Maybe.Absent.changeExceptionSupplier(result, ClassCoercionException.class);
     }
     
     @SuppressWarnings("unchecked")
-    protected <T> Maybe<T> tryCoerceInternal(Object value, TypeToken<T> targetTypeToken) {
+    protected <T> Maybe<T> tryCoerceInternal(Object value, TypeToken<T> targetTypeToken, Class<T> targetType) {
         if (value==null) return Maybe.of((T)null);
-        Class<? super T> targetType = targetTypeToken.getRawType();
         Maybe<T> result = null;
         Maybe<T> firstError = null;
 
         //recursive coercion of parameterized collections and map entries
-        if (targetTypeToken.getType() instanceof ParameterizedType) {
+        targetType = TypeTokens.getRawType(targetTypeToken, targetType);
+        if (targetTypeToken!=null && targetTypeToken.getType() instanceof ParameterizedType) {
             if (value instanceof Iterable && Iterable.class.isAssignableFrom(targetType)) {
                 result = tryCoerceIterable(value, targetTypeToken, targetType);
                 
@@ -154,6 +158,7 @@ public class TypeCoercerExtensible implements TypeCoercer {
         
         if (targetType.isInstance(value)) return Maybe.of( (T) value );
 
+        targetTypeToken = TypeTokens.getTypeToken(targetTypeToken, targetType);
         for (TryCoercer coercer : genericCoercers) {
             result = coercer.tryCoerce(value, targetTypeToken);
             if (result!=null && result.isPresent()) return result;