package com.sams.jws.chapter15;
/*
 * HelloWorldReceiver
 * Odbiera komunikat JAXM i wysyła odpowiedź w rozsądnym czasie.
 */

// Ogólne JDK
import java.io.IOException;
// JAXM
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.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPException;
import javax.xml.messaging.JAXMServlet;
import javax.xml.messaging.ReqRespListener;
// Serwlet
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;

public class HelloWorldReceiver
    extends JAXMServlet
    implements ReqRespListener {
    MessageFactory messageFactory = null;
    public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
        try {
            messageFactory = MessageFactory.newInstance();
        } catch (SOAPException e) {
            System.err.println("Podczas tworzenia instancji MessageFactory wystąpił błąd:");
            e.printStackTrace();
        } // Catch
    }
    public SOAPMessage onMessage(SOAPMessage requestSoapMsg) {
        System.out.println(
            "HelloWorldReceiver odebrał w onMessage() następujący komunikat JAXM:");
        try {
            requestSoapMsg.writeTo(System.out);
            System.out.println("\n");

            SOAPMessage responseSoapMsg = messageFactory.createMessage();

            /*
             * Warto zauważyć, że nie został zdefiniowany element nagłówka. 
             * Chociaż jest to element nieobowiązkowy, JAXM 
             * niejawnie utworzy pusty nagłówek.
             */
            // Tworzenie elementu ciała zawierającego odpowiedź.
            SOAPEnvelope responseSoapEnv = responseSoapMsg.getSOAPPart()
                                                          .getEnvelope();
            SOAPBody responseSoapBody = responseSoapEnv.getBody();
            SOAPBodyElement responseSoapBodyEl =
                responseSoapBody.addBodyElement(responseSoapEnv.createName("Response"));
            responseSoapBodyEl.addTextNode("Witaj!!!");

            responseSoapMsg.saveChanges();
            System.out.println(
                "HelloWorldReceiver odpowiada za pomocą następującego komunikatu JAXM:");
            responseSoapMsg.writeTo(System.out);
            System.out.println("\n");

            return responseSoapMsg;

        } catch (SOAPException e) {
            System.err.println("Podczas przetwarzania lub wysyłania odpowiedzi na komunikat wystąpił błąd");
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            System.err.println(
                "Podczas zapisu SOAPMessage do System.out wystąpił wyjątek IOException: ");
            e.printStackTrace();
            return null;
        }
    } // onMessage()
} // HelloWorldReceiver
