package tutorial.sample25;

import javax.xml.soap.SOAPConstants;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Service;
import javax.xml.rpc.Call;
import javax.xml.rpc.ParameterMode;

import javax.xml.namespace.QName;

import javax.xml.rpc.encoding.TypeMapping;
import javax.xml.rpc.encoding.TypeMappingRegistry;

public class Main{
  
  public static void main( String[] args ){
    try{
      new Main().invoke();
    }catch( Exception e ){
      e.printStackTrace();
    }
  }

  private void invoke() throws Exception{

    //set weblogic ServiceFactory
    System.setProperty( "javax.xml.rpc.ServiceFactory",
        "weblogic.webservice.core.rpc.ServiceFactoryImpl" );

    //create service factory
    ServiceFactory factory = ServiceFactory.newInstance();
  
    //define qnames
    String targetNamespace = "http://soapinterop.org/"; 

    QName serviceName = new QName( targetNamespace, "SimpleTest" );
    QName portName = new QName( targetNamespace, "SimpleTestSoap" );

    QName operationName = new QName( "http://soapinterop.org/", 
        "echoStruct" );

    //create service
    Service service = factory.createService( serviceName );

    TypeMappingRegistry registry = service.getTypeMappingRegistry(); 

    TypeMapping mapping = registry.getTypeMapping( 
        SOAPConstants.URI_NS_SOAP_ENCODING ); 

    mapping.register( SOAPStruct.class, 
        new QName( "http://soapinterop.org/xsd", "SOAPStruct" ),
        new SOAPStructCodec(), 
        new SOAPStructCodec() );

    //create call
    Call call = service.createCall();

    //set port and operation name
    call.setPortTypeName( portName );
    call.setOperationName( operationName );

    call.addParameter( "inputStruct", 
        new QName( "http://soapinterop.org/xsd", "SOAPStruct" ), 
        ParameterMode.IN);

    call.setReturnType( 
        new QName( "http://soapinterop.org/xsd", "SOAPStruct" ) );

    //set end point address
    call.setTargetEndpointAddress( 
        "http://www.mssoapinterop.org/asmx/simple.asmx" ); 

    SOAPStruct s = new SOAPStruct();
    s.setVarInt(2);
    s.setVarString("foo");
    s.setVarFloat(123123);
    System.out.println(s.toString());

    SOAPStruct res = (SOAPStruct) call.invoke(new Object[]{s} );

    System.out.println( res );
  }

}


