You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by em...@apache.org on 2013/08/01 11:16:39 UTC
svn commit: r1509138 - in /cxf/trunk/rt/databinding/jaxb/src:
main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
Author: ema
Date: Thu Aug 1 09:16:39 2013
New Revision: 1509138
URL: http://svn.apache.org/r1509138
Log:
[CXF-5163]:Support marshall exception calss with @XmlAccessorOrder in JAXBEncoderDecoder(patch by Kyle)
Modified:
cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=1509138&r1=1509137&r2=1509138&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Thu Aug 1 09:16:39 2013
@@ -26,6 +26,7 @@ import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
@@ -37,6 +38,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
@@ -49,7 +52,9 @@ import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import javax.xml.bind.attachment.AttachmentMarshaller;
@@ -357,9 +362,31 @@ public final class JAXBEncoderDecoder {
} else {
LOG.warning("Schema associated with " + namespace + " is 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);
+ }
+ }
+ for (Method m : Utils.getGetters(cls, accessType)) {
+ combinedMembers.add(m);
+ }
+
+ XmlAccessorOrder xmlAccessorOrder = cls.getAnnotation(XmlAccessorOrder.class);
+ if (xmlAccessorOrder != null && xmlAccessorOrder.value().equals(XmlAccessOrder.ALPHABETICAL)) {
+ Collections.sort(combinedMembers, new Comparator<Member>() {
+ public int compare(Member m1, Member m2) {
+ return m1.getName().compareTo(m2.getName());
+ }
+ });
+ }
+
+ for (Member member : combinedMembers) {
+ if (member instanceof Field) {
+ Field f = (Field)member;
QName fname = new QName(namespace, f.getName());
ReflectionUtil.setAccessible(f);
if (JAXBSchemaInitializer.isArray(f.getGenericType())) {
@@ -368,18 +395,18 @@ public final class JAXBEncoderDecoder {
Object o = Utils.getFieldValue(f, elValue);
writeObject(marshaller, writer, newJAXBElement(fname, String.class, o));
}
- }
- }
- for (Method m : Utils.getGetters(cls, accessType)) {
- int idx = m.getName().startsWith("get") ? 3 : 2;
- String name = m.getName().substring(idx);
- name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
- QName mname = new QName(namespace, name);
- if (JAXBSchemaInitializer.isArray(m.getGenericReturnType())) {
- writeArrayObject(marshaller, writer, mname, m.invoke(elValue));
- } else {
- Object o = Utils.getMethodValue(m, elValue);
- writeObject(marshaller, writer, newJAXBElement(mname, String.class, o));
+ } else { // it's a Method
+ Method m = (Method)member;
+ int idx = m.getName().startsWith("get") ? 3 : 2;
+ String name = m.getName().substring(idx);
+ name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
+ QName mname = new QName(namespace, name);
+ if (JAXBSchemaInitializer.isArray(m.getGenericReturnType())) {
+ writeArrayObject(marshaller, writer, mname, m.invoke(elValue));
+ } else {
+ Object o = Utils.getMethodValue(m, elValue);
+ writeObject(marshaller, writer, new JAXBElement(mname, String.class, o));
+ }
}
}
Modified: cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java?rev=1509138&r1=1509137&r2=1509138&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBEncoderDecoderTest.java Thu Aug 1 09:16:39 2013
@@ -56,8 +56,13 @@ import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb_form.ObjectWithQualifiedElementElement;
import org.apache.cxf.jaxb_misc.Base64WithDefaultValueType;
import org.apache.cxf.jaxb_misc.ObjectFactory;
+import org.apache.cxf.service.model.InterfaceInfo;
+import org.apache.cxf.service.model.MessageInfo;
import org.apache.cxf.service.model.MessagePartInfo;
+import org.apache.cxf.service.model.OperationInfo;
+import org.apache.cxf.service.model.ServiceInfo;
import org.apache.cxf.staxutils.StaxStreamFilter;
+import org.apache.cxf.staxutils.StaxUtils;
import org.apache.hello_world_soap_http.types.GreetMe;
import org.apache.hello_world_soap_http.types.GreetMeResponse;
import org.apache.hello_world_soap_http.types.StringStruct;
@@ -429,6 +434,46 @@ public class JAXBEncoderDecoderTest exte
}
@Test
+ public void testMarshallExceptionWithOrder() throws Exception {
+ Document doc = DOMUtils.createDocument();
+ Element elNode = doc.createElementNS("http://cxf.apache.org", "ExceptionRoot");
+
+ OrderException exception = new OrderException("Mymessage");
+ exception.setAValue("avalue");
+ exception.setDetail("detail");
+ exception.setInfo1("info1");
+ exception.setInfo2("info2");
+ exception.setIntVal(10000);
+
+ QName elName = new QName("http://cxf.apache.org", "OrderException");
+ ServiceInfo serviceInfo = new ServiceInfo();
+ InterfaceInfo interfaceInfo = new InterfaceInfo(serviceInfo, null);
+ OperationInfo op = interfaceInfo.addOperation(new QName("http://cxf.apache.org", "operation"));
+ MessageInfo message = new MessageInfo(op, null, null);
+ MessagePartInfo part = new MessagePartInfo(elName, message);
+ part.setElement(true);
+ part.setElementQName(elName);
+ part.setTypeClass(OrderException.class);
+
+ JAXBContext exceptionContext = JAXBContext.newInstance(new Class[] {
+ OrderException.class,
+ });
+ JAXBEncoderDecoder.marshallException(exceptionContext.createMarshaller(), exception, part, elNode);
+
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ StaxUtils.writeTo(elNode, bout);
+ int a = bout.toString().lastIndexOf("aValue");
+ int b = bout.toString().lastIndexOf("detail");
+ int c = bout.toString().lastIndexOf("info1");
+ int d = bout.toString().lastIndexOf("info2");
+ int e = bout.toString().lastIndexOf("intVal");
+ assertTrue(a < b);
+ assertTrue(b < c);
+ assertTrue(c < d);
+ assertTrue(d < e);
+ }
+
+ @Test
public void testMarshallWithoutQNameInfo() throws Exception {
GreetMe obj = new GreetMe();
obj.setRequestType("Hello");