Author: dkulp
Date: Thu Oct 4 18:07:45 2012
New Revision: 1394184
URL: http://svn.apache.org/viewvc?rev=1394184&view=rev
Log:
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.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/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.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=1394184&r1=1394183&r2=1394184&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
Thu Oct 4 18:07:45 2012
@@ -180,13 +180,19 @@ 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);
@@ -195,7 +201,10 @@ class JAXBContextInitializer extends Ser
globalAdapters.add(a.type());
}
for (XmlJavaTypeAdapter a: adapt.value()) {
- inspectTypeAdapter(a.value());
+ Type t = getTypeFromXmlAdapter(a);
+ if (t != null) {
+ addType(t);
+ }
}
}
}
@@ -285,9 +294,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;
}
@@ -303,17 +313,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(@SuppressWarnings("rawtypes") 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) {
@@ -373,9 +430,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());
@@ -402,12 +456,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;
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=1394184&r1=1394183&r2=1394184&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
Thu Oct 4 18:07:45 2012
@@ -54,6 +54,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;
@@ -373,8 +375,8 @@ public final class JAXBEncoderDecoder {
if (JAXBSchemaInitializer.isArray(f.getGenericType()))
{
writeArrayObject(marshaller, writer, fname,
f.get(elValue));
} else {
- writeObject(marshaller, writer,
newJAXBElement(fname, String.class,
-
f.get(elValue)));
+ Object o = getFieldValue(f, elValue);
+ writeObject(marshaller, writer,
newJAXBElement(fname, String.class, o));
}
}
}
@@ -388,8 +390,8 @@ public final class JAXBEncoderDecoder {
if
(JAXBSchemaInitializer.isArray(m.getGenericReturnType())) {
writeArrayObject(marshaller, writer, mname,
m.invoke(elValue));
} else {
- writeObject(marshaller, writer, newJAXBElement(mname,
String.class,
-
m.invoke(elValue)));
+ Object o = getMethodValue(m, elValue);
+ writeObject(marshaller, writer, newJAXBElement(mname,
String.class, o));
}
}
}
@@ -499,7 +501,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());
@@ -536,8 +539,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);
}
}
}
@@ -547,6 +550,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.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java?rev=1394184&r1=1394183&r2=1394184&view=diff
==============================================================================
---
cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
(original)
+++
cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
Thu Oct 4 18:07:45 2012
@@ -527,7 +527,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));
@@ -536,8 +536,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;
@@ -560,6 +560,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) {