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());
+    }
+}


Reply via email to