Author: mmusaji
Date: 2012-12-19 06:10:25 -0500 (Wed, 19 Dec 2012)
New Revision: 17139
Modified:
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
Log:
[JBPAPP-10129] - Commit after applying changes from CXF-4542. This allows the annotation
for @XMLJavaTypeAdapter to picked up on exception classes
Modified:
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
===================================================================
---
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java 2012-12-19
10:37:43 UTC (rev 17138)
+++
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java 2012-12-19
11:10:25 UTC (rev 17139)
@@ -41,6 +41,7 @@
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
import javax.xml.namespace.QName;
import org.apache.cxf.common.classloader.ClassLoaderUtils;
@@ -196,13 +197,19 @@
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);
+ }
}
}
@@ -286,8 +293,11 @@
}
XmlJavaTypeAdapter xjta =
cls.getAnnotation(XmlJavaTypeAdapter.class);
if (xjta != null) {
- Class<? extends XmlAdapter> c2 = xjta.value();
- inspectTypeAdapter(c2);
+ Type t = getTypeFromXmlAdapter(xjta);
+ if (t != null) {
+ addType(t);
+ }
+ return;
}
} else if (classes.contains(cls)) {
return;
@@ -299,18 +309,66 @@
}
}
- 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 getFieldXJTA(final Field f) {
+ XmlJavaTypeAdapter adapter = f.getAnnotation(XmlJavaTypeAdapter.class);
+ if (adapter == null) {
+ adapter = f.getType().getAnnotation(XmlJavaTypeAdapter.class);
}
- if (sp instanceof ParameterizedType) {
- addType(((ParameterizedType)sp).getActualTypeArguments()[0]);
+ 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;
}
+ 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;
+ }
+ }
+ }
+ }
+ 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) {
if (cls == null) {
return;
@@ -368,9 +426,6 @@
&& !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());
@@ -397,12 +452,6 @@
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;
Modified:
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
===================================================================
---
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java 2012-12-19
10:37:43 UTC (rev 17138)
+++
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java 2012-12-19
11:10:25 UTC (rev 17139)
@@ -50,6 +50,8 @@
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
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;
@@ -360,8 +362,8 @@
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));
}
}
}
@@ -374,8 +376,8 @@
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));
}
}
}
@@ -483,7 +485,8 @@
f.set(obj, o);
} else {
- f.set(obj, u.unmarshal(reader, f.getType()));
+ Object o = getElementValue(u.unmarshal(reader,
getFieldType(f)));
+ setFieldValue(f, obj, o);
}
}
} catch (NoSuchFieldException ex) {
@@ -518,8 +521,8 @@
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);
}
}
}
@@ -529,6 +532,46 @@
}
}
+ 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:
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
===================================================================
---
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java 2012-12-19
10:37:43 UTC (rev 17138)
+++
thirdparty/cxf/branches/cxf-2.2.12-patch02_JBPAPP-10129/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java 2012-12-19
11:10:25 UTC (rev 17139)
@@ -527,7 +527,7 @@
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(seq, beanInfo, new QName(namespace, f.getName()),
isArray(type));
@@ -536,8 +536,8 @@
}
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;
@@ -550,6 +550,18 @@
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) {
return ((Class)cls).isArray();