You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/10/04 20:52:26 UTC

svn commit: r1394206 - in /cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb: JAXBContextInitializer.java JAXBEncoderDecoder.java JAXBSchemaInitializer.java

Author: dkulp
Date: Thu Oct  4 18:52:25 2012
New Revision: 1394206

URL: http://svn.apache.org/viewvc?rev=1394206&view=rev
Log:
Merged revisions 1394194 via  git cherry-pick from
https://svn.apache.org/repos/asf/cxf/branches/2.5.x-fixes

........
  r1394194 | dkulp | 2012-10-04 14:27:32 -0400 (Thu, 04 Oct 2012) | 19 lines

  Merged revisions 1394184 via  git cherry-pick from
  https://svn.apache.org/repos/asf/cxf/branches/2.6.x-fixes

  ........
    r1394184 | dkulp | 2012-10-04 14:07:45 -0400 (Thu, 04 Oct 2012) | 11 lines

    Merged revisions 1394181 via  git cherry-pick from
    https://svn.apache.org/repos/asf/cxf/trunk

    ........
      r1394181 | dkulp | 2012-10-04 14:01:52 -0400 (Thu, 04 Oct 2012) | 3 lines

      [CXF-4542] More work on examining all the XmlJavaTypeAdapter things
      Patch from Richard Opalka applied

    ........

  ........

........

Modified:
    cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
    cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
    cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java

Modified: cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java?rev=1394206&r1=1394205&r2=1394206&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java (original)
+++ cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java Thu Oct  4 18:52:25 2012
@@ -196,15 +196,34 @@ class JAXBContextInitializer extends Ser
         if (anns != null) {
             for (Annotation a : anns) {
                 if (XmlJavaTypeAdapter.class.isAssignableFrom(a.annotationType())) {
-                    inspectTypeAdapter(((XmlJavaTypeAdapter)a).value());
+                    Type t = getTypeFromXmlAdapter((XmlJavaTypeAdapter)a);
+                    if (t != null) {
+                        addType(t);
+                    }
                 }
             }
         }
         XmlJavaTypeAdapter xjta = clazz.getAnnotation(XmlJavaTypeAdapter.class);
         if (xjta != null) {
-            inspectTypeAdapter(xjta.value());
+            Type t = getTypeFromXmlAdapter(xjta);
+            if (t != null) {
+                addType(t);
+            }
+        }
+        if (clazz.getPackage() != null) {
+            XmlJavaTypeAdapters adapt = clazz.getPackage().getAnnotation(XmlJavaTypeAdapters.class);
+            if (adapt != null) {
+                for (XmlJavaTypeAdapter a: adapt.value()) {
+                    globalAdapters.add(a.type());
+                }
+                for (XmlJavaTypeAdapter a: adapt.value()) {
+                    Type t = getTypeFromXmlAdapter(a);
+                    if (t != null) {
+                        addType(t);
+                    }
+                }
+            }
         }
-        
     }
 
     private void addType(Type cls) {
@@ -288,9 +307,10 @@ class JAXBContextInitializer extends Ser
                     //has an adapter.   We need to inspect the adapter and then
                     //return as the adapter will handle the superclass
                     //and interfaces and such
-                    @SuppressWarnings("rawtypes")
-                    Class<? extends XmlAdapter> c2 = xjta.value();
-                    inspectTypeAdapter(c2);
+                    Type t = getTypeFromXmlAdapter(xjta);
+                    if (t != null) {
+                        addType(t);
+                    }
                     return;
                 }
                 
@@ -306,17 +326,64 @@ class JAXBContextInitializer extends Ser
             }
         }
     }
+    
+    static XmlJavaTypeAdapter getFieldXJTA(final Field f) {
+        XmlJavaTypeAdapter adapter = f.getAnnotation(XmlJavaTypeAdapter.class);
+        if (adapter == null) {
+            adapter = f.getType().getAnnotation(XmlJavaTypeAdapter.class);
+        }
+        if (adapter == null) {
+            XmlJavaTypeAdapters adapters = f.getDeclaringClass().getPackage().getAnnotation(XmlJavaTypeAdapters.class);
+            if (adapters != null) {
+                for (XmlJavaTypeAdapter candidate : adapters.value()) {
+                    if (candidate != null && candidate.type().equals(f.getType())) {
+                        adapter = candidate;
+                        break;
+                    }
+                }
+            }
+        }
+        return adapter;
+    }
 
-    private void inspectTypeAdapter(Class<? extends XmlAdapter> aclass) {
-        Class<?> c2 = aclass;
-        Type sp = c2.getGenericSuperclass();
-        while (!XmlAdapter.class.equals(c2) && c2 != null) {
-            sp = c2.getGenericSuperclass();
-            c2 = c2.getSuperclass();
+    static XmlJavaTypeAdapter getMethodXJTA(final Method m) {
+        XmlJavaTypeAdapter adapter = m.getAnnotation(XmlJavaTypeAdapter.class);
+        if (adapter == null) {
+            adapter = m.getReturnType().getAnnotation(XmlJavaTypeAdapter.class);
+        }
+        if (adapter == null) {
+            XmlJavaTypeAdapters adapters = m.getDeclaringClass().getPackage().getAnnotation(XmlJavaTypeAdapters.class);
+            if (adapters != null) {
+                for (XmlJavaTypeAdapter candidate : adapters.value()) {
+                    if (candidate != null && candidate.type().equals(m.getGenericReturnType())) {
+                        adapter = candidate;
+                        break;
+                    }
+                }
+            }
         }
-        if (sp instanceof ParameterizedType) {
-            addType(((ParameterizedType)sp).getActualTypeArguments()[0]);
+        return adapter;
+    }
+
+    static Class<?> getTypeFromXmlAdapter(XmlJavaTypeAdapter xjta) {
+        if (xjta != null) {
+            Class<?> c2 = xjta.value();
+            Type sp = c2.getGenericSuperclass();
+            while (!XmlAdapter.class.equals(c2) && c2 != null) {
+                sp = c2.getGenericSuperclass();
+                c2 = c2.getSuperclass();
+            }
+            if (sp instanceof ParameterizedType) {
+                return (Class<?>)((ParameterizedType)sp).getActualTypeArguments()[0];
+            }
         }
+        return null;
+    }
+
+    @SuppressWarnings("rawtypes") 
+    static XmlAdapter getXmlAdapter(XmlJavaTypeAdapter adapterAnnotation)
+        throws InstantiationException, IllegalAccessException {
+        return adapterAnnotation != null ? adapterAnnotation.value().newInstance() : null;
     }
 
     private void walkReferences(Class<?> cls) {
@@ -376,9 +443,6 @@ class JAXBContextInitializer extends Ser
             && !Modifier.isPublic(field.getModifiers())) {
             return false;
         }
-        if (field.getAnnotation(XmlJavaTypeAdapter.class) != null) {
-            return false;
-        }
         if (accessType == XmlAccessType.NONE
             || accessType == XmlAccessType.PROPERTY) {
             return checkJaxbAnnotation(field.getAnnotations());
@@ -405,12 +469,6 @@ class JAXBContextInitializer extends Ser
             return false;
         }
 
-        boolean isPropGetter = method.getName().startsWith("get") || method.getName().startsWith("is");
-
-        if (!isPropGetter 
-            || method.getAnnotation(XmlJavaTypeAdapter.class) != null) {
-            return false;
-        }
         int beginIndex = 3;
         if (method.getName().startsWith("is")) {
             beginIndex = 2;
@@ -452,4 +510,4 @@ class JAXBContextInitializer extends Ser
         }
         return false;
     }
-}
\ No newline at end of file
+}

Modified: cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=1394206&r1=1394205&r2=1394206&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Thu Oct  4 18:52:25 2012
@@ -51,6 +51,8 @@ import javax.xml.bind.annotation.XmlAcce
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import javax.xml.bind.attachment.AttachmentMarshaller;
 import javax.xml.bind.attachment.AttachmentUnmarshaller;
 import javax.xml.namespace.NamespaceContext;
@@ -366,8 +368,8 @@ public final class JAXBEncoderDecoder {
                         if (JAXBSchemaInitializer.isArray(f.getGenericType())) {
                             writeArrayObject(marshaller, writer, fname, f.get(elValue));
                         } else {
-                            writeObject(marshaller, writer, new JAXBElement(fname, String.class, 
-                                                                            f.get(elValue)));
+                            Object o = getFieldValue(f, elValue);
+                            writeObject(marshaller, writer, new JAXBElement(fname, String.class, o));
                         }
                     }
                 }
@@ -381,8 +383,8 @@ public final class JAXBEncoderDecoder {
                     if (JAXBSchemaInitializer.isArray(m.getGenericReturnType())) {
                         writeArrayObject(marshaller, writer, mname, m.invoke(elValue));
                     } else {
-                        writeObject(marshaller, writer, new JAXBElement(mname, String.class, 
-                                                                        m.invoke(elValue)));
+                        Object o = getMethodValue(m, elValue);
+                        writeObject(marshaller, writer, new JAXBElement(mname, String.class, o));
                     }
                 }
             }
@@ -495,7 +497,8 @@ public final class JAXBEncoderDecoder {
 
                             f.set(obj, o);
                         } else {
-                            f.set(obj, getElementValue(u.unmarshal(reader, f.getType())));
+                            Object o = getElementValue(u.unmarshal(reader, getFieldType(f)));
+                            setFieldValue(f, obj, o);
                         }
                     } else {
                         throw new NoSuchFieldException("No accessible field " + q.getLocalPart());
@@ -532,8 +535,8 @@ public final class JAXBEncoderDecoder {
 
                         m2.invoke(obj, o);
                     } else {
-                        Object o = getElementValue(u.unmarshal(reader, m.getReturnType()));
-                        m2.invoke(obj, o);
+                        Object o = getElementValue(u.unmarshal(reader, getMethodReturnType(m)));
+                        setMethodValue(m, m2, obj, o);
                     }
                 }
             }
@@ -543,6 +546,46 @@ public final class JAXBEncoderDecoder {
         }
     }
 
+    private static Class<?> getFieldType(final Field f) {
+        XmlJavaTypeAdapter adapter = JAXBContextInitializer.getFieldXJTA(f);
+        Class<?> adapterType = JAXBContextInitializer.getTypeFromXmlAdapter(adapter);
+        return adapterType != null ? adapterType : f.getType();
+    }
+
+    private static Class<?> getMethodReturnType(final Method m) {
+        XmlJavaTypeAdapter adapter = JAXBContextInitializer.getMethodXJTA(m);
+        Class<?> adapterType = JAXBContextInitializer.getTypeFromXmlAdapter(adapter);
+        return adapterType != null ? adapterType : m.getReturnType(); 
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private static Object getFieldValue(Field f, Object target) throws Exception {
+        XmlJavaTypeAdapter adapterAnnotation = JAXBContextInitializer.getFieldXJTA(f);
+        XmlAdapter adapter = JAXBContextInitializer.getXmlAdapter(adapterAnnotation);
+        return adapter != null ? adapter.marshal(f.get(target)) : f.get(target); 
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private static Object getMethodValue(Method m, Object target) throws Exception {
+        XmlJavaTypeAdapter adapterAnnotation = JAXBContextInitializer.getMethodXJTA(m);
+        XmlAdapter adapter = JAXBContextInitializer.getXmlAdapter(adapterAnnotation);
+        return adapter != null ? adapter.marshal(m.invoke(target)) : m.invoke(target); 
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private static void setFieldValue(Field f, Object target, Object value) throws Exception {
+        XmlJavaTypeAdapter xjta = JAXBContextInitializer.getFieldXJTA(f);
+        XmlAdapter adapter = JAXBContextInitializer.getXmlAdapter(xjta);
+        f.set(target, adapter != null ? adapter.unmarshal(value) : value);
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    private static void setMethodValue(Method getter, Method setter, Object target, Object value) throws Exception {
+        XmlJavaTypeAdapter xjta = JAXBContextInitializer.getMethodXJTA(getter);
+        XmlAdapter adapter = JAXBContextInitializer.getXmlAdapter(xjta);
+        setter.invoke(target, adapter != null ? adapter.unmarshal(value) : value);
+    }
+
     private static void writeObject(Marshaller u, Object source, Object mObj) throws Fault, JAXBException {
         if (source instanceof XMLStreamWriter) {
             u.marshal(mObj, (XMLStreamWriter)source);

Modified: cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java?rev=1394206&r1=1394205&r2=1394206&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java (original)
+++ cxf/branches/2.4.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java Thu Oct  4 18:52:25 2012
@@ -523,7 +523,7 @@ class JAXBSchemaInitializer extends Serv
         for (Field f : cls.getDeclaredFields()) {
             if (JAXBContextInitializer.isFieldAccepted(f, accessType)) {
                 //map field
-                Type type = f.getGenericType();
+                Type type = getFieldType(f);
                 JAXBBeanInfo beanInfo = getBeanInfo(type);
                 if (beanInfo != null) {
                     addElement(schema, seq, beanInfo, new QName(namespace, f.getName()), isArray(type));
@@ -532,8 +532,8 @@ class JAXBSchemaInitializer extends Serv
         }
         for (Method m : cls.getMethods()) {
             if (JAXBContextInitializer.isMethodAccepted(m, accessType)) {
-                //map field
-                Type type = m.getGenericReturnType();
+                //map method
+                Type type = getMethodReturnType(m);
                 JAXBBeanInfo beanInfo = getBeanInfo(type);
                 if (beanInfo != null) {
                     int idx = m.getName().startsWith("get") ? 3 : 2;
@@ -556,6 +556,18 @@ class JAXBSchemaInitializer extends Serv
         schemas.addCrossImports();
         part.setProperty(JAXBDataBinding.class.getName() + ".CUSTOM_EXCEPTION", Boolean.TRUE);
     }
+    
+    private static Type getFieldType(final Field f) {
+        XmlJavaTypeAdapter adapter = JAXBContextInitializer.getFieldXJTA(f);
+        Class<?> adapterType = JAXBContextInitializer.getTypeFromXmlAdapter(adapter);
+        return adapterType != null ? adapterType : f.getGenericType();
+    }
+
+    private static Type getMethodReturnType(final Method m) {
+        XmlJavaTypeAdapter adapter = JAXBContextInitializer.getMethodXJTA(m);
+        Class<?> adapterType = JAXBContextInitializer.getTypeFromXmlAdapter(adapter);
+        return adapterType != null ? adapterType : m.getGenericReturnType(); 
+    }
 
     static boolean isArray(Type cls) {
         if (cls instanceof Class) {