Search in sources :

Example 71 with OMNode

use of org.apache.axiom.om.OMNode in project wso2-synapse by wso2.

the class XSLTMediator method performXSLT.

/**
 * Perform actual XSLT transformation
 * @param synCtx current message
 * @param synLog the logger to be used
 */
private void performXSLT(MessageContext synCtx, SynapseLog synLog) {
    OMNode sourceNode = source.selectOMNode(synCtx, synLog);
    boolean isSoapEnvelope = (sourceNode == synCtx.getEnvelope());
    boolean isSoapBody = (sourceNode == synCtx.getEnvelope().getBody());
    boolean isSoapHeader = (sourceNode == synCtx.getEnvelope().getHeader());
    // Derive actual key from message context
    String generatedXsltKey = xsltKey.evaluateValue(synCtx);
    // get templates from generatedXsltKey
    Templates cachedTemplates = null;
    if (synLog.isTraceTraceEnabled()) {
        synLog.traceTrace("Transformation source : " + sourceNode.toString());
    }
    // 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
        synchronized (transformerLock) {
            // only first thread should create the template
            if (isCreationOrRecreationRequired(synCtx)) {
                cachedTemplates = createTemplate(synCtx, synLog, generatedXsltKey);
            } else {
                cachedTemplates = cachedTemplatesMap.get(generatedXsltKey);
            }
        }
    } else {
        // If already cached template then load it from cachedTemplatesMap
        synchronized (transformerLock) {
            cachedTemplates = cachedTemplatesMap.get(generatedXsltKey);
        }
    }
    try {
        // perform transformation
        Transformer transformer = null;
        try {
            transformer = cachedTemplates.newTransformer();
        } catch (NullPointerException ex) {
            handleException("Unable to create Transformer using cached template", ex, synCtx);
        }
        if (!properties.isEmpty()) {
            // set the parameters which will pass to the Transformation
            applyProperties(transformer, synCtx, synLog);
        }
        transformer.setErrorListener(new ErrorListenerImpl(synLog, XSLT_TRANSFORMATION_ACTIVITY));
        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);
        if (synLog.isTraceOrDebugEnabled()) {
            synLog.traceOrDebug("Using " + sourceBuilder.getClass().getName());
            synLog.traceOrDebug("Using " + resultBuilder.getClass().getName());
        }
        try {
            transformer.transform(sourceBuilder.getSource((OMElement) sourceNode), resultBuilder.getResult());
        } finally {
            sourceBuilder.release();
        }
        synLog.traceOrDebug("Transformation completed - processing result");
        /**
         * If user have set transform.xslt.result.disableBuild property to true, we do not build the message to
         * OMElement,
         */
        if (targetPropertyName != null && resultBuilder instanceof StreamResultBuilder && synCtx.getProperty(TRANSFORM_XSLT_RESULT_DISABLE_BUILD) != null && synCtx.getProperty(TRANSFORM_XSLT_RESULT_DISABLE_BUILD) instanceof String && "true".equalsIgnoreCase((String) synCtx.getProperty(TRANSFORM_XSLT_RESULT_DISABLE_BUILD))) {
            // add result XML string as a message context property to the message
            if (synLog.isTraceOrDebugEnabled()) {
                synLog.traceOrDebug("Adding result string as message context property : " + targetPropertyName);
            }
            synCtx.setProperty(targetPropertyName, ((StreamResultBuilder) resultBuilder).getResultAsString());
            return;
        }
        // get the result OMElement
        OMElement result = null;
        try {
            result = resultBuilder.getNode(encoding == null ? null : Charset.forName(encoding));
        } catch (Exception e) {
            throw new SynapseException("Unable to create an OMElement using XSLT result ", e);
        }
        if (synLog.isTraceTraceEnabled()) {
            synLog.traceTrace("Transformation result : " + result.toString());
        }
        if (targetPropertyName != null) {
            // add result XML as a message context property to the message
            if (synLog.isTraceOrDebugEnabled()) {
                synLog.traceOrDebug("Adding result as message context property : " + targetPropertyName);
            }
            synCtx.setProperty(targetPropertyName, result);
        } else {
            if (synLog.isTraceOrDebugEnabled()) {
                synLog.traceOrDebug("Replace " + (isSoapEnvelope ? "SOAP envelope" : isSoapBody ? "SOAP body" : "node") + " with result");
            }
            if (isSoapEnvelope) {
                try {
                    synCtx.setEnvelope((SOAPEnvelope) result);
                } catch (AxisFault ex) {
                    handleException("Unable to replace SOAP envelope with result", ex, synCtx);
                }
            } else if (isSoapBody) {
                for (Iterator itr = synCtx.getEnvelope().getBody().getChildElements(); itr.hasNext(); ) {
                    OMElement child = (OMElement) itr.next();
                    child.detach();
                }
                for (Iterator itr = result.getChildElements(); itr.hasNext(); ) {
                    OMElement child = (OMElement) itr.next();
                    synCtx.getEnvelope().getBody().addChild(child);
                }
            } else if (isSoapHeader) {
                for (Iterator itr = synCtx.getEnvelope().getHeader().getChildElements(); itr.hasNext(); ) {
                    OMElement child = (OMElement) itr.next();
                    child.detach();
                }
                for (Iterator itr = result.getChildElements(); itr.hasNext(); ) {
                    OMElement child = (OMElement) itr.next();
                    synCtx.getEnvelope().getHeader().addChild(child);
                }
            } else {
                sourceNode.insertSiblingAfter(result);
                sourceNode.detach();
            }
        }
    } catch (TransformerException e) {
        handleException("Error performing XSLT transformation using : " + xsltKey, e, synCtx);
    }
}
Also used : AxisFault(org.apache.axis2.AxisFault) ResultBuilder(org.apache.synapse.util.jaxp.ResultBuilder) StreamResultBuilder(org.apache.synapse.util.jaxp.StreamResultBuilder) Transformer(javax.xml.transform.Transformer) StreamResultBuilder(org.apache.synapse.util.jaxp.StreamResultBuilder) SynapseException(org.apache.synapse.SynapseException) SynapseEnvironment(org.apache.synapse.core.SynapseEnvironment) SourceBuilder(org.apache.synapse.util.jaxp.SourceBuilder) Templates(javax.xml.transform.Templates) OMElement(org.apache.axiom.om.OMElement) TransformerException(javax.xml.transform.TransformerException) TransformerConfigurationException(javax.xml.transform.TransformerConfigurationException) SynapseException(org.apache.synapse.SynapseException) OMNode(org.apache.axiom.om.OMNode) Iterator(java.util.Iterator) StreamResultBuilderFactory(org.apache.synapse.util.jaxp.StreamResultBuilderFactory) DOOMResultBuilderFactory(org.apache.synapse.util.jaxp.DOOMResultBuilderFactory) ResultBuilderFactory(org.apache.synapse.util.jaxp.ResultBuilderFactory) TransformerException(javax.xml.transform.TransformerException)

Example 72 with OMNode

use of org.apache.axiom.om.OMNode in project webservices-axiom by apache.

the class TestAddChildIncomplete method runTest.

@Override
protected void runTest() throws Throwable {
    OMFactory factory = metaFactory.getOMFactory();
    OMElement parent = OMXMLBuilderFactory.createOMBuilder(factory, new StringReader("<root><a/><b/></root>")).getDocumentElement();
    parent.addChild(factory.createOMElement("c", null));
    Iterator<OMNode> it = parent.getChildren();
    assertEquals("a", ((OMElement) it.next()).getLocalName());
    assertEquals("b", ((OMElement) it.next()).getLocalName());
    assertEquals("c", ((OMElement) it.next()).getLocalName());
    assertFalse(it.hasNext());
}
Also used : OMFactory(org.apache.axiom.om.OMFactory) OMNode(org.apache.axiom.om.OMNode) StringReader(java.io.StringReader) OMElement(org.apache.axiom.om.OMElement)

Example 73 with OMNode

use of org.apache.axiom.om.OMNode in project webservices-axiom by apache.

the class TestSetOMDocumentElementNew method runTest.

@Override
protected void runTest() throws Throwable {
    OMFactory factory = metaFactory.getOMFactory();
    OMDocument document = factory.createOMDocument();
    OMComment comment = factory.createOMComment(document, "some comment");
    OMElement documentElement = factory.createOMElement("root", null);
    document.setOMDocumentElement(documentElement);
    assertSame(documentElement, document.getOMDocumentElement());
    assertSame(document, documentElement.getParent());
    Iterator<OMNode> it = document.getChildren();
    assertTrue(it.hasNext());
    assertSame(comment, it.next());
    assertTrue(it.hasNext());
    assertSame(documentElement, it.next());
    assertFalse(it.hasNext());
}
Also used : OMFactory(org.apache.axiom.om.OMFactory) OMNode(org.apache.axiom.om.OMNode) OMComment(org.apache.axiom.om.OMComment) OMElement(org.apache.axiom.om.OMElement) OMDocument(org.apache.axiom.om.OMDocument)

Example 74 with OMNode

use of org.apache.axiom.om.OMNode in project webservices-axiom by apache.

the class TestSetOMDocumentElementReplace method runTest.

@Override
protected void runTest() throws Throwable {
    OMFactory factory = metaFactory.getOMFactory();
    OMDocument document = OMXMLBuilderFactory.createOMBuilder(factory, new StringReader("<!--comment1--><root/><!--comment2-->")).getDocument();
    OMElement documentElement = factory.createOMElement("new", null);
    document.setOMDocumentElement(documentElement);
    assertSame(documentElement, document.getOMDocumentElement());
    Iterator<OMNode> it = document.getChildren();
    assertTrue(it.hasNext());
    OMNode child = it.next();
    assertTrue(child instanceof OMComment);
    assertEquals("comment1", ((OMComment) child).getValue());
    assertTrue(it.hasNext());
    assertSame(documentElement, it.next());
    assertTrue(it.hasNext());
    child = it.next();
    assertTrue(child instanceof OMComment);
    assertEquals("comment2", ((OMComment) child).getValue());
    assertFalse(it.hasNext());
}
Also used : OMFactory(org.apache.axiom.om.OMFactory) OMNode(org.apache.axiom.om.OMNode) OMComment(org.apache.axiom.om.OMComment) StringReader(java.io.StringReader) OMElement(org.apache.axiom.om.OMElement) OMDocument(org.apache.axiom.om.OMDocument)

Example 75 with OMNode

use of org.apache.axiom.om.OMNode in project webservices-axiom by apache.

the class TestAddChildIncomplete method runTest.

@Override
protected void runTest() throws Throwable {
    OMFactory factory = metaFactory.getOMFactory();
    OMDocument parent = OMXMLBuilderFactory.createOMBuilder(factory, new StringReader("<!--a--><b/><!--c-->")).getDocument();
    parent.addChild(factory.createOMComment(null, "d"));
    Iterator<OMNode> it = parent.getChildren();
    assertEquals("a", ((OMComment) it.next()).getValue());
    assertEquals("b", ((OMElement) it.next()).getLocalName());
    assertEquals("c", ((OMComment) it.next()).getValue());
    assertEquals("d", ((OMComment) it.next()).getValue());
    assertFalse(it.hasNext());
}
Also used : OMFactory(org.apache.axiom.om.OMFactory) OMNode(org.apache.axiom.om.OMNode) StringReader(java.io.StringReader) OMDocument(org.apache.axiom.om.OMDocument)

Aggregations

OMNode (org.apache.axiom.om.OMNode)150 OMElement (org.apache.axiom.om.OMElement)87 Iterator (java.util.Iterator)28 OMText (org.apache.axiom.om.OMText)23 SOAPEnvelope (org.apache.axiom.soap.SOAPEnvelope)20 BXMLItem (org.ballerinalang.model.values.BXMLItem)18 StringReader (java.io.StringReader)17 SynapseException (org.apache.synapse.SynapseException)15 OMAttribute (org.apache.axiom.om.OMAttribute)14 OMFactory (org.apache.axiom.om.OMFactory)14 BValue (org.ballerinalang.model.values.BValue)14 BXML (org.ballerinalang.model.values.BXML)14 Test (org.testng.annotations.Test)14 QName (javax.xml.namespace.QName)13 BJSON (org.ballerinalang.model.values.BJSON)13 OMDocument (org.apache.axiom.om.OMDocument)12 IOException (java.io.IOException)11 ArrayList (java.util.ArrayList)10 SOAPHeader (org.apache.axiom.soap.SOAPHeader)10 SOAPHeaderBlock (org.apache.axiom.soap.SOAPHeaderBlock)10