package tutorial.sample4;

import java.util.Iterator;

import javax.xml.namespace.QName;

import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.GenericHandler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;

import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.Text;
import javax.xml.soap.Node;

public class ServerHandler extends GenericHandler{

  private HandlerInfo config;
  private String handlerMessage;

  public void init( HandlerInfo config ){
    this.config = config;
    
    handlerMessage = (String)config.getHandlerConfig().get(
        "handler-message" );
  }

  public QName[] getHeaders(){
    return config.getHeaders();
  }

  public boolean handleRequest(MessageContext mc){
    System.out.println( "handleRequest Called ............." );
    return true;
  }

  public boolean handleResponse( MessageContext mc ){
    System.out.println( "handleResponse Called ............." );

    try {
      SOAPMessageContext ctx = (SOAPMessageContext)mc;
      SOAPMessage request = ctx.getMessage();
      SOAPBody body = request.getSOAPPart().getEnvelope().getBody();
      SOAPElement operation = getFirstChild( body );
      SOAPElement result = getFirstChild( operation );
      System.out.println( "Result is :" + result.getValue() );
      result.addTextNode( handlerMessage );
    }catch( SOAPException e ){
      e.printStackTrace();
      throw new JAXRPCException(e);
    }

    return true;
  }

  private SOAPElement getFirstChild( SOAPElement element ){

    Iterator children = element.getChildElements();

    while (children.hasNext()) {
      Node node = (Node)children.next();

      if( node instanceof SOAPElement ){
        SOAPElement child = (SOAPElement)node;
        return child;
      }
    }

    return null;
  }

}

