package org.apache.axis2.jaxws.addressbook;

import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;

import java.util.Map;

/**
 * Simple JAX-WS Dispatch client for the address book service implementation.
 */
public class AddressBookClient {
    private static String NAMESPACE = "http://addressbook.jaxws.axis2.apache.org";
    private static QName QNAME_SERVICE = new QName(NAMESPACE, "service");
    private static QName QNAME_PORT = new QName(NAMESPACE, "port");
    private static String ENDPOINT_URL = "http://localhost:8080/axis2/services/AddressBookImplService.AddressBookImplPort";

    private static String ADD_ENTRY_BODY_CONTENTS = 
        "<ns1:addEntry xmlns:ns1=\"http://addressbook.jaxws.axis2.apache.org\">" + 
          "<ns1:firstName xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myFirstName</ns1:firstName>" + 
          "<ns1:lastName xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myLastName</ns1:lastName>" + 
          "<ns1:phone xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myPhone</ns1:phone>" + 
          "<ns1:street xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myStreet</ns1:street>" + 
          "<ns1:city xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myCity</ns1:city>" + 
          "<ns1:state xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myState</ns1:state>" + 
        "</ns1:addEntry>";
    
    private static String FIND_BODY_CONTENTS = 
        "<ns1:findByLastName xmlns:ns1=\"http://addressbook.jaxws.axis2.apache.org\">" +
          "<ns1:lastName xmlns=\"http://addressbook.jaxws.axis2.apache.org\">myLastName</ns1:lastName>" +        
        "</ns1:findByLastName>";
    
    public static void main(String[] args) {
        try {
            System.out.println("AddressBookClient ...");
            
            Service svc = Service.create(QNAME_SERVICE);
            svc.addPort(QNAME_PORT, null, ENDPOINT_URL);

            // A Dispatch<String> client sends the request and receives the response as 
            // Strings.  Since it is PAYLOAD mode, the client will provide the SOAP body to be 
            // sent; the SOAP envelope and any required SOAP headers will be added by JAX-WS.
            Dispatch<String> dispatch = svc.createDispatch(QNAME_PORT, 
                    String.class, Service.Mode.PAYLOAD);
                
            // Invoke the Dispatch
            System.out.println(">> Invoking sync Dispatch for AddEntry");
            String response = dispatch.invoke(ADD_ENTRY_BODY_CONTENTS);
            System.out.println("Add Entry response: " + response);
            
            System.out.println(">> Invoking Dispatch for findByLastName");
            String response2 = dispatch.invoke(FIND_BODY_CONTENTS);
            System.out.println("Find response: " + response2);
        } catch (Exception e) {
            System.out.println("Caught exception: " + e);
            e.printStackTrace();
        }
    }
}
