Author: timothyjward
Date: Wed Feb 20 13:20:34 2019
New Revision: 1853957

URL: http://svn.apache.org/viewvc?rev=1853957&view=rev
Log:
FELIX-6064 Be lenient when converting from a DTO type with no public no-args 
constructor

Added:
    
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/MyDefaultCtorDTOAlike.java
Modified:
    
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DTOUtil.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=1853957&r1=1853956&r2=1853957&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
 Wed Feb 20 13:20:34 2019
@@ -411,7 +411,7 @@ class ConvertingImpl extends AbstractSpe
 
                                if (f != null) {
                                        Object val = entry.getValue();
-                                       if (sourceAsDTO && 
DTOUtil.isDTOType(f.getType()))
+                                       if (sourceAsDTO && 
DTOUtil.isDTOType(f.getType(), false))
                                                val = 
converter.convert(val).sourceAsDTO().to(
                                                                f.getType());
                                        else {
@@ -573,8 +573,8 @@ class ConvertingImpl extends AbstractSpe
                                if (isCopyRequiredType(cls)) {
                                        cls = getConstructableType(cls);
                                }
-
-                               if (sourceAsDTO || DTOUtil.isDTOType(cls))
+                               // Either force source as DTO, or lenient DTO 
type
+                               if (sourceAsDTO || DTOUtil.isDTOType(cls, true))
                                        element = 
converter.convert(element).sourceAsDTO().to(cls);
                                else
                                        element = 
converter.convert(element).to(cls);
@@ -605,8 +605,8 @@ class ConvertingImpl extends AbstractSpe
                                if (isCopyRequiredType(cls)) {
                                        cls = getConstructableType(cls);
                                }
-
-                               if (sourceAsDTO || DTOUtil.isDTOType(cls))
+                               // Either force source as DTO, or DTO type
+                               if (sourceAsDTO || DTOUtil.isDTOType(cls, 
false))
                                        element = 
converter.convert(element).sourceAsDTO().to(cls);
                                else
                                        element = 
converter.convert(element).to(cls);
@@ -623,7 +623,7 @@ class ConvertingImpl extends AbstractSpe
                        return MapDelegate.forMap((Map) object, this);
                } else if (Dictionary.class.isAssignableFrom(sourceClass)) {
                        return MapDelegate.forDictionary((Dictionary) object, 
this);
-               } else if (DTOUtil.isDTOType(sourceClass) || sourceAsDTO) {
+               } else if (DTOUtil.isDTOType(sourceClass, true) || sourceAsDTO) 
{
                        return MapDelegate.forDTO(object, sourceClass, this);
                } else if (sourceAsJavaBean) {
                        return MapDelegate.forBean(object, sourceClass, this);
@@ -657,7 +657,7 @@ class ConvertingImpl extends AbstractSpe
                        return convertToMap();
                else if (Dictionary.class.isAssignableFrom(targetAsClass))
                        return convertToDictionary();
-               else if (targetAsDTO || DTOUtil.isDTOType(targetAsClass))
+               else if (targetAsDTO || DTOUtil.isDTOType(targetAsClass, false))
                        return convertToDTO(sourceClass, targetAsClass);
                else if (targetAsClass.isInterface())
                        return convertToInterface(sourceClass, targetAsClass);
@@ -836,7 +836,7 @@ class ConvertingImpl extends AbstractSpe
                        return true;
                else if (getInterfaces(cls).size() > 0)
                        return true;
-               else if (DTOUtil.isDTOType(cls))
+               else if (DTOUtil.isDTOType(cls, true))
                        return true;
                else if (asJavaBean && isWriteableJavaBean(cls))
                        return true;
@@ -1195,12 +1195,12 @@ class ConvertingImpl extends AbstractSpe
        private Map< ? , ? > mapView(Object obj, Class< ? > sourceCls,
                        InternalConverter ic) {
                if (Map.class.isAssignableFrom(sourceCls)
-                               || (DTOUtil.isDTOType(sourceCls) && obj 
instanceof Map))
+                               || (DTOUtil.isDTOType(sourceCls, true) && obj 
instanceof Map))
                        return (Map< ? , ? >) obj;
                else if (Dictionary.class.isAssignableFrom(sourceCls))
                        return MapDelegate.forDictionary((Dictionary< ? , ? >) 
object,
                                        this);
-               else if (DTOUtil.isDTOType(sourceCls) || sourceAsDTO)
+               else if (DTOUtil.isDTOType(sourceCls, true) || sourceAsDTO)
                        return createMapFromDTO(obj, ic);
                else if (sourceAsJavaBean) {
                        Map< ? , ? > m = createMapFromBeanAccessors(obj, 
sourceCls);
@@ -1238,7 +1238,7 @@ class ConvertingImpl extends AbstractSpe
                        return false;
                return Map.class.isAssignableFrom(cls)
                                || Collection.class.isAssignableFrom(cls)
-                               || DTOUtil.isDTOType(cls) || cls.isArray();
+                               || DTOUtil.isDTOType(cls, true) || 
cls.isArray();
        }
 
        private static boolean isWriteableJavaBean(Class< ? > cls) {

Modified: 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DTOUtil.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DTOUtil.java?rev=1853957&r1=1853956&r2=1853957&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DTOUtil.java
 (original)
+++ 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/DTOUtil.java
 Wed Feb 20 13:20:34 2019
@@ -28,12 +28,14 @@ class DTOUtil {
                // Do not instantiate. This is a utility class.
        }
 
-       static boolean isDTOType(Class< ? > cls) {
-               try {
-                       cls.getConstructor();
-               } catch (NoSuchMethodException | SecurityException e) {
-                       // No public zero-arg constructor, not a DTO
-                       return false;
+       static boolean isDTOType(Class< ? > cls, boolean 
ignorePublicNoArgsCtor) {
+               if(!ignorePublicNoArgsCtor) {
+                       try {
+                               cls.getConstructor();
+                       } catch (NoSuchMethodException | SecurityException e) {
+                               // No public zero-arg constructor, not a DTO
+                               return false;
+                       }
                }
 
                for (Method m : cls.getMethods()) {

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=1853957&r1=1853956&r2=1853957&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
 Wed Feb 20 13:20:34 2019
@@ -671,6 +671,17 @@ public class ConverterTest {
         assertEquals(Alpha.A, e2.alpha);
     }
 
+    @Test
+    public void testDTO2Map4() {
+       MyDefaultCtorDTOAlike dto = new MyDefaultCtorDTOAlike();
+       dto.myProp = "myValue";
+       
+       @SuppressWarnings("rawtypes")
+       Map m = converter.convert(dto).to(Map.class);
+       assertEquals(1, m.size());
+       assertEquals("myValue", m.get("myProp"));
+    }
+
     @Test @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testDTOFieldShadowing() {
         MySubDTO dto = new MySubDTO();

Added: 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/MyDefaultCtorDTOAlike.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/MyDefaultCtorDTOAlike.java?rev=1853957&view=auto
==============================================================================
--- 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/MyDefaultCtorDTOAlike.java
 (added)
+++ 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/MyDefaultCtorDTOAlike.java
 Wed Feb 20 13:20:34 2019
@@ -0,0 +1,27 @@
+/*
+ * 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 org.osgi.util.converter;
+
+public class MyDefaultCtorDTOAlike {
+    
+       MyDefaultCtorDTOAlike() {
+               // Deliberately default visibiilty
+       }
+
+    public String myProp;
+}
+


Reply via email to