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 2018/09/04 08:23:55 UTC

[6/9] brooklyn-server git commit: preserve generics info when resolving config keys, more places

preserve generics info when resolving config keys, more places

previously we converted to Class in places, losing generic info for resolution


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

Branch: refs/heads/master
Commit: 312131c8b4032d2c78831af825b96a05e36bce6b
Parents: 3e57b14
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Aug 31 11:15:34 2018 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Aug 31 11:15:34 2018 +0100

----------------------------------------------------------------------
 .../brooklyn/api/effector/ParameterType.java    |  3 ++
 .../brooklyn/camp/brooklyn/spi/dsl/DslTest.java | 27 ++++++----
 .../brooklyn/core/config/BasicConfigKey.java    |  2 +-
 .../config/internal/AbstractConfigMapImpl.java  | 15 +++---
 .../core/effector/BasicParameterType.java       | 38 +++++++++++---
 .../brooklyn/core/effector/EffectorTasks.java   |  2 +-
 .../brooklyn/core/effector/Effectors.java       | 18 +++++--
 .../apache/brooklyn/core/entity/Entities.java   |  2 +-
 .../internal/DeferredBrooklynProperties.java    |  2 +-
 .../core/mgmt/internal/EffectorUtils.java       |  2 +-
 .../brooklyn/core/sensor/StaticSensor.java      |  3 +-
 .../brooklyn/enricher/stock/Transformer.java    |  2 +-
 .../apache/brooklyn/util/core/task/Tasks.java   | 38 ++++++++++----
 .../brooklyn/util/core/task/ValueResolver.java  | 53 +++++++++++---------
 .../util/core/task/ValueResolverIterator.java   |  7 +--
 .../core/effector/EffectorMetadataTest.java     |  2 +-
 .../brooklyn/util/core/task/TasksTest.java      |  3 +-
 .../rest/transform/EffectorTransformer.java     |  2 +-
 18 files changed, 144 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/api/src/main/java/org/apache/brooklyn/api/effector/ParameterType.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/brooklyn/api/effector/ParameterType.java b/api/src/main/java/org/apache/brooklyn/api/effector/ParameterType.java
index 07e86bd..2f0949a 100644
--- a/api/src/main/java/org/apache/brooklyn/api/effector/ParameterType.java
+++ b/api/src/main/java/org/apache/brooklyn/api/effector/ParameterType.java
@@ -22,6 +22,8 @@ import java.io.Serializable;
 
 import javax.management.MBeanParameterInfo;
 
+import com.google.common.reflect.TypeToken;
+
 /**
  * Similar to the concepts in the JMX {@link MBeanParameterInfo} class.
  *
@@ -34,6 +36,7 @@ public interface ParameterType<T> extends Serializable {
     public String getName();
 
     public Class<T> getParameterClass();
+    public TypeToken<T> getParameterType();
 
     /**
      * The canonical name of the parameter class; especially useful if the class 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
index 04b6bf1..c3a7154 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslTest.java
@@ -57,6 +57,7 @@ import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
+import com.google.common.reflect.TypeToken;
 import com.google.common.util.concurrent.ListenableScheduledFuture;
 import com.google.common.util.concurrent.ListeningScheduledExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -96,14 +97,14 @@ public class DslTest extends BrooklynAppUnitTestSupport {
     @Test
     public void testAttributeWhenReadyEmptyDoesNotBlock() throws Exception {
         BrooklynDslDeferredSupplier<?> dsl = BrooklynDslCommon.attributeWhenReady(TestApplication.MY_ATTRIBUTE.getName());
-        Maybe<?> actualValue = execDslRealRealQuick(dsl, TestApplication.MY_ATTRIBUTE.getType(), app);
+        Maybe<?> actualValue = execDslRealRealQuick(dsl, TestApplication.MY_ATTRIBUTE.getTypeToken(), app);
         assertTrue(actualValue.isAbsent());
     }
 
     @Test
     public void testAttributeWhenReadyEmptyImmediatelyDoesNotBlock() throws Exception {
         BrooklynDslDeferredSupplier<?> dsl = BrooklynDslCommon.attributeWhenReady(TestApplication.MY_ATTRIBUTE.getName());
-        Maybe<?> actualValue = execDslImmediately(dsl, TestApplication.MY_ATTRIBUTE.getType(), app, true);
+        Maybe<?> actualValue = execDslImmediately(dsl, TestApplication.MY_ATTRIBUTE.getTypeToken(), app, true);
         assertTrue(actualValue.isAbsent());
     }
 
@@ -211,7 +212,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
         BrooklynDslDeferredSupplier<?> attributeDsl = BrooklynDslCommon.attributeWhenReady(TestApplication.MY_ATTRIBUTE.getName());
         app.config().set((ConfigKey)configKey, attributeDsl); // ugly cast because val is DSL, resolving to a string
         BrooklynDslDeferredSupplier<?> configDsl = BrooklynDslCommon.config(configKey.getName());
-        Maybe<?> actualValue = execDslImmediately(configDsl, configKey.getType(), app, true);
+        Maybe<?> actualValue = execDslImmediately(configDsl, configKey.getTypeToken(), app, true);
         assertTrue(actualValue.isAbsent());
     }
 
@@ -338,13 +339,13 @@ public class DslTest extends BrooklynAppUnitTestSupport {
     private static class DslTestWorker implements Runnable {
         protected final TestApplication parent;
         protected final BrooklynDslDeferredSupplier<?> dsl;
-        protected final Class<?> type;
+        protected final TypeToken<?> type;
         protected EntitySpec<? extends TestEntity> childSpec = EntitySpec.create(TestEntity.class);
         protected int resolverIterations = MANY_RESOLVER_ITERATIONS;
         protected boolean satisfiedAsynchronously = false;
         private boolean wrapInTaskForImmediately = true;
         
-        public DslTestWorker(TestApplication parent, BrooklynDslDeferredSupplier<?> dsl, Class<?> type) {
+        public DslTestWorker(TestApplication parent, BrooklynDslDeferredSupplier<?> dsl, TypeToken<?> type) {
             this.parent = checkNotNull(parent, "parent");
             this.dsl = checkNotNull(dsl, "dsl");
             this.type = checkNotNull(type, "type");
@@ -409,7 +410,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
         private ListenableScheduledFuture<?> future;
 
         public AttributeWhenReadyTestWorker(TestApplication parent, AttributeSensor<String> sensor, BrooklynDslDeferredSupplier<?> dsl) {
-            super(parent, dsl, sensor.getType());
+            super(parent, dsl, sensor.getTypeToken());
             this.sensor = sensor;
         }
 
@@ -449,7 +450,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
 
     private static class SelfTestWorker extends DslTestWorker {
         public SelfTestWorker(TestApplication parent, BrooklynDslDeferredSupplier<?> dsl) {
-            super(parent, dsl, Entity.class);
+            super(parent, dsl, TypeToken.of(Entity.class));
         }
 
         @Override
@@ -465,7 +466,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
 
     private static class ParentTestWorker extends DslTestWorker {
         public ParentTestWorker(TestApplication parent, BrooklynDslDeferredSupplier<?> dsl) {
-            super(parent, dsl, Entity.class);
+            super(parent, dsl, TypeToken.of(Entity.class));
         }
 
         @Override
@@ -488,7 +489,7 @@ public class DslTest extends BrooklynAppUnitTestSupport {
         }
         
         public ConfigTestWorker(TestApplication parent, ConfigKey<?> config, Function<? super Entity, ConfigValuePair> valueFunction, BrooklynDslDeferredSupplier<?> dsl) {
-            super(parent, dsl, config.getType());
+            super(parent, dsl, config.getTypeToken());
             this.config = config;
             this.valueFunction = valueFunction;
         }
@@ -536,6 +537,9 @@ public class DslTest extends BrooklynAppUnitTestSupport {
     }
 
     static Maybe<?> execDslImmediately(final BrooklynDslDeferredSupplier<?> dsl, final Class<?> type, final Entity context, boolean execInTask) throws Exception {
+        return execDslImmediately(dsl, TypeToken.of(type), context, execInTask);
+    }
+    static Maybe<?> execDslImmediately(final BrooklynDslDeferredSupplier<?> dsl, final TypeToken<?> type, final Entity context, boolean execInTask) throws Exception {
         // Exec'ing immediately will call DSL in current thread. It needs to find the context entity,
         // and does this using BrooklynTaskTags.getTargetOrContextEntity(Tasks.current()).
         // If we are not in a task executed by the context entity, then this lookup will fail. 
@@ -560,11 +564,14 @@ public class DslTest extends BrooklynAppUnitTestSupport {
         }
     }
     
-    static Maybe<?> execDslRealRealQuick(BrooklynDslDeferredSupplier<?> dsl, Class<?> type, Entity context) {
+    static Maybe<?> execDslRealRealQuick(BrooklynDslDeferredSupplier<?> dsl, TypeToken<?> type, Entity context) {
         return execDslEventually(dsl, type, context, ValueResolver.REAL_REAL_QUICK_WAIT);
     }
     
     static Maybe<?> execDslEventually(BrooklynDslDeferredSupplier<?> dsl, Class<?> type, Entity context, Duration timeout) {
+        return execDslEventually(dsl, TypeToken.of(type), context, timeout);
+    }
+    static Maybe<?> execDslEventually(BrooklynDslDeferredSupplier<?> dsl, TypeToken<?> type, Entity context, Duration timeout) {
         return Tasks.resolving(dsl).as(type)
                 .context(context)
                 .description("Computing "+dsl)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigKey.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigKey.java b/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigKey.java
index b2ec95d..28026c9 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigKey.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/BasicConfigKey.java
@@ -444,7 +444,7 @@ public class BasicConfigKey<T> implements ConfigKeySelfExtracting<T>, Serializab
         if (ValueResolver.supportsDeepResolution(v)) {
             return Tasks.resolveDeepValue(v, Object.class, exec, "Resolving deep config "+name);
         } else {
-            return Tasks.resolveValue(v, getType(), exec, "Resolving config "+name);
+            return Tasks.resolveValue(v, getTypeToken(), exec, "Resolving config "+name);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java b/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
index 8ee78c8..9e68099 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
@@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import com.google.common.reflect.TypeToken;
 
 public abstract class AbstractConfigMapImpl<TContainer extends BrooklynObject> implements ConfigMapWithInheritance<TContainer> {
 
@@ -363,7 +364,7 @@ public abstract class AbstractConfigMapImpl<TContainer extends BrooklynObject> i
     }
 
     @SuppressWarnings("unchecked")
-    protected <T> T coerceDefaultValue(TContainer container, String name, Object value, Class<T> type) {
+    protected <T> T coerceDefaultValue(TContainer container, String name, Object value, TypeToken<T> type) {
         if (type==null || value==null) return (T) value;
         ExecutionContext exec = getExecutionContext(container);
         try {
@@ -405,7 +406,7 @@ public abstract class AbstractConfigMapImpl<TContainer extends BrooklynObject> i
         final ConfigKey<T> ownKey = ownKey1;
         @SuppressWarnings("unchecked")
         // NB: can't use ""+getContainerImpl() as this can loop in the case of locations looking up ports
-        final Class<T> type = (Class<T>) moreSpecificOrWarningPreferringFirst(ownKey, queryKey, ""+getContainer().getId()+"["+getContainer().getDisplayName()+"]");
+        final TypeToken<T> type = (TypeToken<T>) moreSpecificOrWarningPreferringFirst(ownKey, queryKey, ""+getContainer().getId()+"["+getContainer().getDisplayName()+"]");
 
         // takes type of own key (or query key if own key not available)
         // takes default of own key if available and has default, else of query key
@@ -455,13 +456,13 @@ public abstract class AbstractConfigMapImpl<TContainer extends BrooklynObject> i
         }
     }
 
-    private static Class<?> moreSpecificOrWarningPreferringFirst(ConfigKey<?> ownKey, ConfigKey<?> queryKey, String context) {
+    private static TypeToken<?> moreSpecificOrWarningPreferringFirst(ConfigKey<?> ownKey, ConfigKey<?> queryKey, String context) {
         if (ownKey==null && queryKey==null) return null;
-        if (queryKey==null) return ownKey.getType();
-        if (ownKey==null) return queryKey.getType();
+        if (queryKey==null) return ownKey.getTypeToken();
+        if (ownKey==null) return queryKey.getTypeToken();
         
-        Class<?> ownType = ownKey.getType();
-        Class<?> queryType = queryKey.getType();
+        TypeToken<?> ownType = ownKey.getTypeToken();
+        TypeToken<?> queryType = queryKey.getTypeToken();
         if (queryType.isAssignableFrom(ownType)) {
             // own type is same or more specific, normal path
             return ownType;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/effector/BasicParameterType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/effector/BasicParameterType.java b/core/src/main/java/org/apache/brooklyn/core/effector/BasicParameterType.java
index 264459f..1d6f537 100644
--- a/core/src/main/java/org/apache/brooklyn/core/effector/BasicParameterType.java
+++ b/core/src/main/java/org/apache/brooklyn/core/effector/BasicParameterType.java
@@ -22,15 +22,17 @@ import java.util.Collections;
 import java.util.Map;
 
 import org.apache.brooklyn.api.effector.ParameterType;
+import org.apache.brooklyn.util.core.flags.TypeCoercions;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
+import com.google.common.reflect.TypeToken;
 
 public class BasicParameterType<T> implements ParameterType<T> {
     private static final long serialVersionUID = -5521879180483663919L;
     
     private String name;
-    private Class<T> type;
+    private TypeToken<T> type;
     private String description;
     private Boolean hasDefaultValue = null;
     private T defaultValue = null;
@@ -42,24 +44,40 @@ public class BasicParameterType<T> implements ParameterType<T> {
     @SuppressWarnings("unchecked")
     public BasicParameterType(Map<?, ?> arguments) {
         if (arguments.containsKey("name")) name = (String) arguments.get("name");
-        if (arguments.containsKey("type")) type = (Class<T>) arguments.get("type");
+        if (arguments.containsKey("type")) type = TypeCoercions.coerce(arguments.get("type"), TypeToken.class);
         if (arguments.containsKey("description")) description = (String) arguments.get("description");
         if (arguments.containsKey("defaultValue")) defaultValue = (T) arguments.get("defaultValue");
     }
 
     public BasicParameterType(String name, Class<T> type) {
-        this(name, type, null, null, false);
+        this(name, TypeToken.of(type), null, null, false);
     }
     
     public BasicParameterType(String name, Class<T> type, String description) {
-        this(name, type, description, null, false);
+        this(name, TypeToken.of(type), description, null, false);
     }
     
     public BasicParameterType(String name, Class<T> type, String description, T defaultValue) {
-        this(name, type, description, defaultValue, true);
+        this(name, TypeToken.of(type), description, defaultValue, true);
     }
     
     public BasicParameterType(String name, Class<T> type, String description, T defaultValue, boolean hasDefaultValue) {
+        this(name, TypeToken.of(type), description, defaultValue, hasDefaultValue);
+    }
+    
+    public BasicParameterType(String name, TypeToken<T> type) {
+        this(name, type, null, null, false);
+    }
+    
+    public BasicParameterType(String name, TypeToken<T> type, String description) {
+        this(name, type, description, null, false);
+    }
+    
+    public BasicParameterType(String name, TypeToken<T> type, String description, T defaultValue) {
+        this(name, type, description, defaultValue, true);
+    }
+    
+    public BasicParameterType(String name, TypeToken<T> type, String description, T defaultValue, boolean hasDefaultValue) {
         this.name = name;
         this.type = type;
         this.description = description;
@@ -74,11 +92,15 @@ public class BasicParameterType<T> implements ParameterType<T> {
     @Override
     public String getName() { return name; }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    public Class<T> getParameterClass() { return (Class<T>) type.getRawType(); }
+
     @Override
-    public Class<T> getParameterClass() { return type; }
+    public TypeToken<T> getParameterType() { return type; }
 
     @Override
-    public String getParameterClassName() { return type.getCanonicalName(); }
+    public String getParameterClassName() { return type.toString(); }
 
     @Override
     public String getDescription() { return description; }
@@ -111,7 +133,7 @@ public class BasicParameterType<T> implements ParameterType<T> {
         return (obj instanceof ParameterType) &&
                 Objects.equal(name, ((ParameterType<?>)obj).getName()) &&
                 Objects.equal(description, ((ParameterType<?>)obj).getDescription()) &&
-                Objects.equal(type, ((ParameterType<?>)obj).getParameterClass()) &&
+                Objects.equal(type, ((ParameterType<?>)obj).getParameterType()) &&
                 Objects.equal(defaultValue, ((ParameterType<?>)obj).getDefaultValue());
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/effector/EffectorTasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/effector/EffectorTasks.java b/core/src/main/java/org/apache/brooklyn/core/effector/EffectorTasks.java
index db49227..c2a3c6b 100644
--- a/core/src/main/java/org/apache/brooklyn/core/effector/EffectorTasks.java
+++ b/core/src/main/java/org/apache/brooklyn/core/effector/EffectorTasks.java
@@ -132,7 +132,7 @@ public class EffectorTasks {
     }
     
     public static <T> ConfigKey<T> asConfigKey(ParameterType<T> t) {
-        return ConfigKeys.newConfigKey(t.getParameterClass(), t.getName());
+        return ConfigKeys.newConfigKey(t.getParameterType(), t.getName());
     }
     
     public static <T> ParameterTask<T> parameter(ParameterType<T> t) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/effector/Effectors.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/effector/Effectors.java b/core/src/main/java/org/apache/brooklyn/core/effector/Effectors.java
index 653c607..00dd80d 100644
--- a/core/src/main/java/org/apache/brooklyn/core/effector/Effectors.java
+++ b/core/src/main/java/org/apache/brooklyn/core/effector/Effectors.java
@@ -37,7 +37,6 @@ import org.apache.brooklyn.core.effector.EffectorTasks.EffectorMarkingTaskFactor
 import org.apache.brooklyn.core.effector.EffectorTasks.EffectorTaskFactory;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
-import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.config.ConfigBag;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.text.Strings;
@@ -48,6 +47,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.reflect.TypeToken;
 
 public class Effectors {
 
@@ -81,6 +81,15 @@ public class Effectors {
         public <V> EffectorBuilder<T> parameter(Class<V> paramType, String paramName, String paramDescription, V defaultValue) {
             return parameter(new BasicParameterType<V>(paramName, paramType, paramDescription, defaultValue));
         }
+        public EffectorBuilder<T> parameter(TypeToken<?> paramType, String paramName) {
+            return parameter(paramType, paramName, null, null);
+        }
+        public EffectorBuilder<T> parameter(TypeToken<?> paramType, String paramName, String paramDescription) {
+            return parameter(paramType, paramName, paramDescription, null);                
+        }
+        public <V> EffectorBuilder<T> parameter(TypeToken<V> paramType, String paramName, String paramDescription, V defaultValue) {
+            return parameter(new BasicParameterType<V>(paramName, paramType, paramDescription, defaultValue));
+        }
         public <V> EffectorBuilder<T> parameter(ConfigKey<V> key) {
             return parameter(asParameterType(key));
         }
@@ -165,15 +174,14 @@ public class Effectors {
         throw new UnsupportedOperationException("No implementation registered for effector "+eff+" on "+entity);
     }    
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
     public static <V> ParameterType<V> asParameterType(ConfigKey<V> key) {
         return key.hasDefaultValue()
-            ? new BasicParameterType<V>(key.getName(), (Class)key.getType(), key.getDescription(), key.getDefaultValue())
-            : new BasicParameterType<V>(key.getName(), (Class)key.getType(), key.getDescription());
+            ? new BasicParameterType<V>(key.getName(), key.getTypeToken(), key.getDescription(), key.getDefaultValue())
+            : new BasicParameterType<V>(key.getName(), key.getTypeToken(), key.getDescription());
     }
     
     public static <V> ConfigKey<V> asConfigKey(ParameterType<V> paramType) {
-        return ConfigKeys.newConfigKey(paramType.getParameterClass(), paramType.getName(), paramType.getDescription(), paramType.getDefaultValue());
+        return ConfigKeys.newConfigKey(paramType.getParameterType(), paramType.getName(), paramType.getDescription(), paramType.getDefaultValue());
     }
 
     /** convenience for {@link #invocationParallel(Effector, Map, Iterable)} */

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
index 2e38a34..f794793 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
@@ -1013,7 +1013,7 @@ public class Entities {
             @Override public T get() {
                 try {
                     TypeToken<T> type = new TypeToken<T>(sensor.getType()) {};
-                    return Tasks.resolveValue(task, (Class<T>) type.getRawType(), ((EntityInternal) entity).getExecutionContext(), "attributeSupplierWhenReady");
+                    return Tasks.resolveValue(task, type, ((EntityInternal) entity).getExecutionContext(), "attributeSupplierWhenReady");
                 } catch (Exception e) {
                     throw Exceptions.propagate(e);
                 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
index c57e37e..b391bb2 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/DeferredBrooklynProperties.java
@@ -91,7 +91,7 @@ public class DeferredBrooklynProperties implements BrooklynProperties {
         if (transformed instanceof DeferredSupplier) {
             ExecutionContext exec = mgmt.getServerExecutionContext();
             try {
-                result = Tasks.resolveValue(transformed, key.getType(), exec);
+                result = Tasks.resolveValue(transformed, key.getTypeToken(), exec);
             } catch (ExecutionException | InterruptedException e) {
                 throw Exceptions.propagate(e);
             }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EffectorUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EffectorUtils.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EffectorUtils.java
index 245c1c5..45e9871 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EffectorUtils.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EffectorUtils.java
@@ -164,7 +164,7 @@ public class EffectorUtils {
                 throw new IllegalArgumentException("Invalid arguments (missing argument "+it+") for effector "+eff+": "+Sanitizer.sanitize(m));
             }
 
-            newArgs.add(TypeCoercions.coerce(v, it.getParameterClass()));
+            newArgs.add(TypeCoercions.coerce(v, it.getParameterType()));
             newArgsNeeded--;
         }
         if (newArgsNeeded>0)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java b/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
index 6a609fa..4c10f41 100644
--- a/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
+++ b/core/src/main/java/org/apache/brooklyn/core/sensor/StaticSensor.java
@@ -63,7 +63,6 @@ public class StaticSensor<T> extends AddSensor<T> {
         timeout = params.get(TIMEOUT);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public void apply(final EntityLocal entity) {
         super.apply(entity);
@@ -71,7 +70,7 @@ public class StaticSensor<T> extends AddSensor<T> {
         class ResolveValue implements Callable<Maybe<T>> {
             @Override
             public Maybe<T> call() throws Exception {
-                return Tasks.resolving(value).as((Class<T>)sensor.getType()).timeout(timeout).getMaybe();
+                return Tasks.resolving(value).as(sensor.getTypeToken()).timeout(timeout).getMaybe();
             }
         }
         final Task<Maybe<T>> resolveValue = Tasks.<Maybe<T>>builder().displayName("resolving " + value).body(new ResolveValue()).build();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
index 6b73159..b41de3d 100644
--- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
+++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Transformer.java
@@ -131,7 +131,7 @@ public class Transformer<T,U> extends AbstractTransformer<T,U> {
         // (or Maybe.absent) without blocking.
         // Otherwise, the Tasks.resolving will give it its best shot at resolving without
         // blocking on external events (such as waiting for another entity's sensor).
-        return (U) Tasks.resolving(rawVal).as(targetSensor.getType())
+        return (U) Tasks.resolving(rawVal).as(targetSensor.getTypeToken())
                 .context(entity)
                 .description("Computing sensor "+targetSensor+" from "+rawVal)
                 .deep(true)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
index 8ca3baf..dc42e64 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
@@ -56,6 +56,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
+import com.google.common.reflect.TypeToken;
 
 public class Tasks {
     
@@ -133,35 +134,48 @@ public class Tasks {
     
     /** creates a {@link ValueResolver} instance which allows significantly more customization than
      * the various {@link #resolveValue(Object, Class, ExecutionContext)} methods here */
-    public static <T> ValueResolver<T> resolving(Object v, Class<T> type) {
+    public static <T> ValueResolver<T> resolving(Object v, TypeToken<T> type) {
         return new ValueResolver<T>(v, type);
     }
+    /** @see #resolving(Object, TypeToken) */
+    public static <T> ValueResolver<T> resolving(Object v, Class<T> type) {
+        return new ValueResolver<T>(v, TypeToken.of(type));
+    }
 
     public static ValueResolver.ResolverBuilderPretype resolving(Object v) {
         return new ValueResolver.ResolverBuilderPretype(v);
     }
     
-    @SuppressWarnings("unchecked")
     public static <T> ValueResolver<T> resolving(ConfigBag config, ConfigKey<T> key) {
-        return new ValueResolver.ResolverBuilderPretype(config.getStringKey(key.getName())).as((Class<T>)key.getType());
+        return new ValueResolver.ResolverBuilderPretype(config.getStringKey(key.getName())).as(key.getTypeToken());
     }
 
-    /** @see #resolveValue(Object, Class, ExecutionContext, String) */
-    public static <T> T resolveValue(Object v, Class<T> type, @Nullable ExecutionContext exec) throws ExecutionException, InterruptedException {
+    /** @see #resolveValue(Object, TypeToken, ExecutionContext, String) */
+    public static <T> T resolveValue(Object v, TypeToken<T> type, @Nullable ExecutionContext exec) throws ExecutionException, InterruptedException {
         return new ValueResolver<T>(v, type).context(exec).get();
     }
+    /** @see #resolveValue(Object, TypeToken) */
+    public static <T> T resolveValue(Object v, Class<T> type, @Nullable ExecutionContext exec) throws ExecutionException, InterruptedException {
+        return resolveValue(v, TypeToken.of(type), exec);
+    }
     
     /** attempt to resolve the given value as the given type, waiting on futures, submitting if necessary,
      * and coercing as allowed by TypeCoercions;
      * contextMessage (optional) will be displayed in status reports while it waits (e.g. the name of the config key being looked up).
      * if no execution context supplied (null) this method will throw an exception if the object is an unsubmitted task */
-    public static <T> T resolveValue(Object v, Class<T> type, @Nullable ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
+    public static <T> T resolveValue(Object v, TypeToken<T> type, @Nullable ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
         return new ValueResolver<T>(v, type).context(exec).description(contextMessage).get();
     }
+    /** @see #resolveValue(Object, TypeToken, ExecutionContext, String) */
+    public static <T> T resolveValue(Object v, Class<T> type, @Nullable ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
+        return resolveValue(v, TypeToken.of(type), exec, contextMessage);
+    }
     
-    /**
-     * @see #resolveDeepValue(Object, Class, ExecutionContext, String)
-     */
+    /** @see #resolveDeepValue(Object, TypeToken, ExecutionContext, String) */
+    public static Object resolveDeepValue(Object v, TypeToken<?> type, ExecutionContext exec) throws ExecutionException, InterruptedException {
+        return resolveDeepValue(v, type, exec, null);
+    }
+    /** @see #resolveDeepValue(Object, Class, ExecutionContext, String) */
     public static Object resolveDeepValue(Object v, Class<?> type, ExecutionContext exec) throws ExecutionException, InterruptedException {
         return resolveDeepValue(v, type, exec, null);
     }
@@ -178,9 +192,13 @@ public class Tasks {
      * {@link #resolveValue(Object, Class, ExecutionContext, String)} which will accept {@link Map} and {@link Collection}
      * as the required type.
      */
-    public static <T> T resolveDeepValue(Object v, Class<T> type, ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
+    public static <T> T resolveDeepValue(Object v, TypeToken<T> type, ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
         return new ValueResolver<T>(v, type).context(exec).deep(true).description(contextMessage).get();
     }
+    /** @see #resolveDeepValue(Object, TypeToken, ExecutionContext, String) */
+    public static <T> T resolveDeepValue(Object v, Class<T> type, ExecutionContext exec, String contextMessage) throws ExecutionException, InterruptedException {
+        return resolveDeepValue(v, TypeToken.of(type), exec, contextMessage);
+    }
 
     /** sets extra status details on the current task, if possible (otherwise does nothing).
      * the extra status is presented in Task.getStatusDetails(true)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
index e91693c..f6588f8 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolver.java
@@ -105,7 +105,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
     private static final Logger log = LoggerFactory.getLogger(ValueResolver.class);
     
     final Object value;
-    final Class<T> type;
+    final TypeToken<T> typeT;
     ExecutionContext exec;
     String description;
     boolean forceDeep;
@@ -127,17 +127,17 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
     AtomicBoolean started = new AtomicBoolean(false);
     boolean expired;
     
-    ValueResolver(Object v, Class<T> type) {
+    ValueResolver(Object v, TypeToken<T> type) {
         this.value = v;
-        this.type = type;
+        this.typeT = type;
         checkTypeNotNull();
         parentOriginalValue = null;
         parentTimer = null;
     }
     
-    ValueResolver(Object v, Class<T> type, ValueResolver<?> parent) {
+    ValueResolver(Object v, TypeToken<T> type, ValueResolver<?> parent) {
         this.value = v;
-        this.type = type;
+        this.typeT = type;
         checkTypeNotNull();
         
         exec = parent.exec;
@@ -163,6 +163,9 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
             this.v = v;
         }
         public <T> ValueResolver<T> as(Class<T> type) {
+            return as(TypeToken.of(type));
+        }
+        public <T> ValueResolver<T> as(TypeToken<T> type) {
             return new ValueResolver<T>(v, type);
         }
     }
@@ -170,13 +173,13 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
     /** returns a copy of this resolver which can be queried, even if the original (single-use instance) has already been copied */
     @Override
     public ValueResolver<T> clone() {
-        return cloneReplacingValueAndType(value, type);
+        return cloneReplacingValueAndType(value, typeT);
     }
     
-    <S> ValueResolver<S> cloneReplacingValueAndType(Object newValue, Class<S> superType) {
+    <S> ValueResolver<S> cloneReplacingValueAndType(Object newValue, TypeToken<S> superType) {
         // superType expected to be either type or Object.class
-        if (!superType.isAssignableFrom(type)) {
-            throw new IllegalStateException("superType must be assignable from " + type);
+        if (!superType.isAssignableFrom(typeT)) {
+            throw new IllegalStateException("superType must be assignable from " + typeT);
         }
         ValueResolver<S> result = new ValueResolver<S>(newValue, superType)
             .context(exec).description(description)
@@ -186,7 +189,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
             .immediately(immediately)
             .recursive(recursive);
         if (returnDefaultOnGet) {
-            if (!superType.isInstance(defaultValue)) {
+            if (!superType.getRawType().isInstance(defaultValue)) {
                 throw new IllegalStateException("Existing default value " + defaultValue + " not compatible with new type " + superType);
             }
             @SuppressWarnings("unchecked")
@@ -303,7 +306,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
     }
 
     protected void checkTypeNotNull() {
-        if (type==null) 
+        if (typeT==null) 
             throw new NullPointerException("type must be set to resolve, for '"+value+"'"+(description!=null ? ", "+description : ""));
     }
 
@@ -345,7 +348,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
             exec = BasicExecutionContext.getCurrentExecutionContext();
         }
         
-        if (!recursive && type != Object.class) {
+        if (!recursive && typeT.getRawType() != Object.class) {
             throw new IllegalStateException("When non-recursive resolver requested the return type must be Object " +
                     "as the immediately resolved value could be a number of (deferred) types.");
         }
@@ -362,7 +365,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
         
         //if the expected type is a closure or map and that's what we have, we're done (or if it's null);
         //but not allowed to return a future or DeferredSupplier as the resolved value
-        if (v==null || (!forceDeep && type.isInstance(v) && !Future.class.isInstance(v) && !DeferredSupplier.class.isInstance(v) && !TaskFactory.class.isInstance(v)))
+        if (v==null || (!forceDeep && typeT.getRawType().isInstance(v) && !Future.class.isInstance(v) && !DeferredSupplier.class.isInstance(v) && !TaskFactory.class.isInstance(v)))
             return Maybe.of((T) v);
         
         try {
@@ -406,7 +409,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
                     
                     return (result.isPresent())
                         ? recursive
-                            ? new ValueResolver<T>(result.get(), type, this).getMaybe()
+                            ? new ValueResolver<T>(result.get(), typeT, this).getMaybe()
                                 : result
                                 : result;
                 } catch (ImmediateSupplier.ImmediateUnsupportedException e) {
@@ -512,6 +515,10 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
 
             } else {
                 if (supportsDeepResolution(v)) {
+
+                    // FIXME-TT why is this done
+                    if (2>1) throw new IllegalStateException("Deep resolution with type "+typeT);
+                        
                     // restrict deep resolution to the same set of types as calling code;
                     // in particular need to avoid for "interesting iterables" such as PortRange
                     
@@ -519,11 +526,11 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
                         //and if a map or list we look inside
                         Map result = Maps.newLinkedHashMap();
                         for (Map.Entry<?,?> entry : ((Map<?,?>)v).entrySet()) {
-                            Maybe<?> kk = new ValueResolver(entry.getKey(), type, this)
+                            Maybe<?> kk = new ValueResolver(entry.getKey(), typeT, this)
                                 .description( (description!=null ? description+", " : "") + "map key "+entry.getKey() )
                                 .getMaybe();
                             if (kk.isAbsent()) return (Maybe<T>)kk;
-                            Maybe<?> vv = new ValueResolver(entry.getValue(), type, this)
+                            Maybe<?> vv = new ValueResolver(entry.getValue(), typeT, this)
                                 .description( (description!=null ? description+", " : "") + "map value for key "+kk.get() )
                                 .getMaybe();
                             if (vv.isAbsent()) return (Maybe<T>)vv;
@@ -535,7 +542,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
                         Set result = Sets.newLinkedHashSet();
                         int count = 0;
                         for (Object it : (Set)v) {
-                            Maybe<?> vv = new ValueResolver(it, type, this)
+                            Maybe<?> vv = new ValueResolver(it, typeT, this)
                                 .description( (description!=null ? description+", " : "") + "entry "+count )
                                 .getMaybe();
                             if (vv.isAbsent()) return (Maybe<T>)vv;
@@ -548,7 +555,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
                         List result = Lists.newArrayList();
                         int count = 0;
                         for (Object it : (Iterable)v) {
-                            Maybe<?> vv = new ValueResolver(it, type, this)
+                            Maybe<?> vv = new ValueResolver(it, typeT, this)
                                 .description( (description!=null ? description+", " : "") + "entry "+count )
                                 .getMaybe();
                             if (vv.isAbsent()) return (Maybe<T>)vv;
@@ -559,7 +566,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
                     }
                 }
                 
-                return TypeCoercions.tryCoerce(v, TypeToken.of(type));
+                return TypeCoercions.tryCoerce(v, typeT);
             }
 
         } catch (Exception e) {
@@ -579,7 +586,7 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
         }
         
         if (recursive) {
-            return new ValueResolver(v, type, this).getMaybe();
+            return new ValueResolver(v, typeT, this).getMaybe();
         } else {
             return (Maybe<T>) Maybe.of(v);
         }
@@ -598,12 +605,12 @@ public class ValueResolver<T> implements DeferredSupplier<T>, Iterable<Maybe<Obj
         if (parentOriginalValue!=null) return parentOriginalValue;
         return value;
     }
-    protected Class<T> getType() {
-        return type;
+    protected TypeToken<T> getTypeToken() {
+        return typeT;
     }
 
     @Override
     public String toString() {
-        return JavaClassNames.cleanSimpleClassName(this)+"["+JavaClassNames.cleanSimpleClassName(type)+" "+value+"]";
+        return JavaClassNames.cleanSimpleClassName(this)+"["+typeT+" "+value+"]";
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolverIterator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolverIterator.java b/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolverIterator.java
index 0e6fe4d..39c5faf 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolverIterator.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/ValueResolverIterator.java
@@ -27,6 +27,7 @@ import org.apache.brooklyn.util.guava.Maybe;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
+import com.google.common.reflect.TypeToken;
 
 /**
  * Resolve one step at a time, returning intermediate results or absent if there's a resolve error.
@@ -118,7 +119,7 @@ public class ValueResolverIterator<T> implements Iterator<Maybe<Object>> {
     }
 
     private ValueResolver<Object> createIterativeResolver(Object value) {
-        return resolver.cloneReplacingValueAndType(value, Object.class)
+        return resolver.cloneReplacingValueAndType(value, TypeToken.of(Object.class))
             .recursive(false);
     }
 
@@ -179,10 +180,10 @@ public class ValueResolverIterator<T> implements Iterator<Maybe<Object>> {
                 return (Maybe<T>) last;
             }
         }
-        return coerceValue(last, resolver.getType());
+        return coerceValue(last, resolver.getTypeToken());
     }
 
-    private Maybe<T> coerceValue(Maybe<Object> valueMaybe, Class<T> type) {
+    private Maybe<T> coerceValue(Maybe<Object> valueMaybe, TypeToken<T> type) {
         if (valueMaybe.isPresent()) {
             T coercedValue = TypeCoercions.coerce(valueMaybe.get(), type);
             return Maybe.of(coercedValue);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/test/java/org/apache/brooklyn/core/effector/EffectorMetadataTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/effector/EffectorMetadataTest.java b/core/src/test/java/org/apache/brooklyn/core/effector/EffectorMetadataTest.java
index 1f1be85..afc8a1c 100644
--- a/core/src/test/java/org/apache/brooklyn/core/effector/EffectorMetadataTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/effector/EffectorMetadataTest.java
@@ -112,7 +112,7 @@ public class EffectorMetadataTest extends BrooklynAppUnitTestSupport {
     private void assertParameterEqual(ParameterType<?> actual, ParameterType<?> expected) {
         assertEquals(actual.getName(), expected.getName(), "actual="+actual);
         assertEquals(actual.getDescription(), expected.getDescription(), "actual="+actual);
-        assertEquals(actual.getParameterClass(), expected.getParameterClass(), "actual="+actual);
+        assertEquals(actual.getParameterType(), expected.getParameterType(), "actual="+actual);
         assertEquals(actual.getParameterClassName(), expected.getParameterClassName(), "actual="+actual);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/core/src/test/java/org/apache/brooklyn/util/core/task/TasksTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/util/core/task/TasksTest.java b/core/src/test/java/org/apache/brooklyn/util/core/task/TasksTest.java
index 6b4a795..e36fadd 100644
--- a/core/src/test/java/org/apache/brooklyn/util/core/task/TasksTest.java
+++ b/core/src/test/java/org/apache/brooklyn/util/core/task/TasksTest.java
@@ -49,6 +49,7 @@ import org.testng.annotations.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.reflect.TypeToken;
 import com.google.common.util.concurrent.Callables;
 
 
@@ -113,7 +114,7 @@ public class TasksTest extends BrooklynAppUnitTestSupport {
     }
     
     private void assertResolvesValue(Object actual, Class<?> type, Object expected) throws Exception {
-        Object result = Tasks.resolveValue(actual, type, executionContext);
+        Object result = Tasks.resolveValue(actual, TypeToken.of(type), executionContext);
         assertEquals(result, expected);
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/312131c8/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
index 9569425..b54cfae 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/EffectorTransformer.java
@@ -80,7 +80,7 @@ public class EffectorTransformer {
     protected static EffectorSummary.ParameterSummary<?> parameterSummary(Entity entity, ParameterType<?> parameterType) {
         try {
             Maybe<?> defaultValue = Tasks.resolving(parameterType.getDefaultValue())
-                    .as(parameterType.getParameterClass())
+                    .as(parameterType.getParameterType())
                     .context(entity)
                     .immediately(true)
                     .getMaybe();