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