From: PJ Fanning Date: Sun, 22 May 2022 10:23:59 +0000 (+0000) Subject: [bug-66081] fix editing of added abstract numberings X-Git-Tag: REL_5_2_3~319 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=435dc86896dde5f757303f57f3be2cadfa288229;p=poi.git [bug-66081] fix editing of added abstract numberings git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901120 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java index c4317eccc7..b752f98ba1 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java @@ -220,12 +220,15 @@ public class XWPFNumbering extends POIXMLDocumentPart { public BigInteger addAbstractNum(XWPFAbstractNum abstractNum) { int pos = abstractNums.size(); if (abstractNum.getAbstractNum() != null) { // Use the current CTAbstractNum if it exists - ctNumbering.addNewAbstractNum().set(abstractNum.getAbstractNum()); + CTAbstractNum ctAbstractNum = ctNumbering.addNewAbstractNum(); + ctAbstractNum.set(abstractNum.getAbstractNum()); + abstractNum.setCtAbstractNum(ctAbstractNum); } else { abstractNum.setCtAbstractNum(ctNumbering.addNewAbstractNum()); BigInteger id = findNextAbstractNumberingId(); abstractNum.getAbstractNum().setAbstractNumId(id); ctNumbering.setAbstractNumArray(pos, abstractNum.getAbstractNum()); + abstractNum.setCtAbstractNum(ctNumbering.getAbstractNumArray(pos)); } abstractNums.add(abstractNum); return abstractNum.getCTAbstractNum().getAbstractNumId(); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java index edfb986e99..8afaaecb2d 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java @@ -214,8 +214,7 @@ class TestXWPFBugs { // we added one level for numbering with id "1" if (id == 1) { - //TODO remaining issue from https://bz.apache.org/bugzilla/show_bug.cgi?id=66079 - //assertEquals(1, abstractNum.getAbstractNum().getLvlList().size()); + assertEquals(1, abstractNum.getAbstractNum().getLvlList().size()); } else { assertEquals(0, abstractNum.getAbstractNum().getLvlList().size()); } @@ -288,6 +287,48 @@ class TestXWPFBugs { } } + @Test + void testEditNumberings() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("NumberingWithOutOfOrderId.docx")) { + XWPFNumbering numbering = doc.createNumbering(); + + // Abstract numbering with id = 1 already exists in the file, and has 9 levels + XWPFAbstractNum abstractNum1 = numbering.getAbstractNum(BigInteger.ONE); + assertEquals(9, abstractNum1.getAbstractNum().getLvlList().size()); + // Remove all levels from this numbering + while (abstractNum1.getAbstractNum().getLvlList().size() > 0) { + abstractNum1.getAbstractNum().removeLvl(0); + } + + // Add abstract numbering with id = 0 + addNumberingWithAbstractId(numbering, 0); + + // Add abstract numbering with auto-generated id, this should be 2 + numbering.addAbstractNum(new XWPFAbstractNum()); + + // Add (id + 1) levels to each abstract numbering + for (int id = 0; id < 3; id++) { + XWPFAbstractNum num = numbering.getAbstractNum(BigInteger.valueOf(id)); + for (int j = 0; j < id + 1; j++) { + num.getAbstractNum().addNewLvl(); + } + } + + // Check that all levels added successfully + for (int id = 0; id < 3; id++) { + assertEquals(id + 1, numbering.getAbstractNum(BigInteger.valueOf(id)).getAbstractNum().getLvlList().size()); + } + + XWPFDocument docReloaded = writeOutAndReadBack(doc); + XWPFNumbering numberingReloaded = docReloaded.getNumbering(); + + // Check that all added levels persisted after document reload + for (int id = 0; id < 3; id++) { + assertEquals(id + 1, numberingReloaded.getAbstractNum(BigInteger.valueOf(id)).getAbstractNum().getLvlList().size()); + } + } + } + private static void addNumberingWithAbstractId(XWPFNumbering documentNumbering, int id){ // create a numbering scheme CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();