Author: hiranya
Date: Tue May 18 09:50:38 2010
New Revision: 945566
URL: http://svn.apache.org/viewvc?rev=945566&view=rev
Log:
* Upgrading the FIX transport to Quickfix/J 1.4.0 (SYNAPSE-651)
* QFJ-330 has been fixed in QFJ 1.4.0. Hence we can avoid using reflection to
obtain group information when converting FIX to SOAP. This change has been
implemented in FIXUtils
* Added a couple of simple test cases to cover FIX to SOAP conversion
Added:
synapse/trunk/java/modules/transports/optional/fix/src/test/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/MessageTest.java
Modified:
synapse/trunk/java/modules/transports/optional/fix/pom.xml
synapse/trunk/java/modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java
Modified: synapse/trunk/java/modules/transports/optional/fix/pom.xml
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/fix/pom.xml?rev=945566&r1=945565&r2=945566&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/optional/fix/pom.xml (original)
+++ synapse/trunk/java/modules/transports/optional/fix/pom.xml Tue May 18
09:50:38 2010
@@ -104,38 +104,18 @@
<dependencies>
<dependency>
<groupId>quickfixj</groupId>
- <artifactId>quickfixj-core</artifactId>
+ <artifactId>quickfixj-all</artifactId>
<version>${qfj.version}</version>
</dependency>
<dependency>
- <groupId>quickfixj</groupId>
- <artifactId>quickfixj-msg-fix40</artifactId>
- <version>${qfj.version}</version>
- </dependency>
- <dependency>
- <groupId>quickfixj</groupId>
- <artifactId>quickfixj-msg-fix41</artifactId>
- <version>${qfj.version}</version>
- </dependency>
- <dependency>
- <groupId>quickfixj</groupId>
- <artifactId>quickfixj-msg-fix42</artifactId>
- <version>${qfj.version}</version>
- </dependency>
- <dependency>
- <groupId>quickfixj</groupId>
- <artifactId>quickfixj-msg-fix43</artifactId>
- <version>${qfj.version}</version>
- </dependency>
- <dependency>
- <groupId>quickfixj</groupId>
- <artifactId>quickfixj-msg-fix44</artifactId>
- <version>${qfj.version}</version>
+ <groupId>org.apache.synapse</groupId>
+ <artifactId>synapse-core</artifactId>
+ <scope>test</scope>
</dependency>
</dependencies>
<properties>
- <qfj.version>1.3.1</qfj.version>
+ <qfj.version>1.4.0</qfj.version>
</properties>
</project>
\ No newline at end of file
Modified:
synapse/trunk/java/modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java?rev=945566&r1=945565&r2=945566&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java
(original)
+++
synapse/trunk/java/modules/transports/optional/fix/src/main/java/org/apache/synapse/transport/fix/FIXUtils.java
Tue May 18 09:50:38 2010
@@ -39,7 +39,6 @@ import javax.activation.DataSource;
import javax.xml.namespace.QName;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.*;
@@ -83,7 +82,8 @@ public class FIXUtils {
SOAPFactory soapFactory = new SOAP11Factory();
OMElement msg = soapFactory.createOMElement(FIXConstants.FIX_MESSAGE,
null);
-
msg.addAttribute(soapFactory.createOMAttribute(FIXConstants.FIX_MESSAGE_INCOMING_SESSION,
null, sessionID));
+
msg.addAttribute(soapFactory.createOMAttribute(FIXConstants.FIX_MESSAGE_INCOMING_SESSION,
+ null, sessionID));
msg.addAttribute(soapFactory.createOMAttribute
(FIXConstants.FIX_MESSAGE_COUNTER, null,
String.valueOf(counter)));
@@ -97,20 +97,22 @@ public class FIXUtils {
while (iter.hasNext()) {
Field<?> field = iter.next();
OMElement msgField =
soapFactory.createOMElement(FIXConstants.FIX_FIELD, null);
- msgField.addAttribute(soapFactory.
- createOMAttribute(FIXConstants.FIX_FIELD_ID, null,
String.valueOf(field.getTag())));
+
msgField.addAttribute(soapFactory.createOMAttribute(FIXConstants.FIX_FIELD_ID,
+ null, String.valueOf(field.getTag())));
Object value = field.getObject();
if (value instanceof byte[]) {
DataSource dataSource = new ByteArrayDataSource((byte[])
value);
DataHandler dataHandler = new DataHandler(dataSource);
String contentID = msgCtx.addAttachment(dataHandler);
- OMElement binaryData =
soapFactory.createOMElement(FIXConstants.FIX_BINARY_FIELD, null);
+ OMElement binaryData = soapFactory.createOMElement(
+ FIXConstants.FIX_BINARY_FIELD, null);
String binaryCID = "cid:" + contentID;
binaryData.addAttribute(FIXConstants.FIX_MESSAGE_REFERENCE, binaryCID, null);
msgField.addChild(binaryData);
} else {
- soapFactory.createOMText(msgField, value.toString(),
OMElement.CDATA_SECTION_NODE);
+ soapFactory.createOMText(msgField, value.toString(),
+ OMElement.CDATA_SECTION_NODE);
}
header.addChild(msgField);
}
@@ -125,19 +127,22 @@ public class FIXUtils {
Field<?> field = iter.next();
OMElement msgField =
soapFactory.createOMElement(FIXConstants.FIX_FIELD, null);
msgField.addAttribute(soapFactory.
- createOMAttribute(FIXConstants.FIX_FIELD_ID, null,
String.valueOf(field.getTag())));
+ createOMAttribute(FIXConstants.FIX_FIELD_ID, null,
+ String.valueOf(field.getTag())));
Object value = field.getObject();
if (value instanceof byte[]) {
DataSource dataSource = new ByteArrayDataSource((byte[])
value);
DataHandler dataHandler = new DataHandler(dataSource);
String contentID = msgCtx.addAttachment(dataHandler);
- OMElement binaryData =
soapFactory.createOMElement(FIXConstants.FIX_BINARY_FIELD, null);
+ OMElement binaryData = soapFactory.createOMElement(
+ FIXConstants.FIX_BINARY_FIELD, null);
String binaryCID = "cid:" + contentID;
binaryData.addAttribute(FIXConstants.FIX_MESSAGE_REFERENCE, binaryCID, null);
msgField.addChild(binaryData);
} else {
- soapFactory.createOMText(msgField, value.toString(),
OMElement.CDATA_SECTION_NODE);
+ soapFactory.createOMText(msgField, value.toString(),
+ OMElement.CDATA_SECTION_NODE);
}
trailer.addChild(msgField);
}
@@ -174,19 +179,22 @@ public class FIXUtils {
Field<?> field = iter.next();
OMElement msgField =
soapFactory.createOMElement(FIXConstants.FIX_FIELD, null);
msgField.addAttribute(soapFactory.
- createOMAttribute(FIXConstants.FIX_FIELD_ID, null,
String.valueOf(field.getTag())));
+ createOMAttribute(FIXConstants.FIX_FIELD_ID, null,
+ String.valueOf(field.getTag())));
Object value = field.getObject();
if (value instanceof byte[]) {
DataSource dataSource = new ByteArrayDataSource((byte[])
value);
DataHandler dataHandler = new DataHandler(dataSource);
String contentID = msgCtx.addAttachment(dataHandler);
- OMElement binaryData =
soapFactory.createOMElement(FIXConstants.FIX_BINARY_FIELD, null);
+ OMElement binaryData = soapFactory.createOMElement(
+ FIXConstants.FIX_BINARY_FIELD, null);
String binaryCID = "cid:" + contentID;
binaryData.addAttribute(FIXConstants.FIX_MESSAGE_REFERENCE, binaryCID, null);
msgField.addChild(binaryData);
} else {
- soapFactory.createOMText(msgField, value.toString(),
OMElement.CDATA_SECTION_NODE);
+ soapFactory.createOMText(msgField, value.toString(),
+ OMElement.CDATA_SECTION_NODE);
}
body.addChild(msgField);
@@ -195,63 +203,49 @@ public class FIXUtils {
//process FIX repeating groups
Iterator<Integer> groupKeyItr = message.groupKeyIterator();
- if (groupKeyItr != null){
+ if (groupKeyItr != null) {
while (groupKeyItr.hasNext()) {
- try {
- int groupKey = groupKeyItr.next();
- OMElement groupsField =
soapFactory.createOMElement(FIXConstants.FIX_GROUPS, null);
-
groupsField.addAttribute(FIXConstants.FIX_FIELD_ID,String.valueOf(groupKey),null);
- // TODO: Folowing section uses reflections to access the
FieldMap.getGroups(Field) method.
- // Once QFJ accept the QFJ-330 patch can remove the
folowing section.
- Class fieldMap;
- // Package access method getGroups(int) is a method of
FieldMap the parent class of Group , Message and <FIXV>Message
- if
(message.getClass().getName().equals("quickfix.Group")){ // Not added to
constants subject to remove with QFJ-330
- fieldMap = message.getClass().getSuperclass();
- } else if
(message.getClass().getName().equals("quickfix.Message")){ // Not added to
constants subject to remove with QFJ-330
- fieldMap = message.getClass().getSuperclass();
- } else {
- fieldMap =
message.getClass().getSuperclass().getSuperclass().getSuperclass();
- }
-
- Class[] types = new Class[] { int.class };
- Method getGroups = fieldMap.getDeclaredMethod("getGroups",
types); // Not added to constants subject to remove with QFJ-330
- getGroups.setAccessible(true);
- List<Group> groupList = (List<Group>)
getGroups.invoke(message, groupKey);
- Iterator<Group> groupIterator = groupList.iterator();
- while(groupIterator.hasNext()){
- Group msgGroup = groupIterator.next();
- OMElement groupField =
soapFactory.createOMElement(FIXConstants.FIX_GROUP, null);
- convertFIXBodyToXML(msgGroup, groupField, soapFactory,
msgCtx); // rec. call the method to process the repeating groups
- groupsField.addChild(groupField);
- }
- body.addChild(groupsField);
+ int groupKey = groupKeyItr.next();
+ OMElement groupsField =
soapFactory.createOMElement(FIXConstants.FIX_GROUPS,
+ null);
+ groupsField.addAttribute(FIXConstants.FIX_FIELD_ID,
+ String.valueOf(groupKey),null);
+ List<Group> groupList = message.getGroups(groupKey);
+ Iterator<Group> groupIterator = groupList.iterator();
- } catch (Exception e) {
- throw new AxisFault("Exception occured in FIX message
processing : " + e.toString());
+ while(groupIterator.hasNext()) {
+ Group msgGroup = groupIterator.next();
+ OMElement groupField =
soapFactory.createOMElement(FIXConstants.FIX_GROUP, null);
+ // rec. call the method to process the repeating groups
+ convertFIXBodyToXML(msgGroup, groupField, soapFactory,
msgCtx);
+ groupsField.addChild(groupField);
}
+ body.addChild(groupsField);
}
}
}
- private void generateFIXBody(OMElement node, FieldMap message,
MessageContext msgCtx, boolean withNs,
- String nsURI, String nsPrefix) throws
IOException {
+ private void generateFIXBody(OMElement node, FieldMap message,
MessageContext msgCtx,
+ boolean withNs, String nsURI, String
nsPrefix) throws IOException {
- Iterator<OMElement> bodyElements = node.getChildElements();
+ Iterator bodyElements = node.getChildElements();
while (bodyElements.hasNext()) {
- OMElement bodyNode = bodyElements.next();
+ OMElement bodyNode = (OMElement) bodyElements.next();
String nodeLocalName = bodyNode.getLocalName();
//handle repeating groups
if (nodeLocalName.equals(FIXConstants.FIX_GROUPS)){
- int groupsKey =
Integer.parseInt(bodyNode.getAttributeValue(new
QName(FIXConstants.FIX_FIELD_ID)));
+ int groupsKey = Integer.parseInt(bodyNode.getAttributeValue(
+ new QName(FIXConstants.FIX_FIELD_ID)));
Group group;
- Iterator<OMElement> groupElements =
bodyNode.getChildElements();
+ Iterator groupElements = bodyNode.getChildElements();
while (groupElements.hasNext()){
- OMElement groupNode = groupElements.next();
+ OMElement groupNode = (OMElement) groupElements.next();
OMElement delimNode = groupNode.getFirstElement();
- int delimKey = Integer.parseInt(delimNode.
getAttributeValue(new QName(FIXConstants.FIX_FIELD_ID)));
- group = new Group(groupsKey,delimKey);
+ int delimKey =
Integer.parseInt(delimNode.getAttributeValue(
+ new QName(FIXConstants.FIX_FIELD_ID)));
+ group = new Group(groupsKey, delimKey);
generateFIXBody(groupNode, group, msgCtx, withNs, nsURI,
nsPrefix);
message.addGroup(group);
}
@@ -259,7 +253,8 @@ public class FIXUtils {
} else {
String tag;
if (withNs) {
- tag = bodyNode.getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID, nsPrefix));
+ tag = bodyNode.getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID,
+ nsPrefix));
} else {
tag = bodyNode.getAttributeValue(new
QName(FIXConstants.FIX_FIELD_ID));
}
@@ -270,7 +265,8 @@ public class FIXUtils {
String href;
if (withNs) {
href = bodyNode.getFirstElement().
- getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID, nsPrefix)) ;
+ getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID,
+ nsPrefix)) ;
} else {
href = bodyNode.getFirstElement().
getAttributeValue(new
QName(FIXConstants.FIX_MESSAGE_REFERENCE));
@@ -304,7 +300,8 @@ public class FIXUtils {
*/
public Message createFIXMessage(MessageContext msgCtx) throws IOException {
if (log.isDebugEnabled()) {
- log.debug("Extracting FIX message from the message context
(Message ID: " + msgCtx.getMessageID() + ")");
+ log.debug("Extracting FIX message from the message context
(Message ID: " +
+ msgCtx.getMessageID() + ")");
}
boolean withNs = false;
@@ -330,19 +327,19 @@ public class FIXUtils {
messageNode = soapBody.getFirstChildWithName(new
QName(FIXConstants.FIX_MESSAGE));
}
- Iterator<OMElement> messageElements = messageNode.getChildElements();
+ Iterator messageElements = messageNode.getChildElements();
while (messageElements.hasNext()) {
- OMElement node = messageElements.next();
+ OMElement node = (OMElement) messageElements.next();
//create FIX header
if
(node.getQName().getLocalPart().equals(FIXConstants.FIX_HEADER)) {
- Iterator<OMElement> headerElements = node.getChildElements();
+ Iterator headerElements = node.getChildElements();
while (headerElements.hasNext()) {
- OMElement headerNode = headerElements.next();
+ OMElement headerNode = (OMElement) headerElements.next();
String tag;
if (withNs) {
- tag = headerNode.getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID,
- nsPrefix));
+ tag = headerNode.getAttributeValue(new QName(nsURI,
+ FIXConstants.FIX_FIELD_ID, nsPrefix));
} else {
tag = headerNode.getAttributeValue(new
QName(FIXConstants.FIX_FIELD_ID));
}
@@ -352,8 +349,8 @@ public class FIXUtils {
if (child != null) {
String href;
if (withNs) {
- href = headerNode.getFirstElement().
- getAttributeValue(new QName(nsURI,
FIXConstants.FIX_MESSAGE_REFERENCE, nsPrefix));
+ href =
headerNode.getFirstElement().getAttributeValue(
+ new QName(nsURI,
FIXConstants.FIX_MESSAGE_REFERENCE, nsPrefix));
} else {
href = headerNode.getFirstElement().
getAttributeValue(new
QName(FIXConstants.FIX_MESSAGE_REFERENCE));
@@ -380,12 +377,13 @@ public class FIXUtils {
} else if
(node.getQName().getLocalPart().equals(FIXConstants.FIX_TRAILER)) {
//create FIX trailer
- Iterator<OMElement> trailerElements = node.getChildElements();
+ Iterator trailerElements = node.getChildElements();
while (trailerElements.hasNext()) {
- OMElement trailerNode = trailerElements.next();
+ OMElement trailerNode = (OMElement) trailerElements.next();
String tag;
if (withNs) {
- tag = trailerNode.getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID, nsPrefix));
+ tag = trailerNode.getAttributeValue(new QName(nsURI,
+ FIXConstants.FIX_FIELD_ID, nsPrefix));
} else {
tag = trailerNode.getAttributeValue(new
QName(FIXConstants.FIX_FIELD_ID));
}
@@ -395,8 +393,8 @@ public class FIXUtils {
if (child != null) {
String href;
if (withNs) {
- href = trailerNode.getFirstElement().
- getAttributeValue(new QName(nsURI,
FIXConstants.FIX_FIELD_ID, nsPrefix));
+ href =
trailerNode.getFirstElement().getAttributeValue(
+ new QName(nsURI,
FIXConstants.FIX_FIELD_ID, nsPrefix));
} else {
href = trailerNode.getFirstElement().
getAttributeValue(new
QName(FIXConstants.FIX_MESSAGE_REFERENCE));
@@ -644,10 +642,10 @@ public class FIXUtils {
}
}
- Map<String, String> trpHeaders = (Map<String, String>)
msgCtx.getProperty(MessageContext.TRANSPORT_HEADERS);
+ Map trpHeaders = (Map)
msgCtx.getProperty(MessageContext.TRANSPORT_HEADERS);
//try to get the service from the transport headers
if (trpHeaders != null) {
- String serviceName =
(trpHeaders.get(FIXConstants.FIX_MESSAGE_SERVICE));
+ String serviceName = (String)
trpHeaders.get(FIXConstants.FIX_MESSAGE_SERVICE);
if (serviceName != null) {
return serviceName;
}
@@ -662,11 +660,11 @@ public class FIXUtils {
* @return application type of the message
*/
public static String getFixApplication(MessageContext msgCtx) {
- Map<String, String> trpHeaders = (Map)
msgCtx.getProperty(MessageContext.TRANSPORT_HEADERS);
+ Map trpHeaders = (Map)
msgCtx.getProperty(MessageContext.TRANSPORT_HEADERS);
//try to get the application type from the transport headers
String fixApplication = null;
if (trpHeaders != null) {
- fixApplication =
trpHeaders.get(FIXConstants.FIX_MESSAGE_APPLICATION);
+ fixApplication = (String)
trpHeaders.get(FIXConstants.FIX_MESSAGE_APPLICATION);
}
return fixApplication;
}
@@ -678,7 +676,9 @@ public class FIXUtils {
* @param fixApplication FIX application type
* @return a Map of transport headers
*/
- public static Map<String, String> getTransportHeaders(String serviceName,
String fixApplication) {
+ public static Map<String, String> getTransportHeaders(String serviceName,
+ String
fixApplication) {
+
Map<String, String> trpHeaders = new HashMap<String, String>();
trpHeaders.put(FIXConstants.FIX_MESSAGE_SERVICE, serviceName);
trpHeaders.put(FIXConstants.FIX_MESSAGE_APPLICATION, fixApplication);
@@ -705,7 +705,8 @@ public class FIXUtils {
}
/**
- * Reads the SOAP body of a message and attempts to retreive the
application level sequence number
+ * Reads the SOAP body of a message and attempts to retreive the
application level
+ * sequence number
*
* @param msgCtx Axis2 MessageContext
* @return application level sequence number or -1
@@ -730,7 +731,8 @@ public class FIXUtils {
}
/**
- * Reads the SOAP body of a message and attempts to retreive the
application level sequence number
+ * Reads the SOAP body of a message and attempts to retreive the
application level
+ * sequence number
*
* @param body Body of the SOAP message
* @param ns Namespace
@@ -760,7 +762,8 @@ public class FIXUtils {
OMNamespace ns = getNamespaceOfFIXPayload(body);
if (ns == null) {
OMElement messageNode = body.getFirstChildWithName(new
QName(FIXConstants.FIX_MESSAGE));
- srcSession = messageNode.getAttributeValue(new
QName(FIXConstants.FIX_MESSAGE_INCOMING_SESSION));
+ srcSession = messageNode.getAttributeValue(new QName(
+ FIXConstants.FIX_MESSAGE_INCOMING_SESSION));
} else {
srcSession = getSourceSession(body, ns);
}
@@ -768,7 +771,8 @@ public class FIXUtils {
}
/**
- * Reads the SOAP body of a message and attempts to retreive the session
identifier string with a namesapce
+ * Reads the SOAP body of a message and attempts to retreive the session
identifier string
+ * with a namesapce
*
* @param body Body of the SOAP message
* @param ns Namespace
Added:
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/MessageTest.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/MessageTest.java?rev=945566&view=auto
==============================================================================
---
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/MessageTest.java
(added)
+++
synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/MessageTest.java
Tue May 18 09:50:38 2010
@@ -0,0 +1,139 @@
+/*
+ * 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.transport.fix;
+
+import quickfix.Message;
+import quickfix.Group;
+import quickfix.fix41.NewOrderSingle;
+import quickfix.field.*;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axiom.om.util.AXIOMUtil;
+import org.custommonkey.xmlunit.XMLTestCase;
+
+import java.util.Date;
+
+public class MessageTest extends XMLTestCase {
+
+ private static final String BEGIN_STRING = "FIX.4.1";
+ private static final String SENDER_ID = "BANZAI";
+ private static final String TARGET_ID = "SYNAPSE";
+ private static final int SEQ_NUM = 5;
+ private static final String SYMBOL = "APACHE";
+ private static final String CLORD_ID = "12345";
+ private static final String CHECKSUM = "67890";
+ private static final String TX_DATE = new Date().toString();
+ private static final String SESSION_ID = "FIX.4.1:BANZAI->SYNAPSE";
+
+ public void testSimpleFIXMessage() throws Exception {
+ Message message = new NewOrderSingle();
+ message.getHeader().setField(new BeginString(BEGIN_STRING));
+ message.getHeader().setField(new SenderCompID(SENDER_ID));
+ message.getHeader().setField(new TargetCompID(TARGET_ID));
+ message.getHeader().setField(new MsgSeqNum(SEQ_NUM));
+
+ message.setField(new Symbol(SYMBOL));
+ message.setField(new ClOrdID(CLORD_ID));
+ message.setField(new TradeOriginationDate(TX_DATE));
+
+ message.getTrailer().setField(new CheckSum(CHECKSUM));
+
+ MessageContext msgCtx = new MessageContext();
+ FIXUtils.getInstance().setSOAPEnvelope(message, SEQ_NUM, SESSION_ID,
msgCtx);
+ String result =
msgCtx.getEnvelope().getBody().getFirstElement().toString();
+ String expected =
+ "<message inSession=\"" + SESSION_ID + "\" counter=\"" +
SEQ_NUM + "\">" +
+ "<header>" +
+ "<field id=\"" + BeginString.FIELD + "\">" +
BEGIN_STRING + "</field>" +
+ "<field id=\"" + MsgSeqNum.FIELD + "\">" + SEQ_NUM +
"</field>" +
+ "<field id=\"" + MsgType.FIELD + "\">" +
NewOrderSingle.MSGTYPE + "</field>" +
+ "<field id=\"" + SenderCompID.FIELD + "\">" +
SENDER_ID + "</field>" +
+ "<field id=\"" + TargetCompID.FIELD + "\">" +
TARGET_ID + "</field>" +
+ "</header>" +
+ "<body>" +
+ "<field id=\"" + ClOrdID.FIELD + "\">" + CLORD_ID +
"</field>" +
+ "<field id=\"" + Symbol.FIELD + "\">" + SYMBOL +
"</field>" +
+ "<field id=\"" + TradeOriginationDate.FIELD + "\">" +
TX_DATE + "</field>" +
+ "</body>" +
+ "<trailer>" +
+ "<field id=\"" + CheckSum.FIELD + "\">" + CHECKSUM +
"</field>" +
+ "</trailer>" +
+ "</message>";
+
+ assertXMLEqual(expected, AXIOMUtil.stringToOM(result).toString());
+ }
+
+ public void testAdvancedFIXMessage() throws Exception {
+ Message message = new NewOrderSingle();
+ message.getHeader().setField(new BeginString(BEGIN_STRING));
+ message.getHeader().setField(new SenderCompID(SENDER_ID));
+ message.getHeader().setField(new TargetCompID(TARGET_ID));
+ message.getHeader().setField(new MsgSeqNum(SEQ_NUM));
+
+ message.setField(new Symbol(SYMBOL));
+ message.setField(new ClOrdID(CLORD_ID));
+ message.setField(new TradeOriginationDate(TX_DATE));
+
+ Group g1 = new Group(NoAllocs.FIELD, AllocAccount.FIELD);
+ g1.setField(new AllocAccount("ABC"));
+ g1.setField(new IndividualAllocID("PQR"));
+ message.addGroup(g1);
+ Group g2 = new Group(NoAllocs.FIELD, AllocAccount.FIELD);
+ g2.setField(new AllocAccount("MNO"));
+ g2.setField(new IndividualAllocID("XYZ"));
+ message.addGroup(g2);
+
+ message.getTrailer().setField(new CheckSum(CHECKSUM));
+
+ MessageContext msgCtx = new MessageContext();
+ FIXUtils.getInstance().setSOAPEnvelope(message, SEQ_NUM, SESSION_ID,
msgCtx);
+ String result =
msgCtx.getEnvelope().getBody().getFirstElement().toString();
+ String expected =
+ "<message inSession=\"" + SESSION_ID + "\" counter=\"" +
SEQ_NUM + "\">" +
+ "<header>" +
+ "<field id=\"" + BeginString.FIELD + "\">" +
BEGIN_STRING + "</field>" +
+ "<field id=\"" + MsgSeqNum.FIELD + "\">" + SEQ_NUM +
"</field>" +
+ "<field id=\"" + MsgType.FIELD + "\">" +
NewOrderSingle.MSGTYPE + "</field>" +
+ "<field id=\"" + SenderCompID.FIELD + "\">" +
SENDER_ID + "</field>" +
+ "<field id=\"" + TargetCompID.FIELD + "\">" +
TARGET_ID + "</field>" +
+ "</header>" +
+ "<body>" +
+ "<field id=\"" + ClOrdID.FIELD + "\">" + CLORD_ID +
"</field>" +
+ "<field id=\"" + Symbol.FIELD + "\">" + SYMBOL +
"</field>" +
+ "<field id=\"" + NoAllocs.FIELD + "\">2</field>" +
+ "<field id=\"" + TradeOriginationDate.FIELD + "\">" +
TX_DATE + "</field>" +
+ "<groups id=\"" + NoAllocs.FIELD +"\">" +
+ "<group>" +
+ "<field id=\"" + AllocAccount.FIELD +
"\">ABC</field>" +
+ "<field id=\"" + IndividualAllocID.FIELD +
"\">PQR</field>" +
+ "</group>" +
+ "<group>" +
+ "<field id=\"" + AllocAccount.FIELD +
"\">MNO</field>" +
+ "<field id=\"" + IndividualAllocID.FIELD +
"\">XYZ</field>" +
+ "</group>" +
+ "</groups>" +
+ "</body>" +
+ "<trailer>" +
+ "<field id=\"" + CheckSum.FIELD + "\">" + CHECKSUM +
"</field>" +
+ "</trailer>" +
+ "</message>";
+
+ assertXMLEqual(expected, AXIOMUtil.stringToOM(result).toString());
+ }
+}