Browse Source

#57593 Complete create overloading in WorkbookFactory to take passwords

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1676847 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_12_FINAL
Nick Burch 9 years ago
parent
commit
37f045dc02

+ 18
- 5
src/ooxml/java/org/apache/poi/ss/usermodel/WorkbookFactory.java View File

@@ -121,7 +121,9 @@ public class WorkbookFactory {
* using an {@link InputStream} has a higher memory footprint
* than using a {@link File}.</p>
* <p>Note that in order to properly release resources the
* Workbook should be closed after use.
* Workbook should be closed after use. Note also that loading
* from an InputStream requires more memory than loading
* from a File, so prefer {@link #create(File)} where possible.
* @throws EncryptedDocumentException If the workbook given is password protected
*/
public static Workbook create(InputStream inp) throws IOException, InvalidFormatException, EncryptedDocumentException {
@@ -136,7 +138,9 @@ public class WorkbookFactory {
* using an {@link InputStream} has a higher memory footprint
* than using a {@link File}.</p>
* <p>Note that in order to properly release resources the
* Workbook should be closed after use.
* Workbook should be closed after use. Note also that loading
* from an InputStream requires more memory than loading
* from a File, so prefer {@link #create(File)} where possible.
* @throws EncryptedDocumentException If the wrong password is given for a protected file
*/
public static Workbook create(InputStream inp, String password) throws IOException, InvalidFormatException, EncryptedDocumentException {
@@ -155,7 +159,6 @@ public class WorkbookFactory {
throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
}
// TODO file+password
/**
* Creates the appropriate HSSFWorkbook / XSSFWorkbook from
* the given File, which must exist and be readable.
@@ -164,14 +167,24 @@ public class WorkbookFactory {
* @throws EncryptedDocumentException If the workbook given is password protected
*/
public static Workbook create(File file) throws IOException, InvalidFormatException, EncryptedDocumentException {
return create(file, null);
}
/**
* Creates the appropriate HSSFWorkbook / XSSFWorkbook from
* the given File, which must exist and be readable, and
* may be password protected
* <p>Note that in order to properly release resources the
* Workbook should be closed after use.
* @throws EncryptedDocumentException If the wrong password is given for a protected file
*/
public static Workbook create(File file, String password) throws IOException, InvalidFormatException, EncryptedDocumentException {
if (! file.exists()) {
throw new FileNotFoundException(file.toString());
}

try {
@SuppressWarnings("resource")
NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
return new HSSFWorkbook(fs.getRoot(), true);
return create(fs, password);
} catch(OfficeXmlFileException e) {
// opening as .xls failed => try opening as .xlsx
OPCPackage pkg = OPCPackage.open(file);

+ 59
- 1
src/ooxml/testcases/org/apache/poi/ss/TestWorkbookFactory.java View File

@@ -194,6 +194,64 @@ public final class TestWorkbookFactory extends TestCase {
public void testCreateWithPasswordFromFile() throws Exception {
Workbook wb;

// TODO
// Unprotected, no password given, opens normally
wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xls), null
);
assertNotNull(wb);
assertTrue(wb instanceof HSSFWorkbook);
wb.close();

wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xlsx), null
);
assertNotNull(wb);
assertTrue(wb instanceof XSSFWorkbook);


// Unprotected, wrong password, opens normally
wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xls), "wrong"
);
assertNotNull(wb);
assertTrue(wb instanceof HSSFWorkbook);
wb.close();

wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xlsx), "wrong"
);
assertNotNull(wb);
assertTrue(wb instanceof XSSFWorkbook);


// Protected, correct password, opens fine
wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xls_prot[0]), xls_prot[1]
);
assertNotNull(wb);
assertTrue(wb instanceof HSSFWorkbook);
wb.close();

wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xlsx_prot[0]), xlsx_prot[1]
);
assertNotNull(wb);
assertTrue(wb instanceof XSSFWorkbook);


// Protected, wrong password, throws Exception
try {
wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xls_prot[0]), "wrong"
);
fail("Shouldn't be able to open with the wrong password");
} catch (EncryptedDocumentException e) {}

try {
wb = WorkbookFactory.create(
HSSFTestDataSamples.getSampleFile(xlsx_prot[0]), "wrong"
);
fail("Shouldn't be able to open with the wrong password");
} catch (EncryptedDocumentException e) {}
}
}

Loading…
Cancel
Save