package dt.soap.EchoService;

import java.util.*;
import java.net.*;
import org.apache.soap.*;
import org.apache.soap.encoding.*;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
import org.apache.soap.util.xml.*;

import dt.soap.EchoService.*;

public class EchoServiceClient
{
    static SOAPMappingRegistry smr = new SOAPMappingRegistry(Constants.NS_URI_CURRENT_SCHEMA_XSD);

    public static void main(String[] args) throws Exception 
    {
	System.out.println("Starting test...");

	//dt.soap.EchoService.StringSerializer stringSer = new dt.soap.EchoService.StringSerializer();
	//dt.soap.EchoService.StringDeserializer stringDser = new dt.soap.EchoService.StringDeserializer();
	//org.apache.soap.encoding.soapenc.StringDeserializer stringDser = 
	//    new org.apache.soap.encoding.soapenc.StringDeserializer();
	URLSerializer urlSer = new URLSerializer();
	URLDeserializer urlDser = new URLDeserializer();
	MyClassSerializer myClassSer = new MyClassSerializer();
	MyClassDeserializer myClassDser = new MyClassDeserializer();

	smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("http://omnigene.org/xsd", "URL"),
		     URL.class, urlSer, urlDser);
	//smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("http://omnigene.org/xsd", "String"),
	//     String.class, stringSer, stringDser);
	smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("http://omnigene.org/xsd", "MyClass"),
		     MyClass.class, myClassSer, myClassDser);

	String str = null;
	Parameter p = new Parameter("inputString", String.class, str, null);
	//smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, stringDser);
	doCall("echoString", p);

        p = new Parameter("inputURL", URL.class, new URL("http://www.yahoo.com"), null);
	smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, urlDser);
	doCall("echoURL", p);

	
	//MyClass mc = new MyClass();
	MyClass mc = new MyClass(null, new URL("http://www.yahoo.com"));

        p = new Parameter("inputClass", MyClass.class, mc, null);
	smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("", "Return"), null, null, myClassDser);
	doCall("echoClass", p);

	System.out.println("Test complete...");
    }



    public static void doCall(String methodName, Parameter param)
    {
	try
	{
	    System.out.println("Calling method: " + methodName);

	    Call call = new Call();
	    Vector params = new Vector();
	    params.addElement(param);
	    call.setSOAPMappingRegistry(smr);
 	    call.setTargetObjectURI("urn:EchoService");
	    call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
	    call.setMethodName(methodName);
	    call.setParams(params);

	    // Address of SOAP router 
	    URL url = new URL("http://bismuth:9090/soap/servlet/rpcrouter");
	    //URL url = new URL("http://localhost:8080/soap/servlet/rpcrouter");
	    //URL url = new URL("http://localhost:9999/soap/servlet/rpcrouter");

	    Response resp = call.invoke(url,"");

	    // Check the response
	    if (!resp.generatedFault())
	    {
		Parameter ret = resp.getReturnValue();
	        Object output = ret.getValue();
		Object input = param.getValue();

		System.out.print("Return value from " + methodName + "  =  ");

		if (methodName.equals("echoString"))
		{
		    System.out.println( (String)output );
		}
		if (methodName.equals("echoURL"))
		{
		    System.out.println(((URL)output).toString());
		}
		if (methodName.equals("echoClass"))
		{
		    System.out.println("\nName = " + ((MyClass)output).getName() );
		    
		    if (((MyClass)output).getLocation() != null)
			System.out.println("Location = " + ((MyClass)output).getLocation().toString() );
		    else
			System.out.println("Location = null");
		}
		if (methodName.equals("echoXMLString"))
		{
		    System.out.println("\n" +  (String)output );
		}

	    }
	    else
	    {
		Fault fault = resp.getFault();
		System.out.println(methodName + " generated fault: ");
		System.out.println("  Fault Code = " + fault.getFaultCode());
		System.out.println("  Fault String = " + fault.getFaultString());
	    }
	}
	catch (Exception e)
	{
	    e.printStackTrace();
	}
    }

}




















