package fi.arcusys.koku.users;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.apache.log4j.Logger;
/**
* Logs SOAP in/out messages.
* @author mlind
*
*/
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
private static final Logger LOG = Logger.getLogger(SOAPLoggingHandler.class);
// private PrintStream out = ;
@Override
public final Set<QName> getHeaders() {
return null;
}
@Override
public final boolean handleMessage(SOAPMessageContext smc) {
// logToSystemOut(smc);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
smc.getMessage().writeTo(out);
LOG.info(out.toString());
} catch (SOAPException e) {
LOG.error(e);
} catch (IOException ioe) {
LOG.error(ioe);
}
LOG.info("SOAP - '" + out.toString()+"'");
return true;
}
@Override
public final boolean handleFault(SOAPMessageContext smc) {
// logToSystemOut(smc);
return true;
}
@Override
public void close(MessageContext messageContext) {
}
// private void logToSystemOut(SOAPMessageContext smc) {
// LOG.info("LOG SOAP ?!");
//
// Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
//
// if (outboundProperty.booleanValue()) {
// out.println("\n["+new Date()+"] Outbound message:");
// } else {
// out.println("\n["+new Date()+"] Inbound message:");
// }
//
// SOAPMessage message = smc.getMessage();
// try {
// message.writeTo(out);
// LOG.
// out.println(""); // just to add a newline
// LOG.error("SOAP msg - '" + out.toString() + "'");
//
// } catch (Exception e) {
// LOG.error("Exception in handler: "+ e);
// out.println("Exception in handler: " + e);
// }
// }
@SuppressWarnings("rawtypes")
public static void addSOAPLogger(BindingProvider bp) {
LOG.info("Add SOAP logger");
//add logging
Binding binding = bp.getBinding();
List<Handler> handlerList = binding.getHandlerChain();
if (null == handlerList) {
handlerList = new ArrayList<Handler>();
}
handlerList.add(new SOAPLoggingHandler());
binding.setHandlerChain(handlerList);
}
}