dims 2003/03/23 15:49:18
Modified: java/test/wsdl/addrNoImplSEI AddressBook.wsdl
AddressBookNoImplSEISoapBindingImpl.java
java/src/org/apache/axis/client Service.java
Added: java/test/wsdl/addrNoImplSEI
AddressBookDynamicProxyTestCase.java
Log:
- JAX-RPC javax.xml.rpc.Service's getPort(Class) was broken.
- Added a test case for testing this as well.
Here is the excerpt from JAX-RPC spec section 4.3.10:
The method getPort(Class) returns either an instance of a generated stub
implementation class or a dynamic proxy. The parameter serviceEndpoint-
Interface specifies the service endpoint interface that is supported by the returned
stub or proxy. In the implementation of this method, the JAX-RPC runtime system takes
the responsibility of selecting a protocol binding (and a port) and configuring the
stub
accordingly. The returned Stub instance should not be reconfigured by the client.
Revision Changes Path
1.5 +33 -0 xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl
Index: AddressBook.wsdl
===================================================================
RCS file: /home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/AddressBook.wsdl,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AddressBook.wsdl 29 Aug 2002 21:17:58 -0000 1.4
+++ AddressBook.wsdl 23 Mar 2003 23:49:16 -0000 1.5
@@ -6,6 +6,7 @@
xmlns:typens="urn:AddrNoImplSEI"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!-- type defs -->
@@ -41,6 +42,14 @@
<xsd:element ref="typens:Phone"/>
</xsd:all>
</xsd:complexType>
+
+ <xsd:complexType name="ArrayOfaddress">
+ <xsd:complexContent>
+ <xsd:restriction base="soap-enc:Array">
+ <xsd:attribute ref="soap-enc:arrayType"
arrayType="typens:Address[]"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
</xsd:schema>
</types>
@@ -58,6 +67,13 @@
<part name="address" type="typens:Address"/>
</message>
+ <message name="getAddressesRequest">
+ </message>
+
+ <message name="getAddressesResponse">
+ <part name="addresses" type="typens:ArrayOfaddress"/>
+ </message>
+
<!-- port type declns -->
<portType name="AddressBookNoImplSEI">
<operation name="addEntry">
@@ -67,6 +83,10 @@
<input message="tns:GetAddressFromNameRequest"/>
<output message="tns:GetAddressFromNameResponse"/>
</operation>
+ <operation name="getAddresses">
+ <input message="tns:getAddressesRequest"/>
+ <output message="tns:getAddressesResponse"/>
+ </operation>
</portType>
<!-- binding declns -->
@@ -96,6 +116,19 @@
<output>
<soap:body use="encoded"
namespace="urn:AddrNoImplSEI"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="getAddresses">
+ <soap:operation soapAction=""/>
+ <input>
+ <soap:body use="encoded"
+ namespace="urn:AddressFetcher2"
+ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded"
+ namespace="urn:AddressFetcher2"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
1.2 +6 -0
xml-axis/java/test/wsdl/addrNoImplSEI/AddressBookNoImplSEISoapBindingImpl.java
Index: AddressBookNoImplSEISoapBindingImpl.java
===================================================================
RCS file:
/home/cvs/xml-axis/java/test/wsdl/addrNoImplSEI/AddressBookNoImplSEISoapBindingImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AddressBookNoImplSEISoapBindingImpl.java 14 Jun 2002 22:39:50 -0000 1.1
+++ AddressBookNoImplSEISoapBindingImpl.java 23 Mar 2003 23:49:17 -0000 1.2
@@ -28,4 +28,10 @@
{
return (test.wsdl.addrNoImplSEI.Address) this.addresses.get(name);
}
+
+ public test.wsdl.addrNoImplSEI.Address[] getAddresses() throws
java.rmi.RemoteException {
+ test.wsdl.addrNoImplSEI.Address[] array = new
test.wsdl.addrNoImplSEI.Address[this.addresses.size()];
+ this.addresses.values().toArray(array);
+ return array;
+ }
}
1.1
xml-axis/java/test/wsdl/addrNoImplSEI/AddressBookDynamicProxyTestCase.java
Index: AddressBookDynamicProxyTestCase.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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 "Axis" 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 [EMAIL PROTECTED]
*
* 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package test.wsdl.addrNoImplSEI;
import junit.framework.TestCase;
import org.apache.axis.transport.http.SimpleAxisWorker;
import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Stub;
import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;
import java.net.URL;
/**
* Test the address book sample code using JAX-RPC's Dynamic Proxy support.
*/
public class AddressBookDynamicProxyTestCase extends TestCase {
public AddressBookDynamicProxyTestCase(String name) {
super(name);
}
// Use pure JAX-RPC to talk to the server.
public void testAddressBookServiceUsingDynamicProxy() throws Exception {
String nameSpaceUri = "http://addrNoImplSEI.wsdl.test";
String serviceName = "AddressBookNoImplSEIService";
String thisHost = SimpleAxisWorker.getLocalHost();
String thisPort = System.getProperty("test.functional.ServicePort", "8080");
//location of wsdl file
String wsdlLocation = "http://" + thisHost + ":" + thisPort +
"/axis/services/AddressBookNoImplSEI?WSDL";
URL orgWsdlUrl = new URL(wsdlLocation);
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service addressBookService =
serviceFactory.createService(orgWsdlUrl,
new QName(nameSpaceUri, serviceName));
// Add the typemapping entries
TypeMappingRegistry registry = addressBookService.getTypeMappingRegistry();
TypeMapping map = registry.getDefaultTypeMapping();
map.register(test.wsdl.addrNoImplSEI.Address.class,
new QName("urn:AddrNoImplSEI", "Address"),
new
org.apache.axis.encoding.ser.BeanSerializerFactory(test.wsdl.addrNoImplSEI.Address.class,
new QName("urn:AddrNoImplSEI", "Address")),
new
org.apache.axis.encoding.ser.BeanDeserializerFactory(test.wsdl.addrNoImplSEI.Address.class,
new QName("urn:AddrNoImplSEI", "Address")));
map.register(test.wsdl.addrNoImplSEI._Phone.class,
new QName("urn:AddrNoImplSEI", "_Phone"),
new
org.apache.axis.encoding.ser.BeanSerializerFactory(test.wsdl.addrNoImplSEI._Phone.class,
new QName("urn:AddrNoImplSEI", "_Phone")),
new
org.apache.axis.encoding.ser.BeanDeserializerFactory(test.wsdl.addrNoImplSEI._Phone.class,
new QName("urn:AddrNoImplSEI", "_Phone")));
map.register(test.wsdl.addrNoImplSEI.StateType.class,
new QName("urn:AddrNoImplSEI", "StateType"),
new
org.apache.axis.encoding.ser.EnumSerializerFactory(test.wsdl.addrNoImplSEI.StateType.class,
new QName("urn:AddrNoImplSEI", "StateType")),
new
org.apache.axis.encoding.ser.EnumDeserializerFactory(test.wsdl.addrNoImplSEI.StateType.class,
new QName("urn:AddrNoImplSEI", "StateType")));
AddressBookNoImplSEI myProxy = (AddressBookNoImplSEI)
addressBookService.getPort(AddressBookNoImplSEI.class);
// Set session on.
((Stub) myProxy)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);
String name1;
Address addr1;
_Phone phone1;
name1 = "Purdue Boilermaker";
addr1 = new Address();
phone1 = new _Phone();
addr1.setStreetNum(1);
addr1.setStreetName("University Drive");
addr1.setCity("West Lafayette");
addr1.setState(StateType.IN);
addr1.setZip(47907);
phone1.setAreaCode(765);
phone1.setExchange("494");
phone1.setNumber("4900");
addr1.setPhone(phone1);
// Add an entry
myProxy.addEntry(name1, addr1);
// Get the list of entries
test.wsdl.addrNoImplSEI.Address[] addresses = myProxy.getAddresses();
assertTrue(addresses.length > 0);
}
}
1.88 +21 -1 xml-axis/java/src/org/apache/axis/client/Service.java
Index: Service.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Service.java,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -r1.87 -r1.88
--- Service.java 19 Mar 2003 13:02:35 -0000 1.87
+++ Service.java 23 Mar 2003 23:49:18 -0000 1.88
@@ -394,7 +394,27 @@
if (wsdlService == null)
throw new ServiceException(Messages.getMessage("wsdlMissing00"));
- return getPort(null, null, proxyInterface);
+ Map ports = wsdlService.getPorts();
+ if (ports == null || ports.size() <= 0)
+ throw new ServiceException(Messages.getMessage("noPort00", ""));
+
+ // Get the name of the class (without package name)
+ String clazzName = proxyInterface.getName();
+ if(clazzName.lastIndexOf('.')!=-1) {
+ clazzName = clazzName.substring(clazzName.lastIndexOf('.')+1);
+ }
+
+ // Pick the port with the same name as the class
+ Port port = (Port) ports.get(clazzName);
+ if(port == null) {
+ // If not found, just pick the first port.
+ port = (Port) ports.values().iterator().next();
+ }
+
+ // First, try to find a generated stub. If that
+ // returns null, then find a dynamic stub.
+ Remote stub = getGeneratedStub(new QName(port.getName()), proxyInterface);
+ return stub != null ? stub : getPort(null, new QName(port.getName()),
proxyInterface);
}
/**