mirror of
https://github.com/apache/poi.git
synced 2025-03-04 16:09:13 +00:00
#64036 - remove reflective calls in Workbook- and SlideShowFactory
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872066 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c66575c1e7
commit
a0770034fc
@ -31,6 +31,12 @@ import org.apache.poi.util.Internal;
|
||||
@SuppressWarnings("unused")
|
||||
@Internal
|
||||
public class HSSFWorkbookFactory extends WorkbookFactory {
|
||||
|
||||
static {
|
||||
WorkbookFactory.createHssfFromScratch = HSSFWorkbookFactory::createWorkbook;
|
||||
WorkbookFactory.createHssfByNode = HSSFWorkbookFactory::createWorkbook;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty Workbook
|
||||
*
|
||||
|
@ -20,21 +20,40 @@ import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.apache.poi.EncryptedDocumentException;
|
||||
import org.apache.poi.OldFileFormatException;
|
||||
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||
import org.apache.poi.poifs.crypt.Decryptor;
|
||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||
import org.apache.poi.poifs.filesystem.DocumentFactoryHelper;
|
||||
import org.apache.poi.poifs.filesystem.FileMagic;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
|
||||
public class SlideShowFactory {
|
||||
@SuppressWarnings("unchecked")
|
||||
public abstract class SlideShowFactory {
|
||||
|
||||
protected interface CreateSlideShow1<T> {
|
||||
SlideShow<?, ?> apply(T t) throws IOException;
|
||||
}
|
||||
|
||||
protected interface CreateSlideShow2<T, U> {
|
||||
SlideShow<?, ?> apply(T t, U u) throws IOException;
|
||||
}
|
||||
|
||||
// XMLSlideShow createSlideShow(InputStream stream)
|
||||
protected static CreateSlideShow1<InputStream> createXslfByStream;
|
||||
|
||||
// XMLSlideShow createSlideShow(File file, boolean readOnly)
|
||||
protected static CreateSlideShow2<File, Boolean> createXslfByFile;
|
||||
|
||||
// HSLFSlideShow createSlideShow(final POIFSFileSystem fs)
|
||||
protected static CreateSlideShow1<POIFSFileSystem> createHslfByPoifs;
|
||||
|
||||
// HSLFSlideShow createSlideShow(final DirectoryNode root)
|
||||
protected static CreateSlideShow1<DirectoryNode> createHslfByNode;
|
||||
|
||||
/**
|
||||
* Creates a SlideShow from the given POIFSFileSystem.
|
||||
*
|
||||
@ -106,8 +125,8 @@ public class SlideShowFactory {
|
||||
InputStream stream = null;
|
||||
try {
|
||||
stream = DocumentFactoryHelper.getDecryptedStream(root, password);
|
||||
|
||||
return createXSLFSlideShow(stream);
|
||||
initXslf();
|
||||
return (SlideShow<S, P>) createXslfByStream.apply(stream);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(stream);
|
||||
|
||||
@ -125,7 +144,8 @@ public class SlideShowFactory {
|
||||
passwordSet = true;
|
||||
}
|
||||
try {
|
||||
return createHSLFSlideShow(root);
|
||||
initHslf();
|
||||
return (SlideShow<S, P>) createHslfByNode.apply(root);
|
||||
} finally {
|
||||
if (passwordSet) {
|
||||
Biff8EncryptionKey.setCurrentUserPassword(null);
|
||||
@ -162,7 +182,7 @@ public class SlideShowFactory {
|
||||
/**
|
||||
* Creates the appropriate HSLFSlideShow / XMLSlideShow from
|
||||
* the given InputStream, which may be password protected.
|
||||
*
|
||||
*
|
||||
* <p>Note that using an {@link InputStream} has a higher memory footprint
|
||||
* than using a {@link File}.</p>
|
||||
*
|
||||
@ -185,13 +205,14 @@ public class SlideShowFactory {
|
||||
> SlideShow<S,P> create(InputStream inp, String password) throws IOException, EncryptedDocumentException {
|
||||
InputStream is = FileMagic.prepareToCheckMagic(inp);
|
||||
FileMagic fm = FileMagic.valueOf(is);
|
||||
|
||||
|
||||
switch (fm) {
|
||||
case OLE2:
|
||||
POIFSFileSystem fs = new POIFSFileSystem(is);
|
||||
return create(fs, password);
|
||||
case OOXML:
|
||||
return createXSLFSlideShow(is);
|
||||
initXslf();
|
||||
return (SlideShow<S, P>) createXslfByStream.apply(is);
|
||||
default:
|
||||
throw new IOException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
|
||||
}
|
||||
@ -270,66 +291,31 @@ public class SlideShowFactory {
|
||||
return create(fs, password);
|
||||
} catch(OfficeXmlFileException e) {
|
||||
IOUtils.closeQuietly(fs);
|
||||
return createXSLFSlideShow(file, readOnly);
|
||||
initXslf();
|
||||
return (SlideShow<S, P>) createXslfByFile.apply(file, readOnly);
|
||||
} catch(RuntimeException e) {
|
||||
IOUtils.closeQuietly(fs);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static <
|
||||
S extends Shape<S,P>,
|
||||
P extends TextParagraph<S,P,? extends TextRun>
|
||||
> SlideShow<S,P> createHSLFSlideShow(Object... args) throws IOException, EncryptedDocumentException {
|
||||
return createSlideShow("org.apache.poi.hslf.usermodel.HSLFSlideShowFactory", args);
|
||||
}
|
||||
|
||||
private static <
|
||||
S extends Shape<S,P>,
|
||||
P extends TextParagraph<S,P,? extends TextRun>
|
||||
> SlideShow<S,P> createXSLFSlideShow(Object... args) throws IOException, EncryptedDocumentException {
|
||||
return createSlideShow("org.apache.poi.xslf.usermodel.XSLFSlideShowFactory", args);
|
||||
|
||||
private static void initXslf() throws IOException {
|
||||
if (createXslfByFile == null) {
|
||||
initFactory("org.apache.poi.xslf.usermodel.XSLFSlideShowFactory", "poi-ooxml-*.jar");
|
||||
}
|
||||
}
|
||||
|
||||
private static <
|
||||
S extends Shape<S,P>,
|
||||
P extends TextParagraph<S,P,? extends TextRun>
|
||||
> SlideShow<S,P> createSlideShow(String factoryClass, Object[] args) throws IOException, EncryptedDocumentException {
|
||||
final Class<?> clazz;
|
||||
try {
|
||||
clazz = SlideShowFactory.class.getClassLoader().loadClass(factoryClass);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(factoryClass+" not found - check if poi-scratchpad.jar is on the classpath.");
|
||||
private static void initHslf() throws IOException {
|
||||
if (createHslfByPoifs == null) {
|
||||
initFactory("org.apache.poi.hslf.usermodel.HSLFSlideShowFactory", "poi-scratchpad-*.jar");
|
||||
}
|
||||
}
|
||||
|
||||
private static void initFactory(String factoryClass, String jar) throws IOException {
|
||||
try {
|
||||
Class<?>[] argsClz = new Class<?>[args.length];
|
||||
int i=0;
|
||||
for (Object o : args) {
|
||||
Class<?> c = o.getClass();
|
||||
if (Boolean.class.isAssignableFrom(c)) {
|
||||
c = boolean.class;
|
||||
} else if (InputStream.class.isAssignableFrom(c)) {
|
||||
c = InputStream.class;
|
||||
}
|
||||
argsClz[i++] = c;
|
||||
}
|
||||
Method m = clazz.getMethod("createSlideShow", argsClz);
|
||||
return (SlideShow<S,P>)m.invoke(null, args);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable t = e.getCause();
|
||||
if (t instanceof IOException) {
|
||||
throw (IOException)t;
|
||||
} else if (t instanceof EncryptedDocumentException) {
|
||||
throw (EncryptedDocumentException)t;
|
||||
} else if (t instanceof OldFileFormatException) {
|
||||
throw (OldFileFormatException)t;
|
||||
} else if (t instanceof RuntimeException) {
|
||||
throw (RuntimeException)t;
|
||||
} else {
|
||||
throw new IOException(t);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new IOException(e);
|
||||
Class.forName(factoryClass, true, SlideShowFactory.class.getClassLoader());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(factoryClass+" not found - check if " + jar + " is on the classpath.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,20 +21,16 @@ import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.poi.EncryptedDocumentException;
|
||||
import org.apache.poi.OldFileFormatException;
|
||||
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.poifs.crypt.Decryptor;
|
||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||
import org.apache.poi.poifs.filesystem.DocumentFactoryHelper;
|
||||
import org.apache.poi.poifs.filesystem.FileMagic;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
|
||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.apache.poi.util.Removal;
|
||||
|
||||
@ -43,7 +39,28 @@ import org.apache.poi.util.Removal;
|
||||
* (be it {@link HSSFWorkbook} or XSSFWorkbook),
|
||||
* by auto-detecting from the supplied input.
|
||||
*/
|
||||
public class WorkbookFactory {
|
||||
public abstract class WorkbookFactory {
|
||||
|
||||
protected interface CreateWorkbook0 {
|
||||
Workbook apply() throws IOException;
|
||||
}
|
||||
|
||||
protected interface CreateWorkbook1<T> {
|
||||
Workbook apply(T t) throws IOException;
|
||||
}
|
||||
|
||||
protected interface CreateWorkbook2<T, U> {
|
||||
Workbook apply(T t, U u) throws IOException;
|
||||
}
|
||||
|
||||
protected static CreateWorkbook0 createHssfFromScratch;
|
||||
protected static CreateWorkbook1<DirectoryNode> createHssfByNode;
|
||||
|
||||
protected static CreateWorkbook0 createXssfFromScratch;
|
||||
protected static CreateWorkbook1<InputStream> createXssfByStream;
|
||||
protected static CreateWorkbook1<Object> createXssfByPackage;
|
||||
protected static CreateWorkbook2<File,Boolean> createXssfByFile;
|
||||
|
||||
/**
|
||||
* Create a new empty Workbook, either XSSF or HSSF depending
|
||||
* on the parameter
|
||||
@ -56,9 +73,11 @@ public class WorkbookFactory {
|
||||
*/
|
||||
public static Workbook create(boolean xssf) throws IOException {
|
||||
if(xssf) {
|
||||
return createXSSFWorkbook();
|
||||
initXssf();
|
||||
return createXssfFromScratch.apply();
|
||||
} else {
|
||||
return createHSSFWorkbook();
|
||||
initHssf();
|
||||
return createHssfFromScratch.apply();
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,8 +144,8 @@ public class WorkbookFactory {
|
||||
InputStream stream = null;
|
||||
try {
|
||||
stream = DocumentFactoryHelper.getDecryptedStream(root, password);
|
||||
|
||||
return createXSSFWorkbook(stream);
|
||||
initXssf();
|
||||
return createXssfByStream.apply(stream);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(stream);
|
||||
|
||||
@ -144,7 +163,8 @@ public class WorkbookFactory {
|
||||
passwordSet = true;
|
||||
}
|
||||
try {
|
||||
return createHSSFWorkbook(root);
|
||||
initHssf();
|
||||
return createHssfByNode.apply(root);
|
||||
} finally {
|
||||
if (passwordSet) {
|
||||
Biff8EncryptionKey.setCurrentUserPassword(null);
|
||||
@ -172,7 +192,8 @@ public class WorkbookFactory {
|
||||
@Deprecated
|
||||
@Removal(version = "4.2.0")
|
||||
public static Workbook create(Object pkg) throws IOException {
|
||||
return createXSSFWorkbook(pkg);
|
||||
initXssf();
|
||||
return createXssfByPackage.apply(pkg);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -231,7 +252,8 @@ public class WorkbookFactory {
|
||||
POIFSFileSystem fs = new POIFSFileSystem(is);
|
||||
return create(fs, password);
|
||||
case OOXML:
|
||||
return createXSSFWorkbook(is);
|
||||
initXssf();
|
||||
return createXssfByStream.apply(is);
|
||||
default:
|
||||
throw new IOException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
|
||||
}
|
||||
@ -301,60 +323,32 @@ public class WorkbookFactory {
|
||||
return create(fs, password);
|
||||
} catch(OfficeXmlFileException e) {
|
||||
IOUtils.closeQuietly(fs);
|
||||
return createXSSFWorkbook(file, readOnly);
|
||||
initXssf();
|
||||
return createXssfByFile.apply(file, readOnly);
|
||||
} catch(RuntimeException e) {
|
||||
IOUtils.closeQuietly(fs);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static Workbook createHSSFWorkbook(Object... args) throws IOException, EncryptedDocumentException {
|
||||
return createWorkbook("org.apache.poi.hssf.usermodel.HSSFWorkbookFactory", args);
|
||||
private static void initXssf() throws IOException {
|
||||
if (createXssfFromScratch == null) {
|
||||
initFactory("org.apache.poi.xssf.usermodel.XSSFWorkbookFactory", "poi-ooxml-*.jar");
|
||||
}
|
||||
}
|
||||
|
||||
private static Workbook createXSSFWorkbook(Object... args) throws IOException, EncryptedDocumentException {
|
||||
return createWorkbook("org.apache.poi.xssf.usermodel.XSSFWorkbookFactory", args);
|
||||
private static void initHssf() throws IOException {
|
||||
if (createHssfFromScratch == null) {
|
||||
// HSSF is part of the main jar, so this shouldn't fail ...
|
||||
initFactory("org.apache.poi.hssf.usermodel.HSSFWorkbookFactory", "poi-*.jar");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 void initFactory(String factoryClass, String jar) throws IOException {
|
||||
try {
|
||||
Class<?> clazz = WorkbookFactory.class.getClassLoader().loadClass(factoryClass);
|
||||
Class<?>[] argsClz = new Class<?>[args.length];
|
||||
int i=0;
|
||||
for (Object o : args) {
|
||||
Class<?> c = o.getClass();
|
||||
if (Boolean.class.isAssignableFrom(c)) {
|
||||
c = boolean.class;
|
||||
} else if (InputStream.class.isAssignableFrom(c)) {
|
||||
c = InputStream.class;
|
||||
} else if (File.class.isAssignableFrom(c)) {
|
||||
c = File.class;
|
||||
}
|
||||
argsClz[i++] = c;
|
||||
}
|
||||
Method m = clazz.getMethod("createWorkbook", argsClz);
|
||||
return (Workbook)m.invoke(null, args);
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable t = e.getCause();
|
||||
if (t instanceof IOException) {
|
||||
throw (IOException)t;
|
||||
} else if (t instanceof EncryptedDocumentException) {
|
||||
throw (EncryptedDocumentException)t;
|
||||
} else if (t instanceof OldFileFormatException) {
|
||||
throw (OldFileFormatException)t;
|
||||
} else if (t instanceof RuntimeException) {
|
||||
throw (RuntimeException)t;
|
||||
} else {
|
||||
throw new IOException(t.getMessage(), t);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new IOException("While trying to invoke 'createWorkbook' on factory " + factoryClass +
|
||||
" and arguments " + Arrays.toString(args), e);
|
||||
Class.forName(factoryClass, true, WorkbookFactory.class.getClassLoader());
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IOException(factoryClass+" not found - check if " + jar + " is on the classpath.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,6 +31,11 @@ import org.apache.poi.util.Internal;
|
||||
@Internal
|
||||
public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
|
||||
static {
|
||||
SlideShowFactory.createXslfByFile = XSLFSlideShowFactory::createSlideShow;
|
||||
SlideShowFactory.createXslfByStream = XSLFSlideShowFactory::createSlideShow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a XMLSlideShow from the given OOXML Package.
|
||||
* This is a convenience method to go along the create-methods of the super class.
|
||||
@ -43,7 +48,6 @@ public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
* @return The created SlideShow
|
||||
*
|
||||
* @throws IOException if an error occurs while reading the data
|
||||
* @throws InvalidFormatException
|
||||
*/
|
||||
public static XMLSlideShow create(OPCPackage pkg) throws IOException {
|
||||
try {
|
||||
@ -69,7 +73,6 @@ public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
* @return The created SlideShow
|
||||
*
|
||||
* @throws IOException if an error occurs while reading the data
|
||||
* @throws InvalidFormatException
|
||||
*/
|
||||
public static XMLSlideShow createSlideShow(OPCPackage pkg) throws IOException {
|
||||
try {
|
||||
@ -83,7 +86,7 @@ public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
throw ioe;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates the XMLSlideShow from the given File, which must exist and be readable.
|
||||
* <p>Note that in order to properly release resources theSlideShow should be closed after use.
|
||||
@ -99,9 +102,13 @@ public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
*/
|
||||
@SuppressWarnings("resource")
|
||||
public static XMLSlideShow createSlideShow(File file, boolean readOnly)
|
||||
throws IOException, InvalidFormatException {
|
||||
OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
|
||||
return createSlideShow(pkg);
|
||||
throws IOException {
|
||||
try {
|
||||
OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
|
||||
return createSlideShow(pkg);
|
||||
} catch (InvalidFormatException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,12 +122,15 @@ public class XSLFSlideShowFactory extends SlideShowFactory {
|
||||
* @return The created SlideShow
|
||||
*
|
||||
* @throws IOException if an error occurs while reading the data
|
||||
* @throws InvalidFormatException
|
||||
*/
|
||||
@SuppressWarnings("resource")
|
||||
public static XMLSlideShow createSlideShow(InputStream stream) throws IOException, InvalidFormatException {
|
||||
OPCPackage pkg = OPCPackage.open(stream);
|
||||
return createSlideShow(pkg);
|
||||
public static XMLSlideShow createSlideShow(InputStream stream) throws IOException {
|
||||
try {
|
||||
OPCPackage pkg = OPCPackage.open(stream);
|
||||
return createSlideShow(pkg);
|
||||
} catch (InvalidFormatException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -29,6 +29,15 @@ import org.apache.poi.openxml4j.opc.ZipPackage;
|
||||
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
||||
|
||||
public class XSSFWorkbookFactory extends WorkbookFactory {
|
||||
|
||||
static {
|
||||
WorkbookFactory.createXssfFromScratch = XSSFWorkbookFactory::createWorkbook;
|
||||
WorkbookFactory.createXssfByStream = XSSFWorkbookFactory::createWorkbook;
|
||||
WorkbookFactory.createXssfByPackage = o -> XSSFWorkbookFactory.createWorkbook((OPCPackage)o);
|
||||
WorkbookFactory.createXssfByFile = XSSFWorkbookFactory::createWorkbook;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new empty Workbook
|
||||
*
|
||||
@ -110,10 +119,13 @@ public class XSSFWorkbookFactory extends WorkbookFactory {
|
||||
* @throws EncryptedDocumentException If the wrong password is given for a protected file
|
||||
*/
|
||||
@SuppressWarnings("resource")
|
||||
public static XSSFWorkbook createWorkbook(File file, boolean readOnly)
|
||||
throws IOException, InvalidFormatException {
|
||||
OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
|
||||
return createWorkbook(pkg);
|
||||
public static XSSFWorkbook createWorkbook(File file, boolean readOnly) throws IOException {
|
||||
try {
|
||||
OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
|
||||
return createWorkbook(pkg);
|
||||
} catch (InvalidFormatException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -127,11 +139,14 @@ public class XSSFWorkbookFactory extends WorkbookFactory {
|
||||
* @return The created Workbook
|
||||
*
|
||||
* @throws IOException if an error occurs while reading the data
|
||||
* @throws InvalidFormatException if the package is not valid.
|
||||
*/
|
||||
@SuppressWarnings("resource")
|
||||
public static XSSFWorkbook createWorkbook(InputStream stream) throws IOException, InvalidFormatException {
|
||||
OPCPackage pkg = OPCPackage.open(stream);
|
||||
return createWorkbook(pkg);
|
||||
public static XSSFWorkbook createWorkbook(InputStream stream) throws IOException {
|
||||
try {
|
||||
OPCPackage pkg = OPCPackage.open(stream);
|
||||
return createWorkbook(pkg);
|
||||
} catch (InvalidFormatException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -52,9 +52,9 @@ public final class TestWorkbookFactory {
|
||||
private static final String[] xls_protected = new String[] {"password.xls", "password"};
|
||||
private static final String[] xlsx_protected = new String[]{"protected_passtika.xlsx", "tika"};
|
||||
private static final String txt = "SampleSS.txt";
|
||||
|
||||
|
||||
private static final POILogger LOGGER = POILogFactory.getLogger(TestWorkbookFactory.class);
|
||||
|
||||
|
||||
/**
|
||||
* Closes the sample workbook read in from filename.
|
||||
* Throws an exception if closing the workbook results in the file on disk getting modified.
|
||||
@ -70,7 +70,7 @@ public final class TestWorkbookFactory {
|
||||
assertArrayEquals(filename + " sample file was modified as a result of closing the workbook",
|
||||
before, after);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* bug 58779: Closing an XSSFWorkbook that was created with WorkbookFactory modifies the file
|
||||
* FIXME: replace this method with wb.close() when bug 58779 is resolved.
|
||||
@ -353,56 +353,45 @@ public final class TestWorkbookFactory {
|
||||
// expected here
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check that a helpful exception is given on an empty input stream
|
||||
*/
|
||||
@Test
|
||||
@Test(expected = EmptyFileException.class)
|
||||
public void testEmptyInputStream() throws Exception {
|
||||
InputStream emptyStream = new ByteArrayInputStream(new byte[0]);
|
||||
try {
|
||||
WorkbookFactory.create(emptyStream);
|
||||
fail("Shouldn't be able to create for an empty stream");
|
||||
} catch (final EmptyFileException expected) {}
|
||||
WorkbookFactory.create(emptyStream);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check that a helpful exception is given on an empty file
|
||||
*/
|
||||
@Test
|
||||
@Test(expected = EmptyFileException.class)
|
||||
public void testEmptyFile() throws Exception {
|
||||
File emptyFile = TempFile.createTempFile("empty", ".poi");
|
||||
try {
|
||||
WorkbookFactory.create(emptyFile);
|
||||
fail("Shouldn't be able to create for an empty file");
|
||||
} catch (final EmptyFileException expected) {
|
||||
// expected here
|
||||
} finally {
|
||||
assertTrue(emptyFile.delete());
|
||||
}
|
||||
|
||||
assertTrue(emptyFile.delete());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that a helpful exception is raised on a non-existing file
|
||||
*/
|
||||
@Test
|
||||
@Test(expected = FileNotFoundException.class)
|
||||
public void testNonExistingFile() throws Exception {
|
||||
File nonExistingFile = new File("notExistingFile");
|
||||
assertFalse(nonExistingFile.exists());
|
||||
|
||||
try {
|
||||
WorkbookFactory.create(nonExistingFile, "password", true);
|
||||
fail("Should not be able to create for a non-existing file");
|
||||
} catch (final FileNotFoundException e) {
|
||||
// expected
|
||||
}
|
||||
WorkbookFactory.create(nonExistingFile, "password", true);
|
||||
}
|
||||
|
||||
/**
|
||||
* See Bugzilla bug #62831 - #WorkbookFactory.create(File) needs
|
||||
* to work for sub-classes of File too, eg JFileChooser
|
||||
*/
|
||||
@Test
|
||||
@Test(expected = ClassCastException.class)
|
||||
public void testFileSubclass() throws Exception {
|
||||
File normalXLS = HSSFTestDataSamples.getSampleFile(xls);
|
||||
File normalXLSX = HSSFTestDataSamples.getSampleFile(xlsx);
|
||||
@ -423,15 +412,11 @@ public final class TestWorkbookFactory {
|
||||
|
||||
// check what happens if the file is passed as "Object"
|
||||
|
||||
try {
|
||||
//noinspection deprecation
|
||||
WorkbookFactory.create((Object)altXLSX);
|
||||
fail("Will throw an exception");
|
||||
} catch(IOException e) {
|
||||
// expected here because create() in this case expects an object of type "OPCPackage"
|
||||
}
|
||||
//noinspection deprecation
|
||||
WorkbookFactory.create((Object)altXLSX);
|
||||
// expected a ClassCastException here because create() in this case expects an object of type "OPCPackage"
|
||||
}
|
||||
|
||||
|
||||
private static class TestFile extends File {
|
||||
public TestFile(String file) {
|
||||
super(file);
|
||||
@ -452,15 +437,10 @@ public final class TestWorkbookFactory {
|
||||
closeOrRevert(wb);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInvalidFormatException() {
|
||||
@Test(expected = IOException.class)
|
||||
public void testInvalidFormatException() throws IOException {
|
||||
String filename = "OPCCompliance_DerivedPartNameFAIL.docx";
|
||||
try {
|
||||
WorkbookFactory.create(POIDataSamples.getOpenXML4JInstance().openResourceAsStream(filename));
|
||||
fail("Expecting an Exception for this document");
|
||||
} catch (IOException e) {
|
||||
// expected here
|
||||
}
|
||||
WorkbookFactory.create(POIDataSamples.getOpenXML4JInstance().openResourceAsStream(filename));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,6 +31,12 @@ import org.apache.poi.util.Internal;
|
||||
@SuppressWarnings("unused")
|
||||
@Internal
|
||||
public class HSLFSlideShowFactory extends SlideShowFactory {
|
||||
|
||||
static {
|
||||
SlideShowFactory.createHslfByNode = HSLFSlideShowFactory::createSlideShow;
|
||||
SlideShowFactory.createHslfByPoifs = HSLFSlideShowFactory::createSlideShow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a HSLFSlideShow from the given {@link POIFSFileSystem}<p>
|
||||
* Note that in order to properly release resources the
|
||||
|
Loading…
x
Reference in New Issue
Block a user