You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ve...@apache.org on 2008/06/27 22:48:10 UTC

svn commit: r672386 - in /synapse/trunk/java/modules/core/src: main/java/org/apache/synapse/mediators/transform/ main/java/org/apache/synapse/util/jaxp/ test/java/org/apache/synapse/mediators/transform/ test/resources/org/apache/synapse/mediators/trans...

Author: veithen
Date: Fri Jun 27 13:48:09 2008
New Revision: 672386

URL: http://svn.apache.org/viewvc?rev=672386&view=rev
Log:
SYNAPSE-378: Refactored XSLTMediator so that (Source|Result)BuilderFactory classes are used. They can be selected by setting Synapse specific transformer factory attributes.

Added:
    synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/mediators/transform/identity.xslt
Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilder.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilderFactory.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilder.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilderFactory.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilder.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilderFactory.java
    synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/XSLTMediatorTest.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/transform/XSLTMediator.java Fri Jun 27 13:48:09 2008
@@ -19,40 +19,30 @@
 
 package org.apache.synapse.mediators.transform;
 
-import org.apache.axiom.om.OMAbstractFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNode;
-import org.apache.axiom.om.impl.builder.StAXOMBuilder;
-import org.apache.axiom.om.impl.dom.DOOMAbstractFactory;
-import org.apache.axiom.om.impl.dom.jaxp.DocumentBuilderFactoryImpl;
-import org.apache.axiom.om.util.ElementHelper;
-import org.apache.axiom.om.util.StAXUtils;
 import org.apache.axiom.soap.SOAPEnvelope;
-import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
 import org.apache.axis2.AxisFault;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.SynapseLog;
 import org.apache.synapse.config.Entry;
 import org.apache.synapse.config.SynapseConfigUtils;
+import org.apache.synapse.core.SynapseEnvironment;
 import org.apache.synapse.mediators.AbstractMediator;
 import org.apache.synapse.mediators.MediatorProperty;
+import org.apache.synapse.util.jaxp.DOOMResultBuilderFactory;
+import org.apache.synapse.util.jaxp.DOOMSourceBuilderFactory;
+import org.apache.synapse.util.jaxp.ResultBuilder;
+import org.apache.synapse.util.jaxp.ResultBuilderFactory;
+import org.apache.synapse.util.jaxp.SourceBuilder;
+import org.apache.synapse.util.jaxp.SourceBuilderFactory;
+import org.apache.synapse.util.jaxp.StreamResultBuilderFactory;
+import org.apache.synapse.util.jaxp.StreamSourceBuilderFactory;
 import org.apache.synapse.util.xpath.SourceXPathSupport;
 import org.apache.synapse.util.xpath.SynapseXPath;
-import org.apache.synapse.util.AXIOMUtils;
-import org.apache.synapse.util.TemporaryData;
-import org.apache.synapse.util.TextFileDataSource;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
+
 import javax.xml.transform.*;
-import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.*;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -103,11 +93,24 @@
     }
     
     /**
-     * The feature for which deciding swiching between DOM and Stream during the
+     * The feature for which deciding switching between DOM and Stream during the
      * transformation process
      */
     public static final String USE_DOM_SOURCE_AND_RESULTS =
         "http://ws.apache.org/ns/synapse/transform/feature/dom";
+    
+    /**
+     * The name of the attribute that allows to specify the {@link SourceBuilderFactory}.
+     */
+    public static final String SOURCE_BUILDER_FACTORY =
+        "http://ws.apache.org/ns/synapse/transform/attribute/sbf";
+    
+    /**
+     * The name of the attribute that allows to specify the {@link ResultBuilderFactory}.
+     */
+    public static final String RESULT_BUILDER_FACTORY =
+        "http://ws.apache.org/ns/synapse/transform/attribute/rbf";
+    
     /**
      * The resource key/name which refers to the XSLT to be used for the transformation
      */
@@ -158,9 +161,14 @@
     private final Object transformerLock = new Object();
 
     /**
-     *  Is it need to use DOMSource and DOMResult?
+     * The source builder factory to use.
      */
-    private boolean useDOMSourceAndResults = false;
+    private SourceBuilderFactory sourceBuilderFactory = new StreamSourceBuilderFactory();
+    
+    /**
+     * The result builder factory to use.
+     */
+    private ResultBuilderFactory resultBuilderFactory = new StreamResultBuilderFactory();
 
     /**
      * Transforms this message (or its element specified as the source) using the
@@ -200,8 +208,6 @@
     private void performXSLT(MessageContext synCtx, SynapseLog synLog) {
 
         OMNode sourceNode = source.selectOMNode(synCtx, synLog);
-        TemporaryData tempTargetData = null;
-        OutputStream osForTarget;
         boolean isSoapEnvelope = (sourceNode == synCtx.getEnvelope());
         boolean isSoapBody = (sourceNode == synCtx.getEnvelope().getBody());
 
@@ -209,37 +215,6 @@
             synLog.traceTrace("Transformation source : " + sourceNode.toString());
         }
 
-        Source transformSrc;
-        Result transformTgt;
-
-        if (useDOMSourceAndResults) {
-            synLog.traceOrDebug("Using a DOMSource for transformation");
-
-            // for fast transformations create a DOMSource - ** may not work always though **
-            transformSrc = new DOMSource(
-                ((Element) ElementHelper.importOMElement((OMElement) sourceNode,
-                DOOMAbstractFactory.getOMFactory())).getOwnerDocument());
-            DocumentBuilderFactoryImpl.setDOOMRequired(true);
-
-            try {
-                transformTgt = new DOMResult(
-                    DocumentBuilderFactoryImpl.newInstance().newDocumentBuilder().newDocument());
-            } catch (ParserConfigurationException e) {
-                throw new SynapseException("Error creating a DOMResult for the transformation," +
-                    " Consider setting optimization feature : " + USE_DOM_SOURCE_AND_RESULTS +
-                    " off", e, synLog);
-            }
-
-        } else {
-            synLog.traceOrDebug("Using byte array serialization for transformation");
-
-            transformSrc = AXIOMUtils.asSource(sourceNode);
-            
-            tempTargetData = synCtx.getEnvironment().createTemporaryData();
-            osForTarget = tempTargetData.getOutputStream();
-            transformTgt = new StreamResult(osForTarget);
-        }
-
         // build transformer - if necessary
         Entry dp = synCtx.getConfiguration().getEntryDefinition(xsltKey);
 
@@ -273,60 +248,40 @@
 
             transformer.setErrorListener(new ErrorListenerImpl(synLog, "XSLT transformation"));
             
-            transformer.transform(transformSrc, transformTgt);
-
-            synLog.traceOrDebug("Transformation completed - processing result");
-
-            // get the result OMElement
-            OMElement result;
-            if (transformTgt instanceof DOMResult) {
-
-                Node node = ((DOMResult) transformTgt).getNode();
-                if (node == null) {
-                    synLog.traceOrDebug("Transformation result (DOMResult) was null");
-                    return;
-                }
-
-                Node resultNode = node.getFirstChild();
-                if (resultNode == null) {
-                    synLog.traceOrDebug("Transformation result (DOMResult) was empty");
-                    return;
-                }
-
-                result = ElementHelper.importOMElement(
-                    (OMElement) resultNode, OMAbstractFactory.getOMFactory());
+            String outputMethod = transformer.getOutputProperty(OutputKeys.METHOD);
+            String encoding = transformer.getOutputProperty(OutputKeys.ENCODING);
 
+            if (synLog.isTraceOrDebugEnabled()) {
+                synLog.traceOrDebug("output method: " + outputMethod
+                        + "; encoding: " + encoding);
+            }
+            
+            ResultBuilderFactory.Output output;
+            if ("text".equals(outputMethod)) {
+                synLog.traceOrDebug("Processing non SOAP/XML (text) transformation result");
+                output = ResultBuilderFactory.Output.TEXT;
+            } else if (isSoapEnvelope) {
+                output = ResultBuilderFactory.Output.SOAP_ENVELOPE;
             } else {
+                output = ResultBuilderFactory.Output.ELEMENT;
+            }
+            
+            SynapseEnvironment synEnv = synCtx.getEnvironment();
+            ResultBuilder resultBuilder =
+                    resultBuilderFactory.createResultBuilder(synEnv, output);
+            SourceBuilder sourceBuilder = sourceBuilderFactory.createSourceBuilder(synEnv);
+            
+            try {
+                transformer.transform(sourceBuilder.getSource((OMElement)sourceNode),
+                                      resultBuilder.getResult());
+            } finally {
+                sourceBuilder.release();
+            }
 
-                String outputMethod = transformer.getOutputProperty(OutputKeys.METHOD);
-                String encoding = transformer.getOutputProperty(OutputKeys.ENCODING);
+            synLog.traceOrDebug("Transformation completed - processing result");
 
-                if (synLog.isTraceOrDebugEnabled()) {
-                    synLog.traceOrDebug("output method: " + outputMethod
-                            + "; encoding: " + encoding);
-                }
-                
-                if ("text".equals(outputMethod)) {
-                    result = handleNonXMLResult(tempTargetData, Charset.forName(encoding), synLog);
-                } else {
-                    try {
-                        XMLStreamReader reader = StAXUtils.createXMLStreamReader(
-                            tempTargetData.getInputStream());
-                        if (isSoapEnvelope) {
-                            result = new StAXSOAPModelBuilder(reader).getSOAPEnvelope();
-                        } else {
-                            result = new StAXOMBuilder(reader).getDocumentElement();
-                        }                        
-    
-                    } catch (XMLStreamException e) {
-                        throw new SynapseException(
-                            "Error building result element from XSLT transformation", e, synLog);
-    
-                    } catch (IOException e) {
-                        throw new SynapseException("Error reading temporary data", e, synLog);
-                    }
-                }
-            }
+            // get the result OMElement
+            OMElement result = resultBuilder.getNode(Charset.forName(encoding));
 
             if (synLog.isTraceTraceEnabled()) {
                 synLog.traceTrace("Transformation result : " + result.toString());
@@ -440,24 +395,27 @@
      * @see XSLTMediator
      */
     public void addFeature(String featureName, boolean isFeatureEnable) {
-        try {
-            MediatorProperty mp = new MediatorProperty();
-            mp.setName(featureName);
+        MediatorProperty mp = new MediatorProperty();
+        mp.setName(featureName);
+        if (isFeatureEnable) {
+            mp.setValue("true");
+        } else {
+            mp.setValue("false");
+        }
+        transformerFactoryFeatures.add(mp);
+        if (USE_DOM_SOURCE_AND_RESULTS.equals(featureName)) {
             if (isFeatureEnable) {
-                mp.setValue("true");
-            } else {
-                mp.setValue("false");
+                sourceBuilderFactory = new DOOMSourceBuilderFactory();
+                resultBuilderFactory = new DOOMResultBuilderFactory();
             }
-            transformerFactoryFeatures.add(mp);
-            if (USE_DOM_SOURCE_AND_RESULTS.equals(featureName)) {
-                useDOMSourceAndResults = isFeatureEnable;
-            } else {
+        } else {
+            try {
                 transFact.setFeature(featureName, isFeatureEnable);
+            } catch (TransformerConfigurationException e) {
+                String msg = "Error occured when setting features to the TransformerFactory";
+                log.error(msg, e);
+                throw new SynapseException(msg, e);
             }
-        } catch (TransformerConfigurationException e) {
-            String msg = "Error occured when setting features to the TransformerFactory";
-            log.error(msg, e);
-            throw new SynapseException(msg, e);
         }
     }
 
@@ -477,33 +435,36 @@
         mp.setName(name);
         mp.setValue(value);
         transformerFactoryAttributes.add(mp);
-        try {
-            transFact.setAttribute(name, value);
-        } catch (IllegalArgumentException e) {
-            String msg = "Error occured when setting attribute to the TransformerFactory";
-            log.error(msg, e);
-            throw new SynapseException(msg, e);
+        if (SOURCE_BUILDER_FACTORY.equals(name) || RESULT_BUILDER_FACTORY.equals(name)) {
+            Object instance;
+            try {
+                instance = Class.forName(value).newInstance();
+            } catch (ClassNotFoundException e) {
+                String msg = "The class specified by the " + name + " attribute was not found";
+                log.error(msg, e);
+                throw new SynapseException(msg, e);
+            } catch (Exception e) {
+                String msg = "The class " + value + " could not be instantiated";
+                log.error(msg, e);
+                throw new SynapseException(msg, e);
+            }
+            if (SOURCE_BUILDER_FACTORY.equals(name)) {
+                sourceBuilderFactory = (SourceBuilderFactory)instance;
+            } else {
+                resultBuilderFactory = (ResultBuilderFactory)instance;
+            }
+        } else {
+            try {
+                transFact.setAttribute(name, value);
+            } catch (IllegalArgumentException e) {
+                String msg = "Error occured when setting attribute to the TransformerFactory";
+                log.error(msg, e);
+                throw new SynapseException(msg, e);
+            }
         }
     }
 
     /**
-     * If the transformation results in a non-XML payload, use standard wrapper elements
-     * to wrap the text payload so that other mediators could still process the result
-     * @param tempData the encoded text payload
-     * @param charset the encoding of the payload
-     * @param synLog the logger to be used
-     * @return an OMElement wrapping the text payload
-     */
-    private OMElement handleNonXMLResult(TemporaryData tempData, Charset charset,
-                                         SynapseLog synLog) {
-
-        synLog.traceOrDebug("Processing non SOAP/XML (text) transformation result");
-        synLog.traceTrace("Wrapping text transformation result");
-
-        return TextFileDataSource.createOMSourcedElement(tempData, charset);
-    }
-
-    /**
      * @return Return the features explicitly set to the TransformerFactory through this mediator.
      */
     public List<MediatorProperty> getFeatures(){

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilder.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilder.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilder.java Fri Jun 27 13:48:09 2008
@@ -19,6 +19,8 @@
 
 package org.apache.synapse.util.jaxp;
 
+import java.nio.charset.Charset;
+
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Result;
 import javax.xml.transform.dom.DOMResult;
@@ -54,7 +56,7 @@
         return new DOMResult(document);
     }
 
-    public OMElement getNode() {
+    public OMElement getNode(Charset charset) {
         // TODO: we need to support SOAPEnvelope
         //       (not supported by the original code in XSLTMediator)
         return ElementHelper.importOMElement(

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilderFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilderFactory.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilderFactory.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/DOOMResultBuilderFactory.java Fri Jun 27 13:48:09 2008
@@ -26,7 +26,8 @@
  * objects.
  */
 public class DOOMResultBuilderFactory implements ResultBuilderFactory {
-    public ResultBuilder createResultBuilder(SynapseEnvironment synEnv, boolean isSoapEnvelope) {
+    public ResultBuilder createResultBuilder(SynapseEnvironment synEnv,
+            ResultBuilderFactory.Output expectedOutput) {
         return new DOOMResultBuilder();
     }
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilder.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilder.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilder.java Fri Jun 27 13:48:09 2008
@@ -19,6 +19,8 @@
 
 package org.apache.synapse.util.jaxp;
 
+import java.nio.charset.Charset;
+
 import javax.xml.transform.Result;
 
 import org.apache.axiom.om.OMElement;
@@ -47,12 +49,16 @@
     Result getResult();
     
     /**
-     * Get the root element of the AXIOM tree representing the XML infoset written
-     * to the {@link Result} object.
+     * Get the result written to the {@link Result} as an {@link OMElement}.
+     * Note that the exact behavior of this methos depends on the specified
+     * {@link ResultBuilderFactory.Output}.
      * 
+     * @param charset The charset encoding of the data that has been written
+     *                to the {@link Result} object. This information should only
+     *                be used in conjunction with {@link ResultBuilderFactory.Output#TEXT}.
      * @return the root element of the AXIOM tree
      */
-    OMElement getNode();
+    OMElement getNode(Charset charset);
     
     /**
      * Release any resources associated with this object.

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilderFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilderFactory.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilderFactory.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/ResultBuilderFactory.java Fri Jun 27 13:48:09 2008
@@ -26,14 +26,44 @@
  */
 public interface ResultBuilderFactory {
     /**
+     * Enumeration defining the output type to be expected by {@link ResultBuilder}.
+     * This influences the exact behavior of
+     * {@link ResultBuilder#getNode(java.nio.charset.Charset)}.
+     */
+    public enum Output {
+        /**
+         * The expected output is a simple {@link org.apache.axiom.om.OMElement}.
+         * In this case, the return value of
+         * {@link ResultBuilder#getNode(java.nio.charset.Charset)} will be
+         * the root element of the AXIOM tree representing the XML infoset written
+         * to the {@link javax.xml.transform.Result} object.
+         */
+        ELEMENT,
+        
+        /**
+         * The expected output is a SOAP envelope.
+         * If this output type is used, an invocation of {@link ResultBuilder#getNode()}
+         * must return a {@link org.apache.axiom.soap.SOAPEnvelope} object.
+         */
+        SOAP_ENVELOPE,
+        
+        /**
+         * The expected output is text. If this output type is used,
+         * {@link ResultBuilder#getNode(java.nio.charset.Charset)} must return a
+         * text wrapper with the output written to the {@link javax.xml.transform.Result}
+         * object.
+         */
+        TEXT
+    };
+    
+    /**
      * Create a new {@link ResultBuilder} instance.
      * 
      * @param synEnv the Synapse environment
-     * @param isSoapEnvelope
-     *           <code>true</code> if the expected output is a SOAP envelope. In this case an
-     *           invocation of {@link ResultBuilder#getNode()} on the returned instance must
-     *           return a {@link org.apache.axiom.soap.SOAPEnvelope}.
+     * @param expectedOutput specifies the expected type of output that will be written
+     *           to {@link javax.xml.transform.Result} objects produced by {@link ResultBuilder}
+     *           instances returned by this method
      * @return the newly created instance
      */
-    ResultBuilder createResultBuilder(SynapseEnvironment synEnv, boolean isSoapEnvelope);
+    ResultBuilder createResultBuilder(SynapseEnvironment synEnv, Output expectedOutput);
 }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilder.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilder.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilder.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilder.java Fri Jun 27 13:48:09 2008
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.charset.Charset;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -36,6 +37,7 @@
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.core.SynapseEnvironment;
 import org.apache.synapse.util.TemporaryData;
+import org.apache.synapse.util.TextFileDataSource;
 
 /**
  * {@link ResultBuilder} implementation that produces a {@link StreamResult} backed by a
@@ -45,13 +47,14 @@
     private static final Log log = LogFactory.getLog(StreamResultBuilder.class);
     
     private final SynapseEnvironment synEnv;
-    private final boolean isSoapEnvelope;
+    private final ResultBuilderFactory.Output expectedOutput;
     private TemporaryData tmp;
     private OutputStream out;
     
-    public StreamResultBuilder(SynapseEnvironment synEnv, boolean isSoapEnvelope) {
+    public StreamResultBuilder(SynapseEnvironment synEnv,
+            ResultBuilderFactory.Output expectedOutput) {
         this.synEnv = synEnv;
-        this.isSoapEnvelope = isSoapEnvelope;
+        this.expectedOutput = expectedOutput;
     }
 
     public Result getResult() {
@@ -60,31 +63,38 @@
         return new StreamResult(out);
     }
 
-    public OMElement getNode() {
+    public OMElement getNode(Charset charset) {
         try {
             out.close();
         } catch (IOException e) {
             handleException("Error while closing output stream", e);
         }
-        XMLStreamReader reader;
-        try {
-            reader = StAXUtils.createXMLStreamReader(tmp.getInputStream());
-        } catch (XMLStreamException e) {
-            handleException("Unable to parse the XML output", e);
-            return null;
-        } catch (IOException e) {
-            handleException("I/O error while reading temporary file", e);
-            return null;
-        }
-        if (isSoapEnvelope) {
-            return new StAXSOAPModelBuilder(reader).getSOAPEnvelope();
+        if (expectedOutput == ResultBuilderFactory.Output.TEXT) {
+            return TextFileDataSource.createOMSourcedElement(tmp, charset);
         } else {
-            return new StAXOMBuilder(reader).getDocumentElement();
+            XMLStreamReader reader;
+            try {
+                reader = StAXUtils.createXMLStreamReader(tmp.getInputStream());
+            } catch (XMLStreamException e) {
+                handleException("Unable to parse the XML output", e);
+                return null;
+            } catch (IOException e) {
+                handleException("I/O error while reading temporary file", e);
+                return null;
+            }
+            if (expectedOutput == ResultBuilderFactory.Output.SOAP_ENVELOPE) {
+                return new StAXSOAPModelBuilder(reader).getSOAPEnvelope();
+            } else {
+                return new StAXOMBuilder(reader).getDocumentElement();
+            }
         }
     }
 
     public void release() {
-        tmp.release();
+        if (tmp != null) {
+            tmp.release();
+            tmp = null;
+        }
     }
 
     private static void handleException(String message, Throwable ex) {

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilderFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilderFactory.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilderFactory.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/jaxp/StreamResultBuilderFactory.java Fri Jun 27 13:48:09 2008
@@ -26,7 +26,8 @@
  * objects.
  */
 public class StreamResultBuilderFactory implements ResultBuilderFactory {
-    public ResultBuilder createResultBuilder(SynapseEnvironment synEnv, boolean isSoapEnvelope) {
-        return new StreamResultBuilder(synEnv, isSoapEnvelope);
+    public ResultBuilder createResultBuilder(SynapseEnvironment synEnv,
+            ResultBuilderFactory.Output expectedOutput) {
+        return new StreamResultBuilder(synEnv, expectedOutput);
     }
 }

Modified: synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/XSLTMediatorTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/XSLTMediatorTest.java?rev=672386&r1=672385&r2=672386&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/XSLTMediatorTest.java (original)
+++ synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/mediators/transform/XSLTMediatorTest.java Fri Jun 27 13:48:09 2008
@@ -22,8 +22,10 @@
 import javax.xml.namespace.QName;
 
 import junit.framework.TestCase;
+import junit.framework.TestSuite;
 
 import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
@@ -32,9 +34,22 @@
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.TestMessageContextBuilder;
 import org.apache.synapse.transport.base.BaseConstants;
+import org.apache.synapse.util.jaxp.DOOMResultBuilderFactory;
+import org.apache.synapse.util.jaxp.DOOMSourceBuilderFactory;
+import org.apache.synapse.util.jaxp.SpringStaxSourceBuilderFactory;
+import org.apache.synapse.util.jaxp.StreamResultBuilderFactory;
+import org.apache.synapse.util.jaxp.StreamSourceBuilderFactory;
 import org.apache.synapse.util.xpath.SynapseXPath;
 
 public class XSLTMediatorTest extends TestCase {
+    private static final Class[] sourceBuilderFactories = {
+        DOOMSourceBuilderFactory.class,
+        SpringStaxSourceBuilderFactory.class,
+        StreamSourceBuilderFactory.class };
+    
+    private static final Class[] resultBuilderFactories = {
+        DOOMResultBuilderFactory.class,
+        StreamResultBuilderFactory.class };
 
     private static final String SOURCE =
         "<m0:CheckPriceRequest xmlns:m0=\"http://services.samples/xsd\">\n" +
@@ -46,8 +61,31 @@
         SOURCE +
         "</m:someOtherElement>";
 
-    XSLTMediator transformMediator = null;
-
+    // Create the test cases for the various source and result builder dynamically:
+    public static TestSuite suite() {
+        TestSuite suite = new TestSuite(XSLTMediatorTest.class);
+        for (final Class sbf : sourceBuilderFactories) {
+            for (final Class rbf : resultBuilderFactories) {
+                suite.addTest(new TestCase("test" + shortName(sbf) + shortName(rbf)) {
+                    @Override
+                    public void runTest() throws Throwable {
+                        test(sbf, rbf);
+                    }
+                });
+            }
+        }
+        return suite;
+    }
+    
+    private static String shortName(Class clazz) {
+        String name = clazz.getName();
+        name = name.substring(name.lastIndexOf('.')+1);
+        if (name.endsWith("BuilderFactory")) {
+            name = name.substring(0, name.length()-14);
+        }
+        return name;
+    }
+    
     /**
      * Check that the provided element is the result of the XSL transformation of
      * SOURCE by the stylesheet transform_unittest.xslt.
@@ -71,7 +109,7 @@
     public void testTransformXSLTCustomSource() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
 
         // set xpath condition to select source
         SynapseXPath xpath = new SynapseXPath("//m0:CheckPriceRequest");
@@ -97,7 +135,7 @@
     public void testTransformXSLTDefaultSource() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
 
         // set XSLT transformation URL
         transformMediator.setXsltKey("xslt-key");
@@ -114,7 +152,7 @@
     public void testTransformXSLTLargeMessagesCSV() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         // set XSLT transformation URL
         transformMediator.setXsltKey("xslt-key");
 
@@ -136,7 +174,7 @@
     public void testTransformXSLTLargeMessagesXML() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         // set XSLT transformation URL
         transformMediator.setXsltKey("xslt-key");
 
@@ -157,7 +195,7 @@
      public void testSynapse242() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+         XSLTMediator transformMediator = new XSLTMediator();
         // set XSLT transformation URL
         transformMediator.setXsltKey("xslt-key");
 
@@ -178,7 +216,7 @@
     public void testTransformXSLTSmallMessages() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         // set XSLT transformation URL
         transformMediator.setXsltKey("xslt-key");
 
@@ -197,7 +235,7 @@
     public void testTransformXSLTCustomSourceNonMainElement() throws Exception {
 
         // create a new switch mediator
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
 
         // set xpath condition to select source
         SynapseXPath xpath = new SynapseXPath("//m0:CheckPriceRequest");
@@ -229,7 +267,7 @@
     }
 
     public void testTextEncoding() throws Exception {
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         transformMediator.setXsltKey("xslt-key");
         
         MessageContext mc = new TestMessageContextBuilder()
@@ -245,7 +283,7 @@
     
     // Test for SYNAPSE-307
     public void testInvalidStylesheet() throws Exception {
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         transformMediator.setXsltKey("xslt-key");
         
         MessageContext mc = new TestMessageContextBuilder()
@@ -268,7 +306,7 @@
      * AXIOM versions above 1.2.7.
      */
     public void testWithCDATA() throws Exception {
-        transformMediator = new XSLTMediator();
+        XSLTMediator transformMediator = new XSLTMediator();
         transformMediator.setXsltKey("xslt-key");
         
         MessageContext mc = new TestMessageContextBuilder()
@@ -286,4 +324,36 @@
         assertEquals("out", out.getLocalName());
         assertEquals("test", out.getText());
     }
+
+    protected static void test(Class sbf, Class rbf) throws Exception {
+        
+        XSLTMediator transformMediator = new XSLTMediator();
+        transformMediator.setXsltKey("xslt-key");
+        
+        MessageContext mc = new TestMessageContextBuilder()
+            .addEntry("xslt-key", XSLTMediator.class.getResource("identity.xslt"))
+            .build();
+        
+        OMFactory factory = OMAbstractFactory.getOMFactory();
+        OMElement orgRoot = factory.createOMElement(new QName("root"));
+        OMElement orgElement = factory.createOMElement(new QName("urn:mynamespace", "element1"));
+        orgElement.setText("test");
+        OMAttribute orgAttribute = orgElement.addAttribute("att", "testValue", null);
+        orgRoot.addChild(orgElement);
+        
+        mc.getEnvelope().getBody().addChild(orgRoot);
+        
+        transformMediator.addAttribute(XSLTMediator.SOURCE_BUILDER_FACTORY, sbf.getName());
+        transformMediator.addAttribute(XSLTMediator.RESULT_BUILDER_FACTORY, rbf.getName());
+        
+        transformMediator.mediate(mc);
+        
+        OMElement root = mc.getEnvelope().getBody().getFirstElement();
+        assertEquals(orgRoot.getQName(), root.getQName());
+        OMElement element = (OMElement)root.getFirstOMChild();
+        assertEquals(orgElement.getQName(), element.getQName());
+        assertEquals(orgElement.getText(), element.getText());
+        assertEquals(orgAttribute, orgElement.getAttribute(orgAttribute.getQName()));
+        assertNull(element.getNextOMSibling());
+    }
 }

Added: synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/mediators/transform/identity.xslt
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/mediators/transform/identity.xslt?rev=672386&view=auto
==============================================================================
--- synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/mediators/transform/identity.xslt (added)
+++ synapse/trunk/java/modules/core/src/test/resources/org/apache/synapse/mediators/transform/identity.xslt Fri Jun 27 13:48:09 2008
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  ~  Licensed to the Apache Software Foundation (ASF) under one
+  ~  or more contributor license agreements.  See the NOTICE file
+  ~  distributed with this work for additional information
+  ~  regarding copyright ownership.  The ASF licenses this file
+  ~  to you under the Apache License, Version 2.0 (the
+  ~  "License"); you may not use this file except in compliance
+  ~  with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing,
+  ~  software distributed under the License is distributed on an
+  ~   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~  KIND, either express or implied.  See the License for the
+  ~  specific language governing permissions and limitations
+  ~  under the License.
+  -->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output method="xml"/>
+    <xsl:template match="node()|@*">
+         <xsl:copy>
+              <xsl:apply-templates select="node()|@*"/>
+         </xsl:copy>
+    </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file