package tutorial.sample4.client;

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;

import weblogic.webservice.WLMessageContext;
import weblogic.webservice.Operation;
import weblogic.webservice.Port;

public class ClientHandler extends GenericHandler{

  private HandlerInfo config;

  public void init( HandlerInfo config ){
    this.config = config;
  }

  public QName[] getHeaders(){
    return config.getHeaders();
  }

  private void findEndpointAddress( WLMessageContext context ){
    Operation operation = context.getOperation();
    Port port = operation.getPort();
    String address = port.getAddress();
    System.out.println( "Address is" + address );
  }

  private void logContents( SOAPElement element, int level ){
    Name elementName = null;
    elementName = element.getElementName();
    System.out.println( getLevel(level) + "+" + elementName );

    Iterator children = element.getChildElements();

    while (children.hasNext()) {
      Node node = (Node)children.next();

      if( node instanceof SOAPElement ){
        SOAPElement child = (SOAPElement)node;
        logContents(child, level + 1);
      }else{
        Text child = (Text)node;
        System.out.println( getLevel(level) + "-" + child.getValue() );
        System.out.flush();
      }
    }
  }

  private static String getLevel( int level ){
    StringBuffer sb = new StringBuffer();

    for( int i=0; i<level; i++ ){
      sb.append( "  " );
    }

    return sb.toString();
  }

  public boolean handleRequest(MessageContext mc){
    System.out.println( "handleRequest Called ............." );

    findEndpointAddress( (WLMessageContext)mc );

    try{
      SOAPMessageContext ctx = (SOAPMessageContext)mc;
      SOAPMessage request = ctx.getMessage();
      SOAPBody body = request.getSOAPPart().getEnvelope().getBody();
      logContents( body, 0 );
    }catch( SOAPException e ){
      e.printStackTrace();
      throw new JAXRPCException(e);
    }

    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();
      logContents( body, 0 );
    }catch( SOAPException e ){
      e.printStackTrace();
      throw new JAXRPCException(e);
    }

    return true;
  }
}

