package xesj.app.soap;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.xml.namespace.QName;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.client.core.SoapActionCallback;
import org.springframework.ws.soap.saaj.SaajSoapMessage;

/**
 * Saját SoapActionCallback. 
 * Azért van rá szükség, hogy a már összeállított kimenő XML-t még a kiküldés előtt tudjuk módosítani.
 */
public class MySoapActionCallback extends SoapActionCallback {
  
  private final String soapAction;

  /**
   * Konstruktor
   */
  public MySoapActionCallback(String soapAction) {
    
    super(soapAction);
    this.soapAction = soapAction;
    
  }

  /**
   * XML módosítás
   */
  @Override
  public void doWithMessage(WebServiceMessage message) throws IOException {

    // Előkészítés
    super.doWithMessage(message);
    SaajSoapMessage soapMessage = (SaajSoapMessage)message;
    
    // "Action" header hozzáadás
    SoapHeader soapHeader = soapMessage.getSoapHeader();
    SoapHeaderElement soapHeaderElem = soapHeader.addHeaderElement(
      new QName("http://www.w3.org/2005/08/addressing", "wsa:Action")
      );
    soapHeaderElem.setText(soapAction);
    
    // XML output kiírása, ha szükséges 
    if (false) print(soapMessage);
    
  }
  
  /**
   * Kimenő XML kiiratása, ha szükséges
   */
  private void print(SaajSoapMessage soapMessage) throws IOException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    soapMessage.writeTo(out);
    System.out.println("SOAP MESSAGE XML: " + new String(out.toByteArray()));
    
  }
  
  //====
}
