You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by hi...@apache.org on 2011/01/26 12:00:15 UTC

svn commit: r1063673 - in /synapse/trunk/java/modules/transports/optional/fix/src: main/java/org/apache/synapse/transport/fix/FIXUtils.java test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java

Author: hiranya
Date: Wed Jan 26 11:00:15 2011
New Revision: 1063673

URL: http://svn.apache.org/viewvc?rev=1063673&view=rev
Log:
Preseving the order of FIX repeating group fields

Added:
    synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java
Modified:
    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/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=1063673&r1=1063672&r2=1063673&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 Wed Jan 26 11:00:15 2011
@@ -242,10 +242,20 @@ public class FIXUtils {
                 Iterator groupElements = bodyNode.getChildElements();
                 while (groupElements.hasNext()){
                     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);
+                    Iterator groupFields = groupNode.getChildrenWithName(new QName(FIXConstants.FIX_FIELD));
+                    List<Integer> idList = new ArrayList<Integer>();
+                    while (groupFields.hasNext()) {
+                        OMElement fieldNode = (OMElement) groupFields.next();
+                        idList.add(Integer.parseInt(fieldNode.getAttributeValue(
+                                new QName(FIXConstants.FIX_FIELD_ID))));
+                    }
+
+                    int[] order = new int[idList.size()];
+                    for (int i = 0; i < order.length; i++) {
+                        order[i] = idList.get(i);
+                    }
+
+                    group = new Group(groupsKey, order[0], order);
                     generateFIXBody(groupNode, group, msgCtx, withNs, nsURI, nsPrefix);
                     message.addGroup(group);
                 }

Added: synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java?rev=1063673&view=auto
==============================================================================
--- synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java (added)
+++ synapse/trunk/java/modules/transports/optional/fix/src/test/java/org/apache/synapse/transport/fix/FieldOrderingTest.java Wed Jan 26 11:00:15 2011
@@ -0,0 +1,100 @@
+/*
+ *  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 junit.framework.TestCase;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.context.MessageContext;
+import quickfix.Group;
+import quickfix.Message;
+import quickfix.field.*;
+import quickfix.fix44.QuoteRequest;
+
+import javax.xml.namespace.QName;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+public class FieldOrderingTest extends TestCase {
+
+    public void testRepeatingGroupOrdering() throws IOException {
+
+        int order[] = new int[] {
+                Symbol.FIELD, SecurityID.FIELD, SecurityIDSource.FIELD, Product.FIELD,
+                QuoteType.FIELD, OrderQty.FIELD, SettlDate.FIELD, QuotePriceType.FIELD,
+                ValidUntilTime.FIELD, ExpireTime.FIELD
+        };
+
+        Message message = new QuoteRequest(new QuoteReqID("20101110-2"));
+        Group group = new Group(NoRelatedSym.FIELD, Symbol.FIELD, order);
+        group.setField(new Symbol("TestSymbol"));
+        group.setField(new SecurityID("SecurityID"));
+        group.setField(new SecurityIDSource("SecurityIDSource"));
+        group.setField(new Product(11));
+        group.setField(new QuoteType(1));
+        group.setField(new OrderQty(500));
+        group.setField(new SettlDate("20151116"));
+        group.setField(new QuotePriceType(1));
+        group.setField(new ValidUntilTime(new Date()));
+        group.setField(new ExpireTime(new Date()));
+        message.addGroup(group);
+        System.out.println("Original Message: " + message);
+
+        MessageContext msgCtx = new MessageContext();
+        FIXUtils.getInstance().setSOAPEnvelope(message, 1, "TestSession", msgCtx);
+        OMElement msgElt = msgCtx.getEnvelope().getBody().getFirstElement();
+        OMElement groupsElt = msgElt.getFirstChildWithName(new QName(FIXConstants.FIX_BODY)).
+                getFirstChildWithName(new QName(FIXConstants.FIX_GROUPS));
+
+        int groupId = Integer.parseInt(groupsElt.getAttributeValue(
+                new QName(FIXConstants.FIX_FIELD_ID)));
+        assertEquals(groupId, group.getFieldTag());
+
+        // Test whether the fileds in the SOAP infoset are in the correct order
+        Iterator fields = groupsElt.getFirstElement().getChildrenWithName(
+                new QName(FIXConstants.FIX_FIELD));
+        List<Integer> fieldList = new ArrayList<Integer>();
+        while (fields.hasNext()) {
+            OMElement fieldElt = (OMElement) fields.next();
+            fieldList.add(Integer.parseInt(fieldElt.getAttributeValue(
+                    new QName(FIXConstants.FIX_FIELD_ID))));
+        }
+        assertEquals(order.length, fieldList.size());
+        for (int i = 0; i < order.length; i++) {
+            assertEquals(order[i], (int) fieldList.get(i));
+        }
+
+        // Test whether the reconstructed message preserves the group field order
+        Message copy = FIXUtils.getInstance().createFIXMessage(msgCtx);
+        System.out.println("Reconstructed Message: " + copy);
+        List<Group> groups = copy.getGroups(NoRelatedSym.FIELD);
+        assertEquals(1, groups.size());
+        int[] copyOrder = groups.get(0).getFieldOrder();
+        assertEquals(order.length, copyOrder.length);
+        for (int i = 0; i < order.length; i++) {
+            assertEquals(order[i], copyOrder[i]);
+        }
+
+        assertEquals(message.toString(), copy.toString());        
+    }
+
+}