You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wsif-dev@ws.apache.org by an...@apache.org on 2003/03/27 13:25:15 UTC
cvs commit: xml-axis-wsif/java/test/jms JMSURL.wsdl JMSURLTest.java
antelder 2003/03/27 04:25:15
Added: java/test/jms JMSURL.wsdl JMSURLTest.java
Log:
Initial version of support the SOAP over JMS using the soap:address location attribute to define the JMS properties
Revision Changes Path
1.1 xml-axis-wsif/java/test/jms/JMSURL.wsdl
Index: JMSURL.wsdl
===================================================================
<?xml version="1.0" ?>
<definitions targetNamespace="http://wsifservice.addressbook/"
xmlns:tns="http://wsifservice.addressbook/"
xmlns:typens="http://wsiftypes.addressbook/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/"
xmlns:java="http://schemas.xmlsoap.org/wsdl/java/"
xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!-- type defs -->
<types>
<xsd:schema
targetNamespace="http://wsiftypes.addressbook/"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<xsd:complexType name="phone">
<xsd:all>
<xsd:element name="areaCode" type="xsd:int"/>
<xsd:element name="exchange" type="xsd:string"/>
<xsd:element name="number" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="address">
<xsd:all>
<xsd:element name="streetNum" type="xsd:int"/>
<xsd:element name="streetName" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:int"/>
<xsd:element name="phoneNumber" type="typens:phone"/>
</xsd:all>
</xsd:complexType>
</xsd:schema>
</types>
<!-- message declns -->
<message name="AddEntryWholeNameRequestMessage">
<part name="name" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
<message name="AddEntryFirstAndLastNamesRequestMessage">
<part name="firstName" type="xsd:string"/>
<part name="lastName" type="xsd:string"/>
<part name="address" type="typens:address"/>
</message>
<message name="GetAddressFromNameRequestMessage">
<part name="name" type="xsd:string"/>
</message>
<message name="GetAddressFromNameResponseMessage">
<part name="address" type="typens:address"/>
</message>
<!-- port type declns -->
<portType name="AddressBook">
<operation name="addEntry">
<input name="AddEntryWholeNameRequest" message="tns:AddEntryWholeNameRequestMessage"/>
</operation>
<operation name="addEntry">
<input name="AddEntryFirstAndLastNamesRequest" message="tns:AddEntryFirstAndLastNamesRequestMessage"/>
</operation>
<operation name="getAddressFromName">
<input name="GetAddressFromNameRequest" message="tns:GetAddressFromNameRequestMessage"/>
<output name="GetAddressFromNameResponse" message="tns:GetAddressFromNameResponseMessage"/>
</operation>
</portType>
<!-- binding declns -->
<binding name="SOAPHttpBinding" type="tns:AddressBook">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input name="AddEntryWholeNameRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
</operation>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input name="AddEntryFirstAndLastNamesRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
</operation>
<operation name="getAddressFromName">
<soap:operation soapAction=""/>
<input name="GetAddressFromNameRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output name="GetAddressFromNameResponse">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<binding name="SOAPJmsBinding" type="tns:AddressBook">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/jms"/>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input name="AddEntryWholeNameRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
</operation>
<operation name="addEntry">
<soap:operation soapAction=""/>
<input name="AddEntryFirstAndLastNamesRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
</operation>
<operation name="getAddressFromName">
<soap:operation soapAction=""/>
<input name="GetAddressFromNameRequest">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output name="GetAddressFromNameResponse">
<soap:body use="encoded"
namespace="http://wsifservice.addressbook/"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<binding name="JavaBinding" type="tns:AddressBook">
<java:binding/>
<format:typeMapping encoding="Java" style="Java">
<format:typeMap typeName="typens:address" formatType="addressbook.wsiftypes.Address" />
<format:typeMap typeName="xsd:string" formatType="java.lang.String" />
</format:typeMapping>
<operation name="addEntry">
<java:operation
methodName="addEntry"
parameterOrder="name address"
methodType="instance" />
<input name="AddEntryWholeNameRequest"/>
</operation>
<operation name="addEntry">
<java:operation
methodName="addEntry"
parameterOrder="firstName lastName address"
methodType="instance" />
<input name="AddEntryFirstAndLastNamesRequest"/>
</operation>
<operation name="getAddressFromName">
<java:operation
methodName="getAddressFromName"
parameterOrder="name"
methodType="instance"
returnPart="address" />
<input name="GetAddressFromNameRequest"/>
<output name="GetAddressFromNameResponse"/>
</operation>
</binding>
<binding name="NativeJmsBinding" type="tns:AddressBook">
<jms:binding type="ObjectMessage"/>
<format:typeMapping encoding="Java" style="Java">
<format:typeMap typeName="typens:address" formatType="addressbook.wsiftypes.Address" />
<format:typeMap typeName="xsd:string" formatType="java.lang.String" />
</format:typeMapping>
<operation name="addEntry">
<input name="AddEntryWholeNameRequest">
<jms:input parts="name address"/>
</input>
</operation>
<operation name="addEntry">
<input name="AddEntryFirstAndLastNamesRequest"/>
</operation>
<operation name="getAddressFromName">
<input name="GetAddressFromNameRequest"/>
<output name="GetAddressFromNameResponse"/>
</operation>
</binding>
<!-- service decln -->
<service name="AddressBookService">
<port name="SOAPPort" binding="tns:SOAPHttpBinding">
<soap:address location="http://localhost:8080/soap/servlet/rpcrouter"/>
</port>
<port name="AXISPort" binding="tns:SOAPHttpBinding">
<soap:address location="http://localhost:8080/axis/services/AddressBook"/>
</port>
<port name="JavaPort" binding="tns:JavaBinding">
<java:address className="addressbook.wsiftypes.AddressBook"/>
</port>
<port name="SOAPJMSPort" binding="tns:SOAPJmsBinding">
<!--
<jms:address jndiDestinationName="SoapJmsAddressBookQueue"
destinationStyle="queue"
jndiConnectionFactoryName="WSIFSampleQCF"
initialContextFactory="com.sun.jndi.fscontext.RefFSContextFactory"
jndiProviderURL="file:///JNDI-Directory">
<jms:propertyValue name="SOAPAction" type="xsd:string" value=" "/>
<jms:propertyValue name="SOAPAction" type="xsd:string" value=" "/>
</jms:address>
-->
<soap:address location="jms:/queue?destination=SoapJmsAddressBookQueue|connectionFactory=WSIFSampleQCF|initialContextFactory=com.sun.jndi.fscontext.RefFSContextFactory|jndiProviderURL=file:///JNDI-Directory"/>
</port>
<port name="NativeJmsPort" binding="tns:NativeJmsBinding">
<jms:address jndiDestinationName="NativeJmsRequestQueue"
destinationStyle="queue"
jndiConnectionFactoryName="WSIFSampleQCF"
initialContextFactory="com.sun.jndi.fscontext.RefFSContextFactory"
jndiProviderURL="file:///JNDI-Directory">
<jms:propertyValue name="JMSReplyTo" type="xsd:string" value="NativeJmsResponseQueue"/>
</jms:address>
</port>
</service>
</definitions>
1.1 xml-axis-wsif/java/test/jms/JMSURLTest.java
Index: JMSURLTest.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "WSIF" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, 2002, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package jms;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.wsif.WSIFConstants;
import org.apache.wsif.WSIFCorrelationId;
import org.apache.wsif.WSIFException;
import org.apache.wsif.WSIFMessage;
import org.apache.wsif.WSIFOperation;
import org.apache.wsif.WSIFPort;
import org.apache.wsif.WSIFService;
import org.apache.wsif.WSIFServiceFactory;
import org.apache.wsif.providers.soap.apacheaxis.WSIFDynamicProvider_ApacheAxis;
import org.apache.wsif.util.WSIFPluggableProviders;
import util.AddressUtility;
import util.TestUtilities;
import addressbook.wsifservice.AddressBook;
import addressbook.wsiftypes.Address;
import addressbook.wsiftypes.Phone;
import async.AsyncResponseHandler;
/**
* Junit test to test using the location JMS URL
* (Its just the AddressBook test so far...)
*
* See WSFJMSDestination#getJMSAddressFromURL(String) for details
*
* @author Ant Elder <an...@uk.ibm.com>
*/
public class JMSURLTest extends TestCase {
String wsdlLocation =
TestUtilities.getWsdlPath("java\\test\\jms")
+ "JMSURL.wsdl";
static String server = TestUtilities.getSoapServer().toUpperCase();
static String name1 = "Purdue Boilermaker";
static Address addr1 =
new Address(
1,
"University Drive",
"West Lafayette",
"IN",
47907,
new Phone(765, "494", "4900"));
static String firstName2 = "Someone";
static String lastName2 = "Else";
static Address addr2 =
new Address(
0,
"Somewhere Else",
"No Where",
"NO",
71983,
new Phone(600, "391", "5682"));
public JMSURLTest(String name) {
super(name);
}
public static void main(String[] args) {
TestUtilities.startListeners(
TestUtilities.ADDRESSBOOK_LISTENER
| TestUtilities.ASYNC_LISTENER
| TestUtilities.NATIVEJMS_LISTENER);
junit.textui.TestRunner.run(suite());
TestUtilities.stopListeners();
}
public static Test suite() {
return new TestSuite(JMSURLTest.class);
}
public void setUp() {
TestUtilities.setUpExtensionsAndProviders();
}
// public void testAxis() {
// doit(server+"Port", "axis");
// }
// public void testSoap() {
// doit(server+"Port", "soap");
// }
// public void testJava() {
// doit("JavaPort", "java");
// }
// public void testSoapJms() {
// doit("SOAPJMSPort", "soap");
// }
public void testAxisJms() {
doit("SOAPJMSPort", "axis");
}
// public void testNativeJms() {
// doit("NativeJmsPort", "" );
// }
// public void testDynamicSOAP() {
// doitDyn(server+"Port", "soap", false);
// }
// public void testDynamicAxis() {
// doitDyn(server+"Port", "axis", false);
// }
// public void testDynamicJava() {
// doitDyn("JavaPort", "java", false);
// }
// public void testDynamicSoapJms() {
// doitDyn("SOAPJMSPort", "soap", false);
// }
// public void testDynamicAxisJms() {
// doitDyn("SOAPJMSPort", "axis", false);
// }
// public void testDynamicNativeJms() {
// doitDyn("NativeJmsPort", "", false);
// }
// public void testDynamicAxisAuto() {
// doitDyn(server+"Port", "axis", true);
// }
// public void testDynamicAxisJmsAuto() {
// doitDyn("SOAPJMSPort", "axis", true);
// }
private void doit(String portName, String protocol) {
if (portName.toUpperCase().indexOf("JMS") != -1
&& !TestUtilities.areWeTesting("jms"))
return;
TestUtilities.setProviderForProtocol( protocol );
try {
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
WSIFService service = factory.getService(wsdlLocation, null, // serviceNS
null, // serviceName
"http://wsifservice.addressbook/", // portTypeNS
"AddressBook" ); // portTypeName
AddressBook abStub = (AddressBook) service.getStub(portName, AddressBook.class);
abStub.addEntry(name1, addr1);
abStub.addEntry(firstName2, lastName2, addr2);
Address resp1 = abStub.getAddressFromName(name1);
assertTrue(new AddressUtility(addr1).equals(resp1));
Address resp2 = abStub.getAddressFromName(firstName2 + " " + lastName2);
assertTrue(new AddressUtility(addr2).equals(resp2));
if (TestUtilities.areWeTesting("async")) {
testAsyncOPs( service, portName, name1, addr1 );
testAsyncOPs( service, portName, firstName2 + " " + lastName2, addr2 );
}
} catch (Exception e) {
System.err.println("AddressBookTest(" + portName + ") caught exception " + e);
e.printStackTrace();
assertTrue(false);
} finally {
TestUtilities.resetDefaultProviders();
}
}
private void doitDyn(String portName, String protocol, boolean autoMapTypes) {
if (portName.toUpperCase().indexOf("JMS") != -1 && !TestUtilities.areWeTesting("jms"))
return;
TestUtilities.setProviderForProtocol( protocol );
try {
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
if (autoMapTypes) {
factory.setFeature(WSIFConstants.WSIF_FEATURE_AUTO_MAP_TYPES, new Boolean(true));
}
WSIFService service = factory.getService(wsdlLocation, null, // serviceNS
null, // serviceName
"http://wsifservice.addressbook/", // portTypeNS
"AddressBook"); // portTypeName
if (!autoMapTypes) {
service.mapType(
new javax.xml.namespace.QName(
"http://wsiftypes.addressbook/",
"address"),
Class.forName("addressbook.wsiftypes.Address"));
service.mapType(
new javax.xml.namespace.QName(
"http://wsiftypes.addressbook/",
"phone"),
Class.forName("addressbook.wsiftypes.Phone"));
}
WSIFPort port = null;
port = service.getPort(portName);
WSIFOperation operation =
port.createOperation("addEntry", "AddEntryWholeNameRequest", null);
WSIFMessage inputMessage = operation.createInputMessage();
WSIFMessage outputMessage = operation.createOutputMessage();
WSIFMessage faultMessage = operation.createFaultMessage();
// Create a name and address to add to the addressbook
String nameToAdd = "Chris P. Bacon";
Address addressToAdd =
new Address(
1,
"The Waterfront",
"Some City",
"NY",
47907,
new Phone(765, "494", "4900"));
// Add the name and address to the input message
inputMessage.setObjectPart("name", nameToAdd);
inputMessage.setObjectPart("address", addressToAdd);
// Execute the operation, obtaining a flag to indicate its success
operation.executeInputOnlyOperation(inputMessage);
// Start from fresh
operation = null;
inputMessage = null;
outputMessage = null;
faultMessage = null;
operation = port.createOperation("getAddressFromName");
// Create the messages
inputMessage = operation.createInputMessage();
outputMessage = operation.createOutputMessage();
faultMessage = operation.createFaultMessage();
// Set the name to find in the addressbook
String nameToLookup = "Chris P. Bacon";
inputMessage.setObjectPart("name", nameToLookup);
// Execute the operation
boolean operationSucceeded =
operation.executeRequestResponseOperation(
inputMessage,
outputMessage,
faultMessage);
if (operationSucceeded) {
System.out.println(
"Successfull lookup of name '" + nameToLookup + "' in addressbook");
// We can obtain the address that was found by querying the output message
Address addressFound = (Address) outputMessage.getObjectPart("address");
System.out.println("The address found was:");
System.out.println(addressFound);
} else {
System.out.println("Failed to lookup name in addressbook");
}
// Check that we can't reuse an operation.
boolean caughtException = false;
try {
operationSucceeded =
operation.executeRequestResponseOperation(
inputMessage,
outputMessage,
faultMessage);
} catch (WSIFException we) {
caughtException = true;
}
assertTrue(caughtException);
} catch (Exception e) {
System.err.println("AddressBookTest(" + portName + ") caught exception " + e);
e.printStackTrace();
assertTrue(false);
} finally {
TestUtilities.resetDefaultProviders();
}
}
private void testAsyncOPs(WSIFService service, String portName, String name, Address addr) {
try {
WSIFPort port =
(portName == null) ? service.getPort() : service.getPort(portName);
if (!port.supportsAsync() ) {
return;
}
WSIFOperation op = port.createOperation( "getAddressFromName" );
AsyncResponseHandler abHandler = new AsyncResponseHandler( 1 ); // 1 async call
WSIFMessage inMsg = op.createInputMessage();
inMsg.setObjectPart( "name", name );
WSIFMessage outmsg = op.createOutputMessage();
WSIFMessage faultMsg = op.createFaultMessage();
WSIFMessage context = op.getContext();
context.setObjectPart( WSIFConstants.CONTEXT_JMS_PREFIX + "JMSReplyTo",
TestUtilities.getWsifProperty("wsif.async.replytoq") );
op.setContext( context );
WSIFCorrelationId id = op.executeRequestResponseAsync(inMsg, abHandler);
assertTrue("null correlation id returned from async request!", id != null );
int i = 10;
while (i-- > 0 && !abHandler.isDone()) {
System.out.println( "waiting for async responses - " + i );
try {
Thread.sleep(3000);
} catch (InterruptedException ex) {
}
}
assertTrue("no response from async operation!",i > 0); // no responses in time
WSIFMessage[] faults = abHandler.getFaults();
WSIFMessage[] outputs = abHandler.getOutputs();
Address respAddr = (Address) outputs[0].getObjectPart("address");
assertTrue("incorrect address response!", addr.equals(respAddr));
} catch (Exception ex) {
ex.printStackTrace();
assertTrue( "exception making async request!!", false );
}
}
}