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 2017/03/20 14:09:15 UTC

svn commit: r1787776 - in /felix/trunk/converter/converter/src: main/java/org/apache/felix/converter/impl/ test/java/org/apache/felix/converter/impl/

Author: davidb
Date: Mon Mar 20 14:09:14 2017
New Revision: 1787776

URL: http://svn.apache.org/viewvc?rev=1787776&view=rev
Log:
Felix Converter: support for prefixes with DTOs

Added:
    felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/PrefixDTO.java
Modified:
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java
    felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java?rev=1787776&r1=1787775&r2=1787776&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java Mon Mar 20 14:09:14 2017
@@ -295,17 +295,19 @@ public class ConvertingImpl implements C
         if (targetAsDTO)
             cls = targetClass;
         try {
+            String prefix = Util.getPrefix(cls);
+
             T dto = (T) targetClass.newInstance();
 
             for (Map.Entry entry : (Set<Map.Entry>) m.entrySet()) {
                 Field f = null;
                 try {
-                    f = cls.getDeclaredField(Util.mangleName(entry.getKey().toString()));
-                } catch (NoSuchFieldException e) {
+                    f = cls.getDeclaredField(Util.mangleName(prefix, entry.getKey().toString()));
+                } catch (NoSuchFieldException | NullPointerException e) {
                     try {
-                        f = cls.getField(Util.mangleName(entry.getKey().toString()));
-                    } catch (NoSuchFieldException e1) {
-                        // There is not field with this name
+                        f = cls.getField(Util.mangleName(prefix, entry.getKey().toString()));
+                    } catch (NoSuchFieldException | NullPointerException e1) {
+                        // There is no field with this name
                     }
                 }
 

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java?rev=1787776&r1=1787775&r2=1787776&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java Mon Mar 20 14:09:14 2017
@@ -137,7 +137,7 @@ class Util {
         if (!Modifier.isPublic(f.getModifiers()))
             return null;
 
-        return unMangleName(f.getName());
+        return unMangleName(getPrefix(f.getDeclaringClass()), f.getName());
     }
 
     static Map<String, Set<Method>> getInterfaceKeys(Class<?> intf) {
@@ -212,7 +212,26 @@ class Util {
         return md.invoke(obj);
     }
 
-    static String mangleName(String key) {
+    static String getPrefix(Class<?> cls) {
+        try {
+            Field prefixField = cls.getDeclaredField("PREFIX_");
+            if (prefixField.getType().equals(String.class)) {
+                if ((prefixField.getModifiers() & (Modifier.PUBLIC | Modifier.FINAL | Modifier.STATIC)) > 0) {
+                    return (String) prefixField.get(null);
+                }
+            }
+        } catch (Exception ex) {
+            // LOG no prefix field
+        }
+        return "";
+    }
+
+    static String mangleName(String prefix, String key) {
+        if (!key.startsWith(prefix))
+            return null;
+
+        key = key.substring(prefix.length());
+
         String res = key.replace("_", "__");
         res = res.replace("$", "$$");
         res = res.replaceAll("[.]([._])", "_\\$$1");
@@ -221,7 +240,7 @@ class Util {
         return res;
     }
 
-    static String unMangleName(String key) {
+    static String unMangleName(String prefix, String key) {
         String res = key.replaceAll("_\\$", ".");
         res = res.replace("__", "\f"); // park double underscore as formfeed char
         res = res.replace('_', '.');
@@ -230,6 +249,6 @@ class Util {
         res = res.replace('\f', '_');  // convert formfeed char back to single underscore
         res = res.replace('\b', '$');  // convert backspace char back go dollar
         // TODO handle Java keywords
-        return res;
+        return prefix + res;
     }
 }

Modified: felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java?rev=1787776&r1=1787775&r2=1787776&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterTest.java Mon Mar 20 14:09:14 2017
@@ -878,6 +878,23 @@ public class ConverterTest {
         assertEquals(Long.valueOf(Long.MIN_VALUE), m.get(SomeEnum.VALUE));
     }
 
+    @Test
+    public void testPrefixDTO() {
+        Map<String, String> m = new HashMap<>();
+        m.put("org.foo.bar.width", "327");
+        m.put("length", "12");
+
+        PrefixDTO dto = converter.convert(m).to(PrefixDTO.class);
+        assertEquals(327, dto.width);
+        assertEquals("This one should not be set", 0, dto.length);
+
+        Map<String, String> m2 = converter.convert(dto).to(new TypeReference<HashMap<String,String>>() {});
+        Map<String, String> expected = new HashMap<>();
+        expected.put("org.foo.bar.width", "327");
+        expected.put("org.foo.bar.length", "0");
+        assertEquals(expected, m2);
+    }
+
     static class MyClass2 {
         private final String value;
         public MyClass2(String v) {

Added: felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/PrefixDTO.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/PrefixDTO.java?rev=1787776&view=auto
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/PrefixDTO.java (added)
+++ felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/PrefixDTO.java Mon Mar 20 14:09:14 2017
@@ -0,0 +1,25 @@
+/*
+ * 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.apache.felix.converter.impl;
+
+public class PrefixDTO {
+    public static final String PREFIX_ = "org.foo.bar.";
+
+    public long width;
+
+    public int length;
+}