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