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);
+    }
+
+}

Reply via email to