From caf2d32393f6179673a615e9f0db5ef06956654e Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 30 Jan 2021 18:42:14 +0000 Subject: [PATCH] Bug 65099: Fix incorrect handling of styles in XWPFStyle.getUsedStyleList Closes github #216 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1886063 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xwpf/usermodel/XWPFStyles.java | 4 +-- .../poi/xwpf/usermodel/TestXWPFBugs.java | 31 ++++++++++++++++++ .../poi/xwpf/usermodel/TestXWPFStyles.java | 6 ++-- test-data/document/65099.docx | Bin 0 -> 17126 bytes 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 test-data/document/65099.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java index 3d4b1b7268..93b05ab901 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFStyles.java @@ -228,8 +228,8 @@ public class XWPFStyles extends POIXMLDocumentPart { String nextStyleID = style.getNextStyleID(); XWPFStyle nextStyle = getStyle(nextStyleID); if ((nextStyle != null) && (!usedStyleList.contains(nextStyle))) { - usedStyleList.add(linkStyle); - getUsedStyleList(linkStyle, usedStyleList); + usedStyleList.add(nextStyle); + getUsedStyleList(nextStyle, usedStyleList); } return usedStyleList; } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java index 4ad0d80a8c..2974c879dc 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java @@ -20,12 +20,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigInteger; +import java.util.List; import org.apache.poi.util.Units; import org.apache.poi.xwpf.XWPFTestDataSamples; @@ -230,4 +232,33 @@ class TestXWPFBugs { documentNumbering.addNum(abstractNumID); } + + @Test + public void test65099() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("65099.docx")) { + XWPFStyles styles = doc.getStyles(); + assertNotNull(styles); + + XWPFStyle normal = styles.getStyle("Normal"); + assertNotNull(normal); + + XWPFStyle style1 = styles.getStyle("EdfTitre3Car"); + assertNotNull(style1); + + List list = styles.getUsedStyleList(normal); + assertNotNull(list); + assertEquals(1, list.size()); + + list = styles.getUsedStyleList(style1); + assertNotNull(list); + assertEquals(7, list.size()); + + assertThrows(NullPointerException.class, + () -> styles.getUsedStyleList(null), + "Pasisng in 'null' triggers an exception"); + + XWPFStyle style = doc.getStyles().getStyle("TableauGrille41"); + doc.getStyles().getUsedStyleList(style); + } + } } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFStyles.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFStyles.java index fcabe249dd..6c517f4c95 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFStyles.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFStyles.java @@ -170,7 +170,7 @@ public final class TestXWPFStyles { assertNull(r.getColor()); assertNull(r.getFontFamily()); assertNull(r.getFontName()); - assertEquals(-1, r.getFontSize()); + assertNull(r.getFontSizeAsDouble()); } // On page two, has explicit styles, but on runs not on @@ -184,7 +184,7 @@ public final class TestXWPFStyles { XWPFRun r = p.getRuns().get(0); assertEquals("Arial Black", r.getFontFamily()); assertEquals("Arial Black", r.getFontName()); - assertEquals(16, r.getFontSize()); + assertEquals(16.0, r.getFontSizeAsDouble(), 0.01); assertEquals("548DD4", r.getColor()); } @@ -203,7 +203,7 @@ public final class TestXWPFStyles { assertNotNull(styles.getDefaultRunStyle()); assertNotNull(styles.getDefaultParagraphStyle()); - assertEquals(11, styles.getDefaultRunStyle().getFontSize()); + assertEquals(11.0, styles.getDefaultRunStyle().getFontSizeAsDouble(), 0.01); assertEquals(11.0, styles.getDefaultRunStyle().getFontSizeAsDouble(), 0.01); assertEquals(200, styles.getDefaultParagraphStyle().getSpacingAfter()); } diff --git a/test-data/document/65099.docx b/test-data/document/65099.docx new file mode 100644 index 0000000000000000000000000000000000000000..a0b57db943804dd03e57c93ab2c0917b865fa1d0 GIT binary patch literal 17126 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 h|ASBD_yhm9c|b-S^n;%O05Bgvz7L8={I)^{_