You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by da...@apache.org on 2019/04/12 15:45:04 UTC

svn commit: r1857407 - in /felix/trunk/converter/converter/src: main/java/org/osgi/util/converter/ConvertingImpl.java test/java/org/osgi/util/converter/ConverterTest.java

Author: davidb
Date: Fri Apr 12 15:45:04 2019
New Revision: 1857407

URL: http://svn.apache.org/viewvc?rev=1857407&view=rev
Log:
FELIX-6100 [converter] Ensure that converting null to an array creates an object of the correct type

Patch applied on behalf of Tim Ward with many thanks.
This closes #197

Modified:
    felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java?rev=1857407&r1=1857406&r2=1857407&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java Fri Apr 12 15:45:04 2019
@@ -825,7 +825,18 @@ class ConvertingImpl extends AbstractSpe
 		Class< ? > boxed = Util.primitiveToBoxed(cls);
 		if (boxed.equals(cls)) {
 			if (cls.isArray()) {
-				return new Object[] {};
+				int i = 1;
+				Class<?> componentType = cls.getComponentType();
+				while(componentType.isArray()) {
+					i++;
+					componentType = cls.getComponentType();
+				}
+				
+				if(i == 1) {
+					return Array.newInstance(componentType, 0);
+				} else {
+					return Array.newInstance(componentType, new int[i]);
+				}
 			} else if (Collection.class.isAssignableFrom(cls)) {
 				return c.convert(Collections.emptyList()).to(cls);
 			}

Modified: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java?rev=1857407&r1=1857406&r2=1857407&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java Fri Apr 12 15:45:04 2019
@@ -23,6 +23,7 @@ import org.osgi.framework.Version;
 import org.osgi.util.converter.MyDTO.Count;
 import org.osgi.util.converter.MyEmbeddedDTO.Alpha;
 
+import java.lang.reflect.Array;
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -342,6 +343,31 @@ public class ConverterTest {
         assertArrayEquals(new char [] {'x', 'y'}, ca4b);
         assertNotSame("Should have created a new instance", ca4a, ca4b);
     }
+    
+    /**
+     * 707.4.3.1 - null becomes an empty array
+     */
+    @Test
+    public void testNullToArrayConversion() {
+    	
+    	checkArray(String[].class);
+    	checkArray(boolean[].class);
+    	checkArray(byte[].class);
+    	checkArray(short[].class);
+    	checkArray(char[].class);
+    	checkArray(int[].class);
+    	checkArray(float[].class);
+    	checkArray(long[].class);
+    	checkArray(double[].class);
+    }
+
+	private void checkArray(Class<?> arrayType) {
+		assertTrue(arrayType.isArray());
+		
+		Object array = converter.convert(null).to(arrayType);
+    	assertEquals(0, Array.getLength(array));
+    	assertTrue(arrayType.isInstance(array));
+	}
 
     @Test
     public void testLongCollectionConversion() {