org.apache.synapse.util.PayloadHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.synapse.util.PayloadHelper.java

Source

/*
 *  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.
 */

package org.apache.synapse.util;

import java.util.Iterator;

import javax.activation.DataHandler;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamReader;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMText;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.soap.SOAP11Version;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPVersion;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.MessageContext;
import org.apache.synapse.SynapseException;

public class PayloadHelper {

    // this has to match org.apache.axis2.base.transport.BaseConstants 
    // at some future point we will merge this into Axiom as a common parent
    public final static String AXIOMPAYLOADNS = "http://ws.apache.org/commons/ns/payload";

    public final static QName BINARYELT = new QName(AXIOMPAYLOADNS, "binary", "ax");

    public final static QName TEXTELT = new QName(AXIOMPAYLOADNS, "text", "ax");

    public final static QName MAPELT = new QName(AXIOMPAYLOADNS, "map", "ax");

    public final static int XMLPAYLOADTYPE = 0, BINARYPAYLOADTYPE = 1, TEXTPAYLOADTYPE = 2, MAPPAYLOADTYPE = 3;

    public static final Log log = LogFactory.getLog(PayloadHelper.class);

    // gets a indication of the payload type. Default is XML
    // You cannot set the payload type. Instead, it is set automatically when
    // the payload is set
    public static int getPayloadType(SOAPEnvelope envelope) {
        OMElement el = getXMLPayload(envelope);
        if (el.getQName().equals(BINARYELT)) {
            return BINARYPAYLOADTYPE;
        } else if (el.getQName().equals(TEXTELT)) {
            return TEXTPAYLOADTYPE;
        } else if (el.getQName().equals(MAPELT)) {
            return MAPPAYLOADTYPE;
        } else {
            return XMLPAYLOADTYPE; // default XML
        }
    }

    public static int getPayloadType(MessageContext mc) {
        if (mc.getEnvelope() == null)
            return 0;
        return getPayloadType(mc.getEnvelope());
    }

    // XML Payload is carried as the first (and only) child of the body
    public static OMElement getXMLPayload(SOAPEnvelope envelope) {
        SOAPBody body = envelope.getBody();
        if (body == null) {
            log.error("No body found");
            return null;
        }
        OMElement bodyEl = body.getFirstElement();
        if (bodyEl == null) {
            log.error("No body child found");
            return null;
        }
        return bodyEl;
    }

    public static void setXMLPayload(SOAPEnvelope envelope, OMElement element) {
        SOAPBody body = envelope.getBody();
        if (body == null) {

            SOAPVersion version = envelope.getVersion();
            if (version.getEnvelopeURI().equals(SOAP11Version.SOAP_ENVELOPE_NAMESPACE_URI)) {
                body = OMAbstractFactory.getSOAP11Factory().createSOAPBody();
            } else {
                body = OMAbstractFactory.getSOAP12Factory().createSOAPBody();
            }
            if (envelope.getHeader() != null) {
                envelope.getHeader().insertSiblingAfter(body);
            } else {
                envelope.addChild(body);
            }
        } else {
            for (Iterator it = body.getChildren(); it.hasNext();) {
                OMNode node = (OMNode) it.next();
                node.discard();
            }
        }
        body.addChild(element);
    }

    public static void setXMLPayload(MessageContext mc, OMElement element) {
        if (mc.getEnvelope() == null) {
            try {
                mc.setEnvelope(OMAbstractFactory.getSOAP12Factory().createSOAPEnvelope());
            } catch (Exception e) {
                throw new SynapseException(e);
            }
        }
        setXMLPayload(mc.getEnvelope(), element);
    }

    // Binary Payload is carried in a wrapper element with QName BINARYELT
    public static DataHandler getBinaryPayload(SOAPEnvelope envelope) {
        OMElement el = getXMLPayload(envelope);
        if (el == null)
            return null;
        if (!el.getQName().equals(BINARYELT)) {
            log.error("Wrong QName" + el.getQName());
            return null;
        }
        OMNode textNode = el.getFirstOMChild();
        if (textNode.getType() != OMNode.TEXT_NODE) {
            log.error("Text Node not found");
            return null;
        }
        OMText text = (OMText) textNode;
        try {
            return (DataHandler) text.getDataHandler();
        } catch (ClassCastException ce) {
            log.error("cannot get DataHandler" + ce.getMessage());
            return null;
        }
    }

    public static DataHandler getBinaryPayload(MessageContext mc) {
        if (mc.getEnvelope() == null) {
            log.error("null envelope");
            return null;
        }
        return getBinaryPayload(mc.getEnvelope());
    }

    public static void setBinaryPayload(SOAPEnvelope envelope, DataHandler dh) {
        OMFactory fac = envelope.getOMFactory();
        OMElement binaryElt = envelope.getOMFactory().createOMElement(BINARYELT);
        OMText text = fac.createOMText(dh, true);
        binaryElt.addChild(text);
        setXMLPayload(envelope, binaryElt);
    }

    public static void setBinaryPayload(MessageContext mc, DataHandler dh) {
        if (mc.getEnvelope() == null) {
            try {
                mc.setEnvelope(OMAbstractFactory.getSOAP12Factory().createSOAPEnvelope());
            } catch (Exception e) {
                throw new SynapseException(e);
            }
        }
        setBinaryPayload(mc.getEnvelope(), dh);

    }

    // Text payload is carried in a wrapper element with QName TEXTELT
    public static String getTextPayload(SOAPEnvelope envelope) {
        OMElement el = getXMLPayload(envelope);
        if (el == null)
            return null;
        if (!el.getQName().equals(TEXTELT)) {
            log.error("Wrong QName " + el.getQName());
            return null;
        }
        OMNode textNode = el.getFirstOMChild();
        if (textNode.getType() != OMNode.TEXT_NODE) {
            log.error("Text Node not found");
            return null;
        }
        OMText text = (OMText) textNode;
        return text.getText();
    }

    public static String getTextPayload(MessageContext mc) {
        if (mc.getEnvelope() == null) {
            log.error("null envelope");
            return null;
        }
        return getTextPayload(mc.getEnvelope());
    }

    public static void setTextPayload(SOAPEnvelope envelope, String text) {
        OMFactory fac = envelope.getOMFactory();
        OMElement textElt = envelope.getOMFactory().createOMElement(TEXTELT);
        OMText textNode = fac.createOMText(text);
        textElt.addChild(textNode);
        setXMLPayload(envelope, textElt);
    }

    public static void setTextPayload(MessageContext mc, String text) {
        if (mc.getEnvelope() == null) {
            try {
                mc.setEnvelope(OMAbstractFactory.getSOAP12Factory().createSOAPEnvelope());
            } catch (Exception e) {
                throw new SynapseException(e);
            }
        }
        setTextPayload(mc.getEnvelope(), text);
    }

    // Map payload must be a Map of String->int, boolean, float, double, char,
    // short, byte, byte[], long, String
    public static SimpleMap getMapPayload(SOAPEnvelope envelope) {
        OMElement el = getXMLPayload(envelope);
        if (el == null)
            return null;
        if (!el.getQName().equals(MAPELT)) {
            log.error("Wrong QName" + el.getQName());
            return null;
        }
        return new SimpleMapImpl(el);
    }

    public static SimpleMap getMapPayload(MessageContext mc) {
        if (mc.getEnvelope() == null) {
            log.error("null envelope");
            return null;
        }
        return getMapPayload(mc.getEnvelope());
    }

    public static void setMapPayload(SOAPEnvelope envelope, SimpleMap map) {

        if (map instanceof SimpleMapImpl) {
            SimpleMapImpl impl = (SimpleMapImpl) map;
            OMElement mapElt = impl.getOMElement(envelope.getOMFactory());
            if (mapElt == null) {
                log.debug("null map element returned");
                return;
            }
            setXMLPayload(envelope, mapElt);
        } else {
            throw new SynapseException("cannot handle any other instance of SimpleMap at this point TODO");
        }
    }

    public static void setMapPayload(MessageContext mc, SimpleMap map) {
        if (mc.getEnvelope() == null) {
            try {
                mc.setEnvelope(OMAbstractFactory.getSOAP12Factory().createSOAPEnvelope());
            } catch (Exception e) {
                throw new SynapseException(e);
            }
        }
        setMapPayload(mc.getEnvelope(), map);
    }

    public static XMLStreamReader getStAXPayload(SOAPEnvelope envelope) {

        OMElement el = getXMLPayload(envelope);
        if (el == null) {
            return null;
        }
        return el.getXMLStreamReader();
    }

    public static XMLStreamReader getStAXPayload(MessageContext mc) {
        if (mc.getEnvelope() == null) {
            log.error("null envelope");
            return null;
        }
        return getStAXPayload(mc.getEnvelope());
    }

    public static void setStAXPayload(SOAPEnvelope envelope, XMLStreamReader streamReader) {
        StAXOMBuilder builder = new StAXOMBuilder(envelope.getOMFactory(), streamReader);
        OMElement el = builder.getDocumentElement();
        setXMLPayload(envelope, el);
    }

    public static void setStAXPayload(MessageContext mc, XMLStreamReader streamReader) {
        if (mc.getEnvelope() == null) {
            try {
                mc.setEnvelope(OMAbstractFactory.getSOAP12Factory().createSOAPEnvelope());
            } catch (Exception e) {
                throw new SynapseException(e);
            }
            setStAXPayload(mc.getEnvelope(), streamReader);
        }
    }
}