From ae3fae68103ac5a8ec6a4d97f4c495dcd9adca48 Mon Sep 17 00:00:00 2001 From: Emmanuel Robert Ssebaggala Date: Mon, 1 Jul 2019 15:59:19 +0300 Subject: [PATCH 1/2] Fix bug with parent child attributes having the same name Cases where the parameter and child attributes had the same name were breaking the parser as it would take the child's closing tag as the parent's closing tag --- .../bulkcm_parent_child_same_name.xml | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/resources/bulkcm_parent_child_same_name.xml diff --git a/src/test/resources/bulkcm_parent_child_same_name.xml b/src/test/resources/bulkcm_parent_child_same_name.xml new file mode 100644 index 0000000..39af845 --- /dev/null +++ b/src/test/resources/bulkcm_parent_child_same_name.xml @@ -0,0 +1,46 @@ + + + + + + + + 999 + usrLabel + + www.bodastage.com + + + + 4698 + DC=www.bodastage.com + + + + + 2 + Bodastage Solutions + 0.0.0 + SDR + Some Element Name + + + + vsDataSomeMO + BodastageSpecificAttributes.0.0.0 + + + + Val1 + SomeAttrChildVal + + + + + + + + + + + \ No newline at end of file From b63ec5e57e9115c052aa63ba753809044d2e3797 Mon Sep 17 00:00:00 2001 From: Emmanuel Robert Ssebaggala Date: Mon, 1 Jul 2019 16:03:00 +0300 Subject: [PATCH 2/2] Update dist/boda-bulkcmparser.jar --- README.md | 2 +- dist/boda-bulkcmparser.jar | Bin 101807 -> 101867 bytes .../boda_bulkcmparser/BodaBulkCMParser.java | 38 ++++++-- .../BodaBulkCMParserTest.java | 81 +++++++++++++++--- 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 8ebd6ea..4ed53f0 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ java -jar boda-bulkcmparser.jar -i input_folder -o out_folder java -jar boda-bulkcmparser.jar -i input_folder -p java -jar boda-bulkcmparser.jar -i input_folder -p -m -Copyright (c) 2018 Bodastage Solutions(http://www.bodastage.com) +Copyright (c) 2019 Bodastage Solutions(http://www.bodastage.com) ``` # Download and installation diff --git a/dist/boda-bulkcmparser.jar b/dist/boda-bulkcmparser.jar index 13b2888af1496405f2ec2aeaa1b2decc58349c2f..3fadc5dd1595f06107544fa10582d43dac1adae8 100644 GIT binary patch delta 14407 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 ReLfJqd9&vJdJ%i`{{XKL%uN6Q delta 14384 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 diff --git a/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java b/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java index cd8bde8..9508cf1 100644 --- a/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java +++ b/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java @@ -47,7 +47,7 @@ public class BodaBulkCMParser { * * Since 1.3.0 */ - final static String VERSION = "2.0.6"; + final static String VERSION = "2.0.7"; private static final Logger LOGGER = LoggerFactory.getLogger(BodaBulkCMParser.class); @@ -327,6 +327,22 @@ public class BodaBulkCMParser { */ private String parameterFile = null; + + /** + * This is used to mark when processing is still inside the children of a + * a parameter - child scenario. It is useful when one of the children has + * the same name as the parent. + * + * someValue + * ... + * someValue + * ... + * someValue + * + * + */ + private Boolean inParentChildTag = false; + public void setExtractParametersOnly(Boolean bool){ extractParametersOnly = bool; } @@ -606,7 +622,7 @@ public void parse() throws XMLStreamException, FileNotFoundException, Unsupporte //Reset variables resetVariables(); - + //Extracting values if (parserState == ParserStates.EXTRACTING_VALUES) { processFileOrDirectory(); @@ -797,7 +813,7 @@ public void startElementEvent(XMLEvent xmlEvent) { startElementTag = qName; startElementTagPrefix = prefix; - + Iterator attributes = startElement.getAttributes(); if(qName.equals("fileFooter") && ParserStates.EXTRACTING_PARAMETERS == parserState){ @@ -962,12 +978,11 @@ public void endELementEvent(XMLEvent xmlEvent) EndElement endElement = xmlEvent.asEndElement(); String prefix = endElement.getName().getPrefix(); String qName = endElement.getName().getLocalPart(); - + startElementTag = ""; //E3:1 if (qName.equalsIgnoreCase("VsDataContainer")) { - String vsDCTag = "VsDataContainer_" + vsDCDepth; xmlTagStack.pop(); xmlAttrStack.remove(depth); @@ -977,7 +992,8 @@ public void endELementEvent(XMLEvent xmlEvent) depth--; return; } - + + //3.2 if (qName.equals("attributes")) { attrMarker = false; @@ -1010,7 +1026,8 @@ public void endELementEvent(XMLEvent xmlEvent) String newValue = tagData; //Handle attributes with children - if (parentChildParameters.containsKey(qName)) {//End of parent tag + //inParentChildTag== false, means we have completed processing the children + if (parentChildParameters.containsKey(qName) && inParentChildTag == false) {//End of parent tag //Ware at the end of the parent tag so we remove the mapping //as the child values have already been collected in @@ -1034,10 +1051,13 @@ public void endELementEvent(XMLEvent xmlEvent) int len = vsDataTypeRlStack.size(); String parentTag = vsDataTypeRlStack.get(len - 2).toString(); newTag = parentTag + parentChildAttrSeperator + qName; - + inParentChildTag = true; + //Store the parent and it's child parentChildParameters.put(parentTag, qName); + }else{ + inParentChildTag = false; } //Handle multivalued paramenters @@ -1645,7 +1665,7 @@ public void closeMOPWMap() { * @version 1.0.0 */ public void showHelp() { - System.out.println("boda-bulkcmparser "+ VERSION +" Copyright (c) 2018 Bodastage(http://www.bodastage.com)"); + System.out.println("boda-bulkcmparser "+ VERSION +" Copyright (c) 2019 Bodastage(http://www.bodastage.com)"); System.out.println("Parses 3GPP Bulk CM XML to csv."); System.out.println("Usage: java -jar boda-bulkcmparser.jar [parameter.conf]"); } diff --git a/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java b/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java index 9994281..88a6400 100644 --- a/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java +++ b/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java @@ -1,7 +1,15 @@ package com.bodastage.boda_bulkcmparser; import com.bodastage.boda_bulkcmparser.bulkcmxml.BulkCmConfigDataFile; +import java.io.BufferedReader; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -94,21 +102,68 @@ public static Test suite() /** * Run test. */ - public void testApp() - { +// public void testApp() +// { +// try { +// BodaBulkCMParser parser = new BodaBulkCMParser(); +// String[] args = { sampleBulkCMFile, System.getProperty("java.io.tmpdir")}; +// parser.main(args); +// +// for(int i=0; i