60329: Avoid NPE when styleid is null

Task-Url: https://bz.apache.org/bugzilla/show_bug.cgi?id=60329

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1772138 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark Murphy 2016-12-01 02:21:56 +00:00
parent 48ff8e5686
commit 07893ec6a0
3 changed files with 41 additions and 6 deletions

View File

@ -195,8 +195,12 @@ public class XWPFStyles extends POIXMLDocumentPart {
*/ */
public XWPFStyle getStyle(String styleID) { public XWPFStyle getStyle(String styleID) {
for (XWPFStyle style : listStyle) { for (XWPFStyle style : listStyle) {
if (style.getStyleId().equals(styleID)) try {
return style; if (style.getStyleId().equals(styleID))
return style;
} catch (NullPointerException e) {
// Ignore NPE
}
} }
return null; return null;
} }

View File

@ -17,13 +17,18 @@
package org.apache.poi.xwpf.usermodel; package org.apache.poi.xwpf.usermodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import junit.framework.TestCase;
import org.apache.poi.xwpf.XWPFTestDataSamples; import org.apache.poi.xwpf.XWPFTestDataSamples;
import org.junit.Test;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLatentStyles; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLatentStyles;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLsdException; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLsdException;
@ -31,7 +36,8 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyle;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTStyles;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType;
public class TestXWPFStyles extends TestCase { public final class TestXWPFStyles {
@Test
public void testGetUsedStyles() throws IOException { public void testGetUsedStyles() throws IOException {
XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("Styles.docx"); XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("Styles.docx");
List<XWPFStyle> testUsedStyleList = new ArrayList<XWPFStyle>(); List<XWPFStyle> testUsedStyleList = new ArrayList<XWPFStyle>();
@ -47,6 +53,7 @@ public class TestXWPFStyles extends TestCase {
assertEquals(usedStyleList, testUsedStyleList); assertEquals(usedStyleList, testUsedStyleList);
} }
@Test
public void testAddStylesToDocument() throws IOException { public void testAddStylesToDocument() throws IOException {
XWPFDocument docOut = new XWPFDocument(); XWPFDocument docOut = new XWPFDocument();
XWPFStyles styles = docOut.createStyles(); XWPFStyles styles = docOut.createStyles();
@ -70,6 +77,7 @@ public class TestXWPFStyles extends TestCase {
* Bug #52449 - We should be able to write a file containing * Bug #52449 - We should be able to write a file containing
* both regular and glossary styles without error * both regular and glossary styles without error
*/ */
@Test
public void test52449() throws Exception { public void test52449() throws Exception {
XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("52449.docx"); XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("52449.docx");
XWPFStyles styles = doc.getStyles(); XWPFStyles styles = doc.getStyles();
@ -86,6 +94,7 @@ public class TestXWPFStyles extends TestCase {
* they exist only to copy xml beans to pi-ooxml-schemas.jar * they exist only to copy xml beans to pi-ooxml-schemas.jar
*/ */
@SuppressWarnings("resource") @SuppressWarnings("resource")
@Test
public void testLanguages() { public void testLanguages() {
XWPFDocument docOut = new XWPFDocument(); XWPFDocument docOut = new XWPFDocument();
XWPFStyles styles = docOut.createStyles(); XWPFStyles styles = docOut.createStyles();
@ -97,6 +106,7 @@ public class TestXWPFStyles extends TestCase {
styles.setDefaultFonts(def); styles.setDefaultFonts(def);
} }
@Test
public void testType() { public void testType() {
CTStyle ctStyle = CTStyle.Factory.newInstance(); CTStyle ctStyle = CTStyle.Factory.newInstance();
XWPFStyle style = new XWPFStyle(ctStyle); XWPFStyle style = new XWPFStyle(ctStyle);
@ -105,6 +115,7 @@ public class TestXWPFStyles extends TestCase {
assertEquals(STStyleType.PARAGRAPH, style.getType()); assertEquals(STStyleType.PARAGRAPH, style.getType());
} }
@Test
public void testLatentStyles() { public void testLatentStyles() {
CTLatentStyles latentStyles = CTLatentStyles.Factory.newInstance(); CTLatentStyles latentStyles = CTLatentStyles.Factory.newInstance();
CTLsdException ex = latentStyles.addNewLsdException(); CTLsdException ex = latentStyles.addNewLsdException();
@ -114,6 +125,7 @@ public class TestXWPFStyles extends TestCase {
assertEquals(false, ls.isLatentStyle("notex1")); assertEquals(false, ls.isLatentStyle("notex1"));
} }
@Test
public void testSetStyles_Bug57254() throws IOException { public void testSetStyles_Bug57254() throws IOException {
XWPFDocument docOut = new XWPFDocument(); XWPFDocument docOut = new XWPFDocument();
XWPFStyles styles = docOut.createStyles(); XWPFStyles styles = docOut.createStyles();
@ -133,6 +145,7 @@ public class TestXWPFStyles extends TestCase {
assertTrue(styles.styleExist(strStyleId)); assertTrue(styles.styleExist(strStyleId));
} }
@Test
public void testEasyAccessToStyles() throws IOException { public void testEasyAccessToStyles() throws IOException {
XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx"); XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx");
XWPFStyles styles = doc.getStyles(); XWPFStyles styles = doc.getStyles();
@ -188,4 +201,22 @@ public class TestXWPFStyles extends TestCase {
assertEquals(11, styles.getDefaultRunStyle().getFontSize()); assertEquals(11, styles.getDefaultRunStyle().getFontSize());
assertEquals(200, styles.getDefaultParagraphStyle().getSpacingAfter()); assertEquals(200, styles.getDefaultParagraphStyle().getSpacingAfter());
} }
// Bug 60329: style with missing StyleID throws NPE
@Test
public void testMissingStyleId() throws IOException {
XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("60329.docx");
XWPFStyles styles = doc.getStyles();
// Styles exist in the test document in this order, EmptyCellLayoutStyle
// is missing a StyleId
try {
assertNotNull(styles.getStyle("NoList"));
assertNull(styles.getStyle("EmptyCellLayoutStyle"));
assertNotNull(styles.getStyle("BalloonText"));
} catch (NullPointerException e) {
fail(e.toString());
}
doc.close();
}
} }

Binary file not shown.