From 21d25fb38ad0eafc7d6ed3dc4ee482938aef0027 Mon Sep 17 00:00:00 2001 From: Renato Kosaka Araujo Date: Tue, 7 Jul 2015 23:49:09 -0300 Subject: [PATCH] Fix for issue #47 --- .../com/solab/iso8583/parse/ConfigParser.java | 21 ++++++++++++++++--- .../com/solab/iso8583/TestConfigParser.java | 19 +++++++++++++++++ src/test/resources/issue47.xml | 14 +++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/issue47.xml diff --git a/src/main/java/com/solab/iso8583/parse/ConfigParser.java b/src/main/java/com/solab/iso8583/parse/ConfigParser.java index d72caac..9d97548 100644 --- a/src/main/java/com/solab/iso8583/parse/ConfigParser.java +++ b/src/main/java/com/solab/iso8583/parse/ConfigParser.java @@ -23,6 +23,7 @@ import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -34,6 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; @@ -336,9 +338,8 @@ public class ConfigParser { } HashMap child = new HashMap<>(); child.putAll(parent); - NodeList fields = elem.getElementsByTagName("field"); - for (int j = 0; j < fields.getLength(); j++) { - Element f = (Element)fields.item(j); + List fields = getDirectChildrenByTagName(elem, "field"); + for (Element f : fields) { int num = Integer.parseInt(f.getAttribute("num")); String typedef = f.getAttribute("type"); if ("exclude".equals(typedef)) { @@ -352,6 +353,20 @@ public class ConfigParser { } } } + + private static List getDirectChildrenByTagName(Element elem, String tagName) { + List childElementsByTagName = new ArrayList(); + NodeList childNodes = elem.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) { + Element childElem = (Element)childNodes.item(i); + if (childElem.getTagName().equals(tagName)) { + childElementsByTagName.add(childElem); + } + } + } + return childElementsByTagName; + } /** Reads the XML from the stream and configures the message factory with its values. * @param mfact The message factory to be configured with the values read from the XML. diff --git a/src/test/java/com/solab/iso8583/TestConfigParser.java b/src/test/java/com/solab/iso8583/TestConfigParser.java index 3b050ff..d9604e6 100644 --- a/src/test/java/com/solab/iso8583/TestConfigParser.java +++ b/src/test/java/com/solab/iso8583/TestConfigParser.java @@ -201,4 +201,23 @@ public class TestConfigParser { Assert.assertEquals("99", m.getObjectValue(39)); Assert.assertEquals("X", m.getObjectValue(61)); } + + @Test // issue 47 + public void testExtendCompositeWithSameField() throws IOException, ParseException { + final MessageFactory mfact = config("issue47.xml"); + + final String m200 = "02001000000000000004000000100000013ABCDEFGHIJKLM"; + IsoMessage isoMessage = mfact.parseMessage(m200.getBytes(), 0); + + // check field num 4 + IsoValue field4 = isoMessage.getField(4); + Assert.assertEquals(IsoType.AMOUNT, field4.getType()); + Assert.assertEquals(IsoType.AMOUNT.getLength(), field4.getLength()); + + // check nested field num 4 from composite field 62 + CompositeField compositeField62 = (CompositeField) isoMessage.getField(62).getValue(); + IsoValue nestedField4 = compositeField62.getField(0); // first in list + Assert.assertEquals(IsoType.ALPHA, nestedField4.getType()); + Assert.assertEquals(13, nestedField4.getLength()); + } } diff --git a/src/test/resources/issue47.xml b/src/test/resources/issue47.xml new file mode 100644 index 0000000..e5421d8 --- /dev/null +++ b/src/test/resources/issue47.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file