]> source.dussan.org Git - poi.git/commitdiff
Bug 53650 - Prevent unreadable content and disalow to overwrite rows in user templates
authorYegor Kozlov <yegor@apache.org>
Fri, 7 Dec 2012 10:36:16 +0000 (10:36 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 7 Dec 2012 10:36:16 +0000 (10:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1418264 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java
src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java

index 35f3cbef918e186dddf187514507fa1c4e3302a3..b8b3e81d219e0544052ec86f93f9b155bdb4f86d 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="4.0-beta1" date="2013-??-??">
+          <action dev="poi-developers" type="fix">53650 - Prevent unreadable content and disalow to overwrite rows from input template in SXSSF</action>
           <action dev="poi-developers" type="fix">54228,53672 - Fixed XSSF to read cells with missing R attribute</action>
           <action dev="poi-developers" type="fix">54206 - Ensure that shared formuals are updated when shifting rows in a spreadsheet</action>
           <action dev="poi-developers" type="fix">Synchronize table headers with parent sheet in XSSF</action>
index c2c438d7d46a5bde799b71bf72f6b73de4e2d9d8..401f339de01f7c27b27eca912abe20479f140352 100644 (file)
@@ -106,6 +106,20 @@ public class SXSSFSheet implements Sheet, Cloneable
                     + ") outside allowable range (0.." + maxrow + ")");
         }
 
+        // attempt to overwrite a row that is already flushed to disk
+        if(rownum <= _writer.getLastFlushedRow() ) {
+            throw new IllegalArgumentException(
+                    "Attempting to write a row["+rownum+"] " +
+                    "in the range [0," + _writer.getLastFlushedRow() + "] that is already written to disk.");
+        }
+
+        // attempt to overwrite a existing row in the input template
+        if(_sh.getPhysicalNumberOfRows() > 0 && rownum <= _sh.getLastRowNum() ) {
+            throw new IllegalArgumentException(
+                    "Attempting to write a row["+rownum+"] " +
+                            "in the range [0," + _sh.getLastRowNum() + "] that is already written to disk.");
+        }
+
 //Make the initial allocation as big as the row above.
         Row previousRow=rownum>0?getRow(rownum-1):null;
         int initialAllocationSize=0;
index 649d0b72fca1d3db5d6938f7db9f473954a1858a..e205224758c48d5048fcf841b9d88b87c20d487c 100644 (file)
@@ -44,6 +44,7 @@ public class SheetDataWriter {
     int _numberOfFlushedRows;\r
     int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0\r
     int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0\r
+    int _numberLastFlushedRow = -1; // meaningful only of _numberOfFlushedRows>0\r
 \r
     public SheetDataWriter() throws IOException {\r
         _fd = createTempFile();\r
@@ -105,6 +106,10 @@ public class SheetDataWriter {
         return _lowestIndexOfFlushedRows;\r
     }\r
 \r
+    public int getLastFlushedRow() {\r
+        return _numberLastFlushedRow;\r
+    }\r
+\r
     protected void finalize() throws Throwable {\r
         _fd.delete();\r
     }\r
@@ -118,6 +123,7 @@ public class SheetDataWriter {
     public void writeRow(int rownum, SXSSFRow row) throws IOException {\r
         if (_numberOfFlushedRows == 0)\r
             _lowestIndexOfFlushedRows = rownum;\r
+        _numberLastFlushedRow = Math.max(rownum, _numberLastFlushedRow);\r
         _numberOfCellsOfLastFlushedRow = row.getLastCellNum();\r
         _numberOfFlushedRows++;\r
         beginRow(rownum, row);\r
index 2116a0be523c0b1ce1931c02ff166ce4cca16144..db5a1362e26bb94384f955e6147cae428f5e0e5c 100644 (file)
 
 package org.apache.poi.xssf.streaming;
 
-import org.apache.poi.ss.usermodel.BaseTestSheet;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.SXSSFITestDataProvider;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
 
 public class TestSXSSFSheet extends BaseTestSheet {
@@ -90,4 +92,44 @@ public class TestSXSSFSheet extends BaseTestSheet {
     public void testDefaultColumnStyle() {
         //TODO column styles are not yet supported by XSSF
     }
+
+    public void testOverrideFlushedRows() {
+        Workbook wb = new SXSSFWorkbook(3);
+        Sheet sheet = wb.createSheet();
+
+        sheet.createRow(1);
+        sheet.createRow(2);
+        sheet.createRow(3);
+        sheet.createRow(4);
+        try {
+            sheet.createRow(1);
+            fail("expected exception");
+        } catch (Throwable e){
+            assertEquals("Attempting to write a row[1] in the range [0,1] that is already written to disk.", e.getMessage());
+        }
+
+    }
+
+    public void testOverrideRowsInTemplate() {
+        XSSFWorkbook template = new XSSFWorkbook();
+        template.createSheet().createRow(1);
+
+        Workbook wb = new SXSSFWorkbook(template);
+        Sheet sheet = wb.getSheetAt(0);
+
+        try {
+            sheet.createRow(1);
+            fail("expected exception");
+        } catch (Throwable e){
+            assertEquals("Attempting to write a row[1] in the range [0,1] that is already written to disk.", e.getMessage());
+        }
+        try {
+            sheet.createRow(0);
+            fail("expected exception");
+        } catch (Throwable e){
+            assertEquals("Attempting to write a row[0] in the range [0,1] that is already written to disk.", e.getMessage());
+        }
+        sheet.createRow(2);
+
+    }
 }