[Carbon-commits] [Carbon] svn commit r110333 - in trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer: . xml
heshan at wso2.com
heshan at wso2.com
Wed Jul 20 01:09:51 EDT 2011
Author: heshan
Date: Tue Jul 19 22:09:51 2011
New Revision: 110333
URL: http://wso2.org/svn/browse/wso2?view=rev&revision=110333
Log:
Introducing Streaming support to the relayTransformer mediator.
Modified:
trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/RelayTransformerMediator.java
trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorFactory.java
trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorSerializer.java
Modified: trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/RelayTransformerMediator.java
URL: http://wso2.org/svn/browse/wso2/trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/RelayTransformerMediator.java?rev=110333&r1=110332&r2=110333&view=diff
==============================================================================
--- trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/RelayTransformerMediator.java (original)
+++ trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/RelayTransformerMediator.java Tue Jul 19 22:09:51 2011
@@ -1,15 +1,19 @@
package org.wso2.carbon.mediator.relaytransformer;
+import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
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.core.axis2.Axis2MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
import org.apache.synapse.mediators.MediatorProperty;
import org.apache.synapse.mediators.Value;
@@ -19,7 +23,12 @@
import org.apache.synapse.util.xpath.SourceXPathSupport;
import org.apache.synapse.util.xpath.SynapseXPath;
+import javax.activation.DataHandler;
+import javax.xml.namespace.QName;
import javax.xml.transform.*;
+import javax.xml.transform.stream.StreamSource;
+import java.io.IOException;
+import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.*;
@@ -29,19 +38,32 @@
* transformation process
*/
public static final String USE_DOM_SOURCE_AND_RESULTS =
- "http://ws.apache.org/ns/synapse/transform/feature/dom";
+ "http://ws.apache.org/ns/synapse/transform/feature/dom";
+
+ /**
+ * The type of the resource that will be passed into the XSLT transformation. This either
+ * can be a XML or a Stream. By default setting it to xml.
+ */
+ private String inputType = "xml";
+
+ /**
+ * QName for binary content
+ */
+ public static final QName BINARY_CONTENT_QNAME =
+ new QName("http://ws.apache.org/commons/ns/payload", "binary");
+
/**
* The name of the attribute that allows to specify the {@link org.apache.synapse.util.jaxp.SourceBuilderFactory}.
*/
public static final String SOURCE_BUILDER_FACTORY =
- "http://ws.apache.org/ns/synapse/transform/attribute/sbf";
+ "http://ws.apache.org/ns/synapse/transform/attribute/sbf";
/**
* The name of the attribute that allows to specify the {@link org.apache.synapse.util.jaxp.ResultBuilderFactory}.
*/
public static final String RESULT_BUILDER_FACTORY =
- "http://ws.apache.org/ns/synapse/transform/attribute/rbf";
+ "http://ws.apache.org/ns/synapse/transform/attribute/rbf";
/**
* The resource key which refers to the XSLT to be used for the transformation
@@ -73,7 +95,7 @@
* Any attributes which should be set to the TransformerFactory explicitly
*/
private final List<MediatorProperty> transformerFactoryAttributes
- = new ArrayList<MediatorProperty>();
+ = new ArrayList<MediatorProperty>();
/**
* A resource map used to resolve xsl:import and xsl:include.
@@ -129,7 +151,7 @@
} catch (Exception e) {
handleException("Unable to perform XSLT transformation using : " + xsltKey +
- " against source XPath : " + source, e, synCtx);
+ " against source XPath : " + source, e, synCtx);
}
@@ -159,6 +181,13 @@
synLog.traceTrace("Transformation source : " + sourceNode.toString());
}
+ OMElement contentEle = synCtx.getEnvelope().getBody().getFirstChildWithName(BINARY_CONTENT_QNAME);
+ InputStream in = null;
+ // If the xslt is processed as a stream
+ if (contentEle != null) {
+ in = getInputStream(synCtx, synLog, contentEle, in);
+ }
+
// determine if it is needed to create or create the template
if (isCreationOrRecreationRequired(synCtx)) {
// many threads can see this and come here for acquiring the lock
@@ -219,18 +248,29 @@
synLog.traceOrDebug("Using " + resultBuilder.getClass().getName());
}
- try {
- transformer.transform(sourceBuilder.getSource((OMElement)sourceNode),
- resultBuilder.getResult());
- } finally {
- sourceBuilder.release();
+ if (in != null && inputType.equalsIgnoreCase("stream")) {
+ try {
+ //System.out.println("Patch applied - special case - streaming");
+ transformer.transform(new StreamSource(in), resultBuilder.getResult());
+ } catch (Exception e) {
+ handleException("Unable transform the XML stream", e, synCtx);
+ }
+ }
+ if (inputType.equalsIgnoreCase("xml")) {
+ try {
+ //System.out.println("Patch applied - default path - xml");
+ transformer.transform(sourceBuilder.getSource((OMElement)sourceNode),
+ resultBuilder.getResult());
+ } finally {
+ sourceBuilder.release();
+ }
}
synLog.traceOrDebug("Transformation completed - processing result");
// get the result OMElement
OMElement result =
- resultBuilder.getNode(encoding == null ? null : Charset.forName(encoding));
+ resultBuilder.getNode(encoding == null ? null : Charset.forName(encoding));
if (synLog.isTraceTraceEnabled()) {
synLog.traceTrace("Transformation result : " + result.toString());
@@ -240,26 +280,43 @@
// add result XML as a message context property to the message
if (synLog.isTraceOrDebugEnabled()) {
synLog.traceOrDebug("Adding result as message context property : " +
- targetPropertyName);
+ targetPropertyName);
}
synCtx.setProperty(targetPropertyName, result);
} else {
if (synLog.isTraceOrDebugEnabled()) {
synLog.traceOrDebug("Replace " +
- (isSoapEnvelope ? "SOAP envelope" : isSoapBody ? "SOAP body" : "node")
- + " with result");
+ (isSoapEnvelope ? "SOAP envelope" : isSoapBody ? "SOAP body" : "node")
+ + " with result");
}
if (isSoapEnvelope) {
- try {
- synCtx.setEnvelope((SOAPEnvelope) result);
+ try {
+ if (in != null && inputType.equalsIgnoreCase("stream")) {
+ // Special case handling for streams
+ Object contentType = ((Axis2MessageContext) synCtx).getAxis2MessageContext().
+ getProperty(Constants.Configuration.CONTENT_TYPE);
+ SOAPEnvelope envelope = null;
+ if ((contentType != null) && (contentType.toString().equalsIgnoreCase("text/xml; charset=UTF-8"))) {
+ envelope = OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope();
+ //System.out.println("SOAP 1.1");
+ } else if ((contentType != null) && (contentType.toString().equalsIgnoreCase("application/soap+xml; charset=UTF-8"))) {
+ envelope = OMAbstractFactory.getSOAP12Factory().getDefaultEnvelope();
+ //System.out.println("SOAP 1.2");
+ }
+ envelope.getBody().addChild(result);
+ synCtx.setEnvelope(envelope);
+ } else {
+
+ synCtx.setEnvelope((SOAPEnvelope) result);
+ }
} catch (AxisFault ex) {
handleException("Unable to replace SOAP envelope with result", ex, synCtx);
}
} else if (isSoapBody) {
for (Iterator itr = synCtx.getEnvelope().getBody().getChildElements();
- itr.hasNext(); ) {
+ itr.hasNext(); ) {
OMElement child = (OMElement) itr.next();
child.detach();
}
@@ -270,8 +327,29 @@
}
} else {
- sourceNode.insertSiblingAfter(result);
- sourceNode.detach();
+ if (inputType.equalsIgnoreCase("xml")) {
+ sourceNode.insertSiblingAfter(result);
+ sourceNode.detach();
+
+
+ } else {
+ Object contentType = ((Axis2MessageContext) synCtx).getAxis2MessageContext().
+ getProperty(Constants.Configuration.CONTENT_TYPE);
+ SOAPEnvelope envelope = null;
+ if ((contentType != null) && (contentType.toString().equalsIgnoreCase("text/xml; charset=UTF-8"))) {
+ envelope = OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope();
+ } else if ((contentType != null) && (contentType.toString().equalsIgnoreCase("application/soap+xml; charset=UTF-8"))) {
+ envelope = OMAbstractFactory.getSOAP12Factory().getDefaultEnvelope();
+ }
+
+ envelope.getBody().addChild(result);
+ try {
+ synCtx.setEnvelope(envelope);
+ } catch (AxisFault axisFault) {
+ axisFault.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ }
}
}
@@ -357,6 +435,40 @@
properties.add(p);
}
+ private InputStream getInputStream(MessageContext synCtx, SynapseLog synLog, OMElement contentEle, InputStream in) {
+ OMNode node = contentEle.getFirstOMChild();
+
+ if (node != null && (node instanceof OMText)) {
+ OMText binaryDataNode = (OMText) node;
+ DataHandler dh = (DataHandler) binaryDataNode.getDataHandler();
+
+ if (dh == null) {
+ if (synLog.isTraceOrDebugEnabled()) {
+ synLog.auditWarn("Message has the Binary content element. " +
+ "But doesn't have binary content embedded within it");
+ }
+ return null;
+ }
+
+ //DataSource dataSource = dh.getDataSource();
+
+ // TODO: check whether this is necessary
+ //Ask the data source to stream, if it has not alredy cached the request
+ /*if (dataSource instanceof StreamingOnRequestDataSource) {
+ ((StreamingOnRequestDataSource) dataSource).setLastUse(true);
+ }*/
+
+ try {
+ return dh.getInputStream();
+ } catch (IOException e) {
+ handleException("Error retrieving InputStream from data handler", e, synCtx);
+ }
+ }
+
+ return null;
+ }
+
+
/**
* Set the properties defined in the mediator as parameters on the stylesheet.
*
@@ -508,6 +620,14 @@
return resourceMap;
}
+ public void setInputType(String inputType) {
+ this.inputType = inputType;
+ }
+
+ public String getInputType() {
+ return inputType;
+ }
+
public void setResourceMap(ResourceMap resourceMap) {
this.resourceMap = resourceMap;
}
Modified: trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorFactory.java
URL: http://wso2.org/svn/browse/wso2/trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorFactory.java?rev=110333&r1=110332&r2=110333&view=diff
==============================================================================
--- trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorFactory.java (original)
+++ trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorFactory.java Tue Jul 19 22:09:51 2011
@@ -14,9 +14,10 @@
public class RelayTransformerMediatorFactory extends AbstractMediatorFactory {
private static final QName TAG_NAME
- = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "xslt");
+ = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "relayTransformer");
private static final QName ATTRIBUTE_Q
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "attribute");
+ private static final QName ATT_INPUT = new QName("input");
public QName getTagQName() {
return TAG_NAME;
@@ -29,6 +30,7 @@
OMAttribute attXslt = elem.getAttribute(ATT_KEY);
OMAttribute attSource = elem.getAttribute(ATT_SOURCE);
OMAttribute attTarget = elem.getAttribute(ATT_TARGET);
+ OMAttribute attInput = elem.getAttribute(ATT_INPUT);
if (attXslt != null) {
// ValueFactory for creating dynamic or static Value
@@ -58,6 +60,10 @@
transformMediator.setTargetPropertyName(attTarget.getAttributeValue());
}
+ if (attInput != null) {
+ transformMediator.setInputType(attInput.getAttributeValue());
+ }
+
// after successfully creating the mediator
// set its common attributes such as tracing etc
processAuditStatus(transformMediator, elem);
Modified: trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorSerializer.java
URL: http://wso2.org/svn/browse/wso2/trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorSerializer.java?rev=110333&r1=110332&r2=110333&view=diff
==============================================================================
--- trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorSerializer.java (original)
+++ trunk/carbon/components/mediators/relaytransformer/org.wso2.carbon.mediator.relaytransformer/src/main/java/org/wso2/carbon/mediator/relaytransformer/xml/RelayTransformerMediatorSerializer.java Tue Jul 19 22:09:51 2011
@@ -20,30 +20,34 @@
}
RelayTransformerMediator mediator = (RelayTransformerMediator) m;
- OMElement xslt = fac.createOMElement("xslt", synNS);
+ OMElement relayTransformer = fac.createOMElement("relayTransformer", synNS);
if (mediator.getXsltKey() != null) {
// Serialize Value using ValueSerializer
ValueSerializer keySerializer = new ValueSerializer();
- keySerializer.serializeValue(mediator.getXsltKey(), XMLConfigConstants.KEY, xslt);
+ keySerializer.serializeValue(mediator.getXsltKey(), XMLConfigConstants.KEY, relayTransformer);
} else {
handleException("Invalid XSLT mediator. XSLT registry key is required");
}
- saveTracingState(xslt,mediator);
+ saveTracingState(relayTransformer,mediator);
if (mediator.getSource() != null) {
- SynapseXPathSerializer.serializeXPath(mediator.getSource(), xslt, "source");
+ SynapseXPathSerializer.serializeXPath(mediator.getSource(), relayTransformer, "source");
}
if (mediator.getTargetPropertyName() != null) {
- xslt.addAttribute(fac.createOMAttribute(
- "target", nullNS, mediator.getTargetPropertyName()));
+ relayTransformer.addAttribute(fac.createOMAttribute(
+ "target", nullNS, mediator.getTargetPropertyName()));
}
- serializeProperties(xslt, mediator.getProperties());
+ if (mediator.getInputType() != null) {
+ relayTransformer.addAttribute(fac.createOMAttribute(
+ "input", nullNS, mediator.getInputType()));
+ }
+ serializeProperties(relayTransformer, mediator.getProperties());
List<MediatorProperty> features = mediator.getFeatures();
if (!features.isEmpty()) {
for (MediatorProperty mp : features) {
- OMElement prop = fac.createOMElement("feature", synNS, xslt);
+ OMElement prop = fac.createOMElement("feature", synNS, relayTransformer);
if (mp.getName() != null) {
prop.addAttribute(fac.createOMAttribute("name", nullNS, mp.getName()));
} else {
@@ -56,11 +60,11 @@
}
}
}
- serializeMediatorProperties(xslt, mediator.getAttributes(), ATTRIBUTE_Q);
+ serializeMediatorProperties(relayTransformer, mediator.getAttributes(), ATTRIBUTE_Q);
- ResourceMapSerializer.serializeResourceMap(xslt, mediator.getResourceMap());
+ ResourceMapSerializer.serializeResourceMap(relayTransformer, mediator.getResourceMap());
- return xslt;
+ return relayTransformer;
}
public String getMediatorClassName() {
More information about the Carbon-commits
mailing list