public Message createFIXMessage()

in modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java [308:426]


    public Message createFIXMessage(MessageContext msgCtx) throws IOException {
        if (log.isDebugEnabled()) {
            log.debug("Extracting FIX message from the message context (Message ID: " +
                    msgCtx.getMessageID() + ")");
        }

        boolean withNs = false;
        String nsPrefix = null;
        String nsURI = null;
        
        Message message = new Message();
        SOAPBody soapBody = msgCtx.getEnvelope().getBody();

        //find namespace information embedded in the FIX payload
        OMNamespace ns = getNamespaceOfFIXPayload(soapBody);
        if (ns != null) {
            withNs = true;
            nsPrefix = ns.getPrefix();
            nsURI = ns.getNamespaceURI();
        }

        OMElement messageNode;
        if (withNs) {
            messageNode = soapBody.getFirstChildWithName(new QName(nsURI, FIXConstants.FIX_MESSAGE,
                    nsPrefix));
        } else {
            messageNode = soapBody.getFirstChildWithName(new QName(FIXConstants.FIX_MESSAGE));
        }

        Iterator messageElements = messageNode.getChildElements();

        while (messageElements.hasNext()) {
            OMElement node = (OMElement) messageElements.next();
            //create FIX header
            if (node.getQName().getLocalPart().equals(FIXConstants.FIX_HEADER)) {
                Iterator headerElements = node.getChildElements();
                while (headerElements.hasNext()) {
                    OMElement headerNode = (OMElement) headerElements.next();
                    String tag;
                    if (withNs) {
                        tag = headerNode.getAttributeValue(new QName(nsURI,
                                FIXConstants.FIX_FIELD_ID, nsPrefix));
                    } else {
                        tag = headerNode.getAttributeValue(new QName(FIXConstants.FIX_FIELD_ID));
                    }
                    String value = null;

                    OMElement child = headerNode.getFirstElement();
                    if (child != null) {
                        String href;
                        if (withNs) {
                            href = headerNode.getFirstElement().getAttributeValue(
                                    new QName(nsURI, FIXConstants.FIX_MESSAGE_REFERENCE, nsPrefix));
                        } else {
                            href = headerNode.getFirstElement().
                                getAttributeValue(new QName(FIXConstants.FIX_MESSAGE_REFERENCE));
                        }

                        if (href != null) {
                            DataHandler binaryDataHandler = msgCtx.getAttachment(href.substring(4));
                            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                            binaryDataHandler.writeTo(outputStream);
                            value = new String(outputStream.toByteArray());
                        }
                    } else {
                        value = headerNode.getText();
                    }

                    if (value != null) {
                        message.getHeader().setString(Integer.parseInt(tag), value);
                    }
                }

            } else if (node.getQName().getLocalPart().equals(FIXConstants.FIX_BODY)) {
                //create FIX body
                generateFIXBody(node, message, msgCtx, withNs, nsURI, nsPrefix);
                
            } else if (node.getQName().getLocalPart().equals(FIXConstants.FIX_TRAILER)) {
                //create FIX trailer
                Iterator trailerElements = node.getChildElements();
                while (trailerElements.hasNext()) {
                    OMElement trailerNode = (OMElement) trailerElements.next();
                    String tag;
                    if (withNs) {
                        tag = trailerNode.getAttributeValue(new QName(nsURI,
                                FIXConstants.FIX_FIELD_ID, nsPrefix));
                    } else {
                        tag = trailerNode.getAttributeValue(new QName(FIXConstants.FIX_FIELD_ID));
                    }
                    String value = null;

                    OMElement child = trailerNode.getFirstElement();
                    if (child != null) {
                        String href;
                        if (withNs) {
                            href = trailerNode.getFirstElement().getAttributeValue(
                                    new QName(nsURI, FIXConstants.FIX_FIELD_ID, nsPrefix));
                        } else {
                             href = trailerNode.getFirstElement().
                                getAttributeValue(new QName(FIXConstants.FIX_MESSAGE_REFERENCE));
                        }
                        if (href != null) {
                            DataHandler binaryDataHandler = msgCtx.getAttachment(href.substring(4));
                            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                            binaryDataHandler.writeTo(outputStream);
                            value = new String(outputStream.toByteArray());
                        }
                    } else {
                        value = trailerNode.getText();
                    }

                    if (value != null) {
                        message.getTrailer().setString(Integer.parseInt(tag), value);
                    }
                }
            }
        }
        return message;
    }