package com.sams.jws.chapter15;
/*
 * HelloWorldSender
 * Bardzo prosty przykład profilu JAXM SOAP bez łącznika. 
 * Demonstracja synchronicznego żądania w modelu klient-serwer.
 */
// Ogólne JDK
import java.io.IOException;
// JAXM
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
import javax.xml.messaging.URLEndpoint;

public class HelloWorldSender {

    public static void main(String args[]) {

        URLEndpoint urlEndpoint = null;
        if (args.length == 1)
            urlEndpoint = new URLEndpoint(args[0]);
        else {
            System.err.println("Polecenie: java HelloWorldSender targetURL");
            System.exit(0);
        } // Else

        try {
            // Inicjalizacja połączenia i profilu SOAP.
            System.out.println("Otwieranie połączenia...");
            SOAPConnectionFactory soapConnFct = SOAPConnectionFactory.newInstance();
            SOAPConnection soapConnection = soapConnFct.createConnection();

            System.out.println("Tworzenie komunikatu...");
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage requestSoapMsg = messageFactory.createMessage();

            // Tworzenie odwołań do komponentów komunikatu SOAP
            SOAPPart requestSoapPart = requestSoapMsg.getSOAPPart();
            SOAPEnvelope requestSoapEnv = requestSoapPart.getEnvelope();
            SOAPHeader requestSoapHdr = requestSoapEnv.getHeader();

            // Dołączanie pola nagłówka. Pola nagłówka są opcjonalne.
            Name questionName = requestSoapEnv.createName("Question");
            SOAPHeaderElement questionElement =
                requestSoapHdr.addHeaderElement(questionName);
            questionElement.setMustUnderstand(true);
            questionElement.addTextNode("Puk, puk?");

            /*
            * Należy pamiętać, że element ciała nie został zdefiniowany. 
            * Ponieważ jest to pole obowiązkowe, JAXM 
            * niejawnie utworzy pusty element ciała.
            */

            // Zapisanie wszystkich zmian dokonanych w komunikacie przed wydrukiem. 
            // Wysłanie także niejawnie zapisze zmiany.
            requestSoapMsg.saveChanges();

            System.out.println("HelloWorldSender wysyła następujący komunikat:");
            try {
                requestSoapMsg.writeTo(System.out);
            } catch (IOException e) {
                System.err.println(
                    "Wyjątek IOException przy próbie zapisu SOAPMessage do urządzenia System.out: ");
                e.printStackTrace();
            }
            System.out.println("\nNa adres URL: ");
            System.out.println(urlEndpoint.getURL() + "\n");

            // Wyślij żądanie i zablokuj aplikację do momentu otrzymania odpowiedzi.
            SOAPMessage responseSoapMsg = soapConnection.call(requestSoapMsg, urlEndpoint);

            System.out.println("Aplikacja HelloWorldSender otrzymała następujący komunikat odpowiedzi:");
            try {
                responseSoapMsg.writeTo(System.out);
                System.out.println("\n");
            } catch (IOException e) {
                System.err.println(
                    "Wyjątek IOException przy próbie zapisu SOAPMessage do urządzenia System.out: ");
                e.printStackTrace();
            }

            // Porządki
            soapConnection.close();
            System.out.println("Połączenie zamknięte.");

        } catch (SOAPException e) {
            System.err.println("Wystąpił ogólny wyjątek SOAPException: ");
            e.printStackTrace();
        }
        System.out.println("Gotowe.");
    } // main()
} // HelloWorldSender
