[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