Browse Source

[bug-66080] XWPFNumbering.addAbstractNum uses abstract numberings count as id

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901110 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_3
PJ Fanning 1 year ago
parent
commit
d178bb9dc1

+ 10
- 1
poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFNumbering.java View File

@@ -223,13 +223,22 @@ public class XWPFNumbering extends POIXMLDocumentPart {
ctNumbering.addNewAbstractNum().set(abstractNum.getAbstractNum());
} else {
abstractNum.setCtAbstractNum(ctNumbering.addNewAbstractNum());
abstractNum.getAbstractNum().setAbstractNumId(BigInteger.valueOf(pos));
BigInteger id = findNextAbstractNumberingId();
abstractNum.getAbstractNum().setAbstractNumId(id);
ctNumbering.setAbstractNumArray(pos, abstractNum.getAbstractNum());
}
abstractNums.add(abstractNum);
return abstractNum.getCTAbstractNum().getAbstractNumId();
}

private BigInteger findNextAbstractNumberingId() {
long maxId = 0;
for (XWPFAbstractNum num : abstractNums) {
maxId = Math.max(maxId, num.getAbstractNum().getAbstractNumId().longValue());
}
return BigInteger.valueOf(maxId + 1);
}

/**
* remove an existing abstractNum
*

+ 11
- 0
poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java View File

@@ -196,6 +196,9 @@ class TestXWPFBugs {
//attempt to remove item with numId 2
assertTrue(numbering.removeAbstractNum(BigInteger.valueOf(2)));

//adding one level to numbering with id 1
numbering.getAbstractNum(BigInteger.valueOf(1)).getCTAbstractNum().addNewLvl();

XWPFDocument docReloaded = writeOutAndReadBack(doc);
XWPFNumbering numberingReloaded = docReloaded.getNumbering();

@@ -208,6 +211,14 @@ class TestXWPFBugs {
} else {
assertNotNull(abstractNum, "Failed for " + id);
assertEquals(id, abstractNum.getAbstractNum().getAbstractNumId().longValue());

// 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());
} else {
assertEquals(0, abstractNum.getAbstractNum().getLvlList().size());
}
}
}


+ 12
- 0
poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFNumbering.java View File

@@ -153,4 +153,16 @@ class TestXWPFNumbering {
assertEquals("upperLetter", ctNumLvl.getLvl().getNumFmt().getVal().toString());
}
}

@Test
void testAddAbstractNum() throws IOException {
try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("NumberingWithOutOfOrderId.docx")) {
doc.getNumbering().addAbstractNum(new XWPFAbstractNum());
long count = doc.getNumbering()
.getAbstractNums().stream()
.map(e -> e.getCTAbstractNum().getAbstractNumId().intValue())
.distinct().count();
assertEquals(doc.getNumbering().getAbstractNums().size(), count);
}
}
}

BIN
test-data/document/NumberingWithOutOfOrderId.docx View File


Loading…
Cancel
Save