You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by da...@apache.org on 2007/03/19 01:17:57 UTC
svn commit: r519759 - in /incubator/cxf/trunk:
common/common/src/main/java/org/apache/cxf/staxutils/ rt/bindings/soap/
rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/
rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/sa...
Author: dandiep
Date: Sun Mar 18 17:17:55 2007
New Revision: 519759
URL: http://svn.apache.org/viewvc?view=rev&rev=519759
Log:
o Refactored out SAAJ creation code into seperate interceptors. They reside
in the SOAP module.
o Made SAAJ input logic more efficient by creating a document fragment
from the incoming response which includes the Envelope, Headers, and
Body element - but not the contents of the body. This then gets turned
into a SAAJMessage.
o Refactored SAAJ logic so it doesn't require doInterceptInSubChain().
An interceptor which writes the message is added to the end of the chain.
This allows a more logical phase set up of putting the LOGIC handlers
after the MARSHAL phase.
o Remove Phase definitions from cxf.xml as its confusing and unncessary to
have the phase definitions in two places.
Added:
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties (with props)
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java (with props)
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java (with props)
incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/
incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java (with props)
Modified:
incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/PartialXMLStreamReader.java
incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
incubator/cxf/trunk/rt/bindings/soap/pom.xml
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/phase/PhaseManagerImpl.java
incubator/cxf/trunk/rt/core/src/main/resources/META-INF/cxf/cxf.xml
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/PortInfoImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstWSDLTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/JAXWSMethodInvokerTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/MessageReplayObserver.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WebServiceContextImplTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptorTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainBuilderTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalMessageImplTest.java
incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/schema_validation/ValidationServer.java
Modified: incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/PartialXMLStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/PartialXMLStreamReader.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/PartialXMLStreamReader.java (original)
+++ incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/PartialXMLStreamReader.java Sun Mar 18 17:17:55 2007
@@ -43,7 +43,7 @@
if (currentEvent == START_ELEMENT && getName().equals(endTag)) {
foundEnd = true;
endDepth = getDepth();
- return END_ELEMENT;
+ return START_ELEMENT;
}
return currentEvent;
Modified: incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java (original)
+++ incubator/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java Sun Mar 18 17:17:55 2007
@@ -539,7 +539,7 @@
* @param reader
* @throws XMLStreamException
*/
- private static void readDocElements(Node parent, XMLStreamReader reader, boolean repairing)
+ public static void readDocElements(Node parent, XMLStreamReader reader, boolean repairing)
throws XMLStreamException {
Document doc = getDocument(parent);
Modified: incubator/cxf/trunk/rt/bindings/soap/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/pom.xml?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/pom.xml (original)
+++ incubator/cxf/trunk/rt/bindings/soap/pom.xml Sun Mar 18 17:17:55 2007
@@ -81,6 +81,11 @@
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.sun.xml.messaging.saaj</groupId>
+ <artifactId>saaj-impl</artifactId>
+ <optional>true</optional>
+ </dependency>
</dependencies>
Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/ReadHeadersInterceptor.java Sun Mar 18 17:17:55 2007
@@ -30,6 +30,8 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.SoapFault;
@@ -60,7 +62,7 @@
return;
}
XMLStreamReader xmlReader = message.getContent(XMLStreamReader.class);
-
+
if (xmlReader == null) {
InputStream in = (InputStream)message.getContent(InputStream.class);
if (in == null) {
@@ -72,36 +74,33 @@
try {
if (xmlReader.nextTag() == XMLStreamConstants.START_ELEMENT) {
String ns = xmlReader.getNamespaceURI();
+
SoapVersion soapVersion = SoapVersionFactory.getInstance().getSoapVersion(ns);
if (soapVersion == null) {
- throw new SoapFault(new Message("INVALID_VERSION", LOG, ns),
- Soap11.getInstance().getSender());
+ throw new SoapFault(new Message("INVALID_VERSION", LOG, ns), Soap11.getInstance()
+ .getSender());
}
message.setVersion(soapVersion);
-
- QName qn = xmlReader.getName();
- while (!qn.equals(message.getVersion().getBody())
- && !qn.equals(message.getVersion().getHeader())) {
- while (xmlReader.nextTag() != XMLStreamConstants.START_ELEMENT) {
- //nothing to do
- }
- qn = xmlReader.getName();
- }
- if (qn.equals(message.getVersion().getHeader())) {
- XMLStreamReader filteredReader =
- new PartialXMLStreamReader(xmlReader, message.getVersion().getBody());
-
- Document doc = StaxUtils.read(filteredReader);
- Element element = doc.getDocumentElement();
- message.setHeaders(Element.class, element);
- message.put(Element.class, element);
+ XMLStreamReader filteredReader = new PartialXMLStreamReader(xmlReader, message.getVersion()
+ .getBody());
+
+ Document doc = StaxUtils.read(filteredReader);
+
+ message.setContent(Node.class, doc);
+
+ // Find header
+ Element element = doc.getDocumentElement();
+ QName header = soapVersion.getHeader();
+ NodeList headerEls = element.getElementsByTagNameNS(header.getNamespaceURI(), header
+ .getLocalPart());
+ for (int i = 0; i < headerEls.getLength(); i++) {
+ Node node = headerEls.item(i);
+ message.setHeaders(Element.class, (Element)node);
}
+
// advance just past body.
xmlReader.nextTag();
- if (xmlReader.getName().equals(message.getVersion().getBody())) {
- xmlReader.nextTag();
- }
if (message.getVersion().getFault().equals(xmlReader.getName())) {
Endpoint ep = message.getExchange().get(Endpoint.class);
if (!isDecoupled(message)) {
@@ -115,13 +114,12 @@
}
}
} catch (XMLStreamException e) {
- throw new SoapFault(new Message("XML_STREAM_EXC", BUNDLE), e,
- message.getVersion().getSender());
+ throw new SoapFault(new Message("XML_STREAM_EXC", BUNDLE), e, message.getVersion().getSender());
}
}
private boolean isDecoupled(SoapMessage message) {
Boolean decoupled = (Boolean)message.get(DECOUPLED_CHANNEL_MESSAGE);
- return decoupled != null && decoupled.booleanValue();
+ return decoupled != null && decoupled.booleanValue();
}
}
Added: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties?view=auto&rev=519759
==============================================================================
(empty)
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/Messages.properties
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java?view=auto&rev=519759
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java (added)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java Sun Mar 18 17:17:55 2007
@@ -0,0 +1,102 @@
+/**
+ * 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.binding.soap.saaj;
+
+
+import java.util.ResourceBundle;
+
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.StaxUtils;
+
+/**
+ * Builds a SAAJ tree from the Document fragment inside the message which contains
+ * the SOAP headers and from the XMLStreamReader.
+ */
+public class SAAJInInterceptor extends AbstractSoapInterceptor {
+ private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SAAJInInterceptor.class);
+
+ public SAAJInInterceptor() {
+ setPhase(Phase.PRE_PROTOCOL);
+ }
+
+ public void handleMessage(SoapMessage message) throws Fault {
+ try {
+ MessageFactory factory = null;
+ if (message.getVersion() instanceof Soap11) {
+ factory = MessageFactory.newInstance();
+ } else {
+ factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ }
+
+ SOAPMessage soapMessage = factory.createMessage();
+ message.setContent(SOAPMessage.class, soapMessage);
+
+ SOAPPart part = soapMessage.getSOAPPart();
+
+ Document node = (Document) message.getContent(Node.class);
+ DOMSource source = new DOMSource(node);
+ part.setContent(source);
+
+ // TODO: add attachments and mime headers
+
+ //replace header element if necessary
+ if (message.hasHeaders(Element.class)) {
+ Element headerElements = soapMessage.getSOAPHeader();
+ message.setHeaders(Element.class, headerElements);
+ }
+
+ XMLStreamReader xmlReader = message.getContent(XMLStreamReader.class);
+ StaxUtils.readDocElements(soapMessage.getSOAPBody(), xmlReader, true);
+
+ DOMSource bodySource = new DOMSource(soapMessage.getSOAPBody());
+ xmlReader = StaxUtils.createXMLStreamReader(bodySource);
+ xmlReader.nextTag();
+ xmlReader.nextTag(); // move past body tag
+ message.setContent(XMLStreamReader.class, xmlReader);
+ } catch (SOAPException soape) {
+ throw new SoapFault(new org.apache.cxf.common.i18n.Message(
+ "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), soape,
+ message.getVersion().getSender());
+ } catch (XMLStreamException e) {
+ throw new SoapFault(new org.apache.cxf.common.i18n.Message(
+ "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), e, message
+ .getVersion().getSender());
+ }
+ }
+
+}
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java?view=auto&rev=519759
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java (added)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java Sun Mar 18 17:17:55 2007
@@ -0,0 +1,108 @@
+/**
+ * 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.binding.soap.saaj;
+
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ResourceBundle;
+
+import javax.xml.soap.MessageFactory;
+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 org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.SoapVersion;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.i18n.Message;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
+
+/**
+ * Sets up the outgoing chain to build a SAAJ tree instead of writing
+ * directly to the output stream. First it will replace the XMLStreamWriter
+ * with one which writes to a SOAPMessage. Then it will add an interceptor
+ * at the end of the chain in the SEND phase which writes the resulting
+ * SOAPMessage.
+ */
+public class SAAJOutInterceptor extends AbstractSoapInterceptor {
+ private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SAAJOutInterceptor.class);
+
+ public SAAJOutInterceptor() {
+ setPhase(Phase.PRE_PROTOCOL);
+ }
+
+ public void handleMessage(SoapMessage cxfMessage) throws Fault {
+ SoapVersion version = cxfMessage.getVersion();
+ try {
+ MessageFactory factory = null;
+ if (version.getVersion() == 1.1) {
+ factory = MessageFactory.newInstance();
+ } else {
+ factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ }
+ SOAPMessage message = factory.createMessage();
+
+ SOAPPart soapPart = message.getSOAPPart();
+ W3CDOMStreamWriter writer = new W3CDOMStreamWriter(soapPart);
+ // Replace stax writer with DomStreamWriter
+ cxfMessage.setContent(XMLStreamWriter.class, writer);
+ cxfMessage.setContent(SOAPMessage.class, message);
+ } catch (SOAPException e) {
+ throw new SoapFault(new Message("SOAPEXCEPTION", BUNDLE), e, version.getSender());
+ }
+
+ // Add a final interceptor to write the message
+ cxfMessage.getInterceptorChain().add(new AbstractSoapInterceptor() {
+
+ @Override
+ public String getPhase() {
+ return Phase.SEND;
+ }
+
+ public void handleMessage(SoapMessage message) throws Fault {
+ SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
+
+ if (soapMessage != null) {
+ OutputStream os = message.getContent(OutputStream.class);
+ try {
+ soapMessage.writeTo(os);
+ os.flush();
+ } catch (IOException e) {
+ throw new SoapFault(new Message("SOAPEXCEPTION", BUNDLE), e,
+ message.getVersion().getSender());
+ } catch (SOAPException e) {
+ throw new SoapFault(new Message("SOAPEXCEPTION", BUNDLE), e,
+ message.getVersion().getSender());
+ }
+ }
+ }
+
+ });
+
+ }
+
+}
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java?view=auto&rev=519759
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java (added)
+++ incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java Sun Mar 18 17:17:55 2007
@@ -0,0 +1,94 @@
+/**
+ * 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.binding.soap.saaj;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.mail.util.ByteArrayDataSource;
+import javax.xml.stream.XMLStreamReader;
+
+import org.w3c.dom.Element;
+
+import org.apache.cxf.binding.soap.Soap12;
+import org.apache.cxf.binding.soap.TestBase;
+import org.apache.cxf.binding.soap.TestUtil;
+import org.apache.cxf.binding.soap.interceptor.ReadHeadersInterceptor;
+import org.apache.cxf.interceptor.StaxInInterceptor;
+
+
+public class SAAJInInterceptorTest extends TestBase {
+
+ private ReadHeadersInterceptor rhi;
+ private StaxInInterceptor staxIntc = new StaxInInterceptor();
+ private SAAJInInterceptor saajIntc;
+
+ public void setUp() throws Exception {
+ super.setUp();
+
+ rhi = new ReadHeadersInterceptor();
+ rhi.setPhase("phase1");
+ chain.add(rhi);
+
+ saajIntc = new SAAJInInterceptor();
+ saajIntc.setPhase("phase2");
+ chain.add(saajIntc);
+
+ }
+
+ public void testHandleHeader() {
+ try {
+ prepareSoapMessage("../test-soap-header.xml");
+ } catch (IOException ioe) {
+ fail("Failed in creating soap message");
+ }
+
+ staxIntc.handleMessage(soapMessage);
+ rhi.handleMessage(soapMessage);
+ saajIntc.handleMessage(soapMessage);
+
+ // check the xmlReader should be placed on the first entry of the body
+ // element
+ XMLStreamReader xmlReader = soapMessage.getContent(XMLStreamReader.class);
+ assertEquals("check the first entry of body", "itinerary", xmlReader.getLocalName());
+
+ Element eleHeaders = soapMessage.getHeaders(Element.class);
+ List<Element> headerChilds = new ArrayList<Element>();
+ for (int i = 0; i < eleHeaders.getChildNodes().getLength(); i++) {
+ if (eleHeaders.getChildNodes().item(i) instanceof Element) {
+ Element element = (Element)eleHeaders.getChildNodes().item(i);
+ headerChilds.add(element);
+ }
+ }
+
+ assertEquals(2, headerChilds.size());
+ }
+
+ private void prepareSoapMessage(String message) throws IOException {
+
+ soapMessage = TestUtil.createEmptySoapMessage(Soap12.getInstance(), chain);
+ ByteArrayDataSource bads = new ByteArrayDataSource(this.getClass().getResourceAsStream(message),
+ "text/xml");
+ soapMessage.setContent(InputStream.class, bads.getInputStream());
+
+ }
+}
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/cxf/trunk/rt/bindings/soap/src/test/java/org/apache/cxf/binding/soap/saaj/SAAJInInterceptorTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java Sun Mar 18 17:17:55 2007
@@ -44,7 +44,8 @@
public StaxOutInterceptor() {
super();
- setPhase(Phase.PRE_PROTOCOL);
+ setPhase(Phase.PRE_STREAM);
+ getAfter().add(AttachmentOutInterceptor.class.getName());
}
public void handleMessage(Message message) {
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/phase/PhaseManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/phase/PhaseManagerImpl.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/phase/PhaseManagerImpl.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/phase/PhaseManagerImpl.java Sun Mar 18 17:17:55 2007
@@ -86,15 +86,14 @@
outPhases.add(new Phase(Phase.PREPARE_SEND, ++i * 1000));
outPhases.add(new Phase(Phase.PRE_STREAM, ++i * 1000));
-
- outPhases.add(new Phase(Phase.PRE_PROTOCOL, ++i * 1000));
-
- outPhases.add(new Phase(Phase.USER_PROTOCOL, ++i * 1000));
- outPhases.add(new Phase(Phase.POST_PROTOCOL, ++i * 1000));
+ outPhases.add(new Phase(Phase.PRE_PROTOCOL, ++i * 1000));
+
outPhases.add(new Phase(Phase.WRITE, ++i * 1000));
outPhases.add(new Phase(Phase.MARSHAL, ++i * 1000));
+ outPhases.add(new Phase(Phase.USER_PROTOCOL, ++i * 1000));
+ outPhases.add(new Phase(Phase.POST_PROTOCOL, ++i * 1000));
outPhases.add(new Phase(Phase.USER_STREAM, ++i * 1000));
outPhases.add(new Phase(Phase.POST_STREAM, ++i * 1000));
Modified: incubator/cxf/trunk/rt/core/src/main/resources/META-INF/cxf/cxf.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/resources/META-INF/cxf/cxf.xml?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/resources/META-INF/cxf/cxf.xml (original)
+++ incubator/cxf/trunk/rt/core/src/main/resources/META-INF/cxf/cxf.xml Sun Mar 18 17:17:55 2007
@@ -73,130 +73,7 @@
</bean>
<bean id="org.apache.cxf.phase.PhaseManager" class="org.apache.cxf.phase.PhaseManagerImpl">
- <constructor-arg>
- <list>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="receive"/>
- <property name="priority" value="1000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-stream"/>
- <property name="priority" value="2000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-stream"/>
- <property name="priority" value="3000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-stream"/>
- <property name="priority" value="4000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="read"/>
- <property name="priority" value="5000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-protocol"/>
- <property name="priority" value="6000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-protocol"/>
- <property name="priority" value="7000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-protocol"/>
- <property name="priority" value="8000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="unmarshal"/>
- <property name="priority" value="9000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-logical"/>
- <property name="priority" value="10000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-logical"/>
- <property name="priority" value="11000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-logical"/>
- <property name="priority" value="12000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-invoke"/>
- <property name="priority" value="13000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="invoke"/>
- <property name="priority" value="14000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-invoke"/>
- <property name="priority" value="15000"/>
- </bean>
- </list>
- </constructor-arg>
- <constructor-arg>
- <list>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="setup"/>
- <property name="priority" value="1000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-logical"/>
- <property name="priority" value="2000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-logical"/>
- <property name="priority" value="3000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-logical"/>
- <property name="priority" value="4000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="prepare-send"/>
- <property name="priority" value="5000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-stream"/>
- <property name="priority" value="6000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="pre-protocol"/>
- <property name="priority" value="7000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-protocol"/>
- <property name="priority" value="8000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-protocol"/>
- <property name="priority" value="9000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="write"/>
- <property name="priority" value="10000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="marshal"/>
- <property name="priority" value="11000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="user-stream"/>
- <property name="priority" value="12000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="post-stream"/>
- <property name="priority" value="13000"/>
- </bean>
- <bean class="org.apache.cxf.phase.Phase">
- <property name="name" value="send"/>
- <property name="priority" value="14000"/>
- </bean>
- </list>
- </constructor-arg>
+
</bean>
<bean id="org.apache.cxf.workqueue.WorkQueueManager" class="org.apache.cxf.workqueue.WorkQueueManagerImpl">
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java Sun Mar 18 17:17:55 2007
@@ -21,8 +21,6 @@
import java.security.Principal;
-// TODO JAX-WS 2.1
-//import javax.xml.ws.EndpointReference;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/PortInfoImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/PortInfoImpl.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/PortInfoImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/PortInfoImpl.java Sun Mar 18 17:17:55 2007
@@ -20,7 +20,6 @@
package org.apache.cxf.jaxws.handler;
import javax.xml.namespace.QName;
-
import javax.xml.ws.handler.PortInfo;
public class PortInfoImpl implements PortInfo {
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptor.java Sun Mar 18 17:17:55 2007
@@ -19,56 +19,38 @@
package org.apache.cxf.jaxws.handler.soap;
-import java.io.IOException;
-import java.io.OutputStream;
import java.net.URI;
import java.util.HashSet;
-import java.util.ResourceBundle;
import java.util.Set;
import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamConstants;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
import javax.xml.ws.Binding;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import org.apache.cxf.binding.soap.SoapFault;
import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapInterceptor;
-import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.helpers.CastUtils;
-import org.apache.cxf.helpers.XMLUtils;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.StaxOutInterceptor;
-import org.apache.cxf.io.AbstractCachedOutputStream;
import org.apache.cxf.jaxws.handler.AbstractProtocolHandlerInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.apache.cxf.staxutils.W3CDOMStreamWriter;
public class SOAPHandlerInterceptor extends
AbstractProtocolHandlerInterceptor<SoapMessage> implements
SoapInterceptor {
- public static final String SAAJ_ENABLED = "saaj.enabled";
- private static final ResourceBundle BUNDLE = BundleUtils
- .getBundle(SOAPHandlerInterceptor.class);
-
+ private static final SAAJOutInterceptor SAAJ_OUT = new SAAJOutInterceptor();
+
public SOAPHandlerInterceptor(Binding binding) {
super(binding);
setPhase(Phase.PRE_PROTOCOL);
- addAfter((new StaxOutInterceptor()).getId());
+ addAfter(StaxOutInterceptor.class.getName());
+ addAfter(SAAJOutInterceptor.class.getName());
}
public Set<URI> getRoles() {
@@ -91,115 +73,37 @@
}
public void handleMessage(SoapMessage message) {
-
- boolean saajEnabled = Boolean.TRUE.equals(message.getContextualProperty(SAAJ_ENABLED));
- if (getInvoker(message).getProtocolHandlers().isEmpty() && !saajEnabled) {
+ if (getInvoker(message).getProtocolHandlers().isEmpty()) {
return;
}
if (getInvoker(message).isOutbound()) {
- XMLStreamWriter origWriter = message.getContent(XMLStreamWriter.class);
-
- try {
- // Replace stax writer with DomStreamWriter
- W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
- message.setContent(XMLStreamWriter.class, writer);
- } catch (ParserConfigurationException e) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), e,
- message.getVersion().getSender());
+ SOAPMessage saaj = message.getContent(SOAPMessage.class);
+ if (saaj == null) {
+ SAAJ_OUT.handleMessage(message);
}
- message.getInterceptorChain().doInterceptInSubChain(message);
+ final SOAPHandlerInterceptor handlerInterceptor = this;
+ message.getInterceptorChain().add(new AbstractSoapInterceptor() {
- super.handleMessage(message);
+ @Override
+ public String getPhase() {
+ return Phase.USER_PROTOCOL;
+ }
- try {
- // Stream SOAPMessage back to output stream if necessary
- SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
-
- if (soapMessage != null) {
- OutputStream os = message.getContent(OutputStream.class);
- soapMessage.writeTo(os);
- os.flush();
- } else {
- XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
- Document doc = ((W3CDOMStreamWriter)xtw).getDocument();
- StaxUtils.writeDocument(doc, origWriter, false);
+ public void handleMessage(SoapMessage message) throws Fault {
+ handlerInterceptor.invokeSOAPHandlerInterceptors(message);
}
-
- } catch (IOException ioe) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), ioe,
- message.getVersion().getSender());
- } catch (SOAPException soape) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), soape,
- message.getVersion().getSender());
- } catch (XMLStreamException e) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), e,
- message.getVersion().getSender());
- }
+ });
} else {
super.handleMessage(message);
-
- //SOAPMessageContextImpl ctx = (SOAPMessageContextImpl) createProtocolMessageContext(message);
- //ctx.getMessage();
-
- try {
- SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
-
- if (soapMessage == null) {
- if (saajEnabled) {
- soapMessage = new SOAPMessageContextImpl(message).getMessage();
- message.setContent(SOAPMessage.class, soapMessage);
- } else {
- return;
- }
- }
-
- // soapMessage is not null means stax reader has been consumed
- // by SAAJ, we need to replace stax reader with a new stax reader
- // built from the content streamed from SAAJ SOAPBody.
- SOAPBody body = soapMessage.getSOAPBody();
-
- CachedStream outStream = new CachedStream();
- XMLUtils.writeTo(body, outStream);
-
- XMLStreamReader reader = null;
- reader = XMLInputFactory.newInstance().createXMLStreamReader(
- outStream.getInputStream());
- // skip the start element of soap body.
- if (reader.nextTag() == XMLStreamConstants.START_ELEMENT) {
- reader.getName();
- }
- reader.next();
- message.setContent(XMLStreamReader.class, reader);
-
- //replace header element if necessary
- if (message.hasHeaders(Element.class)) {
- Element headerElements = message.getHeaders(Element.class);
- headerElements = soapMessage.getSOAPHeader();
- message.setHeaders(Element.class, headerElements);
- }
- } catch (IOException ioe) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), ioe,
- message.getVersion().getSender());
- } catch (SOAPException soape) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), soape,
- message.getVersion().getSender());
- } catch (XMLStreamException e) {
- throw new SoapFault(new org.apache.cxf.common.i18n.Message(
- "SOAPHANDLERINTERCEPTOR_EXCEPTION", BUNDLE), e, message
- .getVersion().getSender());
- }
-
}
}
+ protected void invokeSOAPHandlerInterceptors(SoapMessage message) {
+ super.handleMessage(message);
+ }
+
@Override
protected MessageContext createProtocolMessageContext(Message message) {
return new SOAPMessageContextImpl(message);
@@ -207,17 +111,4 @@
public void handleFault(SoapMessage message) {
}
-
- private class CachedStream extends AbstractCachedOutputStream {
- protected void doFlush() throws IOException {
- currentStream.flush();
- }
-
- protected void doClose() throws IOException {
- }
-
- protected void onWrite() throws IOException {
- }
- }
-
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/soap/SOAPMessageContextImpl.java Sun Mar 18 17:17:55 2007
@@ -19,49 +19,29 @@
package org.apache.cxf.jaxws.handler.soap;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.ResourceBundle;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
-import javax.xml.soap.MessageFactory;
-import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
-import javax.xml.soap.SOAPConstants;
-import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
-import javax.xml.soap.SOAPPart;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPMessageContext;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
-import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.SoapMessage;
-import org.apache.cxf.binding.soap.SoapVersion;
-import org.apache.cxf.common.i18n.BundleUtils;
-import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.io.AbstractCachedOutputStream;
+import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.jaxws.context.WrappedMessageContext;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.XMLMessage;
-import org.apache.cxf.staxutils.StaxUtils;
-import org.apache.cxf.staxutils.W3CDOMStreamWriter;
public class SOAPMessageContextImpl extends WrappedMessageContext implements SOAPMessageContext {
- private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SOAPMessageContextImpl.class);
-
+ private static final SAAJInInterceptor SAAJ_IN = new SAAJInInterceptor();
+
SOAPMessageContextImpl(Message m) {
super(m);
}
@@ -73,107 +53,26 @@
public SOAPMessage getMessage() {
SOAPMessage message = getWrappedMessage().getContent(SOAPMessage.class);
if (null == message) {
+ Boolean outboundProperty = (Boolean)get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
- try {
- Boolean outboundProperty = (Boolean)get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
-
- if (outboundProperty) {
- SoapVersion soapVersion = ((SoapMessage)getWrappedMessage()).getVersion();
-
- if (soapVersion == null) {
- soapVersion = Soap11.getInstance();
- }
- soapVersion = ((SoapMessage)getWrappedMessage()).getVersion();
-
- XMLStreamWriter xtw = getWrappedMessage().getContent(XMLStreamWriter.class);
- Document doc = ((W3CDOMStreamWriter)xtw).getDocument();
-
- MessageFactory factory = null;
- if (soapVersion.getVersion() == 1.1) {
- factory = MessageFactory.newInstance();
- } else {
- factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ // No SOAPMessage exists yet, so lets create one
+ if (!outboundProperty) {
+ if (getWrappedMessage().getContent(Object.class) != null) {
+ //The Dispatch/Provider case:
+ Object obj = getWrappedMessage().getContent(Object.class);
+ if (obj instanceof SOAPMessage) {
+ message = (SOAPMessage)obj;
+ } else if (obj instanceof SOAPBody) {
+ // what to do
+ } else if (obj instanceof XMLMessage) {
+ // what to do
}
- message = factory.createMessage();
-
- SOAPPart soapPart = message.getSOAPPart();
- DOMSource preppedMsgSrc = new DOMSource(doc.getDocumentElement());
- soapPart.setContent(preppedMsgSrc);
- message.saveChanges();
-
} else {
-
- if (getWrappedMessage().getContent(Object.class) != null) {
- //The Dispatch/Provider case:
- Object obj = getWrappedMessage().getContent(Object.class);
- if (obj instanceof SOAPMessage) {
- message = (SOAPMessage)obj;
- } else if (obj instanceof SOAPBody) {
- // what to do
- } else if (obj instanceof XMLMessage) {
- // what to do
- }
-
- } else {
- CachedStream cs = new CachedStream();
- XMLStreamWriter writer = StaxUtils.getXMLOutputFactory().createXMLStreamWriter(cs);
- XMLStreamReader xmlReader = getWrappedMessage().getContent(XMLStreamReader.class);
-
- // Create a mocked inputStream to feed SAAJ,
- // only SOAPBody is from real data
- // REVISIT: soap version here is not important, we just
- // use soap11.
- SoapVersion soapVersion = Soap11.getInstance();
- writer.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
- writer.writeStartElement(soapVersion.getPrefix(), soapVersion.getEnvelope()
- .getLocalPart(), soapVersion.getNamespace());
- writer.writeNamespace(soapVersion.getPrefix(), soapVersion.getNamespace());
-
- // Write headers
- if (getWrappedSoapMessage().hasHeaders(Element.class)) {
- Element headerElements = getWrappedSoapMessage().getHeaders(Element.class);
- StaxUtils.writeElement(headerElements, writer, true);
- }
-
- writer.writeStartElement(soapVersion.getPrefix(), soapVersion.getBody()
- .getLocalPart(), soapVersion.getNamespace());
-
- // Write soap body
- StaxUtils.copy(xmlReader, writer);
-
- xmlReader.close();
- writer.close();
- cs.doFlush();
-
- InputStream newIs = cs.getInputStream();
- MessageFactory factory = MessageFactory.newInstance();
- MimeHeaders mhs = null;
- message = factory.createMessage(mhs, newIs);
-
- getWrappedMessage().setContent(SOAPMessage.class, message);
- }
+ SAAJ_IN.handleMessage(getWrappedSoapMessage());
+ message = getWrappedSoapMessage().getContent(SOAPMessage.class);
}
-
-
-/* System.out.println("11111------------------");
- PrintStream out = System.out;
- message.writeTo(out);
- out.println();
- System.out.println("11111------------------");
-*/
- getWrappedMessage().setContent(SOAPMessage.class, message);
-
- } catch (IOException ioe) {
- throw new Fault(new org.apache.cxf.common.i18n.Message("SOAPHANDLERINTERCEPTOR_EXCEPTION",
- BUNDLE), ioe);
- } catch (SOAPException soape) {
- throw new Fault(new org.apache.cxf.common.i18n.Message("SOAPHANDLERINTERCEPTOR_EXCEPTION",
- BUNDLE), soape);
- } catch (XMLStreamException e) {
- e.printStackTrace();
- throw new Fault(new org.apache.cxf.common.i18n.Message("SOAPHANDLERINTERCEPTOR_EXCEPTION",
- BUNDLE), e);
}
+
}
return message;
@@ -203,24 +102,10 @@
}
public Set<String> getRoles() {
- // TODO Auto-generated method stub
return null;
}
private SoapMessage getWrappedSoapMessage() {
return (SoapMessage)getWrappedMessage();
- }
-
- private class CachedStream extends AbstractCachedOutputStream {
- protected void doFlush() throws IOException {
- currentStream.flush();
- }
-
- protected void doClose() throws IOException {
- currentStream.close();
- }
-
- protected void onWrite() throws IOException {
- }
}
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsEndpointImpl.java Sun Mar 18 17:17:55 2007
@@ -68,8 +68,7 @@
} else {
// TODO: what for non soap bindings?
}
-// handlerInterceptors.add(new StreamHandlerInterceptor(binding));
-
+
List<Interceptor> fault = super.getOutFaultInterceptors();
fault.addAll(handlerInterceptors);
List<Interceptor> in = super.getInInterceptors();
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/JaxWsServiceFactoryBean.java Sun Mar 18 17:17:55 2007
@@ -35,6 +35,8 @@
import org.apache.cxf.binding.AbstractBindingFactory;
import org.apache.cxf.binding.soap.SoapBindingFactory;
import org.apache.cxf.binding.soap.model.SoapBindingInfo;
+import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
+import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.databinding.source.SourceDataBinding;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.EndpointException;
@@ -112,7 +114,8 @@
out.addBefore(SOAPHandlerInterceptor.class.getName());
getService().getOutInterceptors().add(out);
- getService().put(SOAPHandlerInterceptor.SAAJ_ENABLED, Boolean.TRUE);
+ getService().getInInterceptors().add(new SAAJInInterceptor());
+ getService().getOutInterceptors().add(new SAAJOutInterceptor());
} else {
getService().getInInterceptors().add(new ProviderInDatabindingInterceptor(type));
getService().getOutInterceptors().add(new ProviderOutDatabindingInterceptor());
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstWSDLTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstWSDLTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstWSDLTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/CodeFirstWSDLTest.java Sun Mar 18 17:17:55 2007
@@ -24,7 +24,6 @@
import javax.xml.namespace.QName;
import org.apache.cxf.Bus;
-
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.jaxws.service.Hello2;
import org.apache.cxf.jaxws.service.Hello3;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/JAXWSMethodInvokerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/JAXWSMethodInvokerTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/JAXWSMethodInvokerTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/JAXWSMethodInvokerTest.java Sun Mar 18 17:17:55 2007
@@ -22,7 +22,6 @@
import org.apache.cxf.common.util.factory.Factory;
import org.apache.cxf.jaxws.service.Hello;
import org.apache.cxf.message.Exchange;
-
import org.apache.cxf.service.invoker.ScopePolicy;
import org.easymock.classextension.EasyMock;
import org.junit.Assert;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/MessageReplayObserver.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/MessageReplayObserver.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/MessageReplayObserver.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/MessageReplayObserver.java Sun Mar 18 17:17:55 2007
@@ -23,7 +23,6 @@
import java.io.OutputStream;
import junit.framework.Assert;
-
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.transport.Conduit;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WebServiceContextImplTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WebServiceContextImplTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WebServiceContextImplTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/context/WebServiceContextImplTest.java Sun Mar 18 17:17:55 2007
@@ -24,7 +24,6 @@
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
-
import org.apache.cxf.message.MessageImpl;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptorTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/AbstractProtocolHandlerInterceptorTest.java Sun Mar 18 17:17:55 2007
@@ -24,7 +24,6 @@
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
-
import org.apache.cxf.message.AbstractWrappedMessage;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.Message;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainBuilderTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainBuilderTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainBuilderTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainBuilderTest.java Sun Mar 18 17:17:55 2007
@@ -29,7 +29,6 @@
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
-
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.javaee.FullyQualifiedClassType;
import org.apache.cxf.jaxws.javaee.HandlerChainType;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/HandlerChainInvokerTest.java Sun Mar 18 17:17:55 2007
@@ -33,7 +33,6 @@
import javax.xml.ws.handler.soap.SOAPMessageContext;
import junit.framework.TestCase;
-
import org.apache.cxf.jaxws.context.WrappedMessageContext;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalHandlerInterceptorTest.java Sun Mar 18 17:17:55 2007
@@ -30,7 +30,6 @@
import javax.xml.ws.handler.MessageContext;
import junit.framework.TestCase;
-
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.interceptor.InterceptorChain;
import org.apache.cxf.message.Exchange;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalMessageImplTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalMessageImplTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalMessageImplTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/LogicalMessageImplTest.java Sun Mar 18 17:17:55 2007
@@ -25,7 +25,6 @@
import javax.xml.bind.JAXBContext;
import junit.framework.TestCase;
-
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
import org.apache.handlers.types.AddNumbers;
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/test/java/org/apache/cxf/jaxws/handler/soap/SOAPHandlerInterceptorTest.java Sun Mar 18 17:17:55 2007
@@ -54,7 +54,6 @@
import org.w3c.dom.NodeList;
import junit.framework.TestCase;
-
import org.apache.cxf.binding.soap.Soap11;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.SoapVersion;
@@ -66,13 +65,14 @@
import org.apache.cxf.jaxws.handler.HandlerChainInvoker;
import org.apache.cxf.message.Exchange;
import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.phase.Phase;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.phase.PhaseManagerImpl;
import org.apache.cxf.staxutils.PartialXMLStreamReader;
import org.apache.cxf.staxutils.StaxUtils;
-
import org.easymock.classextension.IMocksControl;
+
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createNiceControl;
@@ -93,8 +93,6 @@
Boolean outboundProperty = (Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outboundProperty.booleanValue()) {
try {
- //SOAPMessage message = smc.getMessage();
- //message.getSOAPBody();
smc.setMessage(preparemSOAPMessage("resources/greetMeRpcLitRespChanged.xml"));
} catch (Exception e) {
throw new Fault(e);
@@ -130,9 +128,15 @@
InterceptorChain chain = new PhaseInterceptorChain((new PhaseManagerImpl()).getOutPhases());
//Interceptors after SOAPHandlerInterceptor DOMXMLStreamWriter to write
chain.add(new AbstractProtocolHandlerInterceptor<SoapMessage>(binding) {
+
+ @Override
+ public String getPhase() {
+ return Phase.MARSHAL;
+ }
+
public void handleMessage(SoapMessage message) throws Fault {
try {
- XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
+ XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
SoapVersion soapVersion = Soap11.getInstance();
writer.setPrefix(soapVersion.getPrefix(), soapVersion.getNamespace());
writer.writeStartElement(soapVersion.getPrefix(),
@@ -142,21 +146,24 @@
writer.writeEndElement();
writer.flush();
+ message.getInterceptorChain().finishSubChain();
} catch (Exception e) {
// do nothing
}
}
});
+ chain.add(new SOAPHandlerInterceptor(binding));
message.setInterceptorChain(chain);
control.replay();
- SOAPHandlerInterceptor li = new SOAPHandlerInterceptor(binding);
- li.handleMessage(message);
+ chain.doIntercept(message);
+
control.verify();
// Verify outputStream
CachedStream expectedOs = prepareOutputStreamFromResource("resources/greetMeRpcLitRespChanged.xml");
+
assertTrue("The content of outputStream should remain unchanged", compareInputStream(expectedOs
.getInputStream(), originalEmptyOs.getInputStream()));
@@ -219,14 +226,14 @@
expect(exchange.get(HandlerChainInvoker.class)).andReturn(invoker).anyTimes();
// This is to set direction to inbound
expect(exchange.getOutMessage()).andReturn(null);
+
SoapMessage message = new SoapMessage(new MessageImpl());
message.setExchange(exchange);
XMLStreamReader reader = preparemXMLStreamReader("resources/greetMeRpcLitReq.xml");
message.setContent(XMLStreamReader.class, reader);
- Element headerElement = preparemSOAPHeader();
- message.setHeaders(Element.class, headerElement);
- message.put(Element.class, headerElement);
-
+ Object[] headerInfo = preparemSOAPHeader();
+ message.setHeaders(Element.class, (Element) headerInfo[1]);
+ message.setContent(Node.class, (Document) headerInfo[0]);
control.replay();
SOAPHandlerInterceptor li = new SOAPHandlerInterceptor(binding);
@@ -306,6 +313,12 @@
InterceptorChain chain = new PhaseInterceptorChain((new PhaseManagerImpl()).getOutPhases());
//Interceptors after SOAPHandlerInterceptor DOMXMLStreamWriter to write
chain.add(new AbstractProtocolHandlerInterceptor<SoapMessage>(binding) {
+
+ @Override
+ public String getPhase() {
+ return Phase.MARSHAL;
+ }
+
public void handleMessage(SoapMessage message) throws Fault {
try {
XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
@@ -316,23 +329,25 @@
soapVersion.getNamespace());
writer.writeNamespace(soapVersion.getPrefix(), soapVersion.getNamespace());
- Element headerElement = preparemSOAPHeader();
- StaxUtils.writeElement(headerElement, writer, true, false);
+ Object[] headerInfo = preparemSOAPHeader();
+ StaxUtils.writeElement((Element) headerInfo[1], writer, true, false);
writer.writeEndElement();
writer.flush();
+ message.getInterceptorChain().finishSubChain();
} catch (Exception e) {
// do nothing
}
}
});
+ chain.add(new SOAPHandlerInterceptor(binding));
message.setInterceptorChain(chain);
control.replay();
- SOAPHandlerInterceptor li = new SOAPHandlerInterceptor(binding);
- li.handleMessage(message);
+ chain.doIntercept(message);
+
control.verify();
// Verify SOAPMessage header
@@ -482,17 +497,28 @@
return xmlReader;
}
- private Element preparemSOAPHeader() throws Exception {
+ private Object[] preparemSOAPHeader() throws Exception {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
SoapVersion soapVersion = Soap11.getInstance();
- Element headerElement = doc.createElementNS(soapVersion.getNamespace(), "SOAP-ENV:"
- + soapVersion.getHeader()
- .getLocalPart());
+ Element envElement = doc.createElementNS(soapVersion.getEnvelope().getNamespaceURI(),
+ soapVersion.getEnvelope().getLocalPart());
+
+ Element headerElement = doc.createElementNS(soapVersion.getNamespace(),
+ soapVersion.getHeader().getLocalPart());
+
+ Element bodyElement = doc.createElementNS(soapVersion.getBody().getNamespaceURI(),
+ soapVersion.getBody().getLocalPart());
+
Element childElement = doc.createElementNS("http://apache.org/hello_world_rpclit/types",
"ns2:header1");
+
childElement.setAttributeNS(soapVersion.getNamespace(), "SOAP-ENV:mustUnderstand", "true");
headerElement.appendChild(childElement);
- return headerElement;
+ envElement.appendChild(headerElement);
+ envElement.appendChild(bodyElement);
+ doc.appendChild(envElement);
+
+ return new Object[] {doc, headerElement};
}
private SOAPMessage preparemSOAPMessage(String resouceName) throws Exception {
Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/schema_validation/ValidationServer.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/schema_validation/ValidationServer.java?view=diff&rev=519759&r1=519758&r2=519759
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/schema_validation/ValidationServer.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/schema_validation/ValidationServer.java Sun Mar 18 17:17:55 2007
@@ -44,7 +44,9 @@
}
public boolean stopInProcess() throws Exception {
- System.setProperty("cxf.config.file.url", oldConfig);
+ if (oldConfig != null) {
+ System.setProperty("cxf.config.file.url", oldConfig);
+ }
return super.stopInProcess();
}