aboutsummaryrefslogtreecommitdiff
path: root/spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java')
-rw-r--r--spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java135
1 files changed, 124 insertions, 11 deletions
diff --git a/spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java b/spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java
index 64bbb8dbe..985012da2 100644
--- a/spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java
+++ b/spss.server/src/at/gv/egovernment/moa/spss/server/service/AxisHandler.java
@@ -1,34 +1,39 @@
package at.gv.egovernment.moa.spss.server.service;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.X509Certificate;
+import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
import org.apache.axis.AxisFault;
+import org.apache.axis.Message;
import org.apache.axis.MessageContext;
+import org.apache.axis.attachments.AttachmentPart;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.transport.http.HTTPConstants;
import org.apache.axis.utils.Messages;
import org.apache.axis.utils.XMLUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import at.gv.egovernment.moa.logging.LogMsg;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.logging.LoggingContext;
import at.gv.egovernment.moa.logging.LoggingContextManager;
-
import at.gv.egovernment.moa.spss.MOASystemException;
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;
import at.gv.egovernment.moa.spss.util.MessageProvider;
+import at.gv.egovernment.moa.util.DOMUtils;
/**
* An handler that is invoked on each web service request and performs some
@@ -44,7 +49,7 @@ import at.gv.egovernment.moa.spss.util.MessageProvider;
public class AxisHandler extends BasicHandler {
/** The resource names of the messages to load. */
- private static final String MOA_SPSS_WSDL_RESOURCE_ = "/resources/wsdl/MOA-SPSS-1.2.wsdl";
+ private static final String MOA_SPSS_WSDL_RESOURCE_ = "/resources/wsdl/MOA-SPSS-1.3.wsdl";
/** The property name for accessing the HTTP request. */
private static final String REQUEST_PROPERTY = HTTPConstants.MC_HTTP_SERVLETREQUEST;
@@ -55,6 +60,18 @@ public class AxisHandler extends BasicHandler {
/** The property name for accessing the SOAP action header. */
private static final String SOAP_ACTION_HEADER = "soapaction";
+ /** URI of the SOAP XML namespace. */
+ public static final String SOAP_NS_URI = "http://schemas.xmlsoap.org/soap/envelope/";
+
+ /** Prefix used for the SOAP XML namespace */
+ public static final String SOAP_PREFIX = "soapenv";
+
+ /** Simple string contains the front part of the enveloping SOAP wrapping */
+ private static final String SOAP_PART_PRE = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>";
+
+ /** Simple string contains the post part of the enveloping SOAP wrapping */
+ private static final String SOAP_PART_POST = "</soapenv:Body></soapenv:Envelope>";
+
/**
* Handle an invocation of this handler.
*
@@ -86,16 +103,68 @@ public class AxisHandler extends BasicHandler {
X509Certificate[] clientCert =
(X509Certificate[]) request.getAttribute(X509_CERTIFICATE_PROPERTY);
+ //Configure Axis
+ //msgContext.setProperty(org.apache.axis.SOAPPart.ALLOW_FORM_OPTIMIZATION, Boolean.FALSE);
+
+ Message soapMessage = msgContext.getCurrentMessage();
+
ConfigurationProvider configuration =
ConfigurationProvider.getInstance();
+ Element xmlRequest = null;
+ Element soapPart = DOMUtils.parseDocument(new ByteArrayInputStream(soapMessage.getSOAPPartAsBytes()), false, null, null).getDocumentElement();
+ if (soapPart!=null) {
+ NodeList soapBodies = soapPart.getElementsByTagNameNS(SOAP_NS_URI, "Body");
+ if (soapBodies!=null && soapBodies.getLength()>0) {
+ xmlRequest = (Element) soapBodies.item(0).getFirstChild();
+ }
+ //oder TODO: Evaluierung ob XPATH schneller
+ /*
+ HashMap nSMap = new HashMap();
+ nSMap.put((String)SOAP_PREFIX, SOAP_NS_URI);
+ Element soapBody = (Element) XPathUtils.selectSingleNode(soapPart, nSMap, "/"+SOAP_PREFIX+":Envelope/"+SOAP_PREFIX+":Body");
+ if (soapBody!=null) {
+ xmlRequest= (Element) soapBody.getFirstChild();
+ }
+ */
+ }
+
TransactionContext context =
new TransactionContext(
TransactionIDGenerator.nextID(),
clientCert,
- configuration);
+ configuration,
+ xmlRequest,
+ null);
+
+ String soapAction = (String) request.getHeader(SOAP_ACTION_HEADER);
+ if ("\"\"".equals(soapAction)) {
+ // if http soap action header is empty
+ soapAction = msgContext.getTargetService();
+ }
+ context.setRequestName(soapAction);
- context.setRequestName((String) request.getHeader(SOAP_ACTION_HEADER));
+ int attachmentCount = soapMessage.getAttachmentsImpl().getAttachmentCount();
+ if (attachmentCount>0) {
+
+ // add SOAP attachments to transaction context
+ Iterator iterator = soapMessage.getAttachments();
+ while (iterator.hasNext()) {
+ AttachmentPart attachment = (AttachmentPart)iterator.next();
+ String id = attachment.getContentId();
+ String type = attachment.getContentType();
+
+ //Now get the InputStream (note: we could also get the content with Object content = attachment.getContent();)
+ InputStream is = null;
+ javax.activation.DataHandler datahandler = attachment.getDataHandler();
+ org.apache.axis.attachments.ManagedMemoryDataSource mmds = (org.apache.axis.attachments.ManagedMemoryDataSource)datahandler.getDataSource();
+ if (mmds!=null){
+ is = mmds.getInputStream();
+ }
+ debug("handler.06", new Object[] {id, type});
+ context.addAttachment(id, type, mmds);
+ }
+ }
setUpContexts(context);
@@ -118,7 +187,7 @@ public class AxisHandler extends BasicHandler {
info("handler.03", null);
}
if (Logger.isDebugEnabled()) {
- String msg = msgContext.getCurrentMessage().getSOAPPartAsString();
+ String msg = soapMessage.getSOAPPartAsString();
Logger.debug(new LogMsg(msg));
}
} catch (MOASystemException e) {
@@ -127,6 +196,8 @@ public class AxisHandler extends BasicHandler {
fault.setFaultDetail(new Element[] { se.toErrorResponse()});
throw fault;
} catch (Throwable t) {
+ t.printStackTrace();
+ Logger.info(new LogMsg(t.getStackTrace()));
MOASystemException e = new MOASystemException("2900", null, t);
AxisFault fault = AxisFault.makeFault(e);
fault.setFaultDetail(new Element[] { e.toErrorResponse()});
@@ -142,10 +213,35 @@ public class AxisHandler extends BasicHandler {
* @throws AxisFault An error occurred during processing of the response.
*/
private void handleResponse(MessageContext msgContext) throws AxisFault {
+ String xmlResponseString = null;
+ String soapResponseString = null;
+
+ TransactionContext context = TransactionContextManager.getInstance().getTransactionContext();
+ Element xmlResponse = context.getResponse();
+
+ if (xmlResponse!=null) {
+ try {
+ xmlResponseString = DOMUtils.serializeNode(xmlResponse, true);
+ soapResponseString = SOAP_PART_PRE + xmlResponseString + SOAP_PART_POST;
+ //override axis response-message
+ msgContext.setResponseMessage(new Message(soapResponseString));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Logger.info(new LogMsg(t.getStackTrace()));
+ MOASystemException e = new MOASystemException("2900", null, t);
+ AxisFault fault = AxisFault.makeFault(e);
+ fault.setFaultDetail(new Element[] { e.toErrorResponse()});
+ throw fault;
+ }
+
+ } else {
+ //Fallback: if functions do not set the resulting response in the transaction, the original one from axis will be used
+ xmlResponseString = msgContext.getCurrentMessage().getSOAPPartAsString();
+ }
+
info("handler.04", null);
if (Logger.isDebugEnabled()) {
- String msg = msgContext.getCurrentMessage().getSOAPPartAsString();
- Logger.debug(new LogMsg(msg));
+ Logger.debug(new LogMsg(xmlResponseString));
}
tearDownContexts();
}
@@ -183,8 +279,13 @@ public class AxisHandler extends BasicHandler {
* Tear down the thread-local contexts.
*/
private void tearDownContexts() {
- // unset the transaction context
TransactionContextManager tcm = TransactionContextManager.getInstance();
+
+ //delete temporary files
+ TransactionContext context = tcm.getTransactionContext();
+ context.cleanAttachmentCache();
+
+ // unset the transaction context
tcm.setTransactionContext(null);
// unset the logging context
@@ -250,4 +351,16 @@ public class AxisHandler extends BasicHandler {
Logger.info(new LogMsg(msg.getMessage(messageId, parameters)));
}
+ /**
+ * Utility function to issue an debug message to the log.
+ *
+ * @param messageId The ID of the message to log.
+ * @param parameters Additional message parameters.
+ */
+ private static void debug(String messageId, Object[] parameters) {
+ MessageProvider msg = MessageProvider.getInstance();
+
+ Logger.debug(new LogMsg(msg.getMessage(messageId, parameters)));
+ }
+
}