You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by gd...@apache.org on 2001/05/11 21:06:38 UTC
cvs commit: xml-soap/java/samples/interop Data.java DataSerializer.java DeploymentDescriptor.xml EchoTestClient.java EchoTestService.java
gdaniels 01/05/11 12:06:37
Added: java/samples/interop Data.java DataSerializer.java
DeploymentDescriptor.xml EchoTestClient.java
EchoTestService.java
Log:
Check in implementation of the interop echo service and client.
Revision Changes Path
1.1 xml-soap/java/samples/interop/Data.java
Index: Data.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 "SOAP" 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package samples.interop;
class Data
{
Integer myInt;
String myString;
Float myFloat;
public Data()
{
}
public Data(int i, String s, float f)
{
myInt = new Integer(i);
myString = s;
myFloat = new Float(f);
}
public String toString()
{
return "Data[MyInt=" + myInt + ", MyString='" + myString + "', myFloat=" + myFloat + "]";
}
/**
* Equality comparison.
*/
public boolean equals(Object object) {
if (!(object instanceof Data)) return false;
Data that= (Data) object;
if (!this.myInt.equals(that.myInt)) return false;
if (!this.myFloat.equals(that.myFloat)) return false;
if (this.myString == null) {
if (that.myString != null) return false;
} else {
if (!this.myString.equals(that.myString)) return false;
}
return true;
};
}
1.1 xml-soap/java/samples/interop/DataSerializer.java
Index: DataSerializer.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 "SOAP" 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package samples.interop;
import java.util.Vector;
import org.apache.soap.*;
import org.apache.soap.encoding.SOAPMappingRegistry;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
import org.apache.soap.messaging.*;
import java.net.URL;
import org.apache.soap.util.xml.*;
import java.io.*;
import org.w3c.dom.*;
import org.apache.soap.util.*;
import java.lang.reflect.*;
public class DataSerializer implements Serializer, Deserializer
{
public void marshall(String inScopeEncStyle, Class javaType, Object src,
Object context, Writer sink, NSStack nsStack,
XMLJavaMappingRegistry xjmr, SOAPContext ctx)
throws IllegalArgumentException, IOException
{
if(!javaType.equals(Data.class))
{
throw new IllegalArgumentException("Can only serialize Data instances");
}
Data data = (Data)src;
nsStack.pushScope();
if(src!=null)
{
SoapEncUtils.generateStructureHeader(inScopeEncStyle,
javaType,
context,
sink,
nsStack,xjmr);
sink.write(StringUtils.lineSeparator);
xjmr.marshall(inScopeEncStyle, Integer.class, data.myInt, "varInt",
sink, nsStack, ctx);
sink.write(StringUtils.lineSeparator);
xjmr.marshall(inScopeEncStyle, Float.class, data.myFloat, "varFloat",
sink, nsStack, ctx);
sink.write(StringUtils.lineSeparator);
xjmr.marshall(inScopeEncStyle, String.class, data.myString, "varString",
sink, nsStack, ctx);
sink.write(StringUtils.lineSeparator);
sink.write("</" + context + '>');
}
else
{
SoapEncUtils.generateNullStructure(inScopeEncStyle,
javaType,
context,
sink,
nsStack,xjmr);
}
nsStack.popScope();
}
public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src,
XMLJavaMappingRegistry xjmr, SOAPContext ctx)
throws IllegalArgumentException
{
Element root = (Element)src;
String name = root.getTagName();
if (SoapEncUtils.isNull(root))
{
return new Bean(Data.class, null);
}
Data ret = new Data();
NodeList list = root.getElementsByTagName("varInt");
if (list == null || list.getLength() == 0) {
throw new IllegalArgumentException("No 'varInt' Element (deserializing Data struct)");
}
Element el = (Element)list.item(0);
ret.myInt = new Integer(DOMUtils.getChildCharacterData(el));
list = root.getElementsByTagName("varFloat");
if (list == null || list.getLength() == 0) {
throw new IllegalArgumentException("No 'varFloat' Element (deserializing Data struct)");
}
el = (Element)list.item(0);
ret.myFloat = new Float(DOMUtils.getChildCharacterData(el));
list = root.getElementsByTagName("varString");
if (list == null || list.getLength() == 0) {
throw new IllegalArgumentException("No 'varString' Element (deserializing Data struct)");
}
el = (Element)list.item(0);
ret.myString = ((Text)el.getFirstChild()).getData();
return new Bean(Data.class, ret);
}
}
1.1 xml-soap/java/samples/interop/DeploymentDescriptor.xml
Index: DeploymentDescriptor.xml
===================================================================
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="http://soapinterop.org/">
<isd:provider type="java"
scope="Application"
methods="nop echoInteger echoString echoFloat echoStruct echoIntegerArray echoFloatArray echoStringArray echoStructArray">
<isd:java class="samples.interop.EchoTestService" static="false"/>
</isd:provider>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
<isd:mappings>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputInteger"
xml2JavaClassName="org.apache.soap.encoding.soapenc.IntDeserializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputFloat"
xml2JavaClassName="org.apache.soap.encoding.soapenc.FloatDeserializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputString"
xml2JavaClassName="org.apache.soap.encoding.soapenc.StringDeserializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputStruct"
xml2JavaClassName="samples.interop.DataSerializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputIntegerArray"
xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputFloatArray"
xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputStringArray"
xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="" qname="x:inputStructArray"
xml2JavaClassName="org.apache.soap.encoding.soapenc.ArraySerializer"/>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="http://soapinterop.org/xsd" qname="x:SOAPStruct"
javaType="samples.interop.Data"
java2XMLClassName="samples.interop.DataSerializer"
xml2JavaClassName="samples.interop.DataSerializer"/>
</isd:mappings>
</isd:service>
1.1 xml-soap/java/samples/interop/EchoTestClient.java
Index: EchoTestClient.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 "SOAP" 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package samples.interop;
import java.util.Vector;
import org.apache.soap.*;
import org.apache.soap.encoding.SOAPMappingRegistry;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
import org.apache.soap.messaging.*;
import java.net.URL;
import org.apache.soap.util.xml.*;
import java.io.*;
import org.w3c.dom.*;
import org.apache.soap.util.*;
import java.lang.reflect.*;
/** A quick-and-dirty client for the Interop echo test services as defined
* at http://www.xmethods.net/ilab.
*
* Defaults to the Apache endpoint, but you can point it somewhere else via
* the command line:
*
* EchoTestClient http://some.other.place/
*
* DOES NOT SUPPORT DIFFERENT SOAPACTION URIS YET.
*
* @author Glen Daniels (gdaniels@macromedia.com)
*/
public class EchoTestClient
{
SOAPMappingRegistry smr = new SOAPMappingRegistry(Constants.NS_URI_CURRENT_SCHEMA_XSD);
public static final String DEFAULT_URL = "http://nagoya.apache.org:5089/soap/servlet/rpcrouter";
public static final String ACTION_URI = "http://soapinterop.org/";
public static final String OBJECT_URI = "http://soapinterop.org/xsd";
public Header header = null;
public static void main(String args[])
{
URL url = null;
try {
if (args.length > 0) {
url = new URL(args[0]);
} else {
url = new URL(DEFAULT_URL);
}
} catch (Exception e) {
e.printStackTrace();
}
EchoTestClient eTest = new EchoTestClient();
eTest.doWork(url);
}
private static boolean equals(Object obj1, Object obj2) {
if (obj1 == null) return (obj2 == null);
if (obj1.equals(obj2)) return true;
if (!obj2.getClass().isArray()) return false;
if (!obj1.getClass().isArray()) return false;
if (Array.getLength(obj1) != Array.getLength(obj2)) return false;
for (int i=0; i<Array.getLength(obj1); i++)
if (!equals(Array.get(obj1,i),Array.get(obj2,i))) return false;
return true;
}
public void doWork(URL url)
{
IntDeserializer intDser = new IntDeserializer();
FloatDeserializer floatDser = new FloatDeserializer();
StringDeserializer stringDser = new StringDeserializer();
ArraySerializer arraySer = new ArraySerializer();
DataSerializer dataSer = new DataSerializer();
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(OBJECT_URI, "SOAPStruct"), Data.class, dataSer, dataSer);
Integer i = new Integer(5);
Parameter p = new Parameter("inputInteger", Integer.class, i, null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, intDser);
doCall(url, "echoInteger", p);
p = new Parameter("inputFloat", Float.class, new Float(55.5), null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, floatDser);
doCall(url, "echoFloat", p);
p = new Parameter("inputString", String.class, "Hi there!", null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, stringDser);
doCall(url, "echoString", p);
p = new Parameter("inputStruct", Data.class, new Data(5, "Hola, baby", (float)10.0), null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, dataSer);
doCall(url, "echoStruct", p);
p = new Parameter("inputIntegerArray", Integer[].class, new Integer[]{
new Integer(5),
new Integer(4),
new Integer(3),
new Integer(2),
new Integer(1)}, null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, arraySer);
doCall(url, "echoIntegerArray", p);
p = new Parameter("inputFloatArray", Float[].class, new Float[]{
new Float(5.5),
new Float(4.4),
new Float(3.3),
new Float(2.2),
new Float(1.1)}, null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, arraySer);
doCall(url, "echoFloatArray", p);
p = new Parameter("inputStringArray", String[].class, new String[]{
"First",
"Second",
"Fifth (just kidding :))",
"Fourth",
"Last"}, null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, arraySer);
doCall(url, "echoStringArray", p);
p = new Parameter("inputStructArray", Data[].class, new Data[]{
new Data(5, "cinqo", new Float("5.55555").floatValue()),
new Data(4, "quattro", (float)4.4444),
new Data(3, "tres", (float)3.333),
new Data(2, "duet", (float)2.22),
new Data(1, "un", (float)1.1)}, null);
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, arraySer);
doCall(url, "echoStructArray", p);
}
public void doCall(URL url, String methodName, Parameter param)
{
try {
Call call = new Call();
Vector params = new Vector();
params.addElement(param);
call.setSOAPMappingRegistry(smr);
call.setTargetObjectURI(ACTION_URI);
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
call.setMethodName(methodName);
call.setParams(params);
if (header != null)
call.setHeader(header);
String soapAction = ACTION_URI;
if (true) {
soapAction = soapAction + methodName;
}
Response resp = call.invoke(url, soapAction);
// check response
if (!resp.generatedFault()) {
Parameter ret = resp.getReturnValue();
Object output = ret.getValue();
Object input = param.getValue();
if (equals(input,output)) {
System.out.println(methodName + "\t OK");
} else {
System.out.println(methodName + "\t FAIL: " + output);
}
}
else {
Fault fault = resp.getFault ();
System.err.println (methodName + " generated fault: ");
System.out.println (" Fault Code = " + fault.getFaultCode());
System.out.println (" Fault String = " + fault.getFaultString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.1 xml-soap/java/samples/interop/EchoTestService.java
Index: EchoTestService.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 "SOAP" 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. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package samples.interop;
/** An implementation of the interop echo service as defined at
* http://www.xmethods.net/ilab.
*
* @author Glen Daniels (gdaniels@macromedia.com)
*/
public class EchoTestService
{
public void nop()
{
}
public int echoInteger(int i)
{
return i;
}
public float echoFloat(float f)
{
return f;
}
public String echoString(String str)
{
return str;
}
public Data echoStruct(Data data)
{
return data;
}
public int [] echoIntegerArray(int [] ii)
{
return ii;
}
public float [] echoFloatArray(float [] ff)
{
return ff;
}
public String [] echoStringArray(String [] ss)
{
return ss;
}
public Data [] echoStructArray(Data [] ds)
{
return ds;
}
}