Skip to content

Instantly share code, notes, and snippets.

@veysiertekin
Created April 3, 2014 21:40
Show Gist options
  • Save veysiertekin/e9bd4f1d92064294cb9c to your computer and use it in GitHub Desktop.
Save veysiertekin/e9bd4f1d92064294cb9c to your computer and use it in GitHub Desktop.
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Hashtable;
import javax.xml.namespace.QName;
import javax.xml.rpc.handler.Handler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.soap.SOAPMessage;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
/**
* This class allow to caught/debug request and response xmls.
*
* @author obssdeveloper
*
*/
public class ThreadLocalRPCHandler implements Handler {
private static final Logger logger = Logger.getLogger(ThreadLocalRPCHandler.class);
private static final ThreadLocal<String> operationName = new ThreadLocal<String>();
private static final ThreadLocal<String> requestXML = new ThreadLocal<String>();
private static final ThreadLocal<String> responseXML = new ThreadLocal<String>();
private static final ThreadLocal<String> fakeResponse = new ThreadLocal<String>();
private static final ThreadLocal<Boolean> doNotSendRequest = new ThreadLocal<Boolean>();
private static final ThreadLocal<DateTime> startDate = new ThreadLocal<DateTime>();
private static final ThreadLocal<HashMap<String, String>> httpHeaders = new ThreadLocal<HashMap<String, String>>();
private static final ThreadLocal<SOAPMessageContext> lastRequestContext = new ThreadLocal<SOAPMessageContext>();
private static final ThreadLocal<SOAPMessageContext> lastResponseContext = new ThreadLocal<SOAPMessageContext>();
public static SOAPMessageContext getLastRequestContext() {
return lastRequestContext.get();
}
public static SOAPMessageContext getLastResponseContext() {
return lastResponseContext.get();
}
public static String getRequestXML() {
return requestXML.get();
}
public static String getResponseXML() {
return responseXML.get();
}
public static Boolean getDonotsendrequest() {
return doNotSendRequest.get();
}
public static void doNotSendRequest(Boolean bool) {
doNotSendRequest.set(bool);
}
public static void setFakeResponse(String str) {
fakeResponse.set(str);
}
public static void addHeader(String key, String value) {
if (httpHeaders.get() == null) {
httpHeaders.set(new HashMap<String, String>());
}
httpHeaders.get().put(key, value);
}
@Override
public void destroy() {
logger.debug("@@@@@ In destroy. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode());
}
@Override
public QName[] getHeaders() {
logger.debug("@@@@@ CognosRPCHandler: In getHeaders");
return null;
}
@Override
public boolean handleFault(MessageContext arg0) {
logger.debug("handleFault has been invoked.");
return true;
}
@Override
public boolean handleRequest(MessageContext arg0) {
try {
SOAPMessageContext context = (SOAPMessageContext) arg0;
SOAPMessage message = context.getMessage();
lastRequestContext.set(context);
if (httpHeaders.get() != null && !httpHeaders.get().isEmpty()) {
@SuppressWarnings("unchecked")
Hashtable<String, String> headers = ((Hashtable<String, String>) context.getProperty("HTTP-Request-Headers"));
if (headers == null) {
headers = new Hashtable<String, String>();
context.setProperty("HTTP-Request-Headers", headers);
}
try {
for (String httpKey : httpHeaders.get().keySet()) {
headers.put(httpKey, httpHeaders.get().get(httpKey));
}
}
catch (Exception e) {
e.printStackTrace();
}
httpHeaders.set(null);
}
ByteArrayOutputStream o = new ByteArrayOutputStream();
message.writeTo(o);
try {
operationName.set(message.getSOAPBody().getFirstChild().getLocalName());
logger.error("Operation processing: " + operationName.get());
}
catch (Exception e) {
e.printStackTrace();
}
requestXML.set(o.toString());
logger.debug("SOAP request:\n" + requestXML.get());
if (doNotSendRequest.get() != null && doNotSendRequest.get()) {
doNotSendRequest.set(false);
throw new Error("Request canceled!");
}
startDate.set(...);
return true;
}
catch (Exception e) {
logger.error("Error in request.", e);
}
return false;
}
@Override
public boolean handleResponse(MessageContext arg0) {
try {
SOAPMessageContext context = (SOAPMessageContext) arg0;
lastResponseContext.set(context);
SOAPMessage message = context.getMessage();
ByteArrayOutputStream o = new ByteArrayOutputStream();
message.writeTo(o);
responseXML.set(o.toString());
logger.debug("SOAP response: \n" + responseXML.get());
if (fakeResponse.get() != null) {
InputStream is = new ByteArrayInputStream(fakeResponse.get().getBytes());
message = new org.apache.axis.soap.MessageFactoryImpl().createMessage(null, is);
context.setMessage(message);
fakeResponse.set(null);
}
return true;
}
catch (Exception e) {
logger.debug("Error in response." + e.getMessage());
}
return false;
}
@Override
public void init(HandlerInfo arg0) {
logger.debug("@@@@@ In init. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment