Patch from bug #55650 from Andrej - Avoid AIOOBE if a non-existant Xfs is requested for a styleAvoid AIOOBE if a non-existant Xfs is requested for a style
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1534818 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a32a1cf538
commit
5ac455fd72
@ -20,17 +20,23 @@ package org.apache.poi.xssf.model;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
||||||
import org.apache.poi.ss.usermodel.FontFamily;
|
import org.apache.poi.ss.usermodel.FontFamily;
|
||||||
import org.apache.poi.ss.usermodel.FontScheme;
|
import org.apache.poi.ss.usermodel.FontScheme;
|
||||||
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFFont;
|
import org.apache.poi.xssf.usermodel.XSSFFont;
|
||||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
|
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
|
||||||
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
|
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
|
||||||
@ -49,8 +55,6 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTStylesheet;
|
|||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTXf;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPatternType;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -302,7 +306,7 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CTXf getCellStyleXfAt(int idx) {
|
public CTXf getCellStyleXfAt(int idx) {
|
||||||
return styleXfs.get(idx);
|
return idx < styleXfs.size() ? styleXfs.get(idx) : null;
|
||||||
}
|
}
|
||||||
public int putCellStyleXf(CTXf cellStyleXf) {
|
public int putCellStyleXf(CTXf cellStyleXf) {
|
||||||
styleXfs.add(cellStyleXf);
|
styleXfs.add(cellStyleXf);
|
||||||
|
@ -229,136 +229,136 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
assertFalse(ctBorder.isSetTop());
|
assertFalse(ctBorder.isSetTop());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderThin() {
|
public void testGetSetBorderThin() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_THIN);
|
cellStyle.setBorderTop(CellStyle.BORDER_THIN);
|
||||||
assertEquals(CellStyle.BORDER_THIN, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_THIN, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.THIN, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.THIN, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderMedium() {
|
public void testGetSetBorderMedium() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
|
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
|
||||||
assertEquals(CellStyle.BORDER_MEDIUM, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_MEDIUM, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.MEDIUM, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.MEDIUM, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderThick() {
|
public void testGetSetBorderThick() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_THICK);
|
cellStyle.setBorderTop(CellStyle.BORDER_THICK);
|
||||||
assertEquals(CellStyle.BORDER_THICK, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_THICK, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.THICK, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.THICK, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderHair() {
|
public void testGetSetBorderHair() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_HAIR);
|
cellStyle.setBorderTop(CellStyle.BORDER_HAIR);
|
||||||
assertEquals(CellStyle.BORDER_HAIR, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_HAIR, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.HAIR, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.HAIR, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderDotted() {
|
public void testGetSetBorderDotted() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_DOTTED);
|
cellStyle.setBorderTop(CellStyle.BORDER_DOTTED);
|
||||||
assertEquals(CellStyle.BORDER_DOTTED, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_DOTTED, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.DOTTED, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.DOTTED, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderDashed() {
|
public void testGetSetBorderDashed() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_DASHED);
|
cellStyle.setBorderTop(CellStyle.BORDER_DASHED);
|
||||||
assertEquals(CellStyle.BORDER_DASHED, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_DASHED, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.DASHED, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.DASHED, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderDashDot() {
|
public void testGetSetBorderDashDot() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_DASH_DOT);
|
cellStyle.setBorderTop(CellStyle.BORDER_DASH_DOT);
|
||||||
assertEquals(CellStyle.BORDER_DASH_DOT, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_DASH_DOT, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.DASH_DOT, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.DASH_DOT, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderDashDotDot() {
|
public void testGetSetBorderDashDotDot() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_DASH_DOT_DOT);
|
cellStyle.setBorderTop(CellStyle.BORDER_DASH_DOT_DOT);
|
||||||
assertEquals(CellStyle.BORDER_DASH_DOT_DOT, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_DASH_DOT_DOT, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.DASH_DOT_DOT, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.DASH_DOT_DOT, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderMediumDashDot() {
|
public void testGetSetBorderMediumDashDot() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASH_DOT);
|
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASH_DOT);
|
||||||
assertEquals(CellStyle.BORDER_MEDIUM_DASH_DOT, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_MEDIUM_DASH_DOT, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.MEDIUM_DASH_DOT, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.MEDIUM_DASH_DOT, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderMediumDashDotDot() {
|
public void testGetSetBorderMediumDashDotDot() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASH_DOT_DOT);
|
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASH_DOT_DOT);
|
||||||
assertEquals(CellStyle.BORDER_MEDIUM_DASH_DOT_DOT, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_MEDIUM_DASH_DOT_DOT, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.MEDIUM_DASH_DOT_DOT, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.MEDIUM_DASH_DOT_DOT, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderMediumDashed() {
|
public void testGetSetBorderMediumDashed() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);
|
cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED);
|
||||||
assertEquals(CellStyle.BORDER_MEDIUM_DASHED, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_MEDIUM_DASHED, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.MEDIUM_DASHED, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.MEDIUM_DASHED, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderSlantDashDot() {
|
public void testGetSetBorderSlantDashDot() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_SLANTED_DASH_DOT);
|
cellStyle.setBorderTop(CellStyle.BORDER_SLANTED_DASH_DOT);
|
||||||
assertEquals(CellStyle.BORDER_SLANTED_DASH_DOT, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_SLANTED_DASH_DOT, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.SLANT_DASH_DOT, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.SLANT_DASH_DOT, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBorderDouble() {
|
public void testGetSetBorderDouble() {
|
||||||
cellStyle.setBorderTop(CellStyle.BORDER_DOUBLE);
|
cellStyle.setBorderTop(CellStyle.BORDER_DOUBLE);
|
||||||
assertEquals(CellStyle.BORDER_DOUBLE, cellStyle.getBorderTop());
|
assertEquals(CellStyle.BORDER_DOUBLE, cellStyle.getBorderTop());
|
||||||
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
int borderId = (int)cellStyle.getCoreXf().getBorderId();
|
||||||
assertTrue(borderId > 0);
|
assertTrue(borderId > 0);
|
||||||
//check changes in the underlying xml bean
|
//check changes in the underlying xml bean
|
||||||
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
CTBorder ctBorder = stylesTable.getBorderAt(borderId).getCTBorder();
|
||||||
assertEquals(STBorderStyle.DOUBLE, ctBorder.getTop().getStyle());
|
assertEquals(STBorderStyle.DOUBLE, ctBorder.getTop().getStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetSetBottomBorderColor() {
|
public void testGetSetBottomBorderColor() {
|
||||||
//defaults
|
//defaults
|
||||||
assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getBottomBorderColor());
|
assertEquals(IndexedColors.BLACK.getIndex(), cellStyle.getBottomBorderColor());
|
||||||
@ -836,4 +836,18 @@ public class TestXSSFCellStyle extends TestCase {
|
|||||||
assertNull(style.getStyleXf());
|
assertNull(style.getStyleXf());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Avoid ArrayIndexOutOfBoundsException when getting cell style
|
||||||
|
* in a workbook that has an empty xf table.
|
||||||
|
*/
|
||||||
|
public void testBug55650() {
|
||||||
|
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("52348.xlsx");
|
||||||
|
StylesTable st = workbook.getStylesSource();
|
||||||
|
assertEquals(0, st._getStyleXfsSize());
|
||||||
|
|
||||||
|
// no exception at this point
|
||||||
|
XSSFCellStyle style = workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle();
|
||||||
|
assertNull(style.getStyleXf());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user