accept primitive names (e.g. `int`) when adding sensors
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/1354d036 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/1354d036 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/1354d036 Branch: refs/heads/master Commit: 1354d0361d34447d0e439574bd008f42aa5dc105 Parents: 5af2925 Author: Alex Heneveld <[email protected]> Authored: Mon Apr 20 13:31:47 2015 +0100 Committer: Alex Heneveld <[email protected]> Committed: Mon Apr 20 13:33:01 2015 +0100 ---------------------------------------------------------------------- .../java/brooklyn/entity/basic/ConfigKeys.java | 5 +-- .../brooklyn/entity/effector/AddSensor.java | 5 +++ .../java/brooklyn/util/javalang/Boxing.java | 15 ++++++++ .../java/brooklyn/util/javalang/BoxingTest.java | 37 ++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1354d036/core/src/main/java/brooklyn/entity/basic/ConfigKeys.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/basic/ConfigKeys.java b/core/src/main/java/brooklyn/entity/basic/ConfigKeys.java index 85b83dc..2b22a90 100644 --- a/core/src/main/java/brooklyn/entity/basic/ConfigKeys.java +++ b/core/src/main/java/brooklyn/entity/basic/ConfigKeys.java @@ -235,10 +235,11 @@ public class ConfigKeys { public static final ConfigKey<Object> DEFAULT_VALUE = ConfigKeys.newConfigKey(Object.class, "defaultValue"); public static ConfigKey<?> newInstance(ConfigBag keyDefs) { - // TODO dynamic typing - see TYPE key commented out above String typeName = Strings.toString(keyDefs.getStringKey("type")); - if (Strings.isNonBlank(typeName)) + if (Strings.isNonBlank(typeName)) { + // TODO dynamic typing - see TYPE key commented out above; also see AddSensor.getType for type lookup log.warn("Setting 'type' is not currently supported for dynamic config keys; ignoring in definition of "+keyDefs); + } Class<Object> type = Object.class; String name = keyDefs.get(NAME); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1354d036/core/src/main/java/brooklyn/entity/effector/AddSensor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/entity/effector/AddSensor.java b/core/src/main/java/brooklyn/entity/effector/AddSensor.java index 9e80b45..318d78a 100644 --- a/core/src/main/java/brooklyn/entity/effector/AddSensor.java +++ b/core/src/main/java/brooklyn/entity/effector/AddSensor.java @@ -28,6 +28,8 @@ import brooklyn.entity.proxying.EntityInitializer; import brooklyn.event.AttributeSensor; import brooklyn.event.basic.Sensors; import brooklyn.util.config.ConfigBag; +import brooklyn.util.guava.Maybe; +import brooklyn.util.javalang.Boxing; import brooklyn.util.time.Duration; import com.google.common.annotations.Beta; @@ -79,6 +81,9 @@ public class AddSensor<T> implements EntityInitializer { @SuppressWarnings("unchecked") protected Class<T> getType(String className) { try { + // TODO use OSGi loader (low priority however); also ensure that allows primitives + Maybe<Class<?>> primitive = Boxing.getPrimitiveType(className); + if (primitive.isPresent()) return (Class<T>) primitive.get(); return (Class<T>) Class.forName(className); } catch (ClassNotFoundException e) { if (!className.contains(".")) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1354d036/utils/common/src/main/java/brooklyn/util/javalang/Boxing.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/brooklyn/util/javalang/Boxing.java b/utils/common/src/main/java/brooklyn/util/javalang/Boxing.java index 296291e..72f5138 100644 --- a/utils/common/src/main/java/brooklyn/util/javalang/Boxing.java +++ b/utils/common/src/main/java/brooklyn/util/javalang/Boxing.java @@ -20,6 +20,8 @@ package brooklyn.util.javalang; import java.lang.reflect.Array; +import brooklyn.util.guava.Maybe; + import com.google.common.collect.ImmutableBiMap; public class Boxing { @@ -42,6 +44,19 @@ public class Boxing { .put(Void.TYPE, Void.class) .build(); + /** Returns the unboxed type for the given primitive type name, if available; + * e.g. {@link Integer#TYPE} for <code>int</code> (distinct from <code>Integer.class</code>), + * or null if not a primitive. + * */ + public static Maybe<Class<?>> getPrimitiveType(String typeName) { + if (typeName!=null) { + for (Class<?> t: PRIMITIVE_TO_BOXED.keySet()) { + if (typeName.equals(t.getName())) return Maybe.<Class<?>>of(t); + } + } + return Maybe.absent("Not a primitive: "+typeName); + } + public static Class<?> boxedType(Class<?> type) { if (PRIMITIVE_TO_BOXED.containsKey(type)) return PRIMITIVE_TO_BOXED.get(type); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1354d036/utils/common/src/test/java/brooklyn/util/javalang/BoxingTest.java ---------------------------------------------------------------------- diff --git a/utils/common/src/test/java/brooklyn/util/javalang/BoxingTest.java b/utils/common/src/test/java/brooklyn/util/javalang/BoxingTest.java new file mode 100644 index 0000000..de1ffcb --- /dev/null +++ b/utils/common/src/test/java/brooklyn/util/javalang/BoxingTest.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package brooklyn.util.javalang; + +import org.testng.Assert; +import org.testng.annotations.Test; + +public class BoxingTest { + + @Test + public static void testIntPrimitiveAndBoxed() { + Assert.assertEquals(Integer.TYPE.getName(), "int"); + + Class<?> t = Boxing.getPrimitiveType("int").get(); + Assert.assertEquals(t, Integer.TYPE); + + Class<?> bt = Boxing.boxedType(t); + Assert.assertEquals(bt, Integer.class); + } + +}
