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;
}