import java.util.*;
import java.net.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;

import com.ibm.uddi.*;
import com.ibm.uddi.datatype.*;
import com.ibm.uddi.datatype.business.*;
import com.ibm.uddi.datatype.tmodel.*;
import com.ibm.uddi.datatype.service.*;
import com.ibm.uddi.response.*;
import com.ibm.uddi.client.*;
import com.ibm.uddi.UDDIElement.*;
import com.ibm.uddi.datatype.binding.*;
import com.ibm.uddi.util.*;
import org.w3c.dom.Element;

public class CurrencyConvert
{
	public double convert(String inCurrency, String outCurrency, double amount) throws MalformedURLException
	{
	   URL url = findService();

      Call myCall = new Call();
      myCall.setTargetObjectURI("urn:ExampleServices:EuroConverter");
      myCall.setMethodName("convert2EUR");

    	myCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
      Vector params = new Vector();

		params.addElement(new Parameter("currencyID", String.class, inCurrency, null));
		params.addElement(new Parameter("amount", Double.class, Double.toString(amount), null));

      myCall.setParams(params);

      Response resp=null;
      //invoke call
      try
      {
         resp = myCall.invoke(url, null);
      } //try
      catch(SOAPException e)
      {
         System.err.println("Caught SOAPException (" +e.getFaultCode () + "): " +e.getMessage ());
      } //catch

      // check response
      if (!resp.generatedFault())
      {
         Parameter ret = resp.getReturnValue();

         //convert from EUR to ECB currency
         myCall.setMethodName("convertFromEUR");
         params.clear();
   		params.addElement(new Parameter("currencyID", String.class, outCurrency, null));
   		params.addElement(new Parameter("amount", Double.class, ret.getValue().toString(), null));
         myCall.setParams(params);

         // invoke call
         resp=null;
         try
         {
            resp = myCall.invoke(url, null);
         } //try
         catch(SOAPException e)
         {
            System.err.println("Caught SOAPException (" +e.getFaultCode () + "): " +e.getMessage ());
         } //catch

         // check response
         if (!resp.generatedFault())
         {
            ret = resp.getReturnValue();
            return Double.parseDouble(ret.getValue().toString());
         } //if
         else
         {
            Fault fault = resp.getFault();
            System.err.println("Generated fault: ");
            System.out.println("  Fault Code   = " + fault.getFaultCode());
            System.out.println("  Fault String = " + fault.getFaultString());
         } //else
      } //if
      else
      {
         Fault fault = resp.getFault();
         System.err.println("Generated fault: ");
         System.out.println("  Fault Code   = " + fault.getFaultCode());
         System.out.println("  Fault String = " + fault.getFaultString());
      } //else
      //never gets here
      return 0;
   } //convert()

   URL findService() throws MalformedURLException
   {
   	UDDIProxy proxy = new UDDIProxy();

   	proxy.setInquiryURL("http://uddi.SampleRegistry.com/services/uddi/servlet/uddi");
      proxy.setPublishURL("http://uddi.SampleRegistry.com/services/uddi/servlet/uddi");

    	try
    	{
      	// query UDDI for EuroConverter Service
      	// find tModelKey for EuroConverter-interface
      	TModelList tlist= proxy.find_tModel("EuroConverter-interface", new FindQualifiers(), 1);
      	Vector tinfos=tlist.getTModelInfos().getTModelInfoVector();
       	String tMKey=((TModelInfo)tinfos.elementAt(1)).getTModelKey();

      	// find business that references tMKey
      	Vector tModelKeyStrings=new Vector();
      	tModelKeyStrings.add(new TModelKey(tMKey));
      	TModelBag bag=new TModelBag(tModelKeyStrings);
      	BusinessList BL=proxy.find_business( bag, new FindQualifiers(),1);
       	Vector businessInfos=BL.getBusinessInfos().getBusinessInfoVector();
      	String bKey=((BusinessInfo)businessInfos.elementAt(1)).getBusinessKey();

      	// find service
      	ServiceList sl=proxy.find_service(bKey, bag, new FindQualifiers(), 1);
      	Vector serviceInfos=sl.getServiceInfos().getServiceInfoVector();
       	String sKey=((ServiceInfo)serviceInfos.elementAt(1)).getServiceKey();
       	Vector busServs=proxy.get_serviceDetail(sKey).getBusinessServiceVector();

       	// get bindingDetail
       	BindingTemplates bts=((BusinessService)busServs.elementAt(1)).getBindingTemplates();
       	Vector bts_v=bts.getBindingTemplateVector();
       	AccessPoint ap= ((BindingTemplate)bts_v.elementAt(1)).getAccessPoint();

       	return new URL(ap.getText());
    	} //try
      catch(Exception e)
      {
   	   System.err.println("unable to contact UDDI, using cached URL");
         return new URL( "http://services.EuroConverter.eu/cgi-bin/EuroConverter.cgi" );
      } //catch
   }//findService()
} //class CurrencyConvert
		
