Created
April 3, 2014 21:40
-
-
Save veysiertekin/e9bd4f1d92064294cb9c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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