package examples.mega.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;

public final class LogHandler extends GenericHandler
{
    private HandlerInfo config;

    public void init(HandlerInfo config)
    {
	this.config = config;
    }

    public QName[] getHeaders()
    {
	return config.getHeaders();
    }

    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() );
            }
	}
    }

    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)
    {
	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)
    {
	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;
    }
}

