You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ba...@apache.org on 2007/07/17 01:01:36 UTC
svn commit: r556761 - in /webservices/axis2/trunk/java/modules: jaxws/
jaxws/test-resources/ jaxws/test/org/apache/axis2/jaxws/framework/
jaxws/test/org/apache/axis2/jaxws/provider/
jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/ jaxws/test/org/a...
Author: barrettj
Date: Mon Jul 16 16:01:34 2007
New Revision: 556761
URL: http://svn.apache.org/viewvc?view=rev&rev=556761
Log:
AXIS2-2853
Add pluggable mustUnderstand checker support and associated testcase.
Added:
webservices/axis2/trunk/java/modules/jaxws/test-resources/axis2.xml
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderChecker.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderTests.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/MANIFEST.MF
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/ProviderSOAPMessage.wsdl
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/services.xml
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/SoapMessageMUProvider.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/SOAPMustUnderstandHeaderChecker.java
Modified:
webservices/axis2/trunk/java/modules/jaxws/pom.xml
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java
webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/AttachmentUtil.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/axis2_default.xml
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
Modified: webservices/axis2/trunk/java/modules/jaxws/pom.xml
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/pom.xml?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/pom.xml (original)
+++ webservices/axis2/trunk/java/modules/jaxws/pom.xml Mon Jul 16 16:01:34 2007
@@ -465,6 +465,17 @@
<include name="org/apache/axis2/jaxws/server/**"/>
</fileset>
</copy>
+ <copy toDir="target/test-classes/services/SoapMessageMUProviderService/">
+ <fileset dir="target/test-classes">
+ <include name="org/apache/axis2/jaxws/provider/soapmsgmu/**"/>
+ </fileset>
+ <fileset dir="test/org/apache/axis2/jaxws/provider/soapmsgmu">
+ <include name="META-INF/**"/>
+ </fileset>
+ <fileset dir="target/classes">
+ <include name="org/apache/axis2/jaxws/server/**"/>
+ </fileset>
+ </copy>
<copy toDir="target/test-classes/services/JAXBProviderService/">
<fileset dir="target/test-classes">
<include name="org/apache/axis2/jaxws/provider/jaxb/**"/>
@@ -806,6 +817,7 @@
<copy toDir="target/test-classes/">
<fileset dir="test-resources/">
<include name="**/*.properties"/>
+ <include name="**/axis2.xml"/>
</fileset>
</copy>
</tasks>
@@ -850,6 +862,11 @@
<property>
<name>build.repository</name>
<value>./target/test-classes</value>
+ </property>
+ <!-- Need this for the client side to pickup an axis2.xml to configure SoapMessageMUProviderChecker -->
+ <property>
+ <name>org.apache.axis2.jaxws.config.path</name>
+ <value>./target/test-classes/axis2.xml</value>
</property>
</systemProperties>
</configuration>
Added: webservices/axis2/trunk/java/modules/jaxws/test-resources/axis2.xml
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test-resources/axis2.xml?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test-resources/axis2.xml (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test-resources/axis2.xml Mon Jul 16 16:01:34 2007
@@ -0,0 +1,284 @@
+<!--
+ ~ 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.
+ -->
+<axisconfig name="AxisJava2.0">
+ <!-- ================================================= -->
+ <!-- Parameters -->
+ <!-- ================================================= -->
+ <parameter name="hotdeployment">true</parameter>
+ <parameter name="hotupdate">false</parameter>
+ <parameter name="enableMTOM">false</parameter>
+
+ <!--During a fault, stacktrace can be sent with the fault message. The following flag will control -->
+ <!--that behaviour.-->
+ <parameter name="sendStacktraceDetailsWithFaults">true</parameter>
+
+ <!--If there aren't any information available to find out the fault reason, we set the message of the exception-->
+ <!--as the faultreason/Reason. But when a fault is thrown from a service or some where, it will be -->
+ <!--wrapped by different levels. Due to this the initial exception message can be lost. If this flag-->
+ <!--is set then, Axis2 tries to get the first exception and set its message as the faultreason/Reason.-->
+ <parameter name="DrillDownToRootCauseForFaultReason">false</parameter>
+
+ <!--This is the user name and password of admin console-->
+ <parameter name="userName">admin</parameter>
+ <parameter name="password">axis2</parameter>
+
+ <!--To override repository/services you need to uncomment following parameter and value SHOULD be absolute file path.-->
+ <!--ServicesDirectory only works on the following cases-->
+ <!---File based configurator and in that case the value should be a file URL (http:// not allowed)-->
+ <!---When creating URL Based configurator with URL âfile://â -->
+ <!--- War based configurator with expanded case , -->
+
+ <!--All the other scenarios it will be ignored.-->
+ <!--<parameter name="ServicesDirectory">service</parameter>-->
+ <!--To override repository/modules you need to uncomment following parameter and value SHOULD be absolute file path-->
+ <!--<parameter name="ModulesDirectory">modules</parameter>-->
+
+ <!--Following params will set the proper context paths for invocations. All the endpoints will have a commons context-->
+ <!--root which can configured using the following contextRoot parameter-->
+ <!--<parameter name="contextRoot">axis2</parameter>-->
+
+ <!--Our HTTP endpoints can handle both REST and SOAP. Following parameters can be used to distinguish those endpoints-->
+ <!--<parameter name="servicePath">services</parameter>-->
+ <!--<parameter name="restPath">rest</parameter>-->
+
+ <!-- Following parameter will completely disable REST handling in Axis2-->
+ <parameter name="disableREST" locked="true">false</parameter>
+
+ <!--POJO deployer , this will alow users to drop .class file and make that into a service-->
+ <deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>
+
+ <!-- Following parameter will set the host name for the epr-->
+ <!--<parameter name="hostname" locked="true">myhost.com</parameter>-->
+
+ <!-- ================================================= -->
+ <!-- Message Receivers -->
+ <!-- ================================================= -->
+ <!--This is the Default Message Receiver for the system , if you want to have MessageReceivers for -->
+ <!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
+ <!--any operation -->
+ <!--Note : You can override this for particular service by adding the same element with your requirement-->
+ <messageReceivers>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
+ class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
+ class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
+ <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-only"
+ class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
+ <messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out"
+ class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
+ </messageReceivers>
+
+ <!-- ================================================= -->
+ <!-- Message Formatter -->
+ <!-- ================================================= -->
+ <!--Following content type to message formatter mapping can be used to implement support for different message -->
+ <!--format serialization in Axis2. These message formats are expected to be resolved based on the content type. -->
+ <messageFormatters>
+ <messageFormatter contentType="application/x-www-form-urlencoded"
+ class="org.apache.axis2.transport.http.XFormURLEncodedFormatter"/>
+ <messageFormatter contentType="multipart/form-data"
+ class="org.apache.axis2.transport.http.MultipartFormDataFormatter"/>
+ <messageFormatter contentType="application/xml"
+ class="org.apache.axis2.transport.http.ApplicationXMLFormatter"/>
+ </messageFormatters>
+
+ <!-- ================================================= -->
+ <!-- Message Builders -->
+ <!-- ================================================= -->
+ <!--Following content type to builder mapping can be used to implement support for different message -->
+ <!--formats in Axis2. These message formats are expected to be resolved based on the content type. -->
+ <messageBuilders>
+ <messageBuilder contentType="application/xml"
+ class="org.apache.axis2.builder.ApplicationXMLBuilder"/>
+ <messageBuilder contentType="application/x-www-form-urlencoded"
+ class="org.apache.axis2.builder.XFormURLEncodedBuilder"/>
+ <!--Left commented because it adds the depandancy of servlet-api to other modules.
+ Please uncomment to Receive messages in multipart/form-data format-->
+ <!--<messageBuilder contentType="multipart/form-data"-->
+ <!--class="org.apache.axis2.builder.MultipartFormDataBuilder"/>-->
+ </messageBuilders>
+
+ <!-- ================================================= -->
+ <!-- Target Resolvers -->
+ <!-- ================================================= -->
+ <!-- Uncomment the following and specify the class name for your TargetResolver to add -->
+ <!-- a TargetResolver. TargetResolvers are used to process the To EPR for example to -->
+ <!-- choose a server in a cluster -->
+ <!--<targetResolvers>-->
+ <!--<targetResolver class="" />-->
+ <!--</targetResolvers>-->
+
+ <!-- ================================================= -->
+ <!-- SOAP Must Understand Header Checkers -->
+ <!-- ================================================= -->
+ <!-- Uncomment the following and specify the class name for your SOAPMustUnderstandHeaderChecker -->
+ <!-- implementation to add a header checker. Header checkers are used to identify SOAP Header -->
+ <!-- QNames that will be processed by components (such as a MessageReceiver) after the point -->
+ <!-- the Axis2 engine checks that all mustUnderstand headers are understood. -->
+ <soapMustUnderstandCheckers>
+ <soapMustUnderstandChecker class="org.apache.axis2.jaxws.provider.SoapMessageMUProviderChecker" />
+ </soapMustUnderstandCheckers>
+
+
+ <!-- ================================================= -->
+ <!-- Transport Ins -->
+ <!-- ================================================= -->
+ <transportReceiver name="http"
+ class="org.apache.axis2.transport.http.SimpleHTTPServer">
+ <parameter name="port">6060</parameter>
+ <!--If you want to give your own host address for EPR generation-->
+ <!--uncomment following parameter , and set as you required.-->
+ <!--<parameter name="hostname">http://myApp.com/ws</parameter>-->
+ </transportReceiver>
+
+ <transportReceiver name="tcp"
+ class="org.apache.axis2.transport.tcp.TCPServer">
+ <parameter name="port">6061</parameter>
+ <!--If you want to give your own host address for EPR generation-->
+ <!--uncomment following parameter , and set as you required.-->
+ <!--<parameter name="hostname">tcp://myApp.com/ws</parameter>-->
+ </transportReceiver>
+
+ <!-- ================================================= -->
+ <!-- Transport Outs -->
+ <!-- ================================================= -->
+
+ <!--<transportSender name="jms"-->
+ <!--class="org.apache.axis2.transport.jms.JMSSender"/>-->
+ <transportSender name="tcp"
+ class="org.apache.axis2.transport.tcp.TCPTransportSender"/>
+ <transportSender name="local"
+ class="org.apache.axis2.transport.local.LocalTransportSender"/>
+ <transportSender name="http"
+ class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding">chunked</parameter>
+ </transportSender>
+ <transportSender name="https"
+ class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
+ <parameter name="PROTOCOL">HTTP/1.1</parameter>
+ <parameter name="Transfer-Encoding">chunked</parameter>
+ </transportSender>
+
+ <!-- ================================================= -->
+ <!-- Phases -->
+ <!-- ================================================= -->
+ <phaseOrder type="InFlow">
+ <!-- System pre-defined phases -->
+ <phase name="Transport">
+ <handler name="RequestURIBasedDispatcher"
+ class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher">
+ <order phase="Transport"/>
+ </handler>
+ <handler name="SOAPActionBasedDispatcher"
+ class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher">
+ <order phase="Transport"/>
+ </handler>
+ </phase>
+ <phase name="Security"/>
+ <phase name="PreDispatch"/>
+ <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
+ <handler name="RequestURIBasedDispatcher"
+ class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPActionBasedDispatcher"
+ class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="AddressingBasedDispatcher"
+ class="org.apache.axis2.dispatchers.AddressingBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ <handler name="RequestURIOperationDispatcher"
+ class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPMessageBodyBasedDispatcher"
+ class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="HTTPLocationBasedDispatcher"
+ class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ </phase>
+ <phase name="RMPhase"/>
+ <!-- System pre defined phases -->
+ <!-- After Postdispatch phase module author or or service author can add any phase he want -->
+ <phase name="OperationInPhase"/>
+ </phaseOrder>
+ <phaseOrder type="OutFlow">
+ <!-- user can add his own phases to this area -->
+ <phase name="OperationOutPhase"/>
+ <!--system predefined phase-->
+ <!--these phase will run irrespective of the service-->
+ <phase name="RMPhase"/>
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ <phase name="Security"/>
+ </phaseOrder>
+ <phaseOrder type="InFaultFlow">
+ <phase name="PreDispatch"/>
+ <phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
+ <handler name="RequestURIBasedDispatcher"
+ class="org.apache.axis2.dispatchers.RequestURIBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPActionBasedDispatcher"
+ class="org.apache.axis2.dispatchers.SOAPActionBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="AddressingBasedDispatcher"
+ class="org.apache.axis2.dispatchers.AddressingBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ <handler name="RequestURIOperationDispatcher"
+ class="org.apache.axis2.dispatchers.RequestURIOperationDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="SOAPMessageBodyBasedDispatcher"
+ class="org.apache.axis2.dispatchers.SOAPMessageBodyBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+
+ <handler name="HTTPLocationBasedDispatcher"
+ class="org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher">
+ <order phase="Dispatch"/>
+ </handler>
+ </phase>
+ <phase name="RMPhase"/>
+ <!-- user can add his own phases to this area -->
+ <phase name="OperationInFaultPhase"/>
+ </phaseOrder>
+ <phaseOrder type="OutFaultFlow">
+ <!-- user can add his own phases to this area -->
+ <phase name="OperationOutFaultPhase"/>
+ <phase name="RMPhase"/>
+ <phase name="PolicyDetermination"/>
+ <phase name="MessageOut"/>
+ </phaseOrder>
+</axisconfig>
\ No newline at end of file
Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/framework/JAXWSTest.java Mon Jul 16 16:01:34 2007
@@ -58,6 +58,7 @@
import org.apache.axis2.jaxws.provider.JAXBProviderTests;
import org.apache.axis2.jaxws.provider.SOAPFaultProviderTests;
import org.apache.axis2.jaxws.provider.SoapMessageProviderTests;
+import org.apache.axis2.jaxws.provider.SoapMessageMUProviderTests;
import org.apache.axis2.jaxws.provider.SourceMessageProviderTests;
import org.apache.axis2.jaxws.provider.SourceProviderTests;
import org.apache.axis2.jaxws.provider.StringMessageProviderTests;
@@ -152,6 +153,7 @@
suite.addTestSuite(SourceMessageProviderTests.class);
// TODO FIXME: Test fails
//suite.addTestSuite(SoapMessageProviderTests.class);
+ suite.addTestSuite(SoapMessageMUProviderTests.class);
suite.addTestSuite(JAXBProviderTests.class);
suite.addTestSuite(ProxyTests.class);
//TODO: FIXME - Was working, now doesn't
Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/AttachmentUtil.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/AttachmentUtil.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/AttachmentUtil.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/AttachmentUtil.java Mon Jul 16 16:01:34 2007
@@ -21,11 +21,23 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPConstants;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
/**
* This will serve as a helper class for attachments utility methods. All methods
@@ -33,7 +45,81 @@
*
*/
public class AttachmentUtil {
-
+ public static final String SOAP11_NAMESPACE = "http://schemas.xmlsoap.org/soap/envelope";
+ public static final String SOAP12_NAMESPACE = "http://www.w3.org/2003/05/soap-envelope";
+
+ public static final String MU_TEXT = "soap message mustUnderstand header request";
+ public static final String UNDERSTOOD_MU_TEXT = "understood headers soap message mustUnderstand header request";
+ public static final String TEXT = "soap message request";
+ public static final String VALUE = "value";
+ public static final String VALUE_NODE = "<"+VALUE+">";
+ public static final String VALUE_NODE_SLASH = "</"+VALUE+">";
+ public static final String XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ public static final String MUHEADER_CLIENT = "ns1:muclient";
+ public static final String MUHEADER_SERVER = "ns1:muserver";
+ public static final String MUHEADER_CLIENT_UNDERSTOOD = "ns1:muclientunderstood";
+ public static final String MUHEADER_SERVER_UNDERSTOOD = "ns1:muserverunderstood";
+ public static final String msgEnvMU =
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<soapenv:Header>" +
+ "<"+MUHEADER_CLIENT+" xmlns:ns1=\"http://ws.apache.org/axis2\" soapenv:mustUnderstand=\"1\">MUinfo</"+MUHEADER_CLIENT+">" +
+ "</soapenv:Header>" +
+ "<soapenv:Body>" +
+ "<ns1:invoke xmlns:ns1=\"http://ws.apache.org/axis2\">" +
+ VALUE_NODE +
+ MU_TEXT +
+ VALUE_NODE_SLASH +
+ "</ns1:invoke>" +
+ "</soapenv:Body>" +
+ "</soapenv:Envelope>";
+
+ public static final String msgEnv =
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<soapenv:Body>" +
+ "<ns1:invoke xmlns:ns1=\"http://ws.apache.org/axis2\">" +
+ VALUE_NODE +
+ MU_TEXT +
+ VALUE_NODE_SLASH +
+ "</ns1:invoke>" +
+ "</soapenv:Body>" +
+ "</soapenv:Envelope>";
+
+ public static final String msgEnvPlain =
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<soapenv:Body>" +
+ "<ns1:invoke xmlns:ns1=\"http://ws.apache.org/axis2\">" +
+ VALUE_NODE +
+ TEXT +
+ VALUE_NODE_SLASH +
+ "</ns1:invoke>" +
+ "</soapenv:Body>" +
+ "</soapenv:Envelope>";
+
+ public static final String msgEnvMU_understood =
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<soapenv:Header>" +
+ "<"+MUHEADER_CLIENT_UNDERSTOOD+" xmlns:ns1=\"http://ws.apache.org/axis2\" soapenv:mustUnderstand=\"1\">MUinfo</"+MUHEADER_CLIENT_UNDERSTOOD+">" +
+ "</soapenv:Header>" +
+ "<soapenv:Body>" +
+ "<ns1:invoke xmlns:ns1=\"http://ws.apache.org/axis2\">" +
+ VALUE_NODE +
+ UNDERSTOOD_MU_TEXT +
+ VALUE_NODE_SLASH +
+ "</ns1:invoke>" +
+ "</soapenv:Body>" +
+ "</soapenv:Envelope>";
+
+ public static final String msgEnv_understood =
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<soapenv:Body>" +
+ "<ns1:invoke xmlns:ns1=\"http://ws.apache.org/axis2\">" +
+ VALUE_NODE +
+ UNDERSTOOD_MU_TEXT +
+ VALUE_NODE_SLASH +
+ "</ns1:invoke>" +
+ "</soapenv:Body>" +
+ "</soapenv:Envelope>";
+
/**
* Store a given image to an Image output stream
* @param mimeType
@@ -56,5 +142,81 @@
ios.flush();
imageWriter.dispose();
}
+
+ /**
+ * Adapter method used to convert any type of Source to a String
+ *
+ * @param input
+ * @return
+ */
+ public static String toString(Source input) {
+
+ if (input == null)
+ return null;
+
+ StringWriter writer = new StringWriter();
+ Transformer trasformer;
+ try {
+ trasformer = TransformerFactory.newInstance().newTransformer();
+ Result result = new StreamResult(writer);
+ trasformer.transform(input, result);
+ } catch (Exception e) {
+ return null;
+ }
+
+ return writer.getBuffer().toString();
+ }
+
+ /**
+ * Adapter method used to convert any type of SOAPMessage to a String
+ *
+ * @param input
+ * @return
+ */
+ public static String toString(SOAPMessage input) {
+
+ if (input == null)
+ return null;
+
+ Source result = null;
+ try {
+ result = input.getSOAPPart().getContent();
+ } catch (SOAPException e) {
+ e.printStackTrace();
+ }
+
+ return toString(result);
+ }
+
+ /**
+ * Method used to convert Strings to SOAPMessages
+ *
+ * @param msgString
+ * @return
+ */
+ public static SOAPMessage toSOAPMessage(String msgString) {
+
+ if (msgString == null) return null;
+
+ SOAPMessage message = null;
+ try {
+ MessageFactory factory = null;
+
+ // Force the usage of specific MesasgeFactories
+ if (msgString.indexOf(SOAP11_NAMESPACE) >= 0) {
+ factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
+ } else {
+ factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+ }
+ message = factory.createMessage();
+ message.getSOAPPart().setContent((Source) new StreamSource(new StringReader(msgString)));
+ message.saveChanges();
+ } catch (SOAPException e) {
+ System.out.println("toSOAPMessage Exception encountered: " + e);
+ e.printStackTrace();
+ }
+ return message;
+ }
+
}
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderChecker.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderChecker.java?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderChecker.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderChecker.java Mon Jul 16 16:01:34 2007
@@ -0,0 +1,56 @@
+/*
+ * 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.axis2.jaxws.provider;
+
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.util.SOAPMustUnderstandHeaderChecker;
+
+import javax.xml.namespace.QName;
+
+import java.util.HashMap;
+
+/**
+ * Plugin to remove "understood" headers for the SoapMessageMUProviderTests. This class must
+ * be configured in the axis2.xml file on both the client and the server.
+ */
+public class SoapMessageMUProviderChecker implements SOAPMustUnderstandHeaderChecker {
+ public HashMap removeUnderstoodHeaders(MessageContext msgContext, HashMap headers) {
+ headers = testDriver(headers);
+ return headers;
+ }
+
+ private HashMap testDriver(HashMap notUnderstoodHeaders) {
+ String ns1 = "http://ws.apache.org/axis2";
+ String clientLocalName = "muclientunderstood";
+ String serverLocalName = "muserverunderstood";
+
+ // Remove the two headers the test expects us to understand
+ QName clientQN = new QName(ns1, clientLocalName);
+ QName serverQN = new QName(ns1, serverLocalName);
+
+ if (notUnderstoodHeaders.containsKey(clientQN)) {
+ notUnderstoodHeaders.remove(clientQN);
+ }
+ if (notUnderstoodHeaders.containsKey(serverQN)) {
+ notUnderstoodHeaders.remove(serverQN);
+
+ }
+ return notUnderstoodHeaders;
+ }
+}
\ No newline at end of file
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderTests.java?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderTests.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/SoapMessageMUProviderTests.java Mon Jul 16 16:01:34 2007
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2007 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.provider;
+
+
+import javax.xml.ws.Service;
+import javax.xml.namespace.QName;
+import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.ws.BindingProvider;
+import javax.xml.soap.SOAPMessage;
+import junit.framework.TestCase;
+
+/**
+ * Tests Dispatch<SOAPMessage> client and a Provider<SOAPMessage> service
+ * with mustUnderstand attribute header.
+ */
+public class SoapMessageMUProviderTests extends TestCase {
+ public static final QName serviceName =
+ new QName("http://ws.apache.org/axis2", "SoapMessageMUProviderService");
+ public static final QName portName =
+ new QName("http://ws.apache.org/axis2", "SimpleProviderServiceSOAP11port0");
+ public static final String endpointUrl =
+ "http://localhost:8080/axis2/services/SoapMessageMUProviderService";
+
+ public static final String bindingID = SOAPBinding.SOAP11HTTP_BINDING;
+ public static final Service.Mode mode = Service.Mode.MESSAGE;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public SoapMessageMUProviderTests(String name) {
+ super(name);
+ }
+
+ /**
+ * Test soap message with no MU headers
+ */
+ public void testNoMustUnderstandHeaders() {
+ System.out.println("testNoMustUnderstandHeaders");
+ // create a service
+ Service svc = Service.create(serviceName);
+ svc.addPort(portName, bindingID, endpointUrl);
+
+ javax.xml.ws.Dispatch<SOAPMessage> dispatch = null;
+ dispatch = svc.createDispatch(portName, SOAPMessage.class, mode);
+
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoString");
+
+ SOAPMessage message = AttachmentUtil.toSOAPMessage(AttachmentUtil.msgEnvPlain);
+
+ try {
+ SOAPMessage response = dispatch.invoke(message);
+
+ String string = AttachmentUtil.toString(response);
+ assertTrue(string.equalsIgnoreCase(AttachmentUtil.XML_HEADER
+ + AttachmentUtil.msgEnvPlain));
+ } catch (Exception e) {
+ fail("Unexpected Exception: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Test the mustUnderstand soap header attribute on the client's
+ * outbound soap message for headers that are not understood. Should cause an
+ * exception.
+ */
+ public void testClientRequestNotUnderstoodHeaders() {
+ System.out.println("testClientRequestNotUnderstoodHeaders");
+ // create a service
+ Service svc = Service.create(serviceName);
+ svc.addPort(portName, bindingID, endpointUrl);
+
+ javax.xml.ws.Dispatch<SOAPMessage> dispatch = null;
+ dispatch = svc.createDispatch(portName, SOAPMessage.class, mode);
+
+ //force SOAPAction to match with wsdl action
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoString");
+
+ SOAPMessage message = AttachmentUtil.toSOAPMessage(AttachmentUtil.msgEnvMU);
+
+ try {
+ dispatch.invoke(message);
+ fail("Should have received fault for not understood headers on request");
+ } catch (Exception e) {
+ // Expected path
+ }
+ }
+
+ /**
+ * Test the mustUnderstand soap header attribute on the server's
+ * outbound soap message (i.e. the inbound response to the client) for headers that
+ * are not understood. Should cause an exception.
+ */
+ public void testClientResponseNotUnderstoodHeaders() {
+ System.out.println("testClientResponseNotUnderstoodHeaders");
+ // create a service
+ Service svc = Service.create(serviceName);
+ svc.addPort(portName, bindingID, endpointUrl);
+
+ javax.xml.ws.Dispatch<SOAPMessage> dispatch = null;
+ dispatch = svc.createDispatch(portName, SOAPMessage.class, mode);
+
+ //force SOAPAction to match with wsdl action
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoString");
+
+ SOAPMessage message = AttachmentUtil.toSOAPMessage(AttachmentUtil.msgEnv);
+
+ try {
+ dispatch.invoke(message);
+ fail("Should have received fault for not understood headers on response");
+ } catch (Exception e) {
+ // Expected path
+ }
+ }
+
+ /**
+ * Test the mustUnderstand soap header attribute on the client's
+ * outbound soap message for headers that should be understood. Should not cause an
+ * exception.
+ */
+ public void testClientRequestUnderstoodHeaders() {
+ System.out.println("testClientRequestUnderstoodHeaders");
+ // create a service
+ Service svc = Service.create(serviceName);
+ svc.addPort(portName, bindingID, endpointUrl);
+
+ javax.xml.ws.Dispatch<SOAPMessage> dispatch = null;
+ dispatch = svc.createDispatch(portName, SOAPMessage.class, mode);
+
+ //force SOAPAction to match with wsdl action
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoString");
+
+ SOAPMessage message = AttachmentUtil.toSOAPMessage(AttachmentUtil.msgEnvMU_understood);
+
+ try {
+ dispatch.invoke(message);
+ } catch (Exception e) {
+ fail("Should not have received fault for headers that were understood. " + e.getMessage());
+ }
+ }
+
+ /**
+ * Test the mustUnderstand soap header attribute on the server's
+ * outbound soap message (i.e. the inbound response to the client) for headers that
+ * are understood. Should not cause an exception.
+ */
+ public void testClientResponseUnderstoodHeaders() {
+ System.out.println("testClientResponseUnderstoodHeaders");
+ // create a service
+ Service svc = Service.create(serviceName);
+ svc.addPort(portName, bindingID, endpointUrl);
+
+ javax.xml.ws.Dispatch<SOAPMessage> dispatch = null;
+ dispatch = svc.createDispatch(portName, SOAPMessage.class, mode);
+
+ //force SOAPAction to match with wsdl action
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_USE_PROPERTY, true);
+ ((BindingProvider) dispatch).getRequestContext()
+ .put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoString");
+
+ SOAPMessage message = AttachmentUtil.toSOAPMessage(AttachmentUtil.msgEnv_understood);
+
+ try {
+ dispatch.invoke(message);
+ } catch (Exception e) {
+ fail("Should not have received fault for headers that were understood. " + e.getMessage());
+ }
+ }
+}
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/MANIFEST.MF?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/MANIFEST.MF (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/MANIFEST.MF Mon Jul 16 16:01:34 2007
@@ -0,0 +1 @@
+Manifest-Version: 1.0
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/ProviderSOAPMessage.wsdl
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/ProviderSOAPMessage.wsdl?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/ProviderSOAPMessage.wsdl (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/ProviderSOAPMessage.wsdl Mon Jul 16 16:01:34 2007
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+-->
+
+<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:s="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://ws.apache.org/axis2"
+ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
+ xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
+ targetNamespace="http://ws.apache.org/axis2"
+ xmlns="http://schemas.xmlsoap.org/wsdl/">
+ <types>
+ <xsd:schema
+ targetNamespace="http://ws.apache.org/axis2"
+ xmlns:tns="http://ws.apache.org/axis2"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:complexType name="StringArray">
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string"
+ minOccurs="0" maxOccurs="unbounded" />
+
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="inMessage" type="tns:StringArray" />
+ <xsd:element name="outMessage" type="tns:StringArray" />
+ <xsd:element name="twoWayExceptionFault" type="xsd:string" />
+ </xsd:schema>
+
+
+ </types>
+
+ <message name="emptyMessage"/>
+ <message name="inMessage">
+ <part name="parameters" element="tns:inMessage" />
+ </message>
+ <message name="outMessage">
+ <part name="parameters" element="tns:outMessage" />
+ </message>
+
+ <portType name="EchoServiceInterface">
+ <operation name="invoke">
+ <input message="tns:inMessage" />
+ <output message="tns:outMessage" />
+ </operation>
+ </portType>
+
+ <binding name="EchoServiceSoap" type="tns:EchoServiceInterface">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
+ <operation name="invoke">
+ <soap:operation soapAction="echoString" style="document" />
+ <input>
+ <soap:body use="literal" />
+ </input>
+ <output>
+ <soap:body use="literal" />
+ </output>
+ </operation>
+ </binding>
+
+ <service name="SoapMessageMUProviderService">
+ <port name="SimpleProviderServiceSOAP11port0" binding="tns:EchoServiceSoap">
+ <soap:address location="http://localhost:8080/axis2/services/SoapMessageMUProviderService" />
+ </port>
+ </service>
+
+</definitions>
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/services.xml
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/services.xml?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/services.xml (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/META-INF/services.xml Mon Jul 16 16:01:34 2007
@@ -0,0 +1,15 @@
+<serviceGroup>
+ <service name="SoapMessageMUProviderService">
+ <messageReceivers>
+ <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.jaxws.server.JAXWSMessageReceiver"/>
+ </messageReceivers>
+ <parameter locked="false" name="ServiceClass">org.apache.axis2.jaxws.provider.soapmsgmu.SoapMessageMUProvider</parameter>
+ <excludeOperations>
+ <operation>invoke</operation>
+ </excludeOperations>
+ <operation name="invoke" mep="http://www.w3.org/2004/08/wsdl/in-out">
+ <actionMapping/>
+ </operation>
+ </service>
+</serviceGroup>
+
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/SoapMessageMUProvider.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/SoapMessageMUProvider.java?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/SoapMessageMUProvider.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/provider/soapmsgmu/SoapMessageMUProvider.java Mon Jul 16 16:01:34 2007
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * Copyright 2007 International Business Machines Corp.
+ *
+ * Licensed 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.axis2.jaxws.provider.soapmsgmu;
+
+import javax.xml.ws.Provider;
+import javax.xml.ws.ServiceMode;
+import javax.xml.ws.Service;
+import javax.xml.ws.WebServiceProvider;
+import javax.xml.ws.BindingType;
+import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.soap.SOAPMessage;
+
+import org.apache.axis2.jaxws.provider.AttachmentUtil;
+
+/**
+ * This class provides the server side implementation for JAX-WS Provider<MESSAGE>
+ * for SOAP11 Binding with Mode = MESSAGE.
+ *
+ * The receiving message and the sending back message
+ * must have the headers defined in wsdl.
+ */
+
+@WebServiceProvider()
+@ServiceMode(value = Service.Mode.MESSAGE)
+@BindingType(SOAPBinding.SOAP11HTTP_BINDING)
+public class SoapMessageMUProvider implements Provider<SOAPMessage> {
+ /**
+ * This service receives soap message and return it back to client as is
+ * or add a soap mustUnderstand attribute header and then return it back to client
+ *
+ * @param SOAPMessage object sent by the client
+ * @return the SOAPMessage
+ */
+ public SOAPMessage invoke(SOAPMessage request) {
+ System.out.println("----------------------------------------------");
+ System.out.println("SoapMessageMUProvider:Invoke: Request received");
+ SOAPMessage response = null;
+
+ try {
+ String string = AttachmentUtil.toString(request);
+ if (string != null) {
+ System.out.println("invoke: ---Received message= " + string);
+ if (string.contains(new StringBuffer(AttachmentUtil.UNDERSTOOD_MU_TEXT))) {
+ String responseStr =
+ AttachmentUtil.msgEnvMU_understood.replaceAll(AttachmentUtil.MUHEADER_CLIENT_UNDERSTOOD,
+ AttachmentUtil.MUHEADER_SERVER_UNDERSTOOD);
+ response = AttachmentUtil.toSOAPMessage(responseStr);
+ System.out.println("invoke: ---Response message= "
+ + AttachmentUtil.toString(response));
+ } else if (string.contains(new StringBuffer(AttachmentUtil.MU_TEXT))) {
+ String responseStr =
+ AttachmentUtil.msgEnvMU.replaceAll(AttachmentUtil.MUHEADER_CLIENT,
+ AttachmentUtil.MUHEADER_SERVER);
+ response = AttachmentUtil.toSOAPMessage(responseStr);
+ System.out.println("invoke: ---Response message= "
+ + AttachmentUtil.toString(response));
+ } else {
+ response = request;
+ }
+ } else {
+ String badResult = "***ERROR at Service Endpoint: Received message is NULL.";
+ throw new NullPointerException(badResult);
+ }
+ } catch (Exception e) {
+ System.out.println("SoapMessageMUProviderService: Failed with exception.");
+ e.printStackTrace();
+ }
+ return response;
+ }
+}
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/AxisConfigBuilder.java Mon Jul 16 16:01:34 2007
@@ -48,6 +48,7 @@
import org.apache.axis2.transport.TransportListener;
import org.apache.axis2.transport.TransportSender;
import org.apache.axis2.util.Loader;
+import org.apache.axis2.util.SOAPMustUnderstandHeaderChecker;
import org.apache.axis2.util.TargetResolver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -122,6 +123,12 @@
config_element.getFirstChildWithName(new QName(TAG_TARGET_RESOLVERS));
processTargetResolvers(axisConfig, targetResolvers);
+ // Process SOAPMustUnderstandHeaderCheckers
+ OMElement headerCheckers =
+ config_element.getFirstChildWithName(new QName(TAG_MUSTUNDERSTAND_CHECKERS));
+ processMustUnderstandCheckers(axisConfig, headerCheckers);
+
+
// Process Observers
Iterator obs_ittr = config_element.getChildrenWithName(new QName(TAG_LISTENER));
@@ -239,6 +246,30 @@
if (log.isTraceEnabled()) {
log.trace(
"processTargetResolvers: Exception thrown initialising TargetResolver: " +
+ e.getMessage());
+ }
+ }
+ }
+ }
+ }
+
+ private void processMustUnderstandCheckers(AxisConfiguration axisConfig, OMElement headerCheckers) {
+ if (headerCheckers != null) {
+ Iterator iterator = headerCheckers.getChildrenWithName(new QName(TAG_MUSTUNDERSTAND_CHECKER));
+ while (iterator.hasNext()) {
+ OMElement headerChecker = (OMElement) iterator.next();
+ OMAttribute classNameAttribute =
+ headerChecker.getAttribute(new QName(TAG_CLASS_NAME));
+ String className = classNameAttribute.getAttributeValue();
+ try {
+ Class classInstance = Loader.loadClass(className);
+ SOAPMustUnderstandHeaderChecker checkerClass =
+ (SOAPMustUnderstandHeaderChecker) classInstance.newInstance();
+ axisConfig.addMustUnderstandHeaderChecker(checkerClass);
+ } catch (Exception e) {
+ if (log.isTraceEnabled()) {
+ log.trace(
+ "processHeaderCheckers: Exception thrown initialising SOAPMustUnderstandHeaderChecker: " +
e.getMessage());
}
}
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentConstants.java Mon Jul 16 16:01:34 2007
@@ -51,6 +51,8 @@
String TAG_TYPE = "type";
String TAG_TARGET_RESOLVERS = "targetResolvers";
String TAG_TARGET_RESOLVER = "targetResolver";
+ String TAG_MUSTUNDERSTAND_CHECKERS = "soapMustUnderstandCheckers";
+ String TAG_MUSTUNDERSTAND_CHECKER = "soapMustUnderstandChecker";
String TAG_TRANSPORT_SENDER = "transportSender";
String TAG_TRANSPORT_RECEIVER = "transportReceiver";
String TAG_SERVICE_GROUP = "serviceGroup";
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/axis2_default.xml
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/axis2_default.xml?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/axis2_default.xml (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/axis2_default.xml Mon Jul 16 16:01:34 2007
@@ -124,6 +124,17 @@
<!--<targetResolver class="" />-->
<!--</targetResolvers>-->
+ <!-- ================================================= -->
+ <!-- SOAP Must Understand Header Checkers -->
+ <!-- ================================================= -->
+ <!-- Uncomment the following and specify the class name for your SOAPMustUnderstandHeaderChecker -->
+ <!-- implementation to add a header checker. Header checkers are used to identify SOAP Header -->
+ <!-- QNames that will be processed by components (such as a MessageReceiver) after the point -->
+ <!-- the Axis2 engine checks that all mustUnderstand headers are understood. -->
+ <!-- <soapMustUnderstandCheckers> -->
+ <!-- <soapMustUnderstandChecker class="" /> -->
+ <!-- </soapMustUnderstandCheckers> -->
+
<!-- ================================================= -->
<!-- Transport Ins -->
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisConfiguration.java Mon Jul 16 16:01:34 2007
@@ -33,6 +33,7 @@
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.phaseresolver.PhaseResolver;
import org.apache.axis2.transport.MessageFormatter;
+import org.apache.axis2.util.SOAPMustUnderstandHeaderChecker;
import org.apache.axis2.util.TargetResolver;
import org.apache.axis2.util.Utils;
import org.apache.commons.logging.Log;
@@ -124,6 +125,8 @@
private boolean start;
private ArrayList targetResolvers;
+
+ private ArrayList mustUnderstandHeaderCheckers;
private ClusterManager clusterManager;
@@ -156,6 +159,7 @@
this.phasesinfo = new PhasesInfo();
targetResolvers = new ArrayList();
+ mustUnderstandHeaderCheckers = new ArrayList();
}
public void addMessageReceiver(String mepURL,
@@ -1011,6 +1015,29 @@
public void addTargetResolver(TargetResolver tr) {
targetResolvers.add(tr);
}
+
+ /**
+ * Return an iterator over implentations of SOAPMustUnderstandHeaderChecker. These
+ * implentations are called during mustUnderstand validation with a HashMap of headers
+ * for the actor/role the engine is currently acting in. They can remove headers they
+ * understand from the map so those headers, if marked mustUnderstand and not yet processed,
+ * do not cause a mustUnderstand fault to be thrown.
+ *
+ * @return an iterator over SOAPMustUnderstandHeaderChecker implementations. It may be
+ * empty if none are configured.
+ */
+ public Iterator getMustUnderstandHeaderCheckers() {
+ return mustUnderstandHeaderCheckers.iterator();
+ }
+
+ /**
+ * Add an implementation of SOAPMustUnderstandHeaderChecker to the list of checkers.
+ *
+ * @param checker The implementation to be added.
+ */
+ public void addMustUnderstandHeaderChecker(SOAPMustUnderstandHeaderChecker checker) {
+ mustUnderstandHeaderCheckers.add(checker);
+ }
public void addLocalPolicyAssertion(QName name) {
this.localPolicyAssertions.add(name);
@@ -1096,3 +1123,4 @@
}
}
}
+
Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java?view=diff&rev=556761&r1=556760&r2=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/engine/AxisEngine.java Mon Jul 16 16:01:34 2007
@@ -36,11 +36,13 @@
import org.apache.axis2.util.CallbackReceiver;
import org.apache.axis2.util.LoggingControl;
import org.apache.axis2.util.MessageContextBuilder;
+import org.apache.axis2.util.SOAPMustUnderstandHeaderChecker;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.namespace.QName;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
/**
@@ -63,7 +65,10 @@
public AxisEngine(ConfigurationContext engineContext) {
}
- private static void checkMustUnderstand(MessageContext msgContext) throws AxisFault {
+ public static void checkMustUnderstand(MessageContext msgContext) throws AxisFault {
+ if (msgContext == null) {
+ return;
+ }
SOAPEnvelope envelope = msgContext.getEnvelope();
if (envelope.getHeader() == null) {
return;
@@ -72,9 +77,12 @@
// Get all the headers targeted to us
Iterator headerBlocks = envelope.getHeader().getHeadersToProcess(null);
- while (headerBlocks.hasNext()) {
- SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) headerBlocks.next();
-
+ // Have the mustUnderstand Header checkers remove any headers from the list they understand
+ Iterator notUnderstoodHeaders = removeUnderstoodHeaders(msgContext, headerBlocks);
+
+ while (notUnderstoodHeaders.hasNext()) {
+ SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) notUnderstoodHeaders.next();
+
// if this header block has been processed or mustUnderstand isn't
// turned on then its cool
if (headerBlock.isProcessed() || !headerBlock.getMustUnderstand()) {
@@ -89,6 +97,51 @@
}
}
+ private static Iterator removeUnderstoodHeaders(MessageContext msgContext, Iterator headerBlocks) {
+ Iterator mustUnderstandCheckers = msgContext.getConfigurationContext()
+ .getAxisConfiguration().getMustUnderstandHeaderCheckers();
+ Iterator notUnderstoodHeaders = null;
+
+ if (mustUnderstandCheckers != null && mustUnderstandCheckers.hasNext()) {
+ // Create a map of the headers that need to be understood keyed by the header QName
+ // to make it easy for the checkers to find the headers they understand, then let
+ // each of the checkers remove any headers from the map that they will understand.
+ // REVIEW: Can there be duplicate SOAP header QNames? If so, the vaules of the map
+ // need to be a linked list or the collection needs to support duplicate keys.
+ HashMap notYetUnderstoodHeaders = new HashMap();
+ while (headerBlocks.hasNext()) {
+ SOAPHeaderBlock headerBlock = (SOAPHeaderBlock) headerBlocks.next();
+ notYetUnderstoodHeaders.put(headerBlock.getQName(), headerBlock);
+ }
+
+ while (mustUnderstandCheckers.hasNext()) {
+ SOAPMustUnderstandHeaderChecker checker =
+ (SOAPMustUnderstandHeaderChecker) mustUnderstandCheckers.next();
+ if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) {
+ log.debug("Before calling mustUnderstandChecker "
+ + checker
+ + " list of not-yet-understood headers is: "
+ + notYetUnderstoodHeaders);
+ }
+
+ notYetUnderstoodHeaders =
+ checker.removeUnderstoodHeaders(msgContext, notYetUnderstoodHeaders);
+
+ if (LoggingControl.debugLoggingAllowed && log.isDebugEnabled()) {
+ log.debug("After calling mustUnderstandChecker "
+ + checker
+ + " list of not-yet-understood headers is: "
+ + notYetUnderstoodHeaders);
+ }
+ }
+ notUnderstoodHeaders = notYetUnderstoodHeaders.values().iterator();
+ } else {
+ // There are no validators, so just return the Iterator paramster unchanged
+ notUnderstoodHeaders = headerBlocks;
+ }
+ return notUnderstoodHeaders;
+ }
+
/**
* This method is called to handle any error that occurs at inflow or outflow. But if the
* method is called twice, it implies that sending the error handling has failed, in which case
@@ -132,9 +185,9 @@
InvocationResponse pi = invoke(msgContext, NOT_RESUMING_EXECUTION);
if (pi.equals(InvocationResponse.CONTINUE)) {
+ checkMustUnderstand(msgContext);
if (msgContext.isServerSide()) {
// invoke the Message Receivers
- checkMustUnderstand(msgContext);
MessageReceiver receiver = msgContext.getAxisOperation().getMessageReceiver();
if (receiver == null) {
@@ -277,9 +330,9 @@
//invoking the MR
if (pi.equals(InvocationResponse.CONTINUE)) {
+ checkMustUnderstand(msgContext);
if (msgContext.isServerSide()) {
// invoke the Message Receivers
- checkMustUnderstand(msgContext);
MessageReceiver receiver = msgContext.getAxisOperation().getMessageReceiver();
if (receiver == null) {
throw new AxisFault(Messages.getMessage(
Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/SOAPMustUnderstandHeaderChecker.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/SOAPMustUnderstandHeaderChecker.java?view=auto&rev=556761
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/SOAPMustUnderstandHeaderChecker.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/util/SOAPMustUnderstandHeaderChecker.java Mon Jul 16 16:01:34 2007
@@ -0,0 +1,58 @@
+/*
+ * 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.axis2.util;
+
+import org.apache.axis2.context.MessageContext;
+
+import java.util.HashMap;
+
+/**
+ * Interface to allow participation in the engine's validation of SOAP headers marked as
+ * mustUnderstand. This allows components such as MessageReceivers to indicate that they WILL
+ * process specific headers later, even though those headers have not yet been marked as
+ * processed.
+ *
+ * Implementations of this interface are specified in the axis2.xml configuration
+ * file using the following elements:
+ * <soapMustUnderstandCheckers>
+ * <soapMustUnderstandChecker class="class" />
+ * </soapMustUnderstandCheckers>
+ *
+ * Implementations are called during the engine's mustUnderstand validation with a collection of
+ * headers that are not yet understood. Note that only headers for the roles/actors in which this
+ * engine is acting will be in the collection. The implementation should remove any headers
+ * which it understands. Note that headers which have already been processed will be include in
+ * the collection, but do not need to be removed (although they can be; it doesn't matter either
+ * way). The checker returns the collection with the headers it understands removed. That
+ * collection is passed to the next checker.
+ *
+ * After all the checkers have been called by the engine, it will examine the collection for any
+ * headers that are marked mustUndertand which are not marked as processed. If any exist, it will
+ * throw a SOAP mustUnderstand fault.
+ */
+public interface SOAPMustUnderstandHeaderChecker {
+ /**
+ * Remove any headers which this checkers understands from the collection.
+ *
+ * @param msgContext The Message Context for the current message
+ * @param headers A collection of headers for this actor/role
+ * @return The collection with any headers understood by this checker removed.
+ */
+ HashMap removeUnderstoodHeaders(MessageContext msgContext, HashMap headers);
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org