Author: alessio.soldano(a)jboss.com
Date: 2008-07-30 10:16:59 -0400 (Wed, 30 Jul 2008)
New Revision: 7954
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/AbstractWrapperGenerator.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/DynamicWrapperGenerator.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/tools/jaxws/impl/SourceWrapperGenerator.java
Log:
[JBWS-2152] Dealing with @XmlTransient annotation when generating fault bean
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/AbstractWrapperGenerator.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/AbstractWrapperGenerator.java 2008-07-30
14:09:59 UTC (rev 7953)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/AbstractWrapperGenerator.java 2008-07-30
14:16:59 UTC (rev 7954)
@@ -22,12 +22,15 @@
package org.jboss.ws.core.jaxws;
import java.beans.Introspector;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import javax.xml.bind.annotation.XmlTransient;
+
/**
* Base class for JAX-WS wrapper generation.
*
@@ -58,13 +61,13 @@
excludedGetters.add("getStackTrace");
}
- protected SortedMap<String, Class<?>>
getExceptionProperties(Class<?> exception)
+ protected SortedMap<String, ExceptionProperty>
getExceptionProperties(Class<?> exception)
{
if (! Exception.class.isAssignableFrom(exception))
throw new IllegalArgumentException("Not an exception");
- TreeMap<String, Class<?>> sortedGetters = new TreeMap<String,
Class<?>>();
-
+ TreeMap<String, ExceptionProperty> sortedGetters = new TreeMap<String,
ExceptionProperty>();
+
for (Method method : exception.getMethods())
{
if (java.lang.reflect.Modifier.isStatic(method.getModifiers()))
@@ -78,6 +81,8 @@
if (excludedGetters.contains(name))
continue;
+ boolean isTransient = method.isAnnotationPresent(XmlTransient.class);
+
int offset;
if (name.startsWith("get"))
offset = 3;
@@ -87,9 +92,64 @@
continue;
name = Introspector.decapitalize(name.substring(offset));
- sortedGetters.put(name, returnType);
+
+ if (!isTransient)
+ {
+ try
+ {
+ Field field = exception.getDeclaredField(name);
+ isTransient = field.getAnnotation(XmlTransient.class) != null;
+ }
+ catch (Exception e) {}
+ }
+
+ sortedGetters.put(name, new ExceptionProperty(name, returnType, isTransient));
}
return sortedGetters;
}
+
+ protected class ExceptionProperty
+ {
+ private String name;
+ private Class<?> returnType;
+ private boolean transientAnnotated;
+
+ public ExceptionProperty()
+ {
+
+ }
+
+ public ExceptionProperty(String name, Class<?> returnType, boolean
transientAnnotated)
+ {
+ this.name = name;
+ this.returnType = returnType;
+ this.transientAnnotated = transientAnnotated;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+ public Class<?> getReturnType()
+ {
+ return returnType;
+ }
+ public void setReturnType(Class<?> returnType)
+ {
+ this.returnType = returnType;
+ }
+ public boolean isTransientAnnotated()
+ {
+ return transientAnnotated;
+ }
+ public void setTransientAnnotated(boolean transientAnnotated)
+ {
+ this.transientAnnotated = transientAnnotated;
+ }
+ }
}
\ No newline at end of file
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/DynamicWrapperGenerator.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/DynamicWrapperGenerator.java 2008-07-30
14:09:59 UTC (rev 7953)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/DynamicWrapperGenerator.java 2008-07-30
14:16:59 UTC (rev 7954)
@@ -23,6 +23,8 @@
import java.util.List;
import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeSet;
import javassist.CannotCompileException;
import javassist.ClassPool;
@@ -35,7 +37,14 @@
import javassist.NotFoundException;
import javassist.bytecode.ConstPool;
-import javax.xml.bind.annotation.*;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttachmentRef;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlMimeType;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.jboss.logging.Logger;
@@ -112,7 +121,8 @@
clazz, parameter.getType(),
parameter.getName(), parameter.getVariable(),
parameter.getTypeArguments(),
- new boolean[] {parameter.isSwaRef(), parameter.isXop()}
+ new boolean[] {parameter.isSwaRef(), parameter.isXop()},
+ false
);
}
clazz.stopPruning(!prune);
@@ -139,18 +149,17 @@
Class exception = fmd.getJavaType();
try
{
- SortedMap<String, Class<?>> properties =
getExceptionProperties(exception);
- String[] propertyOrder = properties.keySet().toArray(new String[0]);
+ SortedMap<String, ExceptionProperty> properties =
getExceptionProperties(exception);
CtClass clazz = pool.makeClass(faultBeanName);
clazz.getClassFile().setVersionToJava5();
- addClassAnnotations(clazz, fmd.getXmlName(), fmd.getXmlType(), propertyOrder);
+ addClassAnnotations(clazz, fmd.getXmlName(), fmd.getXmlType(),
getPropertyOrder(properties));
- for (String property : propertyOrder)
+ for (ExceptionProperty prop : properties.values())
addProperty(
- clazz, properties.get(property).getName(),
- new QName(property), property, null,
- new boolean[] {false, false}
+ clazz, prop.getReturnType().getName(),
+ new QName(prop.getName()), prop.getName(), null,
+ new boolean[] {false, false}, prop.isTransientAnnotated()
);
clazz.stopPruning(!prune);
@@ -171,6 +180,18 @@
{
return type == CtClass.booleanType ||
"java.lang.Boolean".equals(type.getName()) ? "is" : "get";
}
+
+ //get the propertyOrder list (iow excludes the XmlTransient annotated properties)
+ private String[] getPropertyOrder(SortedMap<String, ExceptionProperty>
sortedProperties)
+ {
+ SortedSet<String> set = new TreeSet<String>();
+ for (String prop : sortedProperties.keySet())
+ {
+ if (sortedProperties.get(prop).isTransientAnnotated() == false)
+ set.add(prop);
+ }
+ return set.toArray(new String[0]);
+ }
private String typeSignature(String type, String[] arguments)
{
@@ -195,7 +216,7 @@
private void addProperty(CtClass clazz, String typeName,
QName name, String variable, String[] typeArguments,
- boolean[] attachments)
+ boolean[] attachments, boolean xmlTransient)
throws CannotCompileException, NotFoundException
{
ConstPool constPool = clazz.getClassFile().getConstPool();
@@ -211,12 +232,16 @@
JavassistUtils.addSignature(field, typeSignature);
}
+ JavassistUtils.Annotation annotation;
// Add @XmlElement
- JavassistUtils.Annotation annotation =
JavassistUtils.createAnnotation(XmlElement.class, constPool);
- if (name.getNamespaceURI() != null)
- annotation.addParameter("namespace", name.getNamespaceURI());
- annotation.addParameter("name", name.getLocalPart());
- annotation.markField(field);
+ if (!xmlTransient)
+ {
+ annotation = JavassistUtils.createAnnotation(XmlElement.class, constPool);
+ if (name.getNamespaceURI() != null)
+ annotation.addParameter("namespace", name.getNamespaceURI());
+ annotation.addParameter("name", name.getLocalPart());
+ annotation.markField(field);
+ }
// @XmlAttachmentRef
if(attachments[0])
{
@@ -230,6 +255,12 @@
annotation.addParameter("value",
"application/octet-stream"); // TODO: default mime
annotation.markField(field);
}
+ // @XmlTransient
+ if(xmlTransient)
+ {
+ annotation = JavassistUtils.createAnnotation(XmlTransient.class, constPool);
+ annotation.markField(field);
+ }
clazz.addField(field);
// Add accessor methods
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/tools/jaxws/impl/SourceWrapperGenerator.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/tools/jaxws/impl/SourceWrapperGenerator.java 2008-07-30
14:09:59 UTC (rev 7953)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/tools/jaxws/impl/SourceWrapperGenerator.java 2008-07-30
14:16:59 UTC (rev 7954)
@@ -41,6 +41,7 @@
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import java.io.File;
@@ -105,7 +106,7 @@
addClassAnnotations(clazz, parameterMD.getXmlName(), parameterMD.getXmlType(),
null);
for (WrappedParameter wrapped : wrappedParameters)
{
- addProperty(clazz, wrapped.getType(), wrapped.getName(),
wrapped.getVariable(), loader);
+ addProperty(clazz, wrapped.getType(), wrapped.getName(),
wrapped.getVariable(), false, loader);
}
}
catch (Exception e)
@@ -121,7 +122,7 @@
try
{
- SortedMap<String, Class<?>> properties =
getExceptionProperties(exception);
+ SortedMap<String, ExceptionProperty> properties =
getExceptionProperties(exception);
String[] propertyOrder = properties.keySet().toArray(new String[0]);
JDefinedClass clazz = codeModel._class(faultBeanName);
@@ -129,7 +130,8 @@
for (String property : propertyOrder)
{
- addProperty(clazz, properties.get(property).getName(), new QName(property),
property, loader);
+ ExceptionProperty p = properties.get(property);
+ addProperty(clazz, p.getReturnType().getName(), new QName(property),
property, p.isTransientAnnotated(), loader);
}
}
catch (Exception e)
@@ -143,7 +145,7 @@
return (Boolean.TYPE == type || Boolean.class == type) ? "is" :
"get";
}
- private static void addProperty(JDefinedClass clazz, String typeName, QName name,
String variable, ClassLoader loader)
+ private static void addProperty(JDefinedClass clazz, String typeName, QName name,
String variable, boolean xmlTransient, ClassLoader loader)
throws ClassNotFoundException
{
// be careful about reserved keywords when generating variable names
@@ -153,13 +155,21 @@
Class<?> type = JavaUtils.loadJavaType(typeName, loader);
JFieldVar field = clazz.field(JMod.PRIVATE, type, realVariableName);
- // define XmlElement annotation for variable
- JAnnotationUse annotation = field.annotate(XmlElement.class);
- annotation.param("name", name.getLocalPart());
- if (name.getNamespaceURI() != null)
+ if (xmlTransient == false)
{
- annotation.param("namespace", name.getNamespaceURI());
+ // define XmlElement annotation for variable
+ JAnnotationUse annotation = field.annotate(XmlElement.class);
+ annotation.param("name", name.getLocalPart());
+ if (name.getNamespaceURI() != null)
+ {
+ annotation.param("namespace", name.getNamespaceURI());
+ }
}
+ else
+ {
+ //XmlTransient
+ field.annotate(XmlTransient.class);
+ }
// generate acessor get method for variable
JMethod method = clazz.method(JMod.PUBLIC, type, getterPrefix(type) +
JavaUtils.capitalize(variable));