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/24 20:17:03 UTC
svn commit: r1401804 - in
/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb:
JAXBContextInitializer.java JAXBEncoderDecoder.java
JAXBSchemaInitializer.java Utils.java
Author: dkulp
Date: Wed Oct 24 18:17:02 2012
New Revision: 1401804
URL: http://svn.apache.org/viewvc?rev=1401804&view=rev
Log:
Merged revisions 1401614 via git cherry-pick from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1401614 | asoldano | 2012-10-24 06:42:00 -0400 (Wed, 24 Oct 2012) | 2 lines
[CXF-4591] Applying patch from Richard Opalka
........
Added:
cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java
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=1401804&r1=1401803&r2=1401804&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 Wed Oct 24 18:17:02 2012
@@ -34,13 +34,11 @@ import java.util.HashSet;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlTransient;
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;
@@ -180,7 +178,7 @@ class JAXBContextInitializer extends Ser
if (anns != null) {
for (Annotation a : anns) {
if (XmlJavaTypeAdapter.class.isAssignableFrom(a.annotationType())) {
- Type t = getTypeFromXmlAdapter((XmlJavaTypeAdapter)a);
+ Type t = Utils.getTypeFromXmlAdapter((XmlJavaTypeAdapter)a);
if (t != null) {
addType(t);
}
@@ -189,7 +187,7 @@ class JAXBContextInitializer extends Ser
}
XmlJavaTypeAdapter xjta = clazz.getAnnotation(XmlJavaTypeAdapter.class);
if (xjta != null) {
- Type t = getTypeFromXmlAdapter(xjta);
+ Type t = Utils.getTypeFromXmlAdapter(xjta);
if (t != null) {
addType(t);
}
@@ -201,7 +199,7 @@ class JAXBContextInitializer extends Ser
globalAdapters.add(a.type());
}
for (XmlJavaTypeAdapter a: adapt.value()) {
- Type t = getTypeFromXmlAdapter(a);
+ Type t = Utils.getTypeFromXmlAdapter(a);
if (t != null) {
addType(t);
}
@@ -294,7 +292,7 @@ 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
- Type t = getTypeFromXmlAdapter(xjta);
+ Type t = Utils.getTypeFromXmlAdapter(xjta);
if (t != null) {
addType(t);
}
@@ -314,65 +312,6 @@ 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;
- }
-
- 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;
@@ -387,11 +326,7 @@ class JAXBContextInitializer extends Ser
//We'll grab the public field/method types and then add the ObjectFactory stuff
//as well as look for jaxb.index files in those packages.
- XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
- if (accessorType == null && cls.getPackage() != null) {
- accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
- }
- XmlAccessType accessType = accessorType != null ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
+ XmlAccessType accessType = Utils.getXmlAccessType(cls);
if (accessType != XmlAccessType.PROPERTY) { // only look for fields if we are instructed to
//fields are accessible even if not public, must look at the declared fields
@@ -487,7 +422,7 @@ class JAXBContextInitializer extends Ser
* @param annotations the array of annotations from the class member
* @return true if JAXB annotations are present, false otherwise
*/
- private static boolean checkJaxbAnnotation(Annotation[] annotations) {
+ static boolean checkJaxbAnnotation(Annotation[] annotations) {
// must check if there are any jaxb annotations
Package jaxbAnnotationsPackage = XmlElement.class.getPackage();
for (Annotation annotation : annotations) {
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=1401804&r1=1401803&r2=1401804&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 Wed Oct 24 18:17:02 2012
@@ -45,17 +45,13 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.logging.Logger;
-
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.XmlAccessType;
-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;
@@ -74,7 +70,6 @@ import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.jaxb.JAXBUtils;
import org.apache.cxf.common.logging.LogUtils;
@@ -349,12 +344,7 @@ public final class JAXBEncoderDecoder {
try {
writer.writeStartElement("ns1", qn.getLocalPart(), qn.getNamespaceURI());
Class<?> cls = part.getTypeClass();
- XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
- if (accessorType == null && cls.getPackage() != null) {
- accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
- }
- XmlAccessType accessType = accessorType != null
- ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
+ XmlAccessType accessType = Utils.getXmlAccessType(cls);
String namespace = part.getElementQName().getNamespaceURI();
SchemaInfo sch = part.getMessageInfo().getOperation().getInterface()
@@ -366,33 +356,29 @@ public final class JAXBEncoderDecoder {
} else {
LOG.warning("Schema associated with " + namespace + " is null");
}
- for (Field f : ReflectionUtil.getDeclaredFields(cls)) {
- if (JAXBContextInitializer.isFieldAccepted(f, accessType)) {
- XmlAttribute at = f.getAnnotation(XmlAttribute.class);
- if (at == null) {
- QName fname = new QName(namespace, f.getName());
- ReflectionUtil.setAccessible(f);
- if (JAXBSchemaInitializer.isArray(f.getGenericType())) {
- writeArrayObject(marshaller, writer, fname, f.get(elValue));
- } else {
- Object o = getFieldValue(f, elValue);
- writeObject(marshaller, writer, newJAXBElement(fname, String.class, o));
- }
+ for (Field f : Utils.getFields(cls, accessType)) {
+ XmlAttribute at = f.getAnnotation(XmlAttribute.class);
+ if (at == null) {
+ QName fname = new QName(namespace, f.getName());
+ ReflectionUtil.setAccessible(f);
+ if (JAXBSchemaInitializer.isArray(f.getGenericType())) {
+ writeArrayObject(marshaller, writer, fname, f.get(elValue));
+ } else {
+ Object o = Utils.getFieldValue(f, elValue);
+ writeObject(marshaller, writer, newJAXBElement(fname, String.class, o));
}
}
}
- for (Method m : cls.getMethods()) {
- if (JAXBContextInitializer.isMethodAccepted(m, 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 = getMethodValue(m, elValue);
- writeObject(marshaller, writer, newJAXBElement(mname, 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));
}
}
@@ -404,7 +390,7 @@ public final class JAXBEncoderDecoder {
StaxUtils.close(writer);
}
}
-
+
private static void writeArrayObject(Marshaller marshaller,
Object source,
QName mname,
@@ -465,61 +451,44 @@ public final class JAXBEncoderDecoder {
obj = cons.newInstance(new Object[1]);
}
- XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
- if (accessorType == null && cls.getPackage() != null) {
- accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
- }
- XmlAccessType accessType = accessorType != null
- ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
+ XmlAccessType accessType = Utils.getXmlAccessType(cls);
reader.nextTag();
while (reader.getEventType() == XMLStreamReader.START_ELEMENT) {
QName q = reader.getName();
- try {
- Field f = ReflectionUtil.getDeclaredField(cls, q.getLocalPart());
- if (f == null) {
- f = cls.getField(q.getLocalPart());
- }
+ String fieldName = q.getLocalPart();
+ Field f = Utils.getField(cls, accessType, fieldName);
+ if (f != null) {
Type type = f.getGenericType();
- if (JAXBContextInitializer.isFieldAccepted(f, accessType)) {
- f.setAccessible(true);
- if (JAXBSchemaInitializer.isArray(type)) {
- Class<?> compType = JAXBSchemaInitializer
- .getArrayComponentType(type);
- List<Object> ret = unmarshallArray(u, reader,
- q,
- compType,
- createList(type));
- Object o = ret;
- if (!isList(type)) {
- if (compType.isPrimitive()) {
- o = java.lang.reflect.Array.newInstance(compType, ret.size());
- for (int x = 0; x < ret.size(); x++) {
- Array.set(o, x, ret.get(x));
- }
- } else {
- o = ret.toArray((Object[])Array.newInstance(compType, ret.size()));
+ f.setAccessible(true);
+ if (JAXBSchemaInitializer.isArray(type)) {
+ Class<?> compType = JAXBSchemaInitializer.getArrayComponentType(type);
+ List<Object> ret = unmarshallArray(u, reader, q, compType, createList(type));
+ Object o = ret;
+ if (!isList(type)) {
+ if (compType.isPrimitive()) {
+ o = java.lang.reflect.Array.newInstance(compType, ret.size());
+ for (int x = 0; x < ret.size(); x++) {
+ Array.set(o, x, ret.get(x));
}
+ } else {
+ o = ret.toArray((Object[]) Array.newInstance(compType, ret.size()));
}
-
- f.set(obj, o);
- } else {
- Object o = getElementValue(u.unmarshal(reader, getFieldType(f)));
- setFieldValue(f, obj, o);
}
+
+ f.set(obj, o);
} else {
- throw new NoSuchFieldException("No accessible field " + q.getLocalPart());
+ Object o = getElementValue(u.unmarshal(reader, Utils.getFieldType(f)));
+ Utils.setFieldValue(f, obj, o);
}
- } catch (NoSuchFieldException ex) {
+ } else {
String s = Character.toUpperCase(q.getLocalPart().charAt(0))
+ q.getLocalPart().substring(1);
- Method m = null;
- try {
- m = cls.getMethod("get" + s);
- } catch (NoSuchMethodException mex) {
- m = cls.getMethod("is" + s);
+ Method m = Utils.getMethod(cls, accessType, "get" + s);
+ if (m == null) {
+ m = Utils.getMethod(cls, accessType, "is" + s);
}
Type type = m.getGenericReturnType();
- Method m2 = cls.getMethod("set" + s, m.getReturnType());
+ Method m2 = Utils.getMethod(cls, accessType, "set" + s, m.getReturnType());
if (JAXBSchemaInitializer.isArray(type)) {
Class<?> compType = JAXBSchemaInitializer
.getArrayComponentType(type);
@@ -541,8 +510,8 @@ public final class JAXBEncoderDecoder {
m2.invoke(obj, o);
} else {
- Object o = getElementValue(u.unmarshal(reader, getMethodReturnType(m)));
- setMethodValue(m, m2, obj, o);
+ Object o = getElementValue(u.unmarshal(reader, Utils.getMethodReturnType(m)));
+ Utils.setMethodValue(m, m2, obj, o);
}
}
}
@@ -552,46 +521,6 @@ 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=1401804&r1=1401803&r2=1401804&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 Wed Oct 24 18:17:02 2012
@@ -32,7 +32,6 @@ import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlAdapter;
@@ -516,35 +515,25 @@ class JAXBSchemaInitializer extends Serv
XmlSchemaSequence seq = new XmlSchemaSequence();
ct.setParticle(seq);
String namespace = part.getElementQName().getNamespaceURI();
+ XmlAccessType accessType = Utils.getXmlAccessType(cls);
- XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
- if (accessorType == null && cls.getPackage() != null) {
- accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
- }
- XmlAccessType accessType = accessorType != null ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
-
-
- for (Field f : cls.getDeclaredFields()) {
- if (JAXBContextInitializer.isFieldAccepted(f, accessType)) {
- //map field
- Type type = getFieldType(f);
- JAXBBeanInfo beanInfo = getBeanInfo(type);
- if (beanInfo != null) {
- addElement(schema, seq, beanInfo, new QName(namespace, f.getName()), isArray(type));
- }
- }
- }
- for (Method m : cls.getMethods()) {
- if (JAXBContextInitializer.isMethodAccepted(m, accessType)) {
- //map method
- Type type = getMethodReturnType(m);
- JAXBBeanInfo beanInfo = getBeanInfo(type);
- if (beanInfo != null) {
- int idx = m.getName().startsWith("get") ? 3 : 2;
- String name = m.getName().substring(idx);
- name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
- addElement(schema, seq, beanInfo, new QName(namespace, name), isArray(type));
- }
+ for (Field f : Utils.getFields(cls, accessType)) {
+ //map field
+ Type type = Utils.getFieldType(f);
+ JAXBBeanInfo beanInfo = getBeanInfo(type);
+ if (beanInfo != null) {
+ addElement(schema, seq, beanInfo, new QName(namespace, f.getName()), isArray(type));
+ }
+ }
+ for (Method m : Utils.getGetters(cls, accessType)) {
+ //map method
+ Type type = Utils.getMethodReturnType(m);
+ JAXBBeanInfo beanInfo = getBeanInfo(type);
+ if (beanInfo != null) {
+ int idx = m.getName().startsWith("get") ? 3 : 2;
+ String name = m.getName().substring(idx);
+ name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
+ addElement(schema, seq, beanInfo, new QName(namespace, name), isArray(type));
}
}
// Create element in xsd:sequence for Exception.class
@@ -561,18 +550,6 @@ class JAXBSchemaInitializer extends Serv
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();
Added: cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java?rev=1401804&view=auto
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java (added)
+++ cxf/branches/2.6.x-fixes/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java Wed Oct 24 18:17:02 2012
@@ -0,0 +1,312 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.jaxb;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
+
+/**
+ * JAXB reflection utilities.
+ */
+final class Utils {
+ private Utils() {
+ }
+
+ static XmlAccessType getXmlAccessType(Class<?> cls) {
+ XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
+ if (accessorType == null && cls.getPackage() != null) {
+ accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
+ }
+ return accessorType != null
+ ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
+ }
+
+ static Collection<Field> getFields(Class<?> cls, XmlAccessType accessType) {
+ if (cls.isAnnotationPresent(XmlTransient.class)) {
+ // When placed on a class, it indicates that the class shouldn't be mapped
+ // to XML by itself. Properties on such class will be mapped to XML along
+ // with its derived classes, as if the class is inlined.
+ return Collections.emptySet();
+ } else {
+ return getFieldsInternal(cls, accessType);
+ }
+ }
+
+ private static Collection<Field> getFieldsInternal(Class<?> cls, XmlAccessType accessType) {
+ Set<Field> fields = new HashSet<Field>();
+ Class<?> superClass = cls.getSuperclass();
+ if (superClass != null && superClass.isAnnotationPresent(XmlTransient.class)) {
+ // only if superClass is @XmlTransient annotated it will be processed recursively
+ fields.addAll(getFieldsInternal(superClass, accessType));
+ }
+ // process current class
+ for (Field field : cls.getDeclaredFields()) {
+ if (JAXBContextInitializer.isFieldAccepted(field, accessType)) {
+ fields.add(field);
+ }
+ }
+ return fields;
+ }
+
+ private static Collection<Method> getMethods(Class<?> cls, XmlAccessType accessType, boolean acceptSetters) {
+ if (cls.isAnnotationPresent(XmlTransient.class)) {
+ // When placed on a class, it indicates that the class shouldn't be mapped
+ // to XML by itself. Properties on such class will be mapped to XML along
+ // with its derived classes, as if the class is inlined.
+ return Collections.emptySet();
+ } else {
+ return getMethodsInternal(cls, accessType, acceptSetters);
+ }
+ }
+
+ private static Collection<Method> getMethodsInternal(Class<?> cls, XmlAccessType accessType,
+ boolean acceptSetters) {
+ Set<Method> methods = new HashSet<Method>();
+ Class<?> superClass = cls.getSuperclass();
+ if (superClass != null && superClass.isAnnotationPresent(XmlTransient.class)) {
+ // only if superClass is @XmlTransient annotated it will be processed recursively
+ methods.addAll(getMethodsInternal(superClass, accessType, acceptSetters));
+ }
+ // process current class
+ for (Method method : cls.getDeclaredMethods()) {
+ if (isMethodAccepted(method, accessType, acceptSetters)) {
+ methods.add(method);
+ }
+ }
+ return methods;
+ }
+
+ static Method getMethod(Class<?> cls, XmlAccessType accessType, String methodName,
+ Class<?>... paramTypes) {
+ for (Method m : getMethods(cls, accessType, true)) {
+ if (m.getName().equals(methodName) && Arrays.equals(m.getParameterTypes(), paramTypes)) {
+ return m;
+ }
+ }
+ return null;
+ }
+
+ static Field getField(Class<?> cls, XmlAccessType accessType, String fieldName) {
+ for (final Field f : getFields(cls, accessType)) {
+ if (f.getName().equals(fieldName)) {
+ return f;
+ }
+ }
+ return null;
+ }
+
+ static Collection<Method> getGetters(Class<?> cls, XmlAccessType accessType) {
+ return getMethods(cls, accessType, false);
+ }
+
+ static boolean isMethodAccepted(Method method, XmlAccessType accessType, boolean acceptSetters) {
+ // ignore bridge, static, @XmlTransient methods plus methods declared in Throwable
+ if (method.isBridge()
+ || Modifier.isStatic(method.getModifiers())
+ || method.isAnnotationPresent(XmlTransient.class)
+ || method.getDeclaringClass().equals(Throwable.class)) {
+ return false;
+ }
+ // Allow only public methods if PUBLIC_MEMBER access is requested
+ if (accessType == XmlAccessType.PUBLIC_MEMBER && !Modifier.isPublic(method.getModifiers())) {
+ return false;
+ }
+ if (isGetter(method)) {
+ // does nothing
+ } else if (isSetter(method)) {
+ if (!acceptSetters) {
+ return false;
+ }
+ } else {
+ // we accept only getters and setters
+ return false;
+ }
+ // let JAXB annotations decide if NONE or FIELD access is requested
+ if (accessType == XmlAccessType.NONE || accessType == XmlAccessType.FIELD) {
+ return JAXBContextInitializer.checkJaxbAnnotation(method.getAnnotations());
+ }
+ // method accepted
+ return true;
+ }
+
+ private static boolean isGetter(Method m) {
+ Class<?> declaringClass = m.getDeclaringClass();
+ if (m.getReturnType() != Void.class && m.getParameterTypes().length == 0) {
+ final int index = getterIndex(m.getName());
+ if (index != -1) {
+ String setterName = "set" + m.getName().substring(index);
+ Class<?> paramTypes = m.getReturnType();
+ Method setter = getDeclaredMethod(declaringClass, setterName, paramTypes);
+ if (setter != null && !setter.isAnnotationPresent(XmlTransient.class)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static boolean isSetter(Method m) {
+ Class<?> declaringClass = m.getDeclaringClass();
+ boolean isVoidReturnType = m.getReturnType() == Void.class || m.getReturnType() == Void.TYPE;
+ if (isVoidReturnType && m.getParameterTypes().length == 1 && m.getName().startsWith("set")) {
+ String getterName = "get" + m.getName().substring(3);
+ Class<?> setterParamType = m.getParameterTypes()[0];
+ Method getter = getDeclaredMethod(declaringClass, getterName);
+ if (getter != null && getter.getReturnType().equals(setterParamType)
+ && !getter.isAnnotationPresent(XmlTransient.class)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static int getterIndex(String methodName) {
+ if (methodName.startsWith("is")) {
+ return 2;
+ }
+ if (methodName.startsWith("get")) {
+ return 3;
+ }
+ return -1;
+ }
+
+ private static Method getDeclaredMethod(Class<?> cls, String methodName, Class<?>... paramTypes) {
+ try {
+ return cls.getDeclaredMethod(methodName, paramTypes);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ static Class<?> getFieldType(Field f) {
+ XmlJavaTypeAdapter adapter = getFieldXJTA(f);
+ Class<?> adapterType = getTypeFromXmlAdapter(adapter);
+ return adapterType != null ? adapterType : f.getType();
+ }
+
+ static Class<?> getMethodReturnType(Method m) {
+ XmlJavaTypeAdapter adapter = getMethodXJTA(m);
+ Class<?> adapterType = getTypeFromXmlAdapter(adapter);
+ return adapterType != null ? adapterType : m.getReturnType();
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ static Object getFieldValue(Field f, Object target) throws Exception {
+ XmlJavaTypeAdapter adapterAnnotation = getFieldXJTA(f);
+ XmlAdapter adapter = getXmlAdapter(adapterAnnotation);
+ return adapter != null ? adapter.marshal(f.get(target)) : f.get(target);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ static Object getMethodValue(Method m, Object target) throws Exception {
+ XmlJavaTypeAdapter adapterAnnotation = getMethodXJTA(m);
+ XmlAdapter adapter = getXmlAdapter(adapterAnnotation);
+ return adapter != null ? adapter.marshal(m.invoke(target)) : m.invoke(target);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ static void setFieldValue(Field f, Object target, Object value) throws Exception {
+ XmlJavaTypeAdapter xjta = getFieldXJTA(f);
+ XmlAdapter adapter = getXmlAdapter(xjta);
+ f.set(target, adapter != null ? adapter.unmarshal(value) : value);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ static void setMethodValue(Method getter, Method setter, Object target, Object value) throws Exception {
+ XmlJavaTypeAdapter xjta = getMethodXJTA(getter);
+ XmlAdapter adapter = getXmlAdapter(xjta);
+ setter.invoke(target, adapter != null ? adapter.unmarshal(value) : value);
+ }
+
+ @SuppressWarnings("rawtypes")
+ static XmlAdapter getXmlAdapter(XmlJavaTypeAdapter adapterAnnotation)
+ throws InstantiationException, IllegalAccessException {
+ return adapterAnnotation != null ? adapterAnnotation.value().newInstance() : null;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+}