|
|
@@ -36,99 +36,99 @@ import org.apache.poi.hssf.record.SelectionRecord; |
|
|
|
import org.apache.poi.hssf.record.WindowTwoRecord; |
|
|
|
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey; |
|
|
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem; |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
* Testing for {@link HSSFEventFactory} |
|
|
|
*/ |
|
|
|
public final class TestHSSFEventFactory extends TestCase { |
|
|
|
|
|
|
|
private static final InputStream openSample(String sampleFileName) { |
|
|
|
return HSSFTestDataSamples.openSampleFileStream(sampleFileName); |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithMissingRecords() throws Exception { |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("SimpleWithSkip.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
|
|
|
|
Record[] recs = mockListen.getRecords(); |
|
|
|
// Check we got the records |
|
|
|
assertTrue( recs.length > 100 ); |
|
|
|
|
|
|
|
// Check that the last few records are as we expect |
|
|
|
// (Makes sure we don't accidently skip the end ones) |
|
|
|
int numRec = recs.length; |
|
|
|
assertEquals(WindowTwoRecord.class, recs[numRec-3].getClass()); |
|
|
|
assertEquals(SelectionRecord.class, recs[numRec-2].getClass()); |
|
|
|
assertEquals(EOFRecord.class, recs[numRec-1].getClass()); |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithCrazyContinueRecords() throws Exception { |
|
|
|
// Some files have crazy ordering of their continue records |
|
|
|
// Check that we don't break on them (bug #42844) |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("ContinueRecordProblem.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
|
|
|
|
Record[] recs = mockListen.getRecords(); |
|
|
|
// Check we got the records |
|
|
|
assertTrue( recs.length > 100 ); |
|
|
|
|
|
|
|
// And none of them are continue ones |
|
|
|
for(int i=0; i<recs.length; i++) { |
|
|
|
assertFalse( recs[i] instanceof ContinueRecord ); |
|
|
|
} |
|
|
|
|
|
|
|
// Check that the last few records are as we expect |
|
|
|
// (Makes sure we don't accidently skip the end ones) |
|
|
|
int numRec = recs.length; |
|
|
|
assertEquals(DVALRecord.class, recs[numRec-4].getClass()); |
|
|
|
assertEquals(DVRecord.class, recs[numRec-3].getClass()); |
|
|
|
assertEquals(FeatHdrRecord.class, recs[numRec-2].getClass()); |
|
|
|
assertEquals(EOFRecord.class, recs[numRec-1].getClass()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Unknown records can be continued. |
|
|
|
* Check that HSSFEventFactory doesn't break on them. |
|
|
|
* (the test file was provided in a reopen of bug #42844) |
|
|
|
*/ |
|
|
|
public void testUnknownContinueRecords() throws Exception { |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("42844.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
} |
|
|
|
|
|
|
|
private static class MockHSSFListener implements HSSFListener { |
|
|
|
private final List<Record> records = new ArrayList<Record>(); |
|
|
|
|
|
|
|
public MockHSSFListener() {} |
|
|
|
public Record[] getRecords() { |
|
|
|
Record[] result = new Record[records.size()]; |
|
|
|
records.toArray(result); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
public void processRecord(Record record) { |
|
|
|
records.add(record); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithDifferentWorkbookName() throws Exception { |
|
|
|
private static final InputStream openSample(String sampleFileName) { |
|
|
|
return HSSFTestDataSamples.openSampleFileStream(sampleFileName); |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithMissingRecords() throws Exception { |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("SimpleWithSkip.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
|
|
|
|
Record[] recs = mockListen.getRecords(); |
|
|
|
// Check we got the records |
|
|
|
assertTrue( recs.length > 100 ); |
|
|
|
|
|
|
|
// Check that the last few records are as we expect |
|
|
|
// (Makes sure we don't accidently skip the end ones) |
|
|
|
int numRec = recs.length; |
|
|
|
assertEquals(WindowTwoRecord.class, recs[numRec-3].getClass()); |
|
|
|
assertEquals(SelectionRecord.class, recs[numRec-2].getClass()); |
|
|
|
assertEquals(EOFRecord.class, recs[numRec-1].getClass()); |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithCrazyContinueRecords() throws Exception { |
|
|
|
// Some files have crazy ordering of their continue records |
|
|
|
// Check that we don't break on them (bug #42844) |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("ContinueRecordProblem.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
|
|
|
|
Record[] recs = mockListen.getRecords(); |
|
|
|
// Check we got the records |
|
|
|
assertTrue( recs.length > 100 ); |
|
|
|
|
|
|
|
// And none of them are continue ones |
|
|
|
for(int i=0; i<recs.length; i++) { |
|
|
|
assertFalse( recs[i] instanceof ContinueRecord ); |
|
|
|
} |
|
|
|
|
|
|
|
// Check that the last few records are as we expect |
|
|
|
// (Makes sure we don't accidently skip the end ones) |
|
|
|
int numRec = recs.length; |
|
|
|
assertEquals(DVALRecord.class, recs[numRec-4].getClass()); |
|
|
|
assertEquals(DVRecord.class, recs[numRec-3].getClass()); |
|
|
|
assertEquals(FeatHdrRecord.class, recs[numRec-2].getClass()); |
|
|
|
assertEquals(EOFRecord.class, recs[numRec-1].getClass()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Unknown records can be continued. |
|
|
|
* Check that HSSFEventFactory doesn't break on them. |
|
|
|
* (the test file was provided in a reopen of bug #42844) |
|
|
|
*/ |
|
|
|
public void testUnknownContinueRecords() throws Exception { |
|
|
|
|
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("42844.xls")); |
|
|
|
HSSFEventFactory factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
} |
|
|
|
|
|
|
|
private static class MockHSSFListener implements HSSFListener { |
|
|
|
private final List<Record> records = new ArrayList<Record>(); |
|
|
|
|
|
|
|
public MockHSSFListener() {} |
|
|
|
public Record[] getRecords() { |
|
|
|
Record[] result = new Record[records.size()]; |
|
|
|
records.toArray(result); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
public void processRecord(Record record) { |
|
|
|
records.add(record); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithDifferentWorkbookName() throws Exception { |
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
@@ -140,14 +140,14 @@ public final class TestHSSFEventFactory extends TestCase { |
|
|
|
fs = new POIFSFileSystem(openSample("WORKBOOK_in_capitals.xls")); |
|
|
|
factory = new HSSFEventFactory(); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithPasswordProtectedWorkbooks() throws Exception { |
|
|
|
} |
|
|
|
|
|
|
|
public void testWithPasswordProtectedWorkbooks() throws Exception { |
|
|
|
HSSFRequest req = new HSSFRequest(); |
|
|
|
MockHSSFListener mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
|
|
|
|
// Without a password, can't be read |
|
|
|
|
|
|
|
// Without a password, can't be read |
|
|
|
Biff8EncryptionKey.setCurrentUserPassword(null); |
|
|
|
POIFSFileSystem fs = new POIFSFileSystem(openSample("xor-encryption-abc.xls")); |
|
|
|
|
|
|
@@ -156,20 +156,20 @@ public final class TestHSSFEventFactory extends TestCase { |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
fail("Shouldn't be able to process protected workbook without the password"); |
|
|
|
} catch (EncryptedDocumentException e) {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// With the password, is properly processed |
|
|
|
Biff8EncryptionKey.setCurrentUserPassword("abc"); |
|
|
|
|
|
|
|
|
|
|
|
req = new HSSFRequest(); |
|
|
|
mockListen = new MockHSSFListener(); |
|
|
|
req.addListenerForAllRecords(mockListen); |
|
|
|
factory.processWorkbookEvents(req, fs); |
|
|
|
|
|
|
|
|
|
|
|
// Check we got the sheet and the contents |
|
|
|
Record[] recs = mockListen.getRecords(); |
|
|
|
assertTrue( recs.length > 50 ); |
|
|
|
|
|
|
|
|
|
|
|
// Has one sheet, with values 1,2,3 in column A rows 1-3 |
|
|
|
boolean hasSheet=false, hasA1=false, hasA2=false, hasA3=false; |
|
|
|
for (Record r : recs) { |
|
|
@@ -194,10 +194,10 @@ public final class TestHSSFEventFactory extends TestCase { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
assertTrue("Sheet record not found", hasSheet); |
|
|
|
assertTrue("Numeric record for A1 not found", hasA1); |
|
|
|
assertTrue("Numeric record for A2 not found", hasA2); |
|
|
|
assertTrue("Numeric record for A3 not found", hasA3); |
|
|
|
} |
|
|
|
} |
|
|
|
} |