Author: azeez
Date: Wed Jan 5 09:43:02 2011
New Revision: 1055381
URL: http://svn.apache.org/viewvc?rev=1055381&view=rev
Log:
Applying patch provided by Antonio Andrade for AXIS2-4090 -
https://issues.apache.org/jira/browse/AXIS2-4090
Added:
axis/axis2/java/core/trunk/modules/kernel/test-resources/wsdl/meps-wsdl11.wsdl
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/MessageExchangePatternsTest.java
Modified:
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java
Modified:
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java?rev=1055381&r1=1055380&r2=1055381&view=diff
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java
(original)
+++
axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/description/WSDL11ToAxisServiceBuilder.java
Wed Jan 5 09:43:02 2011
@@ -1490,7 +1490,7 @@ public class WSDL11ToAxisServiceBuilder
if (null != message) {
outMessage.setName(message.getQName().getLocalPart());
-
copyExtensionAttributes(wsdl4jInputMessage.getExtensionAttributes(),
+
copyExtensionAttributes(wsdl4jOutputMessage.getExtensionAttributes(),
outMessage,
PORT_TYPE_OPERATION_INPUT);
// wsdl:portType -> wsdl:operation -> wsdl:output
Added:
axis/axis2/java/core/trunk/modules/kernel/test-resources/wsdl/meps-wsdl11.wsdl
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/test-resources/wsdl/meps-wsdl11.wsdl?rev=1055381&view=auto
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/test-resources/wsdl/meps-wsdl11.wsdl
(added)
+++
axis/axis2/java/core/trunk/modules/kernel/test-resources/wsdl/meps-wsdl11.wsdl
Wed Jan 5 09:43:02 2011
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wsdl:definitions targetNamespace="http://www.example.org"
+ xmlns:tns="http://www.example.org"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
+
+ <wsdl:documentation>
+ Message Exchange Patterns
+ </wsdl:documentation>
+
+ <wsdl:types>
+ <xsd:schema elementFormDefault="qualified"
+ targetNamespace="http://www.example.org">
+ <xsd:element name="generic-element-in" type="xsd:string"/>
+ <xsd:element name="generic-element-out" type="xsd:string"/>
+ </xsd:schema>
+ </wsdl:types>
+
+ <wsdl:message name="generic-message-in">
+ <wsdl:part name="input" element="tns:generic-element-in" />
+ </wsdl:message>
+
+ <wsdl:message name="generic-message-out">
+ <wsdl:part name="output" element="tns:generic-element-out" />
+ </wsdl:message>
+
+ <wsdl:portType name="message-exchange-patterns">
+ <wsdl:operation name="in-only">
+ <wsdl:input message="tns:generic-message-in" />
+ </wsdl:operation>
+ <wsdl:operation name="robust-in-only">
+ <wsdl:input message="tns:generic-message-in" />
+ <wsdl:fault message="tns:generic-message-out" name="fault" />
+ </wsdl:operation>
+ <wsdl:operation name="in-out">
+ <wsdl:input message="tns:generic-message-in" />
+ <wsdl:output message="tns:generic-message-out" />
+ <wsdl:fault message="tns:generic-message-out" name="fault" />
+ </wsdl:operation>
+ <wsdl:operation name="out-only">
+ <wsdl:output message="tns:generic-message-out" />
+ </wsdl:operation>
+ <wsdl:operation name="robust-out-only">
+ <wsdl:output message="tns:generic-message-out" />
+ <wsdl:fault message="tns:generic-message-in" name="fault" />
+ </wsdl:operation>
+ <wsdl:operation name="out-in">
+ <wsdl:output message="tns:generic-message-out" />
+ <wsdl:input message="tns:generic-message-in" />
+ <wsdl:fault message="tns:generic-message-in" name="fault" />
+ </wsdl:operation>
+ </wsdl:portType>
+
+ <wsdl:binding name="mep-soap11"
+ type="tns:message-exchange-patterns">
+ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="in-only">
+ <soap:operation soapAction="http://www.example.org/in-only"
+ style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ </wsdl:operation>
+ <wsdl:operation name="robust-in-only">
+ <soap:operation soapAction="http://www.example.org/robust-in-only"
+ style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:fault name="fault">
+ <soap:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="in-out">
+ <soap:operation soapAction="http://www.example.org/in-out"
+ style="document" />
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="out-only">
+ <soap:operation soapAction="http://www.example.org/out-only"
+ style="document" />
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="robust-out-only">
+ <soap:operation soapAction="http://www.example.org/robust-out-only"
+ style="document" />
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="out-in">
+ <soap:operation soapAction="http://www.example.org/out-in"
+ style="document" />
+ <wsdl:output>
+ <soap:body use="literal" />
+ </wsdl:output>
+ <wsdl:input>
+ <soap:body use="literal" />
+ </wsdl:input>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ </wsdl:binding>
+
+ <wsdl:binding name="mep-soap12"
+ type="tns:message-exchange-patterns">
+ <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
+ <wsdl:operation name="in-only">
+ <soap12:operation soapAction="http://www.example.org/in-only"
+ style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ </wsdl:operation>
+ <wsdl:operation name="robust-in-only">
+ <soap12:operation soapAction="http://www.example.org/robust-in-only"
+ style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="in-out">
+ <soap12:operation soapAction="http://www.example.org/in-out"
+ style="document" />
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="out-only">
+ <soap12:operation soapAction="http://www.example.org/out-only"
+ style="document" />
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="robust-out-only">
+ <soap12:operation soapAction="http://www.example.org/robust-out-only"
+ style="document" />
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ <wsdl:operation name="out-in">
+ <soap12:operation soapAction="http://www.example.org/out-in"
+ style="document" />
+ <wsdl:output>
+ <soap12:body use="literal" />
+ </wsdl:output>
+ <wsdl:input>
+ <soap12:body use="literal" />
+ </wsdl:input>
+ <wsdl:fault name="fault">
+ <soap12:fault name="fault" use="literal" />
+ </wsdl:fault>
+ </wsdl:operation>
+ </wsdl:binding>
+
+ <wsdl:service name="message-exchange-patterns">
+ <wsdl:documentation>
+ Message Exchange Patterns
+ </wsdl:documentation>
+ <wsdl:port name="soap11" binding="tns:mep-soap11">
+ <soap:address location="http://www.example.org" />
+ </wsdl:port>
+ <wsdl:port name="soap12" binding="tns:mep-soap12">
+ <soap12:address location="http://www.example.org" />
+ </wsdl:port>
+ </wsdl:service>
+
+</wsdl:definitions>
Added:
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/MessageExchangePatternsTest.java
URL:
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/MessageExchangePatternsTest.java?rev=1055381&view=auto
==============================================================================
---
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/MessageExchangePatternsTest.java
(added)
+++
axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/description/MessageExchangePatternsTest.java
Wed Jan 5 09:43:02 2011
@@ -0,0 +1,282 @@
+package org.apache.axis2.description;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.Assert;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.axis2.AbstractTestCase;
+import org.apache.axis2.wsdl.WSDLConstants;
+
+/**
+ * This is a data-driven test class that verifies that
+ * <code>AxisBindingOperation</code>s, <code>AxisOpertion</code>s and
+ * <code>AxisMessage</code>s objects are consistently built when the
+ * <code>WSDLToAxisServiceBuilder.isServerSide</code> attribute is set both to
+ * <code>true</code> and <code>false</code> and the <code>AxisService</code> is
+ * populated. <p/> There are assertions that verify that operations' MEPs,
+ * message labels, message directions AND schema elements tight to the specific
+ * <code>AxisMessage</code>s are correctly populated.
+ */
+public class MessageExchangePatternsTest extends AbstractTestCase
+ implements WSDL2Constants {
+
+ protected static final String WSDL_PATH = "wsdl/meps-wsdl11.wsdl";
+
+ // Convenient access to reversed mappings
+ private static final Map REVERSED_MEP;
+ private static final Map REVERSED_DIRECTION;
+ private static final Map REVERSED_MESSAGE_LABEL;
+ private static final Map MESSAGE_LABEL_TO_DIRECTION;
+
+ static {
+ REVERSED_MEP = new HashMap();
+ REVERSED_MEP.put(MEP_URI_OUT_IN, MEP_URI_IN_OUT);
+ REVERSED_MEP.put(MEP_URI_OUT_ONLY, MEP_URI_IN_ONLY);
+ REVERSED_MEP.put(MEP_URI_IN_OUT, MEP_URI_OUT_IN);
+ // Axis2 maps the "robust-out-only" operation type as "out-only"
+ REVERSED_MEP.put(MEP_URI_ROBUST_IN_ONLY, MEP_URI_OUT_ONLY);
+ REVERSED_MEP.put(MEP_URI_IN_ONLY, MEP_URI_OUT_ONLY);
+
+ REVERSED_DIRECTION = new HashMap();
+ REVERSED_DIRECTION.put(WSDLConstants.WSDL_MESSAGE_DIRECTION_IN,
+ WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+ REVERSED_DIRECTION.put(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT,
+ WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
+
+ REVERSED_MESSAGE_LABEL = new HashMap();
+ REVERSED_MESSAGE_LABEL.put(MESSAGE_LABEL_IN, MESSAGE_LABEL_OUT);
+ REVERSED_MESSAGE_LABEL.put(MESSAGE_LABEL_OUT, MESSAGE_LABEL_IN);
+
+ MESSAGE_LABEL_TO_DIRECTION = new HashMap();
+ MESSAGE_LABEL_TO_DIRECTION.put(MESSAGE_LABEL_IN,
+ WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
+ MESSAGE_LABEL_TO_DIRECTION.put(MESSAGE_LABEL_OUT,
+ WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
+ }
+
+ protected static String getMEP(String serverSideMEP, boolean isServerSide)
{
+ return isServerSide ? serverSideMEP :
(String)REVERSED_MEP.get(serverSideMEP);
+ }
+
+ protected static String getMessageDirection(String
serverSideMessageDirection, boolean isServerSide) {
+ return isServerSide ? serverSideMessageDirection :
+ (String)REVERSED_DIRECTION.get(serverSideMessageDirection);
+ }
+
+ protected static String getMessageLabel(String serverSideMessageLabel,
boolean isServerSide) {
+ return isServerSide ? serverSideMessageLabel :
+ (String)REVERSED_MESSAGE_LABEL.get(serverSideMessageLabel);
+ }
+
+ protected static String getDirectionFromMessageLabel(String
serverSideMessageLabel, boolean isServerSide) {
+ String serverSideMessageDirection =
(String)MESSAGE_LABEL_TO_DIRECTION.get(serverSideMessageLabel);
+ return getMessageDirection(serverSideMessageDirection, isServerSide);
+ }
+
+ private AxisBindingOperation bindingOperation;
+ private TestConfig testConfig;
+
+ public MessageExchangePatternsTest(String testName_) {
+ super(testName_);
+ }
+
+ public static Test suite() {
+
+ TestConfig[] testConfigs = buildTestConfigs(WSDL_PATH);
+
+ String className = MessageExchangePatternsTest.class.getName();
+ TestSuite suite = new TestSuite(className);
+ for (int i = 0, n = testConfigs.length; i < n; i++) {
+ /* Have JUnit create a TestCase instance for every test method of
+ this class. */
+ TestSuite testCases = new TestSuite(
+ MessageExchangePatternsTest.class, testConfigs[i].toString());
+
+ /* Loop through the TestCase instances and inject them with the
test
+ data. */
+ Enumeration tests = testCases.tests();
+ while (tests.hasMoreElements()) {
+ MessageExchangePatternsTest test =
+ (MessageExchangePatternsTest)tests.nextElement();
+ test.setTestConfig(testConfigs[i]);
+ }
+
+ suite.addTest(testCases);
+ }
+ return suite;
+ }
+
+ protected static TestConfig[] buildTestConfigs(String wsdlPath) {
+ // Populate WSDL information
+ final String targetNamespace = "http://www.example.org";
+ final QName serviceName = new QName(targetNamespace,
"message-exchange-patterns");
+ final Map operationNamesToServerSideMEP = new HashMap();
+ operationNamesToServerSideMEP.put("out-in", MEP_URI_OUT_IN);
+ operationNamesToServerSideMEP.put("out-only", MEP_URI_OUT_ONLY);
+ operationNamesToServerSideMEP.put("in-out", MEP_URI_IN_OUT);
+ operationNamesToServerSideMEP.put("robust-in-only",
MEP_URI_ROBUST_IN_ONLY);
+ // Axis2 maps the "robust-out-only" operation type as "out-only"
+ operationNamesToServerSideMEP.put("robust-out-only", MEP_URI_OUT_ONLY);
+ operationNamesToServerSideMEP.put("in-only", MEP_URI_IN_ONLY);
+ final String[] portNames = {"soap11", "soap12"};
+ final boolean isServerSide[] = {true, false};
+ final QName inputSchemaElementName = new QName(targetNamespace,
"generic-element-in");
+ final QName outputSchemaElementName = new QName(targetNamespace,
"generic-element-out");
+
+ /* Create TestConfig objects using combinations between port types (2),
+ operations (5) and the isServerSide flag */
+ List testConfigs = new ArrayList();
+ Iterator mepsIt = operationNamesToServerSideMEP.entrySet().iterator();
+ while (mepsIt.hasNext()) {
+ Map.Entry operationNameToMEP = (Map.Entry)mepsIt.next();
+ QName operationName = new QName(targetNamespace,
(String)operationNameToMEP.getKey());
+ String serverSideMEP = (String)operationNameToMEP.getValue();
+ for (int i = 0; i < portNames.length; i++) {
+ OperationReference operationReference = new OperationReference(
+ wsdlPath, serviceName, portNames[i], operationName);
+ for (int j = 0; j < isServerSide.length; j++) {
+ String expectedMEP = getMEP(serverSideMEP,
isServerSide[j]);
+ testConfigs.add(new TestConfig(
+ operationReference, isServerSide[j], expectedMEP,
+ inputSchemaElementName, outputSchemaElementName
+ ));
+ }
+ }
+ }
+ return (TestConfig[])testConfigs.toArray(new
TestConfig[testConfigs.size()]);
+ }
+
+ public String getName() {
+ TestConfig testConfig = getTestConfig();
+ return super.getName() + ". Expected MEP: " +
+ testConfig.getExpectedMep() + " ; isServerSide: " +
+ testConfig.isServerSide();
+ }
+
+ public void setUp() throws Exception {
+ TestConfig testConfig = getTestConfig();
+ OperationReference operationReference =
testConfig.getOperationReference();
+ InputStream contentTypeWsdlIn =
getTestResource(operationReference.getWsdlPath());
+ // Populate AxisService (WSDL port)
+ WSDL11ToAxisServiceBuilder wsdl11Builder = new
WSDL11ToAxisServiceBuilder(
+ contentTypeWsdlIn, operationReference.getServiceName(),
+ operationReference.getPortName());
+ wsdl11Builder.setServerSide(testConfig.isServerSide());
+ AxisService service = wsdl11Builder.populateService();
+
+ // Get Binding Operation
+ AxisEndpoint endpoint =
service.getEndpoint(operationReference.getPortName());
+ AxisBinding binding = endpoint.getBinding();
+ bindingOperation = (AxisBindingOperation)binding.getChild(
+ operationReference.getOperationName());
+ }
+
+ public void testMessageExchangePattern() {
+ TestConfig testConfig = getTestConfig();
+ AxisOperation axisOperation = bindingOperation.getAxisOperation();
+ Assert.assertEquals("The Message Exchange Pattern is not the
expected",
+ testConfig.getExpectedMep(),
axisOperation.getMessageExchangePattern());
+ }
+
+ public void testInputMessageDirection() {
+ doTestMessageDirection(MESSAGE_LABEL_IN,
+ getTestConfig().getExpectedInputSchemaElementName());
+ }
+
+ public void testOutputMessageDirection() {
+ doTestMessageDirection(MESSAGE_LABEL_OUT,
+ getTestConfig().getExpectedOutputSchemaElementName());
+ }
+
+ protected void doTestMessageDirection(String serverSideMessageLabel,
+ QName expectedSchemaElementName) {
+ TestConfig testConfig = getTestConfig();
+ AxisOperation axisOperation = bindingOperation.getAxisOperation();
+
+ String messageLabel = getMessageLabel(serverSideMessageLabel,
+ testConfig.isServerSide());
+ String expectedDirection =
getDirectionFromMessageLabel(serverSideMessageLabel,
+ testConfig.isServerSide());
+
+ try {
+ AxisMessage axisMessage =
(AxisMessage)axisOperation.getMessage(messageLabel);
+
+ Assert.assertEquals("The Message Direction is not the expected",
+ expectedDirection, axisMessage.getDirection());
+
+ Assert.assertEquals("The Schema Element Name is not the expected",
+ expectedSchemaElementName,
+ axisMessage.getElementQName());
+
+ } catch (UnsupportedOperationException e) {
+ // OK, AxisOperation have no message within messageLabel
+ }
+ }
+
+ protected TestConfig getTestConfig() {
+ return testConfig;
+ }
+
+ protected void setTestConfig(TestConfig testConfig_) {
+ testConfig = testConfig_;
+ }
+
+ protected static class TestConfig {
+
+ private final OperationReference operationReference;
+ private final boolean isServerSide;
+ private final String expectedMep;
+ private final QName expectedInputSchemaElementName;
+ private final QName expectedOutputSchemaElementName;
+
+ public TestConfig(OperationReference operationReference,
+ boolean isServerSide,
+ String expectedMep,
+ QName expectedInputSchemaElementName,
+ QName expectedOutputSchemaElementName) {
+ this.operationReference = operationReference;
+ this.isServerSide = isServerSide;
+ this.expectedMep = expectedMep;
+ this.expectedInputSchemaElementName =
expectedInputSchemaElementName;
+ this.expectedOutputSchemaElementName =
expectedOutputSchemaElementName;
+ }
+
+ public OperationReference getOperationReference() {
+ return operationReference;
+ }
+
+ public boolean isServerSide() {
+ return isServerSide;
+ }
+
+ public String getExpectedMep() {
+ return expectedMep;
+ }
+
+ public QName getExpectedInputSchemaElementName() {
+ return expectedInputSchemaElementName;
+ }
+
+ public QName getExpectedOutputSchemaElementName() {
+ return expectedOutputSchemaElementName;
+ }
+
+ public String toString() {
+ OperationReference opRef = getOperationReference();
+ return "port:" + opRef.getPortName() + "; operation:" +
+ opRef.getOperationName() + "; isServerSide:" + isServerSide()
+
+ "; expectedMEP:" + getExpectedMep();
+ }
+ }
+
+}