From bdcb6c09ee50e659bf9b8a67b20f7b663a2e5ea6 Mon Sep 17 00:00:00 2001 From: Emmanuel Robert Ssebaggala Date: Fri, 28 Jul 2017 14:40:31 +0300 Subject: [PATCH] Fix column misalignment caused by uneven number of 3GPP attributes Cases where un:UtranCell was missing the creationTime attribute resulted in wrong csv column alignment --- dist/boda-bulkcmparser.jar | Bin 10916 -> 11374 bytes nbactions.xml | 7 ++ .../boda_bulkcmparser/BodaBulkCMParser.java | 107 ++++++++++++++++-- .../BodaBulkCMParserTest.java | 2 +- 4 files changed, 103 insertions(+), 13 deletions(-) diff --git a/dist/boda-bulkcmparser.jar b/dist/boda-bulkcmparser.jar index 4cf9d2b2b396cae19a6af56420673e351bd38af1..50f98475785bae080a5eb4cfd2dc22a7dcb94a04 100644 GIT binary patch delta 10272 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%0DiqP{Fp1uPDtZ%6rng`j{RLLj+k9Pk2R6~W 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 z=t?H5MuRW`007nj001%o0000000000005+c6(^IxDassembly:single + + CUSTOM-test + test + + test + + diff --git a/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java b/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java index 978ab13..9befabb 100644 --- a/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java +++ b/src/main/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParser.java @@ -29,6 +29,14 @@ public class BodaBulkCMParser { + + /** + * Current release version + * + * Since 1.3.0 + */ + final String VERSION = "1.3.0"; + /** * Tracks XML elements. * @@ -248,6 +256,13 @@ public class BodaBulkCMParser { */ Map moColumnsParentIds = new LinkedHashMap(); + /** + * A map of 3GPP attributes to the 3GPP MOs + * + * @since 1.3.0 + */ + Map moThreeGPPAttrMap = new LinkedHashMap(); + /** * The file/directory to be parsed. * @@ -719,6 +734,10 @@ public void endELementEvent(XMLEvent xmlEvent) //3.2 if (qName.equals("attributes")) { attrMarker = false; + + if(parserState == ParserStates.EXTRACTING_PARAMETERS && vsDataType == null){ + updateThreeGPPAttrMap(); + } return; } @@ -941,18 +960,33 @@ public void process3GPPAttributes() paramValues = paramValues + "," + toCSVFormat(meMap.getValue()); } } + + //Some MOs dont have 3GPP attributes e.g. the fileHeader + //and the fileFooter + if( moThreeGPPAttrMap.get(mo) != null ){ + //Get 3GPP attributes for MO at the current depth + Stack a3GPPAtrr = moThreeGPPAttrMap.get(mo); + Map current3GPPAttrs = null; + + if (!threeGPPAttrStack.isEmpty() && threeGPPAttrStack.get(depth) != null) { + current3GPPAttrs = threeGPPAttrStack.get(depth); + } + + for(int i =0; i < a3GPPAtrr.size();i++){ + String aAttr = (String)a3GPPAtrr.get(i); + String aValue= ""; + + if( current3GPPAttrs != null && current3GPPAttrs.containsKey(aAttr)){ + aValue = toCSVFormat(current3GPPAttrs.get(aAttr)); + } + + paramNames = paramNames + "," + aAttr; + paramValues = paramValues + "," + aValue; + } + } + - //Get 3GPP parameters for the MO at the current depth. - if (!threeGPPAttrStack.isEmpty() && threeGPPAttrStack.get(depth) != null) { - Iterator> iter - = threeGPPAttrStack.get(depth).entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry meMap = iter.next(); - paramNames = paramNames + "," + meMap.getKey(); - paramValues = paramValues + "," + toCSVFormat(meMap.getValue()); - } - } - + //Write the 3GPP defined MOs to files. PrintWriter pw = null; if (!output3GPPMOPWMap.containsKey(mo)) { @@ -1065,6 +1099,55 @@ public void processVendorAttributes() { } + + /** + * Update the map of 3GPP MOs to attributes. + * + * This is necessary to ensure the final output in the csv is aligned. + * + * @since 1.3.0 + */ + private void updateThreeGPPAttrMap(){ + if( xmlTagStack == null || xmlTagStack.isEmpty() ) return; + + String mo = xmlTagStack.peek().toString(); + + //Hold the current 3GPP attributes + HashMap tgppAttrs = null; + + Stack attrs = new Stack(); + + //Initialize if the MO does not exist + if(!moThreeGPPAttrMap.containsKey(mo)){ + moThreeGPPAttrMap.put(mo, new Stack()); + } + + + //The attributes stack can be empty if the MO has no 3GPP attributes + if(threeGPPAttrStack.isEmpty() || threeGPPAttrStack.get(depth) == null){ + return; + } + tgppAttrs = (LinkedHashMap) threeGPPAttrStack.get(depth); + + + attrs = moThreeGPPAttrMap.get(mo); + + if(tgppAttrs != null){ + //Get vendor specific attributes + Iterator> iter + = tgppAttrs.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry me = iter.next(); + String parameter = me.getKey(); + if( !attrs.contains( parameter ) ){ + attrs.push(parameter); + } + } + moThreeGPPAttrMap.replace(mo, attrs); + + } + } + /** * Collect parameters for vendor specific mo data */ @@ -1178,7 +1261,7 @@ public void closeMOPWMap() { * @version 1.0.0 */ public void showHelp() { - System.out.println("boda-bulkcmparser 1.2.0 Copyright (c) 2017 Bodastage(http://www.bodastage.com)"); + System.out.println("boda-bulkcmparser "+ VERSION +" Copyright (c) 2017 Bodastage(http://www.bodastage.com)"); System.out.println("Parses 3GPP Bulk CM XML to csv."); System.out.println("Usage: java -jar boda-bulkcmparser.jar "); } diff --git a/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java b/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java index 69da1ca..9994281 100644 --- a/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java +++ b/src/test/java/com/bodastage/boda_bulkcmparser/BodaBulkCMParserTest.java @@ -79,7 +79,7 @@ public void tearDown(){ }catch(Exception e){ System.err.println(e.getMessage()); - //assertTrue(false); + assertTrue(false); } }