You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:55:38 UTC

[sling-org-apache-sling-models-impl] 08/24: SLING-3863 - correcting behavior where optional methods and constructor parameters were injected with non-null wrapper classes.

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.models.impl-1.1.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git

commit fd0324df4dae97d2becea26c48a6074d4b2d8835
Author: Justin Edelson <ju...@apache.org>
AuthorDate: Wed Aug 20 19:42:00 2014 +0000

    SLING-3863 - correcting behavior where optional methods and constructor parameters were injected with non-null wrapper classes.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/impl@1619212 13f79535-47bb-0310-9956-ffa450edef68
---
 .../sling/models/impl/ModelAdapterFactory.java     | 42 ++++++--------
 .../sling/models/impl/OptionalPrimitivesTest.java  | 41 +++++++++++++-
 .../classes/OptionalPrimitivesModel.java           | 66 ++++++++++++++++++++--
 .../OptionalPrimitivesModel.java                   | 60 +++++++++++++++++++-
 .../interfaces/OptionalPrimitivesModel.java        | 36 ++++++++++--
 5 files changed, 206 insertions(+), 39 deletions(-)

diff --git a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
index a81cc31..1880e66 100644
--- a/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
+++ b/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
@@ -249,8 +249,6 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
          * @return true if injection was successful otherwise false
          */
         public boolean inject(AnnotatedElement element, Object value);
-
-        public boolean shouldInjectPrimitiveInitValue();
     }
 
     private static class SetFieldCallback implements InjectCallback {
@@ -265,11 +263,6 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         public boolean inject(AnnotatedElement element, Object value) {
             return setField((Field) element, object, value);
         }
-
-        @Override
-        public boolean shouldInjectPrimitiveInitValue() {
-            return false;
-        }
     }
 
     private static class SetMethodsCallback implements InjectCallback {
@@ -284,13 +277,8 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         public boolean inject(AnnotatedElement element, Object value) {
             return setMethod((Method) element, methods, value);
         }
-
-        @Override
-        public boolean shouldInjectPrimitiveInitValue() {
-            return true;
-        }
     }
-    
+
     private static class SetConstructorParameterCallback implements InjectCallback {
 
         private final List<Object> parameterValues;
@@ -303,15 +291,11 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         public boolean inject(AnnotatedElement element, Object value) {
             return setConstructorParameter((ConstructorParameter)element, parameterValues, value);
         }
-
-        @Override
-        public boolean shouldInjectPrimitiveInitValue() {
-            return true;
-        }
     }
 
     private boolean injectElement(final AnnotatedElement element, final Object adaptable, final Type type,
-            final Model modelAnnotation, final DisposalCallbackRegistry registry, InjectCallback callback) {
+            final boolean injectPrimitiveInitialValue, final Model modelAnnotation, final DisposalCallbackRegistry registry,
+            final InjectCallback callback) {
 
         InjectAnnotationProcessor annotationProcessor = null;
         String source = getSource(element);
@@ -350,7 +334,7 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         // if default is not set, check if mandatory
         if (!wasInjectionSuccessful) {
             if (isOptional(element, modelAnnotation, annotationProcessor)) {
-                if (callback.shouldInjectPrimitiveInitValue()) {
+                if (injectPrimitiveInitialValue) {
                     injectPrimitiveInitialValue(element, type, callback);
                 }
             } else {
@@ -372,8 +356,13 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         Set<Method> requiredMethods = new HashSet<Method>();
 
         for (Method method : injectableMethods) {
-            Type returnType = mapPrimitiveClasses(method.getGenericReturnType());
-            if (!injectElement(method, adaptable, returnType, modelAnnotation, registry, callback)) {
+            Type genericReturnType = method.getGenericReturnType();
+            Type returnType = mapPrimitiveClasses(genericReturnType);
+            boolean isPrimitive = false;
+            if (returnType != genericReturnType) {
+                isPrimitive = true;
+            }
+            if (!injectElement(method, adaptable, returnType, isPrimitive, modelAnnotation, registry, callback)) {
                 requiredMethods.add(method);
             }
         }
@@ -467,7 +456,7 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
         Set<Field> injectableFields = collectInjectableFields(type);
         for (Field field : injectableFields) {
             Type fieldType = mapPrimitiveClasses(field.getGenericType());
-            if (!injectElement(field, adaptable, fieldType, modelAnnotation, registry, callback)) {
+            if (!injectElement(field, adaptable, fieldType, false, modelAnnotation, registry, callback)) {
                 requiredFields.add(field);
             }
         }
@@ -532,9 +521,14 @@ public class ModelAdapterFactory implements AdapterFactory, Runnable {
 
         for (int i = 0; i < parameterTypes.length; i++) {
             Type genericType = mapPrimitiveClasses(parameterTypes[i]);
+
+            boolean isPrimitive = false;
+            if (parameterTypes[i] != genericType) {
+                isPrimitive = true;
+            }
             ConstructorParameter constructorParameter = new ConstructorParameter(
                     constructor.getParameterAnnotations()[i], constructor.getParameterTypes()[i], genericType, i);
-            if (!injectElement(constructorParameter, adaptable, genericType, modelAnnotation, registry, callback)) {
+            if (!injectElement(constructorParameter, adaptable, genericType, isPrimitive, modelAnnotation, registry, callback)) {
                 requiredParameters.add(constructorParameter);
             }
         }
diff --git a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
index 7e7637a..0fd45c5 100644
--- a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
+++ b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java
@@ -18,6 +18,7 @@ package org.apache.sling.models.impl;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -66,6 +67,8 @@ public class OptionalPrimitivesTest {
         org.apache.sling.models.testmodels.classes.OptionalPrimitivesModel model
                 = factory.getAdapter(res, org.apache.sling.models.testmodels.classes.OptionalPrimitivesModel.class);
         assertNotNull(model);
+
+        // make sure primitives are initialized with initial value
         assertEquals(0, model.getByteValue());
         assertEquals(0, model.getShortValue());
         assertEquals(0, model.getIntValue());
@@ -74,7 +77,17 @@ public class OptionalPrimitivesTest {
         assertEquals(0.0d, model.getDoubleValue(), 0.00001d);
         assertEquals('\u0000', model.getCharValue());
         assertEquals(false, model.getBooleanValue());
-    }
+
+        // make sure object wrapper of primitives are null
+        assertNull(model.getByteObjectValue());
+        assertNull(model.getShortObjectValue());
+        assertNull(model.getIntObjectValue());
+        assertNull(model.getLongObjectValue());
+        assertNull(model.getFloatObjectValue());
+        assertNull(model.getDoubleObjectValue());
+        assertNull(model.getCharObjectValue());
+        assertNull(model.getBooleanObjectValue());
+}
 
     @Test
     public void testConstructorInjection() {
@@ -86,6 +99,8 @@ public class OptionalPrimitivesTest {
         org.apache.sling.models.testmodels.classes.constructorinjection.OptionalPrimitivesModel model
                 = factory.getAdapter(res, org.apache.sling.models.testmodels.classes.constructorinjection.OptionalPrimitivesModel.class);
         assertNotNull(model);
+
+        // make sure primitives are initialized with initial value
         assertEquals(0, model.getByteValue());
         assertEquals(0, model.getShortValue());
         assertEquals(0, model.getIntValue());
@@ -94,7 +109,17 @@ public class OptionalPrimitivesTest {
         assertEquals(0.0d, model.getDoubleValue(), 0.00001d);
         assertEquals('\u0000', model.getCharValue());
         assertEquals(false, model.getBooleanValue());
-    }
+
+        // make sure object wrapper of primitives are null
+        assertNull(model.getByteObjectValue());
+        assertNull(model.getShortObjectValue());
+        assertNull(model.getIntObjectValue());
+        assertNull(model.getLongObjectValue());
+        assertNull(model.getFloatObjectValue());
+        assertNull(model.getDoubleObjectValue());
+        assertNull(model.getCharObjectValue());
+        assertNull(model.getBooleanObjectValue());
+}
 
     @Test
     public void testFieldInjectionInterface() {
@@ -106,6 +131,8 @@ public class OptionalPrimitivesTest {
         org.apache.sling.models.testmodels.interfaces.OptionalPrimitivesModel model
                 = factory.getAdapter(res, org.apache.sling.models.testmodels.interfaces.OptionalPrimitivesModel.class);
         assertNotNull(model);
+
+        // make sure primitives are initialized with initial value
         assertEquals(0, model.getByteValue());
         assertEquals(0, model.getShortValue());
         assertEquals(0, model.getIntValue());
@@ -114,6 +141,16 @@ public class OptionalPrimitivesTest {
         assertEquals(0.0d, model.getDoubleValue(), 0.00001d);
         assertEquals('\u0000', model.getCharValue());
         assertEquals(false, model.getBooleanValue());
+
+        // make sure object wrapper of primitives are null
+        assertNull(model.getByteObjectValue());
+        assertNull(model.getShortObjectValue());
+        assertNull(model.getIntObjectValue());
+        assertNull(model.getLongObjectValue());
+        assertNull(model.getFloatObjectValue());
+        assertNull(model.getDoubleObjectValue());
+        assertNull(model.getCharObjectValue());
+        assertNull(model.getBooleanObjectValue());
     }
 
 }
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java
index f97afa9..2f9aad2 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/OptionalPrimitivesModel.java
@@ -33,22 +33,46 @@ public class OptionalPrimitivesModel {
 
     @Inject @Optional
     private int intValue;
-    
+
     @Inject @Optional
     private long longValue;
-    
+
     @Inject @Optional
     private float floatValue;
-    
+
     @Inject @Optional
     private double doubleValue;
-    
+
     @Inject @Optional
     private char charValue;
-    
+
     @Inject @Optional
     private boolean booleanValue;
 
+    @Inject @Optional
+    private Byte byteObjectValue;
+
+    @Inject @Optional
+    private Short shortObjectValue;
+
+    @Inject @Optional
+    private Integer intObjectValue;
+
+    @Inject @Optional
+    private Long longObjectValue;
+
+    @Inject @Optional
+    private Float floatObjectValue;
+
+    @Inject @Optional
+    private Double doubleObjectValue;
+
+    @Inject @Optional
+    private Character charObjectValue;
+
+    @Inject @Optional
+    private Boolean booleanObjectValue;
+
     public byte getByteValue() {
         return this.byteValue;
     }
@@ -81,4 +105,36 @@ public class OptionalPrimitivesModel {
         return this.booleanValue;
     }
 
+    public Byte getByteObjectValue() {
+        return this.byteObjectValue;
+    }
+
+    public Short getShortObjectValue() {
+        return this.shortObjectValue;
+    }
+
+    public Integer getIntObjectValue() {
+        return this.intObjectValue;
+    }
+
+    public Long getLongObjectValue() {
+        return this.longObjectValue;
+    }
+
+    public Float getFloatObjectValue() {
+        return this.floatObjectValue;
+    }
+
+    public Double getDoubleObjectValue() {
+        return this.doubleObjectValue;
+    }
+
+    public Character getCharObjectValue() {
+        return this.charObjectValue;
+    }
+
+    public Boolean getBooleanObjectValue() {
+        return this.booleanObjectValue;
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java
index c6f51c2..e465fc4 100644
--- a/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/constructorinjection/OptionalPrimitivesModel.java
@@ -33,7 +33,15 @@ public class OptionalPrimitivesModel {
     private final double doubleValue;
     private final char charValue;
     private final boolean booleanValue;
-    
+    private final Byte byteObjectValue;
+    private final Short shortObjectValue;
+    private final Integer intObjectValue;
+    private final Long longObjectValue;
+    private final Float floatObjectValue;
+    private final Double doubleObjectValue;
+    private final Character charObjectValue;
+    private final Boolean booleanObjectValue;
+
     @Inject
     public OptionalPrimitivesModel(
             @Optional byte byteValue,
@@ -43,7 +51,15 @@ public class OptionalPrimitivesModel {
             @Optional float floatValue,
             @Optional double doubleValue,
             @Optional char charValue,
-            @Optional boolean booleanValue) {
+            @Optional boolean booleanValue,
+            @Optional Byte byteObjectValue,
+            @Optional Short shortObjectValue,
+            @Optional Integer intObjectValue,
+            @Optional Long longObjectValue,
+            @Optional Float floatObjectValue,
+            @Optional Double doubleObjectValue,
+            @Optional Character charObjectValue,
+            @Optional Boolean booleanObjectValue) {
         this.byteValue = byteValue;
         this.shortValue = shortValue;
         this.intValue = intValue;
@@ -52,6 +68,14 @@ public class OptionalPrimitivesModel {
         this.doubleValue = doubleValue;
         this.charValue = charValue;
         this.booleanValue = booleanValue;
+        this.byteObjectValue = byteObjectValue;
+        this.shortObjectValue = shortObjectValue;
+        this.intObjectValue = intObjectValue;
+        this.longObjectValue = longObjectValue;
+        this.floatObjectValue = floatObjectValue;
+        this.doubleObjectValue = doubleObjectValue;
+        this.charObjectValue = charObjectValue;
+        this.booleanObjectValue = booleanObjectValue;
     }
 
     public byte getByteValue() {
@@ -86,4 +110,36 @@ public class OptionalPrimitivesModel {
         return this.booleanValue;
     }
     
+    public Byte getByteObjectValue() {
+        return this.byteObjectValue;
+    }
+
+    public Short getShortObjectValue() {
+        return this.shortObjectValue;
+    }
+
+    public Integer getIntObjectValue() {
+        return this.intObjectValue;
+    }
+
+    public Long getLongObjectValue() {
+        return this.longObjectValue;
+    }
+
+    public Float getFloatObjectValue() {
+        return this.floatObjectValue;
+    }
+
+    public Double getDoubleObjectValue() {
+        return this.doubleObjectValue;
+    }
+
+    public Character getCharObjectValue() {
+        return this.charObjectValue;
+    }
+
+    public Boolean getBooleanObjectValue() {
+        return this.booleanObjectValue;
+    }
+    
 }
diff --git a/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java b/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java
index 8f8ed54..1a07c18 100644
--- a/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java
+++ b/src/test/java/org/apache/sling/models/testmodels/interfaces/OptionalPrimitivesModel.java
@@ -33,20 +33,44 @@ public interface OptionalPrimitivesModel {
 
     @Inject @Optional
     public int getIntValue();
-    
+
     @Inject @Optional
     public long getLongValue();
-    
+
     @Inject @Optional
     public float getFloatValue();
-    
+
     @Inject @Optional
     public double getDoubleValue();
-    
+
     @Inject @Optional
     public char getCharValue();
-    
+
     @Inject @Optional
     public boolean getBooleanValue();
-    
+
+    @Inject @Optional
+    public Byte getByteObjectValue();
+
+    @Inject @Optional
+    public Short getShortObjectValue();
+
+    @Inject @Optional
+    public Integer getIntObjectValue();
+
+    @Inject @Optional
+    public Long getLongObjectValue();
+
+    @Inject @Optional
+    public Float getFloatObjectValue();
+
+    @Inject @Optional
+    public Double getDoubleObjectValue();
+
+    @Inject @Optional
+    public Character getCharObjectValue();
+
+    @Inject @Optional
+    public Boolean getBooleanObjectValue();
+
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.