You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2007/10/25 19:10:56 UTC
svn commit: r588283 [9/18] - in /incubator/cxf/branches/jliu: ./ api/
api/src/main/java/org/apache/cxf/databinding/
api/src/main/java/org/apache/cxf/io/
api/src/main/java/org/apache/cxf/message/
api/src/main/java/org/apache/cxf/phase/ api/src/main/java...
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java Thu Oct 25 10:09:20 2007
@@ -19,16 +19,23 @@
package org.apache.cxf.jaxb;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
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.XmlTransient;
+
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.service.ServiceModelVisitor;
import org.apache.cxf.service.model.MessagePartInfo;
@@ -56,12 +63,12 @@
}
boolean isFromWrapper = part.getMessageInfo().getOperation().isUnwrapped();
- if (isFromWrapper
- && clazz.isArray()
+ if (isFromWrapper
+ && clazz.isArray()
&& !Byte.TYPE.equals(clazz.getComponentType())) {
clazz = clazz.getComponentType();
}
-
+
Type genericType = (Type) part.getProperty("generic.type");
if (genericType != null) {
boolean isList = Collection.class.isAssignableFrom(clazz);
@@ -73,38 +80,38 @@
&& !Byte.TYPE.equals(cl2.getComponentType())) {
genericType = cl2.getComponentType();
}
- addType(genericType);
+ addType(genericType);
} else if (!isList) {
- addType(genericType);
+ addType(genericType);
}
} else {
- addType(genericType);
+ addType(genericType);
}
-
- if (isList
+
+ if (isList
&& genericType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericType;
- if (pt.getActualTypeArguments().length > 0
+ if (pt.getActualTypeArguments().length > 0
&& pt.getActualTypeArguments()[0] instanceof Class) {
-
- Class<? extends Object> arrayCls =
+
+ Class<? extends Object> arrayCls =
Array.newInstance((Class) pt.getActualTypeArguments()[0], 0).getClass();
clazz = arrayCls;
part.setTypeClass(clazz);
if (isFromWrapper) {
addType(clazz.getComponentType());
}
- } else if (pt.getActualTypeArguments().length > 0
+ } else if (pt.getActualTypeArguments().length > 0
&& pt.getActualTypeArguments()[0] instanceof GenericArrayType) {
GenericArrayType gat = (GenericArrayType)pt.getActualTypeArguments()[0];
gat.getGenericComponentType();
- Class<? extends Object> arrayCls =
+ Class<? extends Object> arrayCls =
Array.newInstance((Class) gat.getGenericComponentType(), 0).getClass();
clazz = Array.newInstance(arrayCls, 0).getClass();
part.setTypeClass(clazz);
if (isFromWrapper) {
addType(clazz.getComponentType());
- }
+ }
}
}
if (isFromWrapper && isList) {
@@ -115,7 +122,7 @@
addClass(clazz);
}
}
-
+
private void addType(Type cls) {
if (cls instanceof Class) {
addClass((Class)cls);
@@ -127,11 +134,11 @@
GenericArrayType gt = (GenericArrayType)cls;
Class ct = (Class) gt.getGenericComponentType();
ct = Array.newInstance(ct, 0).getClass();
-
+
addClass(ct);
}
}
-
+
private void addClass(Class<?> cls) {
if (cls.isArray() && cls.getComponentType().isPrimitive()) {
@@ -172,28 +179,101 @@
}
}
-
private void walkReferences(Class<?> cls) {
if (cls.getName().startsWith("java.")
|| cls.getName().startsWith("javax.")) {
return;
}
- //walk the public fields/methods to try and find all the classes. JAXB will only load the
- //EXACT classes in the fields/methods if they are in a different package. Thus,
+ //walk the public fields/methods to try and find all the classes. JAXB will only load the
+ //EXACT classes in the fields/methods if they are in a different package. Thus,
//subclasses won't be found and the xsi:type stuff won't work at all.
- //We'll grab the public field/method types and then add the ObjectFactory stuff
+ //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.
-
- Field fields[] = cls.getFields();
- for (Field f : fields) {
- addType(f.getGenericType());
+
+ XmlAccessorType accessorType = cls.getAnnotation(XmlAccessorType.class);
+ if (accessorType == null && cls.getPackage() != null) {
+ accessorType = cls.getPackage().getAnnotation(XmlAccessorType.class);
}
- Method methods[] = cls.getMethods();
- for (Method m : methods) {
- addType(m.getGenericReturnType());
- for (Type t : m.getGenericParameterTypes()) {
- addType(t);
+ XmlAccessType accessType = accessorType != null ? accessorType.value() : XmlAccessType.PUBLIC_MEMBER;
+
+ if (accessType != XmlAccessType.PROPERTY) { // only look for fields if we are instructed to
+ Field fields[] = cls.getFields();
+ for (Field f : fields) {
+ if (isFieldAccepted(f, accessType)) {
+ addType(f.getGenericType());
+ }
+ }
+ }
+
+ if (accessType != XmlAccessType.FIELD) { // only look for methods if we are instructed to
+ Method methods[] = cls.getMethods();
+ for (Method m : methods) {
+ if (isMethodAccepted(m, accessType)) {
+ addType(m.getGenericReturnType());
+ for (Type t : m.getGenericParameterTypes()) {
+ addType(t);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks is the field is accepted as a JAXB property.
+ */
+ private boolean isFieldAccepted(Field field, XmlAccessType accessType) {
+ // We only accept non static fields which are not marked @XmlTransient
+ if (Modifier.isStatic(field.getModifiers()) || field.isAnnotationPresent(XmlTransient.class)) {
+ return false;
+ }
+
+ if (accessType == XmlAccessType.NONE) {
+ return checkJaxbAnnotation(field.getAnnotations());
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Checks is the method is accepted as a JAXB property getter.
+ */
+ private boolean isMethodAccepted(Method method, XmlAccessType accessType) {
+ // We only accept non static property getters which are not marked @XmlTransient
+ if (Modifier.isStatic(method.getModifiers()) || method.isAnnotationPresent(XmlTransient.class)) {
+ return false;
+ }
+
+ // must not have parameters and return type must not be void
+ if (method.getReturnType() == Void.class || method.getParameterTypes().length != 0) {
+ return false;
+ }
+
+ boolean isPropGetter = method.getName().startsWith("get") || method.getName().startsWith("is");
+
+ if (!isPropGetter) {
+ return false;
+ }
+
+ if (accessType == XmlAccessType.NONE) {
+ return checkJaxbAnnotation(method.getAnnotations());
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Checks if there are JAXB annotations among the annotations of the class member.
+ * @param annotations the array of annotations from the class member
+ * @return true if JAXB annotations are present, false otherwise
+ */
+ private boolean checkJaxbAnnotation(Annotation[] annotations) {
+ // must check if there are any jaxb annotations
+ Package jaxbAnnotationsPackage = XmlElement.class.getPackage();
+ for (Annotation annotation : annotations) {
+ if (annotation.annotationType().getPackage() == jaxbAnnotationsPackage) {
+ return true;
}
}
+ return false;
}
-}
+}
\ No newline at end of file
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java Thu Oct 25 10:09:20 2007
@@ -72,7 +72,7 @@
return new JAXBAttachmentUnmarshaller(attachments);
}
- protected AttachmentMarshaller getAttachmentMarrshaller() {
+ protected AttachmentMarshaller getAttachmentMarshaller() {
return new JAXBAttachmentMarshaller(attachments);
}
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Thu Oct 25 10:09:20 2007
@@ -32,8 +32,9 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.ResourceBundle;
import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.xml.bind.JAXBContext;
@@ -53,8 +54,8 @@
import com.sun.xml.bind.v2.ContextFactory;
import com.sun.xml.bind.v2.runtime.JAXBContextImpl;
-import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.common.util.CacheMap;
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.common.util.StringUtils;
@@ -72,13 +73,13 @@
import org.apache.ws.commons.schema.XmlSchemaCollection;
public final class JAXBDataBinding extends AbstractDataBinding implements DataBinding {
-
public static final String SCHEMA_RESOURCE = "SCHEMRESOURCE";
public static final String UNWRAP_JAXB_ELEMENT = "unwrap.jaxb.element";
- private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JAXBDataBinding.class);
-
+ private static final Logger LOG = LogUtils.getLogger(JAXBDataBinding.class);
+
+
private static final Class<?> SUPPORTED_READER_FORMATS[] = new Class<?>[] {Node.class,
XMLEventReader.class,
XMLStreamReader.class};
@@ -198,6 +199,9 @@
}
}
+ if (LOG.isLoggable(Level.FINE)) {
+ LOG.log(Level.FINE, "CREATED_JAXB_CONTEXT", new Object[] {ctx, contextClasses});
+ }
setContext(ctx);
@@ -225,7 +229,7 @@
(Document)r.getNode(), r.getSystemId());
}
} catch (IOException e) {
- throw new ServiceConstructionException(new Message("SCHEMA_GEN_EXC", BUNDLE), e);
+ throw new ServiceConstructionException(new Message("SCHEMA_GEN_EXC", LOG), e);
}
}
@@ -392,8 +396,8 @@
//Now we can not add all the classes that Jaxb needed into JaxbContext, especially when
- //an ObjectFactroy is pointed by an jaxb @XmlElementDecl annotation
- //added this workaround method to load the jaxb needed OjbectFactory class
+ //an ObjectFactory is pointed to by an jaxb @XmlElementDecl annotation
+ //added this workaround method to load the jaxb needed ObjectFactory class
public boolean addJaxbObjectFactory(JAXBException e1) {
boolean added = false;
java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
@@ -418,6 +422,14 @@
}
return added;
+ }
+
+ /**
+ * Jaxb has no declared namespace prefixes.
+ * {@inheritDoc}
+ */
+ public Map<String, String> getDeclaredNamespaceMappings() {
+ return null;
}
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Thu Oct 25 10:09:20 2007
@@ -200,6 +200,27 @@
public static void marshall(JAXBContext context, Schema schema, Object elValue, Object source) {
marshall(context, schema, elValue, null, source, null);
}
+
+ @SuppressWarnings("unchecked")
+ public static void marshallNullElement(JAXBContext context, Schema schema,
+ Object source, MessagePartInfo part) {
+ Class<?> clazz = part != null ? (Class) part.getTypeClass() : null;
+ try {
+ Marshaller u = createMarshaller(context, clazz);
+ u.setSchema(schema);
+ try {
+ // The Marshaller.JAXB_FRAGMENT will tell the Marshaller not to
+ // generate the xml declaration.
+ u.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ u.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
+ } catch (javax.xml.bind.PropertyException e) {
+ // intentionally empty.
+ }
+ writeObject(u, source, new JAXBElement(part.getElementQName(), clazz, null));
+ } catch (JAXBException e) {
+ throw new Fault(new Message("MARSHAL_ERROR", BUNDLE, e.getMessage()), e);
+ }
+ }
public static void marshall(JAXBContext context, Schema schema,
Object elValue,
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBSchemaInitializer.java Thu Oct 25 10:09:20 2007
@@ -20,13 +20,18 @@
package org.apache.cxf.jaxb;
import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import java.util.Iterator;
+import java.util.logging.Logger;
import javax.xml.namespace.QName;
import com.sun.xml.bind.v2.runtime.JAXBContextImpl;
import com.sun.xml.bind.v2.runtime.JaxBeanInfo;
+import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.service.ServiceModelVisitor;
import org.apache.cxf.service.model.FaultInfo;
import org.apache.cxf.service.model.MessagePartInfo;
@@ -46,6 +51,7 @@
* Walks the service model and sets up the element/type names.
*/
class JAXBSchemaInitializer extends ServiceModelVisitor {
+ private static final Logger LOG = LogUtils.getLogger(JAXBSchemaInitializer.class);
private XmlSchemaCollection schemas;
private JAXBContextImpl context;
@@ -148,20 +154,20 @@
private void createBridgeXsElement(MessagePartInfo part, QName qn, QName typeName) {
XmlSchemaElement el = null;
- SchemaInfo schemaInfo = null;
- for (SchemaInfo s : serviceInfo.getSchemas()) {
- if (s.getNamespaceURI().equals(qn.getNamespaceURI())) {
- schemaInfo = s;
-
+ SchemaInfo schemaInfo = serviceInfo.getSchema(qn.getNamespaceURI());
+ if (schemaInfo != null) {
+ el = schemaInfo.getElementByQName(qn);
+ if (el == null) {
el = createXsElement(part, typeName, schemaInfo);
schemaInfo.getSchema().getElements().add(el.getQName(), el);
schemaInfo.getSchema().getItems().add(el);
-
- return;
+ } else if (!typeName.equals(el.getSchemaTypeName())) {
+ throw new Fault(new Message("CANNOT_CREATE_ELEMENT", LOG,
+ qn, typeName, el.getSchemaTypeName()));
}
+ return;
}
-
schemaInfo = new SchemaInfo(serviceInfo, qn.getNamespaceURI());
el = createXsElement(part, typeName, schemaInfo);
@@ -171,6 +177,7 @@
schema.getItems().add(el);
NamespaceMap nsMap = new NamespaceMap();
+ nsMap.add(WSDLConstants.CONVENTIONAL_TNS_PREFIX, schema.getTargetNamespace());
nsMap.add(WSDLConstants.NP_SCHEMA_XSD, WSDLConstants.NU_SCHEMA_XSD);
schema.setNamespaceContext(nsMap);
@@ -195,29 +202,27 @@
QName name = (QName)fault.getProperty("elementName");
part.setElementQName(name);
JaxBeanInfo<?> beanInfo = context.getBeanInfo(cls);
- SchemaInfo schemaInfo = null;
- for (SchemaInfo s : serviceInfo.getSchemas()) {
- if (s.getNamespaceURI().equals(part.getElementQName().getNamespaceURI())
- && !isExistSchemaElement(s.getSchema(), part.getElementQName())) {
- schemaInfo = s;
-
- XmlSchemaElement el = new XmlSchemaElement();
- el.setQName(part.getElementQName());
- el.setName(part.getElementQName().getLocalPart());
- el.setNillable(true);
+ if (beanInfo == null) {
+ throw new Fault(new Message("NO_BEAN_INFO", LOG, cls.getName()));
+ }
+ SchemaInfo schemaInfo = serviceInfo.getSchema(part.getElementQName().getNamespaceURI());
+ if (schemaInfo != null
+ && !isExistSchemaElement(schemaInfo.getSchema(), part.getElementQName())) {
- schemaInfo.getSchema().getItems().add(el);
- schemaInfo.getSchema().getElements().add(el.getQName(), el);
-
- Iterator<QName> itr = beanInfo.getTypeNames().iterator();
- if (!itr.hasNext()) {
- continue;
- }
- QName typeName = itr.next();
- el.setSchemaTypeName(typeName);
+ XmlSchemaElement el = new XmlSchemaElement();
+ el.setQName(part.getElementQName());
+ el.setName(part.getElementQName().getLocalPart());
+ el.setNillable(true);
+
+ schemaInfo.getSchema().getItems().add(el);
+ schemaInfo.getSchema().getElements().add(el.getQName(), el);
+ Iterator<QName> itr = beanInfo.getTypeNames().iterator();
+ if (!itr.hasNext()) {
return;
}
+ QName typeName = itr.next();
+ el.setSchemaTypeName(typeName);
}
}
}
@@ -237,6 +242,7 @@
schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED));
NamespaceMap nsMap = new NamespaceMap();
+ nsMap.add(WSDLConstants.CONVENTIONAL_TNS_PREFIX, schema.getTargetNamespace());
nsMap.add(WSDLConstants.NP_SCHEMA_XSD, WSDLConstants.NU_SCHEMA_XSD);
schema.setNamespaceContext(nsMap);
@@ -271,6 +277,14 @@
ct.setParticle(seq);
String namespace = part.getElementQName().getNamespaceURI();
for (Field f : cls.getDeclaredFields()) {
+ // This code takes all the fields that are public and not static.
+ // It is arguable that it should be looking at get/is properties and all those
+ // bean-like things.
+ int modifiers = f.getModifiers();
+ if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers)) {
+ continue;
+ }
+
JaxBeanInfo<?> beanInfo = context.getBeanInfo(f.getType());
if (beanInfo != null) {
el = new XmlSchemaElement();
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Messages.properties?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Messages.properties (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Messages.properties Thu Oct 25 10:09:20 2007
@@ -22,7 +22,11 @@
SCHEMA_NOT_RESOLVED = Could not resolve URI: {0}
UNKNOWN_SOURCE = Marshalling Error, unrecognized source {0}.
MARSHAL_ERROR = Marshalling Error: {0}
-UNMARSHAL_ERROR = Unmarshalling Error : {0}
+UNMARSHAL_ERROR = Unmarshalling Error: {0}
UNKNOWN_ELEMENT_NAME = Could not determine the element name for {0}.
UNKNOWN_PACKAGE_NS = No package info found for class {0}. Cannot lookup default schema namespace.
SCHEMA_GEN_EXC = Could not generate schemas.
+CREATED_JAXB_CONTEXT = Created JAXBContext "{0}" with classes {1}.
+NO_BEAN_INFO = Could not find JAXB information for bean class {0} in context. Make sure it follows JAXB conventions.
+CANNOT_CREATE_ELEMENT = Cannot create element {0} with type of {1} due to element already exists with type {2}.
+
\ No newline at end of file
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataWriterImpl.java Thu Oct 25 10:09:20 2007
@@ -40,7 +40,17 @@
if (obj != null
|| !(part.getXmlSchema() instanceof XmlSchemaElement)) {
JAXBEncoderDecoder.marshall(getJAXBContext(), getSchema(), obj, part, output,
- getAttachmentMarrshaller());
+ getAttachmentMarshaller());
+ } else if (obj == null && needToRender(obj, part)) {
+ JAXBEncoderDecoder.marshallNullElement(getJAXBContext(), getSchema(), output, part);
}
+ }
+
+ private boolean needToRender(Object obj, MessagePartInfo part) {
+ if (part != null && part.getXmlSchema() instanceof XmlSchemaElement) {
+ XmlSchemaElement element = (XmlSchemaElement)part.getXmlSchema();
+ return element.isNillable() && element.getMinOccurs() > 0;
+ }
+ return false;
}
}
Modified: incubator/cxf/branches/jliu/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java (original)
+++ incubator/cxf/branches/jliu/rt/databinding/jaxb/src/test/java/org/apache/cxf/jaxb/JAXBDataBindingTest.java Thu Oct 25 10:09:20 2007
@@ -43,6 +43,7 @@
import org.apache.cxf.Bus;
import org.apache.cxf.binding.BindingFactoryManager;
+import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.databinding.DataReader;
import org.apache.cxf.databinding.DataWriter;
import org.apache.cxf.helpers.CastUtils;
@@ -63,7 +64,7 @@
public class JAXBDataBindingTest extends Assert {
- private static final Logger LOG = Logger.getLogger(JAXBDataBindingTest.class.getName());
+ private static final Logger LOG = LogUtils.getLogger(JAXBDataBindingTest.class);
private static final String WSDL_PATH = "/wsdl/hello_world.wsdl";
private Definition def;
private Service service;
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/pom.xml?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/pom.xml (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/pom.xml Thu Oct 25 10:09:20 2007
@@ -104,7 +104,7 @@
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_2.5_spec</artifactId>
<scope>provided</scope>
- </dependency>
+ </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java Thu Oct 25 10:09:20 2007
@@ -26,7 +26,7 @@
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
//TODO JAX-WS 2.1
-//import javax.xml.ws.EndpointReference;
+import javax.xml.ws.EndpointReference;
import javax.xml.ws.handler.MessageContext;
public class BindingProviderImpl implements BindingProvider {
@@ -79,17 +79,12 @@
}
}
- /*
//TODO JAX-WS 2.1
public EndpointReference getEndpointReference() {
- // TODO
throw new UnsupportedOperationException();
}
public <T extends EndpointReference> T getEndpointReference(Class<T> clazz) {
- // TODO
throw new UnsupportedOperationException();
}
- */
-
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java Thu Oct 25 10:09:20 2007
@@ -81,6 +81,7 @@
public class DispatchImpl<T> extends BindingProviderImpl implements Dispatch<T>, MessageObserver {
private static final Logger LOG = LogUtils.getL7dLogger(DispatchImpl.class);
+ private static final String FINISHED = "exchange.finished";
private Bus bus;
private InterceptorProvider iProvider;
@@ -171,9 +172,9 @@
// execute chain
chain.doIntercept(message);
- getConduitSelector().complete(exchange);
if (message.getContent(Exception.class) != null) {
+ getConduitSelector().complete(exchange);
if (getBinding() instanceof SOAPBinding) {
try {
SOAPFault soapFault = SOAPFactory.newInstance().createFault();
@@ -206,6 +207,7 @@
synchronized (exchange) {
Message inMsg = waitResponse(exchange);
respContext.putAll(inMsg);
+ getConduitSelector().complete(exchange);
//need to do context mapping from cxf message to jax-ws
ContextPropertiesMapping.mapResponsefromCxf2Jaxws(respContext);
return cl.cast(inMsg.getContent(Object.class));
@@ -216,6 +218,13 @@
}
private Message waitResponse(Exchange exchange) {
+ while (!Boolean.TRUE.equals(exchange.get(FINISHED))) {
+ try {
+ exchange.wait();
+ } catch (InterruptedException e) {
+ //TODO - timeout
+ }
+ }
Message inMsg = exchange.getInMessage();
if (inMsg == null) {
try {
@@ -303,6 +312,7 @@
chain.doIntercept(message);
} finally {
synchronized (message.getExchange()) {
+ message.getExchange().put(FINISHED, Boolean.TRUE);
message.getExchange().setInMessage(message);
message.getExchange().notifyAll();
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java Thu Oct 25 10:09:20 2007
@@ -24,11 +24,16 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
-
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.ws.Binding;
+import javax.xml.ws.EndpointReference;
+import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.WebServicePermission;
+import javax.xml.ws.soap.MTOM;
+import javax.xml.ws.soap.MTOMFeature;
+
+import org.w3c.dom.Element;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
@@ -47,6 +52,7 @@
import org.apache.cxf.service.Service;
import org.apache.cxf.service.invoker.Invoker;
+
public class EndpointImpl extends javax.xml.ws.Endpoint
implements InterceptorProvider, Configurable {
/**
@@ -109,9 +115,9 @@
this.bindingUri = bindingUri;
wsdlLocation = wsdl == null ? null : new String(wsdl);
serverFactory = new JaxWsServerFactoryBean();
+ loadWSFeatureAnnotation();
}
-
-
+
public EndpointImpl(Bus b, Object i, String bindingUri) {
this(b, i, bindingUri, (String)null);
}
@@ -119,6 +125,15 @@
public EndpointImpl(Bus bus, Object implementor) {
this(bus, implementor, (String) null);
}
+
+ private void loadWSFeatureAnnotation() {
+ List<WebServiceFeature> wsFeatures = new ArrayList<WebServiceFeature>();
+ MTOM mtom = implementor.getClass().getAnnotation(MTOM.class);
+ if (mtom != null) {
+ wsFeatures.add(new MTOMFeature(mtom.enabled(), mtom.threshold()));
+ }
+ ((JaxWsServiceFactoryBean) serverFactory.getServiceFactory()).setWsFeatures(wsFeatures);
+ }
public Binding getBinding() {
return ((JaxWsEndpointImpl) getEndpoint()).getJaxwsBinding();
@@ -200,6 +215,7 @@
public void stop() {
if (null != server) {
server.stop();
+ server = null;
}
}
@@ -450,17 +466,13 @@
this.schemaLocations = schemaLocations;
}
- /*
//TODO JAX-WS 2.1
public EndpointReference getEndpointReference(Element... referenceParameters) {
- // TODO
throw new UnsupportedOperationException();
}
public <T extends EndpointReference> T getEndpointReference(Class<T> clazz,
Element... referenceParameters) {
- // TODO
throw new UnsupportedOperationException();
}
- */
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JAXWSMethodInvoker.java Thu Oct 25 10:09:20 2007
@@ -61,7 +61,7 @@
super(factory, scope);
}
- protected Fault createFault(Throwable ex) {
+ protected Fault createFault(Throwable ex, Method m, List<Object> params, boolean checked) {
//map the JAX-WS faults
if (ex instanceof SOAPFaultException) {
SOAPFaultException sfe = (SOAPFaultException)ex;
@@ -73,7 +73,7 @@
return fault;
}
- return super.createFault(ex);
+ return super.createFault(ex, m, params, checked);
}
protected Object invoke(Exchange exchange, final Object serviceObject, Method m, List<Object> params) {
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java Thu Oct 25 10:09:20 2007
@@ -33,8 +33,7 @@
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
-//TODO JAX-WS 2.1
-//import javax.xml.ws.EndpointReference;
+import javax.xml.ws.EndpointReference;
import javax.xml.ws.Response;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.handler.MessageContext.Scope;
@@ -250,16 +249,12 @@
return binding;
}
- /*
// TODO JAX-WS 2.1
public EndpointReference getEndpointReference() {
- // TODO
throw new UnsupportedOperationException();
}
public <T extends EndpointReference> T getEndpointReference(Class<T> clazz) {
- // TODO
throw new UnsupportedOperationException();
}
- */
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsServerFactoryBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsServerFactoryBean.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsServerFactoryBean.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsServerFactoryBean.java Thu Oct 25 10:09:20 2007
@@ -20,6 +20,7 @@
+import java.lang.reflect.Proxy;
import java.util.List;
import javax.xml.ws.WebServiceException;
@@ -172,7 +173,7 @@
private void buildHandlerChain() {
AnnotationHandlerChainBuilder builder = new AnnotationHandlerChainBuilder();
- List<Handler> chain = builder.buildHandlerChainFromClass(getServiceBean().getClass(),
+ List<Handler> chain = builder.buildHandlerChainFromClass(getServiceBeanClass(),
getEndpointName());
for (Handler h : chain) {
injectResources(h);
@@ -196,7 +197,13 @@
resourceManager = new DefaultResourceManager(resolvers);
resourceManager.addResourceResolver(new WebServiceContextResourceResolver());
ResourceInjector injector = new ResourceInjector(resourceManager);
- injector.inject(instance);
+ if (Proxy.isProxyClass(instance.getClass()) && getServiceClass() != null) {
+ injector.inject(instance, getServiceClass());
+ injector.construct(instance, getServiceClass());
+ } else {
+ injector.inject(instance);
+ injector.construct(instance);
+ }
}
}
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java Thu Oct 25 10:09:20 2007
@@ -21,6 +21,7 @@
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -31,13 +32,14 @@
import java.util.concurrent.Executor;
import java.util.logging.Level;
import java.util.logging.Logger;
-
import javax.jws.WebService;
import javax.xml.bind.JAXBContext;
import javax.xml.namespace.QName;
import javax.xml.ws.Dispatch;
+import javax.xml.ws.EndpointReference;
import javax.xml.ws.Service.Mode;
import javax.xml.ws.WebServiceException;
+import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.spi.ServiceDelegate;
@@ -240,15 +242,23 @@
return handlerResolver;
}
- public <T> T getPort(Class<T> type) {
+ public <T> T getPort(Class<T> serviceEndpointInterface) {
+ return getPort(serviceEndpointInterface, new WebServiceFeature[]{});
+ }
+
+ public <T> T getPort(Class<T> serviceEndpointInterface, WebServiceFeature... features) {
try {
- return createPort(null, null, type);
+ return createPort(null, null, serviceEndpointInterface, features);
} catch (ServiceConstructionException e) {
throw new WebServiceException(e);
- }
+ }
+ }
+
+ public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) {
+ return getPort(portName, serviceEndpointInterface, new WebServiceFeature[]{});
}
- public <T> T getPort(QName portName, Class<T> type) {
+ public <T> T getPort(QName portName, Class<T> serviceEndpointInterface, WebServiceFeature... features) {
if (portName == null) {
throw new WebServiceException(BUNDLE.getString("PORT_NAME_NULL_EXC"));
}
@@ -258,12 +268,12 @@
}
try {
- return createPort(portName, null, type);
+ return createPort(portName, null, serviceEndpointInterface, features);
} catch (ServiceConstructionException e) {
throw new WebServiceException(e);
- }
+ }
}
-
+
public <T> T getPort(EndpointReferenceType endpointReference,
Class<T> type) {
endpointReference = EndpointReferenceUtils.resolve(endpointReference, bus);
@@ -307,13 +317,19 @@
}
protected <T> T createPort(QName portName, EndpointReferenceType epr, Class<T> serviceEndpointInterface) {
+ return createPort(portName, epr, serviceEndpointInterface, new WebServiceFeature[]{});
+ }
+
+ protected <T> T createPort(QName portName, EndpointReferenceType epr, Class<T> serviceEndpointInterface,
+ WebServiceFeature... features) {
LOG.log(Level.FINE, "creating port for portName", portName);
LOG.log(Level.FINE, "endpoint reference:", epr);
LOG.log(Level.FINE, "endpoint interface:", serviceEndpointInterface);
JaxWsProxyFactoryBean proxyFac = new JaxWsProxyFactoryBean();
JaxWsClientFactoryBean clientFac = (JaxWsClientFactoryBean) proxyFac.getClientFactoryBean();
- ReflectionServiceFactoryBean serviceFactory = proxyFac.getServiceFactory();
+ JaxWsServiceFactoryBean serviceFactory = (JaxWsServiceFactoryBean) proxyFac.getServiceFactory();
+ serviceFactory.setWsFeatures(Arrays.asList(features));
proxyFac.setBus(bus);
proxyFac.setServiceClass(serviceEndpointInterface);
@@ -329,7 +345,7 @@
Service service = serviceFactory.getService();
if (service == null) {
serviceFactory.setServiceClass(serviceEndpointInterface);
- serviceFactory.setBus(getBus());
+ serviceFactory.setBus(getBus());
service = serviceFactory.create();
}
@@ -485,12 +501,10 @@
// TODO JAX-WS 2.1
- /*
public <T> Dispatch<T> createDispatch(QName portName,
Class<T> type,
Mode mode,
WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
@@ -498,7 +512,6 @@
Class<T> type,
Mode mode,
WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
@@ -506,7 +519,6 @@
JAXBContext context,
Mode mode,
WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
@@ -514,28 +526,12 @@
JAXBContext context,
Mode mode,
WebServiceFeature... features) {
- // TODO
- throw new UnsupportedOperationException();
- }
-
- public <T> T getPort(Class<T> serviceEndpointInterface,
- WebServiceFeature... features) {
- // TODO
- throw new UnsupportedOperationException();
- }
-
- public <T> T getPort(QName portName,
- Class<T> serviceEndpointInterface,
- WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
public <T> T getPort(EndpointReference endpointReference,
Class<T> serviceEndpointInterface,
WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
- */
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java Thu Oct 25 10:09:20 2007
@@ -20,12 +20,13 @@
package org.apache.cxf.jaxws.context;
import java.security.Principal;
-
+import javax.xml.ws.EndpointReference;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
-import org.apache.cxf.security.SecurityContext;
+import org.w3c.dom.Element;
+import org.apache.cxf.security.SecurityContext;
public class WebServiceContextImpl implements WebServiceContext {
@@ -61,20 +62,14 @@
}
// TODO JAX-WS 2.1
- /*
public EndpointReference getEndpointReference(Element... referenceParameters) {
- // TODO
throw new UnsupportedOperationException();
}
public <T extends EndpointReference> T getEndpointReference(Class<T> clazz,
Element... referenceParameters) {
- // TODO
throw new UnsupportedOperationException();
}
- */
-
-
public static void setMessageContext(MessageContext ctx) {
//ContextPropertiesMapping.mapCxf2Jaxws(ctx);
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainBuilder.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainBuilder.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainBuilder.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerChainBuilder.java Thu Oct 25 10:09:20 2007
@@ -179,6 +179,7 @@
resolvers.add(new InitParamResourceResolver(params));
ResourceInjector resInj = new ResourceInjector(resMgr, resolvers);
resInj.inject(handler);
+ resInj.construct(handler);
}
}
@@ -198,7 +199,7 @@
try {
m = handler.getClass().getMethod("init", Map.class);
} catch (NoSuchMethodException ex) {
- // emtpy
+ // empty
}
return m;
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerResolverImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerResolverImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerResolverImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/HandlerResolverImpl.java Thu Oct 25 10:09:20 2007
@@ -108,6 +108,7 @@
// resourceManager.addResourceResolver(new WebContextEntriesResourceResolver());
ResourceInjector injector = new ResourceInjector(resourceManager);
injector.inject(handler);
+ injector.construct(handler);
}
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java Thu Oct 25 10:09:20 2007
@@ -85,6 +85,7 @@
obj = new StreamSource(cos.getInputStream());
message.setContent(Source.class, new StreamSource(cos.getInputStream()));
+ cos.close();
} catch (Exception e) {
throw new Fault(e);
}
@@ -98,8 +99,11 @@
Transformer transformer = XMLUtils.newTransformer();
transformer.transform(obj, new StreamResult(cos));
- SOAPMessage msg = initSOAPMessage(cos.getInputStream());
+ InputStream in = cos.getInputStream();
+ SOAPMessage msg = initSOAPMessage(in);
source = new DOMSource(((SOAPMessage)msg).getSOAPBody().getFirstChild());
+ in.close();
+ cos.close();
} catch (Exception e) {
throw new Fault(e);
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInDatabindingInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInDatabindingInterceptor.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInDatabindingInterceptor.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchInDatabindingInterceptor.java Thu Oct 25 10:09:20 2007
@@ -21,12 +21,17 @@
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.logging.Logger;
import javax.activation.DataSource;
import javax.mail.util.ByteArrayDataSource;
+import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPException;
@@ -40,6 +45,7 @@
import org.w3c.dom.Node;
+import org.apache.cxf.attachment.AttachmentImpl;
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapMessage;
@@ -49,6 +55,7 @@
import org.apache.cxf.databinding.source.NodeDataReader;
import org.apache.cxf.databinding.source.XMLStreamDataReader;
import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
@@ -58,6 +65,7 @@
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.jaxws.handler.logical.DispatchLogicalHandlerInterceptor;
import org.apache.cxf.jaxws.handler.soap.DispatchSOAPHandlerInterceptor;
+import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageContentsList;
@@ -111,11 +119,10 @@
ex.put(Service.Mode.class, mode);
if (message instanceof SoapMessage) {
- SOAPMessage soapMessage = newSOAPMessage(is, ((SoapMessage)message).getVersion());
+ SOAPMessage soapMessage = newSOAPMessage(is, (SoapMessage)message);
PostDispatchSOAPHandlerInterceptor postSoap = new PostDispatchSOAPHandlerInterceptor();
message.getInterceptorChain().add(postSoap);
- //soapMessage.writeTo(System.out);
message.setContent(SOAPMessage.class, soapMessage);
} else if (message instanceof XMLMessage) {
if (type.equals(DataSource.class)) {
@@ -144,16 +151,25 @@
message.getInterceptorChain().add(postLogical);
is.close();
+ message.removeContent(InputStream.class);
} catch (Exception e) {
throw new Fault(e);
}
}
- private SOAPMessage newSOAPMessage(InputStream is, SoapVersion version) throws Exception {
- // TODO: Get header from message, this interceptor should after
- // readHeadersInterceptor
+ private SOAPMessage newSOAPMessage(InputStream is, SoapMessage msg) throws Exception {
+ SoapVersion version = msg.getVersion();
MimeHeaders headers = new MimeHeaders();
+ if (msg.containsKey(Message.PROTOCOL_HEADERS)) {
+ Map<String, List<String>> heads = CastUtils.cast((Map<?, ?>)msg.get(Message.PROTOCOL_HEADERS));
+ for (Map.Entry<String, List<String>> entry : heads.entrySet()) {
+ for (String val : entry.getValue()) {
+ headers.addHeader(entry.getKey(), val);
+ }
+ }
+ }
+
MessageFactory msgFactory = null;
if (version == null || version instanceof Soap11) {
msgFactory = MessageFactory.newInstance();
@@ -187,6 +203,24 @@
//This seems to be a problem in SAAJ. Envelope might not be initialized properly
//without calling getEnvelope()
soapMessage.getSOAPPart().getEnvelope();
+ if (soapMessage.countAttachments() > 0) {
+ if (message.getAttachments() == null) {
+ message.setAttachments(new ArrayList<Attachment>(soapMessage
+ .countAttachments()));
+ }
+ Iterator<AttachmentPart> it = CastUtils.cast(soapMessage.getAttachments());
+ while (it.hasNext()) {
+ AttachmentPart part = it.next();
+ AttachmentImpl att = new AttachmentImpl(part.getContentId());
+ att.setDataHandler(part.getDataHandler());
+ Iterator<MimeHeader> it2 = CastUtils.cast(part.getAllMimeHeaders());
+ while (it2.hasNext()) {
+ MimeHeader header = it2.next();
+ att.setHeader(header.getName(), header.getValue());
+ }
+ message.getAttachments().add(att);
+ }
+ }
} catch (SOAPException e) {
throw new Fault(e);
}
@@ -227,10 +261,30 @@
if (SOAPMessage.class.isAssignableFrom(type)) {
try {
- CachedOutputStream cos = new CachedOutputStream();
- Transformer transformer = XMLUtils.newTransformer();
- transformer.transform(source, new StreamResult(cos));
- obj = newSOAPMessage(cos.getInputStream(), ((SoapMessage)message).getVersion());
+ SoapVersion version = ((SoapMessage)message).getVersion();
+ MessageFactory msgFactory = null;
+ if (version == null || version instanceof Soap11) {
+ msgFactory = MessageFactory.newInstance();
+ } else if (version instanceof Soap12) {
+ msgFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ }
+ SOAPMessage msg = msgFactory.createMessage();
+ msg.getSOAPPart().setContent(source);
+
+ if (message.getAttachments() != null) {
+ for (Attachment att : message.getAttachments()) {
+ AttachmentPart part = msg.createAttachmentPart(att.getDataHandler());
+ if (att.getId() != null) {
+ part.setContentId(att.getId());
+ }
+ for (Iterator<String> it = att.getHeaderNames(); it.hasNext();) {
+ String s = it.next();
+ part.setMimeHeader(s, att.getHeader(s));
+ }
+ msg.addAttachmentPart(part);
+ }
+ }
+ obj = msg;
} catch (Exception e) {
throw new Fault(e);
}
@@ -286,6 +340,8 @@
dataReader.setProperty(JAXBDataBinding.UNWRAP_JAXB_ELEMENT, Boolean.FALSE);
Object obj = dataReader.read(null, reader, null);
+ reader.close();
+ cos.close();
return obj;
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutDatabindingInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutDatabindingInterceptor.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutDatabindingInterceptor.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/DispatchOutDatabindingInterceptor.java Thu Oct 25 10:09:20 2007
@@ -22,15 +22,23 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.logging.Logger;
import javax.activation.DataSource;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
+import javax.xml.soap.MimeHeader;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
@@ -42,6 +50,7 @@
import org.w3c.dom.Node;
+import org.apache.cxf.attachment.AttachmentImpl;
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.Soap12;
import org.apache.cxf.binding.soap.SoapMessage;
@@ -49,14 +58,15 @@
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.databinding.DataWriter;
import org.apache.cxf.databinding.source.NodeDataWriter;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor;
import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.jaxws.handler.logical.DispatchLogicalHandlerInterceptor;
+import org.apache.cxf.message.Attachment;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.XMLMessage;
import org.apache.cxf.phase.Phase;
@@ -77,9 +87,6 @@
}
public void handleMessage(Message message) throws Fault {
- org.apache.cxf.service.Service service =
- message.getExchange().get(org.apache.cxf.service.Service.class);
-
Object obj = null;
Object result = message.getContent(List.class);
if (result != null) {
@@ -97,26 +104,7 @@
if (message instanceof SoapMessage) {
Source source = null;
if (mode == Service.Mode.PAYLOAD) {
- if (obj instanceof SOAPMessage || obj instanceof DataSource) {
- throw new Fault(
- new org.apache.cxf.common.i18n.Message(
- "DISPATCH_OBJECT_NOT_SUPPORTED_SOAPBINDING",
- LOG, obj.getClass(), "PAYLOAD"));
- } else if (obj instanceof Source) {
- source = (Source)obj;
- } else {
- //JAXB
- try {
- SOAPMessage msg = newSOAPMessage(null, ((SoapMessage)message).getVersion());
- DataWriter<Node> dataWriter = getDataWriter(message, service, Node.class);
- dataWriter.write(obj, msg.getSOAPBody());
- //msg.writeTo(System.out);
- source = new DOMSource(DOMUtils.getChild(msg.getSOAPBody(), Node.ELEMENT_NODE));
- } catch (Exception e) {
- throw new Fault(new org.apache.cxf.common.i18n.Message("EXCEPTION_WRITING_OBJECT",
- LOG), e);
- }
- }
+ source = handlePayloadMode(obj, message);
} else {
if (obj instanceof DataSource) {
throw new Fault(
@@ -124,7 +112,8 @@
"DISPATCH_OBJECT_NOT_SUPPORTED_SOAPBINDING",
LOG, "DataSource", "MESSAGE"));
} else if (obj instanceof SOAPMessage) {
- source = new DOMSource(((SOAPMessage)obj).getSOAPPart());
+ source = handleSOAPMessage(obj, message);
+
} else if (obj instanceof Source) {
source = (Source)obj;
}
@@ -157,6 +146,8 @@
} else {
// JAXB element
try {
+ org.apache.cxf.service.Service service =
+ message.getExchange().get(org.apache.cxf.service.Service.class);
DataWriter<XMLStreamWriter> dataWriter = getDataWriter(message, service,
XMLStreamWriter.class);
W3CDOMStreamWriter xmlWriter = new W3CDOMStreamWriter();
@@ -173,6 +164,68 @@
message.getInterceptorChain().add(ending);
}
+ private Source handleSOAPMessage(Object obj, Message message) {
+ SOAPMessage soapMessage = (SOAPMessage)obj;
+ try {
+ //workaround bug in Sun SAAJ impl
+ soapMessage.getSOAPPart().getEnvelope();
+ } catch (SOAPException e1) {
+ //ignore
+ }
+ Source source = new DOMSource(soapMessage.getSOAPPart());
+
+ if (soapMessage.countAttachments() > 0) {
+ if (message.getAttachments() == null) {
+ message.setAttachments(new ArrayList<Attachment>(soapMessage
+ .countAttachments()));
+ }
+ Iterator<AttachmentPart> it = CastUtils.cast(soapMessage.getAttachments());
+ while (it.hasNext()) {
+ AttachmentPart part = it.next();
+ AttachmentImpl att = new AttachmentImpl(part.getContentId());
+ try {
+ att.setDataHandler(part.getDataHandler());
+ } catch (SOAPException e) {
+ throw new Fault(e);
+ }
+ Iterator<MimeHeader> it2 = CastUtils.cast(part.getAllMimeHeaders());
+ while (it2.hasNext()) {
+ MimeHeader header = it2.next();
+ att.setHeader(header.getName(), header.getValue());
+ }
+ message.getAttachments().add(att);
+ }
+ }
+ return source;
+ }
+
+ private Source handlePayloadMode(Object obj, Message message) {
+ Source source = null;
+ if (obj instanceof SOAPMessage || obj instanceof DataSource) {
+ throw new Fault(
+ new org.apache.cxf.common.i18n.Message(
+ "DISPATCH_OBJECT_NOT_SUPPORTED_SOAPBINDING",
+ LOG, obj.getClass(), "PAYLOAD"));
+ } else if (obj instanceof Source) {
+ source = (Source)obj;
+ } else {
+ //JAXB
+ try {
+ org.apache.cxf.service.Service service =
+ message.getExchange().get(org.apache.cxf.service.Service.class);
+ SOAPMessage msg = newSOAPMessage(null, ((SoapMessage)message).getVersion());
+ DataWriter<Node> dataWriter = getDataWriter(message, service, Node.class);
+ dataWriter.write(obj, msg.getSOAPBody());
+ //msg.writeTo(System.out);
+ source = new DOMSource(DOMUtils.getChild(msg.getSOAPBody(), Node.ELEMENT_NODE));
+ } catch (Exception e) {
+ throw new Fault(new org.apache.cxf.common.i18n.Message("EXCEPTION_WRITING_OBJECT",
+ LOG), e);
+ }
+ }
+ return source;
+ }
+
private class DispatchOutDatabindingEndingInterceptor extends AbstractOutDatabindingInterceptor {
public DispatchOutDatabindingEndingInterceptor() {
super(Phase.WRITE_ENDING);
@@ -190,6 +243,27 @@
if (xmlWriter != null) {
xmlWriter.flush();
} else if (soapMessage != null) {
+ Map<String, List<String>> heads
+ = CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS));
+ if (heads == null) {
+ heads = new HashMap<String, List<String>>();
+ message.put(Message.PROTOCOL_HEADERS, heads);
+ }
+
+ soapMessage.saveChanges();
+ Iterator<MimeHeader> smh = CastUtils.cast(soapMessage.getMimeHeaders().getAllHeaders());
+ while (smh.hasNext()) {
+ MimeHeader head = smh.next();
+ if ("Content-Type".equals(head.getName())) {
+ message.put(Message.CONTENT_TYPE, head.getValue());
+ } else if (!"Content-Length".equals(head.getName())) {
+ if (!heads.containsKey(head.getName())) {
+ heads.put(head.getName(), new ArrayList<String>());
+ }
+ List<String>l = heads.get(head.getName());
+ l.add(head.getValue());
+ }
+ }
soapMessage.writeTo(os);
} else if (source != null) {
doTransform(source, os);
@@ -200,6 +274,7 @@
// Finish the message processing, do flush
os.flush();
} catch (Exception ex) {
+ ex.printStackTrace();
throw new Fault(new org.apache.cxf.common.i18n.Message("EXCEPTION_WRITING_OBJECT", LOG, ex));
}
}
@@ -221,6 +296,20 @@
Source source = message.getContent(Source.class);
message.removeContent(Source.class);
+ //workaround bug in Sun SAAJ impl where
+ //source doesn't work if the SOAPPart was already
+ //created from a source
+ if (source instanceof DOMSource) {
+ DOMSource ds = (DOMSource)source;
+ if (ds.getNode() instanceof SOAPPart) {
+ try {
+ ((SOAPPart)ds.getNode()).getEnvelope();
+ } catch (SOAPException e) {
+ //ignore
+ }
+ }
+ }
+
if (mode == Service.Mode.PAYLOAD) {
// Input is Source in payload mode, need to wrap it
// with a SOAPMessage
@@ -234,11 +323,32 @@
}
} else {
try {
- CachedOutputStream cos = new CachedOutputStream();
- Transformer transformer = XMLUtils.newTransformer();
- transformer.transform(source, new StreamResult(cos));
- obj = newSOAPMessage(cos.getInputStream(), ((SoapMessage)message).getVersion());
+ SoapVersion version = ((SoapMessage)message).getVersion();
+ MessageFactory msgFactory = null;
+ if (version == null || version instanceof Soap11) {
+ msgFactory = MessageFactory.newInstance();
+ } else if (version instanceof Soap12) {
+ msgFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ }
+ SOAPMessage msg = msgFactory.createMessage();
+ msg.getSOAPPart().setContent(source);
+ msg.saveChanges();
+ if (message.getAttachments() != null) {
+ for (Attachment att : message.getAttachments()) {
+ AttachmentPart part = msg.createAttachmentPart(att.getDataHandler());
+ if (att.getId() != null) {
+ part.setContentId(att.getId());
+ }
+ for (Iterator<String> it = att.getHeaderNames(); it.hasNext();) {
+ String s = it.next();
+ part.setMimeHeader(s, att.getHeader(s));
+ }
+ msg.addAttachmentPart(part);
+ }
+ }
+ obj = msg;
} catch (Exception e) {
+ e.printStackTrace();
throw new Fault(e);
}
}
@@ -278,7 +388,7 @@
}
if (obj instanceof DataSource) {
InputStream is = ((DataSource)obj).getInputStream();
- IOUtils.copy(((DataSource)obj).getInputStream(), os);
+ IOUtils.copy(is, os);
is.close();
}
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/Messages.properties?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/Messages.properties (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/Messages.properties Thu Oct 25 10:09:20 2007
@@ -26,3 +26,4 @@
ATTACHMENT_NOT_SUPPORTED = Attachments of type {0} are not supported.
DISPATCH_OBJECT_NOT_SUPPORTED_SOAPBINDING = {0} is not valid in {1} mode with SOAP/HTTP binding.
DISPATCH_OBJECT_NOT_SUPPORTED_XMLBINDING = {0} is not valid in {1} mode with XML/HTTP binding.
+EXCEPTION_WHILE_WRITING_FAULT = Exception occurred while writing fault.
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java Thu Oct 25 10:09:20 2007
@@ -22,6 +22,7 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ResourceBundle;
+import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
@@ -34,23 +35,23 @@
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.databinding.DataWriter;
import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.FaultOutInterceptor;
import org.apache.cxf.jaxws.support.JaxWsServiceConfiguration;
+import org.apache.cxf.message.FaultMode;
import org.apache.cxf.message.Message;
-import org.apache.cxf.phase.AbstractPhaseInterceptor;
-import org.apache.cxf.phase.Phase;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.FaultInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.OperationInfo;
-public class WebFaultOutInterceptor extends AbstractPhaseInterceptor<Message> {
+public class WebFaultOutInterceptor extends FaultOutInterceptor {
private static final Logger LOG = LogUtils.getL7dLogger(WebFaultOutInterceptor.class);
private static final ResourceBundle BUNDLE = BundleUtils.getBundle(JaxWsServiceConfiguration.class);
public WebFaultOutInterceptor() {
- super(Phase.PRE_PROTOCOL);
+ super();
}
private QName getFaultName(WebFault wf, Class<?> cls, OperationInfo op) {
@@ -104,14 +105,27 @@
}
Service service = message.getExchange().get(Service.class);
- DataWriter<Node> writer = service.getDataBinding().createWriter(Node.class);
-
- OperationInfo op = message.getExchange().get(BindingOperationInfo.class).getOperationInfo();
- QName faultName = getFaultName(fault, cause.getClass(), op);
- MessagePartInfo part = getFaultMessagePart(faultName, op);
- writer.write(faultInfo, part, f.getOrCreateDetail());
-
- f.setMessage(ex.getMessage());
+ try {
+ DataWriter<Node> writer = service.getDataBinding().createWriter(Node.class);
+
+ OperationInfo op = message.getExchange().get(BindingOperationInfo.class).getOperationInfo();
+ QName faultName = getFaultName(fault, cause.getClass(), op);
+ MessagePartInfo part = getFaultMessagePart(faultName, op);
+ writer.write(faultInfo, part, f.getOrCreateDetail());
+
+ f.setMessage(ex.getMessage());
+ } catch (Exception nex) {
+ //if exception occurs while writing a fault, we'll just let things continue
+ //and let the rest of the chain try handling it as is.
+ LOG.log(Level.WARNING, "EXCEPTION_WHILE_WRITING_FAULT", nex);
+ }
+ } else {
+ FaultMode mode = message.get(FaultMode.class);
+ if (mode == FaultMode.CHECKED_APPLICATION_FAULT) {
+ //only convert checked exceptions with this
+ //otherwise delegate down to the normal protocol specific stuff
+ super.handleMessage(message);
+ }
}
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java Thu Oct 25 10:09:20 2007
@@ -21,6 +21,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
@@ -120,10 +121,25 @@
try {
newParams = new MessageContentsList(helper.getWrapperParts(wrappedObject));
+ List<Integer> removes = null;
for (MessagePartInfo part : messageInfo.getMessageParts()) {
if (Boolean.TRUE.equals(part.getProperty(ReflectionServiceFactoryBean.HEADER))) {
MessagePartInfo mpi = wrappedMessageInfo.getMessagePart(part.getName());
- newParams.put(part, lst.get(mpi));
+ if (lst.hasValue(mpi)) {
+ newParams.put(part, lst.get(mpi));
+ } else if (mpi.getTypeClass() == null) {
+ //header, but not mapped to a param on the method
+ if (removes == null) {
+ removes = new ArrayList<Integer>();
+ }
+ removes.add(mpi.getIndex());
+ }
+ }
+ }
+ if (removes != null) {
+ Collections.sort(removes, Collections.reverseOrder());
+ for (Integer i : removes) {
+ newParams.remove(i.intValue());
}
}
} catch (Exception e) {
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassOutInterceptor.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassOutInterceptor.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassOutInterceptor.java Thu Oct 25 10:09:20 2007
@@ -109,7 +109,9 @@
for (MessagePartInfo p : messageInfo.getMessageParts()) {
if (Boolean.TRUE.equals(p.getProperty(ReflectionServiceFactoryBean.HEADER))) {
MessagePartInfo mpi = wrappedMsgInfo.getMessagePart(p.getName());
- newObjs.put(mpi, objs.get(p));
+ if (objs.hasValue(p)) {
+ newObjs.put(mpi, objs.get(p));
+ }
}
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperHelper.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperHelper.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperHelper.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperHelper.java Thu Oct 25 10:09:20 2007
@@ -268,6 +268,9 @@
Object ret = wrapperType.newInstance();
for (int x = 0; x < setMethods.length; x++) {
+ if (setMethods[x] == null && fields[x] == null) {
+ continue;
+ }
Object o = lst.get(x);
if (jaxbObjectMethods[x] != null) {
o = jaxbObjectMethods[x].invoke(objectFactory, o);
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java Thu Oct 25 10:09:20 2007
@@ -20,19 +20,18 @@
package org.apache.cxf.jaxws.spi;
import java.net.URL;
+import java.util.List;
import java.util.logging.Logger;
-
import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
import javax.xml.ws.Endpoint;
-//TODO JAX-WS 2.1
-//import javax.xml.ws.EndpointReference;
+import javax.xml.ws.EndpointReference;
import javax.xml.ws.WebServiceException;
-//TODO JAX-WS 2.1
-//import javax.xml.ws.WebServiceFeature;
+import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.spi.ServiceDelegate;
-//TODO JAX-WS 2.1
-//import javax.xml.ws.wsaddressing.W3CEndpointReference;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
+import org.w3c.dom.Element;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
@@ -42,6 +41,7 @@
import org.apache.cxf.jaxws.EndpointUtils;
import org.apache.cxf.jaxws.ServiceImpl;
+
public class ProviderImpl extends javax.xml.ws.spi.Provider {
public static final String JAXWS_PROVIDER = ProviderImpl.class.getName();
@@ -76,28 +76,24 @@
}
// TODO JAX-WS 2.1
- /*
+
public W3CEndpointReference createW3CEndpointReference(String address,
QName serviceName,
QName portName,
List<Element> metadata,
String wsdlDocumentLocation,
List<Element> referenceParameters) {
- // TODO
throw new UnsupportedOperationException();
}
public <T> T getPort(EndpointReference endpointReference,
Class<T> serviceEndpointInterface,
WebServiceFeature... features) {
- // TODO
throw new UnsupportedOperationException();
}
public EndpointReference readEndpointReference(Source eprInfoset) {
- // TODO
throw new UnsupportedOperationException();
}
- */
}
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spring/EndpointDefinitionParser.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spring/EndpointDefinitionParser.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spring/EndpointDefinitionParser.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spring/EndpointDefinitionParser.java Thu Oct 25 10:09:20 2007
@@ -144,7 +144,7 @@
throws BeanDefinitionStoreException {
String id = super.resolveId(elem, definition, ctx);
if (StringUtils.isEmpty(id)) {
- id = getBeanClass().getName() + "--" + hashCode();
+ id = getBeanClass().getName() + "--" + definition.hashCode();
}
return id;
Modified: incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java?rev=588283&r1=588282&r2=588283&view=diff
==============================================================================
--- incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java (original)
+++ incubator/cxf/branches/jliu/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java Thu Oct 25 10:09:20 2007
@@ -22,6 +22,9 @@
import java.util.List;
import javax.xml.ws.Binding;
+import javax.xml.ws.WebServiceFeature;
+import javax.xml.ws.soap.MTOMFeature;
+import javax.xml.ws.soap.SOAPBinding;
import org.apache.cxf.Bus;
import org.apache.cxf.binding.soap.SoapBinding;
@@ -63,15 +66,18 @@
private Binding jaxwsBinding;
private JaxWsImplementorInfo implInfo;
+ private List<WebServiceFeature> wsFeatures;
public JaxWsEndpointImpl(Bus bus, Service s, EndpointInfo ei) throws EndpointException {
- this(bus, s, ei, null);
+ this(bus, s, ei, null, null);
}
- public JaxWsEndpointImpl(Bus bus, Service s, EndpointInfo ei, JaxWsImplementorInfo implementorInfo)
+ public JaxWsEndpointImpl(Bus bus, Service s, EndpointInfo ei, JaxWsImplementorInfo implementorInfo,
+ List<WebServiceFeature> features)
throws EndpointException {
super(bus, s, ei);
this.implInfo = implementorInfo;
+ this.wsFeatures = features;
createJaxwsBinding();
@@ -130,9 +136,25 @@
return jaxwsBinding;
}
+ private MTOMFeature getMTOMFeature() {
+ if (wsFeatures == null) {
+ return null;
+ }
+ for (WebServiceFeature feature : wsFeatures) {
+ if (feature instanceof MTOMFeature) {
+ return (MTOMFeature)feature;
+ }
+ }
+ return null;
+ }
+
final void createJaxwsBinding() {
if (getBinding() instanceof SoapBinding) {
jaxwsBinding = new SOAPBindingImpl(getEndpointInfo().getBinding());
+ MTOMFeature mtomFeature = getMTOMFeature();
+ if (mtomFeature != null && mtomFeature.isEnabled()) {
+ ((SOAPBinding)jaxwsBinding).setMTOMEnabled(true);
+ }
} else if (getBinding() instanceof XMLBinding) {
jaxwsBinding = new HTTPBindingImpl(getEndpointInfo().getBinding());
} else {