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 2013/09/13 20:39:26 UTC

svn commit: r1523053 - in /cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src: main/java/org/apache/cxf/jaxb/ test/java/org/apache/cxf/jaxb/

Author: dkulp
Date: Fri Sep 13 18:39:25 2013
New Revision: 1523053

URL: http://svn.apache.org/r1523053
Log:
Merged revisions 1523044 via  git cherry-pick from
https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes

........
  r1523044 | dkulp | 2013-09-13 14:20:45 -0400 (Fri, 13 Sep 2013) | 10 lines

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

  ........
    r1523043 | dkulp | 2013-09-13 14:18:02 -0400 (Fri, 13 Sep 2013) | 2 lines

    [CXF-5189] Make some more attemps at mapping some of the fields, particular those with XmlAttribute.

  ........

........

Modified:
    cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
    cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
    cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
    cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/OrderException.java

Modified: cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java?rev=1523053&r1=1523052&r2=1523053&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java (original)
+++ cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java Fri Sep 13 18:39:25 2013
@@ -34,6 +34,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
@@ -379,10 +380,13 @@ class JAXBContextInitializer extends Ser
      */
     static boolean isFieldAccepted(Field field, XmlAccessType accessType) {
         // We only accept non static fields which are not marked @XmlTransient or has transient modifier
-        if (Modifier.isStatic(field.getModifiers()) || field.isAnnotationPresent(XmlTransient.class)
+        if (field.isAnnotationPresent(XmlTransient.class)
             || Modifier.isTransient(field.getModifiers())) {
             return false;
         }
+        if (Modifier.isStatic(field.getModifiers())) {
+            return field.isAnnotationPresent(XmlAttribute.class);
+        }
         if (accessType == XmlAccessType.PUBLIC_MEMBER 
             && !Modifier.isPublic(field.getModifiers())) {
             return false;

Modified: cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=1523053&r1=1523052&r2=1523053&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Fri Sep 13 18:39:25 2013
@@ -72,6 +72,7 @@ import javax.xml.stream.util.StreamReade
 import javax.xml.transform.stream.StreamResult;
 
 import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -82,6 +83,7 @@ import org.apache.cxf.common.util.Reflec
 import org.apache.cxf.common.util.SOAPConstants;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.service.model.MessagePartInfo;
 import org.apache.cxf.service.model.SchemaInfo;
@@ -351,26 +353,62 @@ public final class JAXBEncoderDecoder {
             Class<?> cls = part.getTypeClass();
             XmlAccessType accessType = Utils.getXmlAccessType(cls);
             String namespace = part.getElementQName().getNamespaceURI();
+            String attNs = namespace;
             
             SchemaInfo sch = part.getMessageInfo().getOperation().getInterface()
                 .getService().getSchema(namespace);
             if (sch == null) {
                 LOG.warning("Schema associated with " + namespace + " is null");
                 namespace = null;
-            } else if (!sch.isElementFormQualified()) {
-                namespace = null;
+                attNs = null;
+            } else {
+                if (!sch.isElementFormQualified()) {
+                    namespace = null;
+                }
+                if (!sch.isAttributeFormQualified()) {
+                    attNs = null;
+                }
             }
             List<Member> combinedMembers = new ArrayList<Member>();
 
-
             for (Field f : Utils.getFields(cls, accessType)) {
                 XmlAttribute at = f.getAnnotation(XmlAttribute.class);
                 if (at == null) {
                     combinedMembers.add(f);
+                } else {
+                    QName fname = new QName(attNs, StringUtils.isEmpty(at.name()) ? f.getName() : at.name());
+                    ReflectionUtil.setAccessible(f);
+                    Object o = Utils.getFieldValue(f, elValue);
+                    Document doc = DOMUtils.newDocument();
+                    writeObject(marshaller, doc, newJAXBElement(fname, String.class, o));
+                    
+                    if (attNs != null) {
+                        writer.writeAttribute(attNs, fname.getLocalPart(),
+                                              DOMUtils.getAllContent(doc.getDocumentElement()));
+                    } else {
+                        writer.writeAttribute(fname.getLocalPart(), DOMUtils.getAllContent(doc.getDocumentElement()));
+                    }
                 }
             }
             for (Method m : Utils.getGetters(cls, accessType)) {
-                combinedMembers.add(m);
+                if (!m.isAnnotationPresent(XmlAttribute.class)) {
+                    combinedMembers.add(m);
+                } else {
+                    int idx = m.getName().startsWith("get") ? 3 : 2;
+                    String name = m.getName().substring(idx);
+                    name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
+                    XmlAttribute at = m.getAnnotation(XmlAttribute.class);
+                    QName mname = new QName(namespace, StringUtils.isEmpty(at.name()) ? name : at.name());
+                    Document doc = DOMUtils.newDocument();
+                    Object o = Utils.getMethodValue(m, elValue); 
+                    writeObject(marshaller, doc, newJAXBElement(mname, String.class, o));
+                    if (attNs != null) {
+                        writer.writeAttribute(attNs, mname.getLocalPart(),
+                                              DOMUtils.getAllContent(doc.getDocumentElement()));
+                    } else {
+                        writer.writeAttribute(mname.getLocalPart(), DOMUtils.getAllContent(doc.getDocumentElement()));
+                    }
+                }
             }
 
             XmlAccessorOrder xmlAccessorOrder = cls.getAnnotation(XmlAccessorOrder.class);

Modified: cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java?rev=1523053&r1=1523052&r2=1523053&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java (original)
+++ cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java Fri Sep 13 18:39:25 2013
@@ -473,6 +473,7 @@ public class JAXBEncoderDecoderTest exte
         assertTrue(c < d);
         assertTrue(d < e);
         assertTrue(bout.toString().indexOf("transientValue") < 0);
+        assertTrue(bout.toString(), bout.toString().indexOf("mappedField=\"MappedField\"") > 0);
     }
     
     @Test

Modified: cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/OrderException.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/OrderException.java?rev=1523053&r1=1523052&r2=1523053&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/OrderException.java (original)
+++ cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/OrderException.java Fri Sep 13 18:39:25 2013
@@ -20,14 +20,18 @@ package org.apache.cxf.jaxb;
 
 import javax.xml.bind.annotation.XmlAccessOrder;
 import javax.xml.bind.annotation.XmlAccessorOrder;
+import javax.xml.bind.annotation.XmlAttribute;
 
 @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
 public class OrderException extends Exception {
       
     private static final long serialVersionUID = 1L;
-
-    private transient int transientValue;
     
+    @XmlAttribute(name = "mappedField")
+    private static final String MAPPED_FIELD = "MappedField";
+    
+    private transient int transientValue;
+
     private String info1;
 
     private String info2;
@@ -37,8 +41,9 @@ public class OrderException extends Exce
     private int intVal;
 
     private String detail;
-       
-
+    
+    
+    
     public OrderException(String message) {
         super(message);
     }
@@ -94,6 +99,10 @@ public class OrderException extends Exce
     void setTransientValue(int transientValue) {
         this.transientValue = transientValue;
     }
+    
+    public String mappedField() {
+        return MAPPED_FIELD;
+    }
 
 
 }