package examples.mega.client;

import java.io.IOException;

import java.net.URL;

import java.util.Iterator;

import java.rmi.RemoteException;

import javax.xml.namespace.QName;

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Call;

import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;

import weblogic.webservice.encoding.GenericTypeMapping;
import weblogic.webservice.extensions.WLCall;

public class BrowserClient{

  public void invoke() throws RemoteException, InvokeFailedException,
    ServiceException, IOException{

    String url = "http://localhost:7001/mega/TemperatureService?WSDL"; 

    System.setProperty( "javax.xml.rpc.ServiceFactory",
        "weblogic.webservice.core.rpc.ServiceFactoryImpl" );

    System.setProperty( "weblogic.webservice.servicenamechecking", 
        "false" );

    ServiceFactory factory = ServiceFactory.newInstance();

    QName serviceName = new QName( "http://www.bea.com/mega-service/",
        "MegaWebService" );

    Service service = factory.createService( new URL( url ), serviceName );

    TypeMappingRegistry registry = service.getTypeMappingRegistry(); 
    registry.registerDefault( new GenericTypeMapping() ); 

    System.out.println( "+ Service: " + service.getServiceName() );

    for( Iterator it = service.getPorts(); it.hasNext(); ){
      QName portName = (QName)it.next();
      System.out.println( "  + Port: " + portName );
      Call[] calls = service.getCalls( portName );
      printCalls( calls );
    }
  }

  private void printCalls( Call[] calls ){
    for( int i=0; i<calls.length; i++ ){
      Call call = calls[i];
      System.out.println( "    + Operation :" + call.getOperationName() ); 
      printParameters( (WLCall)call );
      
      if( call.getReturnType() != null ){
        System.out.println( "      + Return Type:" + call.getReturnType() ); 
      }

      System.out.println( "" ); 
    }
  }

  private void printParameters( WLCall call ){
    for( Iterator it = call.getParameterNames(); it.hasNext(); ){
      String name = (String)it.next();
      System.out.println( "      + Part :" + name ); 

      System.out.println( "        - Java Type :" + 
          call.getParameterJavaType( name ) ); 

      System.out.println( "        - Mode :" + 
          call.getParameterMode( name ) ); 

      System.out.println( "        - XML Type :" + 
          call.getParameterTypeByName( name ) ); 
    }
  }
}

