Author: fanningpj
Date: Thu Aug 18 17:40:22 2022
New Revision: 1903529
URL: http://svn.apache.org/viewvc?rev=1903529&view=rev
Log:
[bug-66230] don't fail to create SXSSFSheet if auto size tracker can't be
initialized
Added:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/SXSSFITestDataProviderWithNullAutoSizeTracker.java
- copied, changed from r1903470,
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithNullAutoSizeTracker.java
- copied, changed from r1903470,
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
Modified:
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java?rev=1903529&r1=1903528&r2=1903529&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
(original)
+++
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
Thu Aug 18 17:40:22 2022
@@ -19,13 +19,7 @@ package org.apache.poi.xssf.streaming;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Spliterator;
-import java.util.TreeMap;
+import java.util.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -56,7 +50,7 @@ public class SXSSFSheet implements Sheet
private final TreeMap<Integer,SXSSFRow> _rows = new TreeMap<>();
protected SheetDataWriter _writer;
private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE;
- protected final AutoSizeColumnTracker _autoSizeColumnTracker;
+ protected AutoSizeColumnTracker _autoSizeColumnTracker;
private int outlineLevelRow;
private int lastFlushedRowNumber = -1;
private boolean allFlushed;
@@ -97,7 +91,11 @@ public class SXSSFSheet implements Sheet
_sh = xSheet;
_writer = workbook.createSheetDataWriter();
setRandomAccessWindowSize(_workbook.getRandomAccessWindowSize());
- _autoSizeColumnTracker = new AutoSizeColumnTracker(this);
+ try {
+ _autoSizeColumnTracker = new AutoSizeColumnTracker(this);
+ } catch (Exception e) {
+ LOG.atWarn().log("Failed to create AutoSizeColumnTracker, possibly
due to fonts not being installed in your OS", e);
+ }
}
/**
@@ -1439,11 +1437,15 @@ public class SXSSFSheet implements Sheet
* If <code>column</code> is already tracked, this call does nothing.
*
* @param column the column to track for auto-sizing
+ * @throws IllegalStateException if autoSizeColumnTracker failed to
initialize (possibly due to fonts not being installed in your OS)
* @since 3.14beta1
* @see #trackColumnsForAutoSizing(Collection)
* @see #trackAllColumnsForAutoSizing()
*/
public void trackColumnForAutoSizing(int column) {
+ if (_autoSizeColumnTracker == null) {
+ throw new IllegalStateException("Cannot trackColumnForAutoSizing
because autoSizeColumnTracker failed to initialize (possibly due to fonts not
being installed in your OS)");
+ }
_autoSizeColumnTracker.trackColumn(column);
}
@@ -1453,18 +1455,26 @@ public class SXSSFSheet implements Sheet
* Any column in <code>columns</code> that are already tracked are ignored
by this call.
*
* @param columns the columns to track for auto-sizing
+ * @throws IllegalStateException if autoSizeColumnTracker failed to
initialize (possibly due to fonts not being installed in your OS)
* @since 3.14beta1
*/
public void trackColumnsForAutoSizing(Collection<Integer> columns) {
+ if (_autoSizeColumnTracker == null) {
+ throw new IllegalStateException("Cannot trackColumnForAutoSizing
because autoSizeColumnTracker failed to initialize (possibly due to fonts not
being installed in your OS)");
+ }
_autoSizeColumnTracker.trackColumns(columns);
}
/**
* Tracks all columns in the sheet for auto-sizing. If this is called,
individual columns do not need to be tracked.
* Because determining the best-fit width for a cell is expensive, this
may affect the performance.
+ * @throws IllegalStateException if autoSizeColumnTracker failed to
initialize (possibly due to fonts not being installed in your OS)
* @since 3.14beta1
*/
public void trackAllColumnsForAutoSizing() {
+ if (_autoSizeColumnTracker == null) {
+ throw new IllegalStateException("Cannot trackColumnForAutoSizing
because autoSizeColumnTracker failed to initialize (possibly due to fonts not
being installed in your OS)");
+ }
_autoSizeColumnTracker.trackAllColumns();
}
@@ -1480,7 +1490,7 @@ public class SXSSFSheet implements Sheet
* @see #untrackAllColumnsForAutoSizing()
*/
public boolean untrackColumnForAutoSizing(int column) {
- return _autoSizeColumnTracker.untrackColumn(column);
+ return _autoSizeColumnTracker != null &&
_autoSizeColumnTracker.untrackColumn(column);
}
/**
@@ -1493,7 +1503,7 @@ public class SXSSFSheet implements Sheet
* @since 3.14beta1
*/
public boolean untrackColumnsForAutoSizing(Collection<Integer> columns) {
- return _autoSizeColumnTracker.untrackColumns(columns);
+ return _autoSizeColumnTracker != null &&
_autoSizeColumnTracker.untrackColumns(columns);
}
/**
@@ -1502,7 +1512,9 @@ public class SXSSFSheet implements Sheet
* @since 3.14beta1
*/
public void untrackAllColumnsForAutoSizing() {
- _autoSizeColumnTracker.untrackAllColumns();
+ if (_autoSizeColumnTracker != null) {
+ _autoSizeColumnTracker.untrackAllColumns();
+ }
}
/**
@@ -1513,7 +1525,7 @@ public class SXSSFSheet implements Sheet
* @since 3.14beta1
*/
public boolean isColumnTrackedForAutoSizing(int column) {
- return _autoSizeColumnTracker.isColumnTracked(column);
+ return _autoSizeColumnTracker != null &&
_autoSizeColumnTracker.isColumnTracked(column);
}
/**
@@ -1525,7 +1537,7 @@ public class SXSSFSheet implements Sheet
* @since 3.14beta1
*/
public Set<Integer> getTrackedColumnsForAutoSizing() {
- return _autoSizeColumnTracker.getTrackedColumns();
+ return _autoSizeColumnTracker == null ? Collections.emptySet() :
_autoSizeColumnTracker.getTrackedColumns();
}
/**
@@ -1576,9 +1588,14 @@ public class SXSSFSheet implements Sheet
*
* @param column the column index to auto-size
* @param useMergedCells whether to use the contents of merged cells when
calculating the width of the column
+ * @throws IllegalStateException if autoSizeColumnTracker failed to
initialize (possibly due to fonts not being installed in your OS)
*/
@Override
public void autoSizeColumn(int column, boolean useMergedCells) {
+ if (_autoSizeColumnTracker == null) {
+ throw new IllegalStateException("Cannot trackColumnForAutoSizing
because autoSizeColumnTracker failed to initialize (possibly due to fonts not
being installed in your OS)");
+ }
+
// Multiple calls to autoSizeColumn need to look up the best-fit width
// of rows already flushed to disk plus re-calculate the best-fit width
// of rows in the current window. It isn't safe to update the column
@@ -1889,9 +1906,13 @@ public class SXSSFSheet implements Sheet
if (firstRowNum!=null) {
int rowIndex = firstRowNum;
SXSSFRow row = _rows.get(firstRowNum);
- // Update the best fit column widths for auto-sizing just before
the rows are flushed
- _autoSizeColumnTracker.updateColumnWidths(row);
- if (_writer != null) _writer.writeRow(rowIndex, row);
+ if (_autoSizeColumnTracker != null) {
+ // Update the best fit column widths for auto-sizing just
before the rows are flushed
+ _autoSizeColumnTracker.updateColumnWidths(row);
+ }
+ if (_writer != null) {
+ _writer.writeRow(rowIndex, row);
+ }
_rows.remove(firstRowNum);
lastFlushedRowNumber = rowIndex;
}
Modified:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java?rev=1903529&r1=1903528&r2=1903529&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
(original)
+++
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
Thu Aug 18 17:40:22 2022
@@ -36,14 +36,14 @@ import org.apache.poi.xssf.streaming.SXS
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-public final class SXSSFITestDataProvider implements ITestDataProvider {
+public class SXSSFITestDataProvider implements ITestDataProvider {
public static final SXSSFITestDataProvider instance = new
SXSSFITestDataProvider();
// an instance of all SXSSFWorkbooks opened by this TestDataProvider,
// so that the temporary files created can be disposed up by cleanup()
- private final Collection<SXSSFWorkbook> instances = new ArrayList<>();
+ protected final Collection<SXSSFWorkbook> instances = new ArrayList<>();
- private SXSSFITestDataProvider() {
+ protected SXSSFITestDataProvider() {
// enforce singleton
}
Copied:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/SXSSFITestDataProviderWithNullAutoSizeTracker.java
(from r1903470,
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java)
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/SXSSFITestDataProviderWithNullAutoSizeTracker.java?p2=poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/SXSSFITestDataProviderWithNullAutoSizeTracker.java&p1=poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java&r1=1903470&r2=1903529&rev=1903529&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/SXSSFITestDataProvider.java
(original)
+++
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/SXSSFITestDataProviderWithNullAutoSizeTracker.java
Thu Aug 18 17:40:22 2022
@@ -17,64 +17,16 @@
* ====================================================================
*/
-package org.apache.poi.xssf;
+package org.apache.poi.xssf.streaming;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
-import org.apache.poi.POIDataSamples;
-import org.apache.poi.ss.ITestDataProvider;
-import org.apache.poi.ss.SpreadsheetVersion;
-import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.xssf.streaming.SXSSFSheet;
-import org.apache.poi.xssf.streaming.SXSSFWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-
-public final class SXSSFITestDataProvider implements ITestDataProvider {
- public static final SXSSFITestDataProvider instance = new
SXSSFITestDataProvider();
-
- // an instance of all SXSSFWorkbooks opened by this TestDataProvider,
- // so that the temporary files created can be disposed up by cleanup()
- private final Collection<SXSSFWorkbook> instances = new ArrayList<>();
+import org.apache.poi.xssf.SXSSFITestDataProvider;
- private SXSSFITestDataProvider() {
- // enforce singleton
- }
-
- @Override
- public Workbook openSampleWorkbook(String sampleFileName) {
- XSSFWorkbook xssfWorkbook =
XSSFITestDataProvider.instance.openSampleWorkbook(sampleFileName);
- SXSSFWorkbook swb = new SXSSFWorkbook(xssfWorkbook);
- instances.add(swb);
- return swb;
- }
+public class SXSSFITestDataProviderWithNullAutoSizeTracker extends
SXSSFITestDataProvider {
+ public static final SXSSFITestDataProviderWithNullAutoSizeTracker instance
= new SXSSFITestDataProviderWithNullAutoSizeTracker();
- /**
- * Returns an XSSFWorkbook since SXSSFWorkbook is write-only
- */
- @Override
- public XSSFWorkbook writeOutAndReadBack(Workbook wb) {
- // wb is usually an SXSSFWorkbook, but must also work on an
XSSFWorkbook
- // since workbooks must be able to be written out and read back
- // several times in succession
- if(!(wb instanceof SXSSFWorkbook || wb instanceof XSSFWorkbook)) {
- throw new IllegalArgumentException("Expected an instance of
SXSSFWorkbook");
- }
-
- try (UnsynchronizedByteArrayOutputStream baos = new
UnsynchronizedByteArrayOutputStream()) {
- wb.write(baos);
- try (InputStream is = baos.toInputStream()) {
- return new XSSFWorkbook(is);
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
+ private SXSSFITestDataProviderWithNullAutoSizeTracker() {
+ // enforce singleton
}
@Override
@@ -98,32 +50,27 @@ public final class SXSSFITestDataProvide
}
//************ End SXSSF-specific methods ***************//
- @Override
- public FormulaEvaluator createFormulaEvaluator(Workbook wb) {
- return new XSSFFormulaEvaluator(((SXSSFWorkbook)
wb).getXSSFWorkbook());
- }
-
- @Override
- public byte[] getTestDataFileContent(String fileName) {
- return POIDataSamples.getSpreadSheetInstance().readFile(fileName);
- }
+ private static class SXSSFWorkbookWithNullAutoSizeTracker extends
SXSSFWorkbook {
+ SXSSFWorkbookWithNullAutoSizeTracker() {
+ super();
+ }
- @Override
- public SpreadsheetVersion getSpreadsheetVersion() {
- return SpreadsheetVersion.EXCEL2007;
- }
+ SXSSFWorkbookWithNullAutoSizeTracker(int rowAccessWindowSize) {
+ super(rowAccessWindowSize);
+ }
- @Override
- public String getStandardFileNameExtension() {
- return "xlsx";
- }
+ @Override
+ public SXSSFSheet createSheet() {
+ SXSSFSheet sheet = super.createSheet();
+ sheet._autoSizeColumnTracker = null;
+ return sheet;
+ }
- public synchronized boolean cleanup() {
- boolean ok = true;
- for(final SXSSFWorkbook wb : instances) {
- ok = ok && wb.dispose();
+ @Override
+ public SXSSFSheet createSheet(String name) {
+ SXSSFSheet sheet = super.createSheet(name);
+ sheet._autoSizeColumnTracker = null;
+ return sheet;
}
- instances.clear();
- return ok;
}
}
Copied:
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithNullAutoSizeTracker.java
(from r1903470,
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java)
URL:
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithNullAutoSizeTracker.java?p2=poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithNullAutoSizeTracker.java&p1=poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java&r1=1903470&r2=1903529&rev=1903529&view=diff
==============================================================================
---
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
(original)
+++
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithNullAutoSizeTracker.java
Thu Aug 18 17:40:22 2022
@@ -19,58 +19,40 @@
package org.apache.poi.xssf.streaming;
-import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM;
-import static org.apache.poi.POITestCase.assertEndsWith;
-import static org.apache.poi.POITestCase.assertStartsWith;
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-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.assertSame;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-
import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
import org.apache.poi.POIDataSamples;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.ss.tests.usermodel.BaseTestXWorkbook;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.SXSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.model.SharedStringsTable;
-import org.apache.poi.xssf.usermodel.DefaultIndexedColorMap;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFColor;
-import org.apache.poi.xssf.usermodel.XSSFFont;
-import org.apache.poi.xssf.usermodel.XSSFHyperlink;
-import org.apache.poi.xssf.usermodel.XSSFRichTextString;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xssf.usermodel.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-public final class TestSXSSFWorkbook extends BaseTestXWorkbook {
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM;
+import static org.apache.poi.POITestCase.assertEndsWith;
+import static org.apache.poi.POITestCase.assertStartsWith;
+import static org.junit.jupiter.api.Assertions.*;
+
+public final class TestSXSSFWorkbookWithNullAutoSizeTracker extends
BaseTestXWorkbook {
- public TestSXSSFWorkbook() {
- super(SXSSFITestDataProvider.instance);
+ public TestSXSSFWorkbookWithNullAutoSizeTracker() {
+ super(SXSSFITestDataProviderWithNullAutoSizeTracker.instance);
}
@AfterEach
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]