mirror of https://github.com/apache/poi.git
Bug 53650 - Prevent unreadable content and disalow to overwrite rows in user templates
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1418264 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8e1d206e26
commit
50c8e74af9
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="4.0-beta1" date="2013-??-??">
|
<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">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">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>
|
<action dev="poi-developers" type="fix">Synchronize table headers with parent sheet in XSSF</action>
|
||||||
|
|
|
@ -106,6 +106,20 @@ public class SXSSFSheet implements Sheet, Cloneable
|
||||||
+ ") outside allowable range (0.." + maxrow + ")");
|
+ ") 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.
|
//Make the initial allocation as big as the row above.
|
||||||
Row previousRow=rownum>0?getRow(rownum-1):null;
|
Row previousRow=rownum>0?getRow(rownum-1):null;
|
||||||
int initialAllocationSize=0;
|
int initialAllocationSize=0;
|
||||||
|
|
|
@ -44,6 +44,7 @@ public class SheetDataWriter {
|
||||||
int _numberOfFlushedRows;
|
int _numberOfFlushedRows;
|
||||||
int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0
|
int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0
|
||||||
int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0
|
int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0
|
||||||
|
int _numberLastFlushedRow = -1; // meaningful only of _numberOfFlushedRows>0
|
||||||
|
|
||||||
public SheetDataWriter() throws IOException {
|
public SheetDataWriter() throws IOException {
|
||||||
_fd = createTempFile();
|
_fd = createTempFile();
|
||||||
|
@ -105,6 +106,10 @@ public class SheetDataWriter {
|
||||||
return _lowestIndexOfFlushedRows;
|
return _lowestIndexOfFlushedRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getLastFlushedRow() {
|
||||||
|
return _numberLastFlushedRow;
|
||||||
|
}
|
||||||
|
|
||||||
protected void finalize() throws Throwable {
|
protected void finalize() throws Throwable {
|
||||||
_fd.delete();
|
_fd.delete();
|
||||||
}
|
}
|
||||||
|
@ -118,6 +123,7 @@ public class SheetDataWriter {
|
||||||
public void writeRow(int rownum, SXSSFRow row) throws IOException {
|
public void writeRow(int rownum, SXSSFRow row) throws IOException {
|
||||||
if (_numberOfFlushedRows == 0)
|
if (_numberOfFlushedRows == 0)
|
||||||
_lowestIndexOfFlushedRows = rownum;
|
_lowestIndexOfFlushedRows = rownum;
|
||||||
|
_numberLastFlushedRow = Math.max(rownum, _numberLastFlushedRow);
|
||||||
_numberOfCellsOfLastFlushedRow = row.getLastCellNum();
|
_numberOfCellsOfLastFlushedRow = row.getLastCellNum();
|
||||||
_numberOfFlushedRows++;
|
_numberOfFlushedRows++;
|
||||||
beginRow(rownum, row);
|
beginRow(rownum, row);
|
||||||
|
|
|
@ -19,8 +19,10 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf.streaming;
|
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.SXSSFITestDataProvider;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
|
||||||
|
|
||||||
public class TestSXSSFSheet extends BaseTestSheet {
|
public class TestSXSSFSheet extends BaseTestSheet {
|
||||||
|
@ -90,4 +92,44 @@ public class TestSXSSFSheet extends BaseTestSheet {
|
||||||
public void testDefaultColumnStyle() {
|
public void testDefaultColumnStyle() {
|
||||||
//TODO column styles are not yet supported by XSSF
|
//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);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue