Author: richard.opalka(a)jboss.com
Date: 2010-06-04 08:53:10 -0400 (Fri, 04 Jun 2010)
New Revision: 12418
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/PayloadBinding.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchSOAPBinding.java
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/XMLFragment.java
Log:
[JBWS-3056] dispatch objects must handle empty payloads accordingly
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/PayloadBinding.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/PayloadBinding.java 2010-06-04
12:47:26 UTC (rev 12417)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/binding/PayloadBinding.java 2010-06-04
12:53:10 UTC (rev 12418)
@@ -27,6 +27,7 @@
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.handler.Handler;
import org.jboss.logging.Logger;
@@ -51,6 +52,7 @@
import org.jboss.ws.core.soap.XMLFragment;
import org.jboss.ws.metadata.umdm.OperationMetaData;
import org.jboss.ws.metadata.umdm.ParameterMetaData;
+import org.jboss.wsf.common.DOMUtils;
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData.HandlerType;
/** A BindingProvider for a JAXWS payload
@@ -93,9 +95,15 @@
SOAPBodyImpl body = (SOAPBodyImpl)reqMessage.getSOAPBody();
SOAPContentElement bodyElement = (SOAPContentElement)body.getBodyElement();
- Source source = bodyElement.getXMLFragment().getSource();
- if (source == null)
- throw new IllegalStateException("Payload cannot be null");
+ Source source = null;
+ if (bodyElement != null)
+ {
+ source = bodyElement.getXMLFragment().getSource();
+ }
+ else
+ {
+ source = new DOMSource();
+ }
epInv.setRequestParamValue(xmlName, source);
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java 2010-06-04
12:47:26 UTC (rev 12417)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchImpl.java 2010-06-04
12:53:10 UTC (rev 12418)
@@ -21,7 +21,9 @@
*/
package org.jboss.ws.core.jaxws.client;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -37,6 +39,9 @@
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.AsyncHandler;
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
@@ -82,8 +87,12 @@
import org.jboss.ws.metadata.umdm.ServiceMetaData;
import org.jboss.ws.metadata.wsse.WSSecurityConfigFactory;
import org.jboss.ws.metadata.wsse.WSSecurityConfiguration;
+import org.jboss.wsf.common.DOMUtils;
import org.jboss.wsf.spi.deployment.UnifiedVirtualFile;
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData.HandlerType;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
/**
@@ -276,8 +285,7 @@
if (handlerPass)
{
- boolean unwrap = !(obj instanceof JAXBElement);
- retObj = getReturnObject(resMsg, unwrap);
+ retObj = getReturnObject(resMsg, obj);
}
}
catch (Exception ex)
@@ -315,8 +323,7 @@
targetAddress = (String)
callProps.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY);
}
MessageAbstraction resMsg = getRemotingConnection().invoke(reqMsg, targetAddress,
false);
- boolean unwrap = !(obj instanceof JAXBElement);
- Object retObj = getReturnObject(resMsg, unwrap);
+ Object retObj = getReturnObject(resMsg, obj);
return retObj;
}
@@ -469,25 +476,40 @@
return message;
}
- private Object getReturnObject(MessageAbstraction resMsg, boolean unwrap)
+ private Object getReturnObject(MessageAbstraction resMsg, Object reqObj)
{
String bindingID = bindingProvider.getBinding().getBindingID();
if (EndpointMetaData.SUPPORTED_BINDINGS.contains(bindingID) == false)
throw new IllegalStateException("Unsupported binding: " + bindingID);
- Object retObj = null;
+ boolean unwrap = !(reqObj instanceof JAXBElement);
+ Object resObj = null;
if (HTTPBinding.HTTP_BINDING.equals(bindingID))
{
DispatchHTTPBinding helper = new DispatchHTTPBinding(mode, type, jaxbContext);
- retObj = helper.getReturnObject(resMsg);
+ resObj = helper.getReturnObject(resMsg);
}
else
{
DispatchSOAPBinding helper = new DispatchSOAPBinding(mode, type, jaxbContext);
- retObj = helper.getReturnObject(resMsg, unwrap);
+ resObj = helper.getReturnObject(resMsg, unwrap);
}
- return retObj;
+
+ // HACK - handle null because of TCK requirement
+ if ((reqObj instanceof Source) && (resObj instanceof DOMSource))
+ {
+ resObj = this.handleNull((DOMSource)resObj);
+ }
+
+ return resObj;
}
+
+ private Source handleNull(final DOMSource from)
+ {
+ final Node node = from.getNode();
+
+ return node != null ? from : null;
+ }
class AsyncRunnable implements Runnable
{
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchSOAPBinding.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchSOAPBinding.java 2010-06-04
12:47:26 UTC (rev 12417)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/DispatchSOAPBinding.java 2010-06-04
12:53:10 UTC (rev 12418)
@@ -186,10 +186,13 @@
if (log.isDebugEnabled())
log.debug("JAXB unmarshal: " + DOMWriter.printNode(soapElement,
false));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- retObj = unmarshaller.unmarshal(soapElement);
- if ((retObj instanceof JAXBElement<?>) && unwrap)
+ if (soapElement != null)
{
- retObj = ((JAXBElement<?>)retObj).getValue();
+ retObj = unmarshaller.unmarshal(soapElement);
+ if ((retObj instanceof JAXBElement<?>) && unwrap)
+ {
+ retObj = ((JAXBElement<?>)retObj).getValue();
+ }
}
}
}
Modified:
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/XMLFragment.java
===================================================================
---
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/XMLFragment.java 2010-06-04
12:47:26 UTC (rev 12417)
+++
stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/soap/XMLFragment.java 2010-06-04
12:53:10 UTC (rev 12418)
@@ -23,6 +23,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
@@ -174,11 +175,16 @@
boolean newReader = false;
Reader reader = streamSource.getReader();
+ InputStream is = streamSource.getInputStream();
{
if (reader == null)
{
- reader = new InputStreamReader(streamSource.getInputStream(),
"UTF-8");
- newReader = true;
+ if (is != null)
+ {
+ reader = new InputStreamReader(is, "UTF-8");
+ newReader = true;
+ }
+ else return;
}
}
@@ -243,7 +249,7 @@
try
{
Element element = DOMUtils.sourceToElement(source);
- source = new DOMSource(element);
+ source = element != null ? new DOMSource(element) : new DOMSource();
}
catch (IOException ex)
{