Author: asankha
Date: Mon Jan  7 07:10:24 2008
New Revision: 609631

URL: http://svn.apache.org/viewvc?rev=609631&view=rev
Log:
Fix SYNAPSE-187 and SYNAPSE-191

Modified:
    
webservices/synapse/branches/1.1.1/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java

Modified: 
webservices/synapse/branches/1.1.1/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/branches/1.1.1/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java?rev=609631&r1=609630&r2=609631&view=diff
==============================================================================
--- 
webservices/synapse/branches/1.1.1/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java
 (original)
+++ 
webservices/synapse/branches/1.1.1/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java
 Mon Jan  7 07:10:24 2008
@@ -29,9 +29,13 @@
 import org.apache.axiom.om.impl.llom.OMSourcedElementImpl;
 import org.apache.axiom.om.impl.llom.OMTextImpl;
 import org.apache.axiom.om.util.ElementHelper;
+import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.om.xpath.AXIOMXPath;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAPConstants;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.config.Entry;
@@ -42,6 +46,7 @@
 import org.apache.synapse.transport.base.BaseConstants;
 import org.apache.synapse.util.FixedByteArrayOutputStream;
 import org.apache.synapse.util.TextFileDataSource;
+import org.apache.axis2.AxisFault;
 import org.jaxen.JaxenException;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -51,6 +56,7 @@
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.*;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;
@@ -59,6 +65,7 @@
 import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Iterator;
 
 /**
  * The XSLT mediator performs an XSLT transformation requested, using
@@ -209,6 +216,8 @@
         ByteArrayOutputStream baosForTarget = new 
FixedByteArrayOutputStream(BYTE_ARRAY_SIZE);
         File tempTargetFile = null;
         File tempSourceFile = null;
+        boolean isSoapEnvelope = (sourceNode == synCtx.getEnvelope());
+        boolean isSoapBody = (sourceNode == synCtx.getEnvelope().getBody());
 
         if (traceOrDebugOn) {
             trace.trace("Transformation source : " + sourceNode.toString());
@@ -396,8 +405,13 @@
                 // if we used a temporary file for the output of the 
transformation, read from it
                 if (tempTargetFile != null) {
                     try {
-                        StAXOMBuilder builder = new StAXOMBuilder(new 
FileInputStream(tempTargetFile));
-                        result = builder.getDocumentElement();
+                        XMLStreamReader reader = 
StAXUtils.createXMLStreamReader(
+                            new FileInputStream(tempTargetFile));
+                        if (isSoapEnvelope) {
+                            result = new 
StAXSOAPModelBuilder(reader).getSOAPEnvelope();
+                        } else {
+                            result = new 
StAXOMBuilder(reader).getDocumentElement();
+                        }                        
 
                     } catch (XMLStreamException e) {
                         handleException(
@@ -416,9 +430,13 @@
                 } else {
                     // read the Fixed byte array stream
                     try {
-                        StAXOMBuilder builder = new StAXOMBuilder(
+                        XMLStreamReader reader = 
StAXUtils.createXMLStreamReader(
                             new 
ByteArrayInputStream(baosForTarget.toByteArray()));
-                        result = builder.getDocumentElement();
+                        if (isSoapEnvelope) {
+                            result = new 
StAXSOAPModelBuilder(reader).getSOAPEnvelope();
+                        } else {
+                            result = new 
StAXOMBuilder(reader).getDocumentElement();
+                        }
 
                     } catch (XMLStreamException e) {
                         handleException(
@@ -450,11 +468,34 @@
                 synCtx.setProperty(targetPropertyName, result);
             } else {
                 if (traceOrDebugOn) {
-                    traceOrDebug(traceOn, "Replace source node with result");
+                    traceOrDebug(traceOn, "Replace " +
+                        (isSoapEnvelope ? "SOAP envelope" : isSoapBody ? "SOAP 
body" : "node")
+                        + " with result");
+                }
+
+                if (isSoapEnvelope) {
+                    try {
+                        synCtx.setEnvelope((SOAPEnvelope) result);
+                    } catch (AxisFault ex) {
+                        handleException("Unable to replace SOAP envelope with 
result", ex, synCtx);
+                    }
+
+                } else if (isSoapBody) {
+                    for (Iterator iter = 
synCtx.getEnvelope().getBody().getChildElements();
+                        iter.hasNext(); ) {
+                        OMElement child = (OMElement) iter.next();
+                        child.detach();
+                    }
+
+                    for (Iterator iter = result.getChildElements(); 
iter.hasNext(); ) {
+                        OMElement child = (OMElement) iter.next();
+                        synCtx.getEnvelope().getBody().addChild(child);
+                    }
+
+                } else {
+                    sourceNode.insertSiblingAfter(result);
+                    sourceNode.detach();
                 }
-                // replace the sourceNode with the result.
-                sourceNode.insertSiblingAfter(result);
-                sourceNode.detach();
             }
 
         } catch (TransformerException e) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to