#62831 Fix WorkbookFactory.create with a subclass of File, eg from JFileChooser

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1844116 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2018-10-17 14:24:59 +00:00
parent ba71f90c32
commit 290e9c4087
2 changed files with 16 additions and 7 deletions

View File

@ -296,6 +296,11 @@ public class WorkbookFactory {
return createWorkbook("org.apache.poi.xssf.usermodel.XSSFWorkbookFactory", args); return createWorkbook("org.apache.poi.xssf.usermodel.XSSFWorkbookFactory", args);
} }
/**
* Does the actual call to HSSF or XSSF to do the creation.
* Uses reflection, so that this class can be in the Core non-OOXML
* POI jar without errors / broken references to the OOXML / XSSF code.
*/
private static Workbook createWorkbook(String factoryClass, Object args[]) throws IOException, EncryptedDocumentException { private static Workbook createWorkbook(String factoryClass, Object args[]) throws IOException, EncryptedDocumentException {
try { try {
Class<?> clazz = WorkbookFactory.class.getClassLoader().loadClass(factoryClass); Class<?> clazz = WorkbookFactory.class.getClassLoader().loadClass(factoryClass);
@ -307,6 +312,8 @@ public class WorkbookFactory {
c = boolean.class; c = boolean.class;
} else if (InputStream.class.isAssignableFrom(c)) { } else if (InputStream.class.isAssignableFrom(c)) {
c = InputStream.class; c = InputStream.class;
} else if (File.class.isAssignableFrom(c)) {
c = File.class;
} }
argsClz[i++] = c; argsClz[i++] = c;
} }

View File

@ -17,18 +17,24 @@
package org.apache.poi.ss; package org.apache.poi.ss;
import static org.junit.Assert.*; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.FileNotFoundException;
import org.apache.poi.EmptyFileException; import org.apache.poi.EmptyFileException;
import org.apache.poi.EncryptedDocumentException; import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.WorkbookFactory;
@ -36,10 +42,7 @@ import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFile;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
public final class TestWorkbookFactory { public final class TestWorkbookFactory {
@ -393,7 +396,6 @@ public final class TestWorkbookFactory {
* to work for sub-classes of File too, eg JFileChooser * to work for sub-classes of File too, eg JFileChooser
*/ */
@Test @Test
@Ignore
public void testFileSubclass() throws Exception { public void testFileSubclass() throws Exception {
Workbook wb; Workbook wb;