aboutsummaryrefslogtreecommitdiff
path: root/cxfImplementations/ContextSetupAspect.java
diff options
context:
space:
mode:
Diffstat (limited to 'cxfImplementations/ContextSetupAspect.java')
-rw-r--r--cxfImplementations/ContextSetupAspect.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/cxfImplementations/ContextSetupAspect.java b/cxfImplementations/ContextSetupAspect.java
new file mode 100644
index 0000000..42ffd5e
--- /dev/null
+++ b/cxfImplementations/ContextSetupAspect.java
@@ -0,0 +1,104 @@
+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 (<code>TransactionContext</code> and
+ * <code>LoggingContext</code>).
+ *
+ * @param context
+ * The <code>TransactionContext</code> 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();
+ }
+}