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]

Reply via email to