package at.gv.egovernment.moa.spss.server.webservice.impl; import java.security.cert.X509Certificate; import javax.servlet.http.HttpServletRequest; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.apache.cxf.transport.http.AbstractHTTPDestination; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; import at.gv.egovernment.moa.logging.LoggingContext; import at.gv.egovernment.moa.logging.LoggingContextManager; import at.gv.egovernment.moa.spss.server.config.ConfigurationException; import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider; import at.gv.egovernment.moa.spss.server.transaction.TransactionContext; import at.gv.egovernment.moa.spss.server.transaction.TransactionContextManager; import at.gv.egovernment.moa.spss.server.transaction.TransactionIDGenerator; @Aspect public class ContextSetupAspect { private static final Logger logger = LoggerFactory.getLogger(ContextSetupAspect.class); /** The property name for accessing the X509 client certificate chain. */ private static final String X509_CERTIFICATE_PROPERTY = "javax.servlet.request.X509Certificate"; /** The property name for accessing the SOAP action header. */ private static final String SOAP_ACTION_HEADER = "soapaction"; /** * Set up the thread-local contexts (TransactionContext and * LoggingContext). * * @param context * The TransactionContext to set for the current * request. */ private static void setUpContexts(TransactionContext context) { // set the transaction context in the TransactionContextManager TransactionContextManager tcm = TransactionContextManager.getInstance(); tcm.setTransactionContext(context); // set the logging context in the LoggingContextManager LoggingContextManager lcm = LoggingContextManager.getInstance(); LoggingContext lc = new LoggingContext(context.getTransactionID()); lcm.setLoggingContext(lc); } /** * Tear down the thread-local contexts. */ private static void tearDownContexts() { TransactionContextManager tcm = TransactionContextManager.getInstance(); // delete temporary files TransactionContext context = tcm.getTransactionContext(); context.cleanAttachmentCache(); // unset the transaction context tcm.setTransactionContext(null); // unset the logging context LoggingContextManager lcm = LoggingContextManager.getInstance(); lcm.setLoggingContext(null); } public static void setupContext(MessageContext messageContext, String targetService) throws ConfigurationException { logger.debug("Context setup"); HttpServletRequest request = (HttpServletRequest) messageContext .get(AbstractHTTPDestination.HTTP_REQUEST); X509Certificate[] clientCert = (X509Certificate[]) request.getAttribute(X509_CERTIFICATE_PROPERTY); ConfigurationProvider configuration = ConfigurationProvider.getInstance(); Element xmlRequest = null; if (messageContext instanceof SOAPMessageContext) { SOAPMessageContext soapMessageContext = (SOAPMessageContext) messageContext; xmlRequest = soapMessageContext.getMessage().getSOAPPart().getDocumentElement(); } TransactionContext context = new TransactionContext(TransactionIDGenerator.nextID(), clientCert, configuration, xmlRequest, null); String soapAction = (String) request.getHeader(SOAP_ACTION_HEADER); if ("\"\"".equals(soapAction)) { // if http soap action header is empty soapAction = targetService; } context.setRequestName(soapAction); setUpContexts(context); } public static void cleanContext() { logger.debug("Context clean up"); tearDownContexts(); } }