Adjust integration-test files slightly, more failure-output, make it a bit easier to test single-files, add a HeapDump class for investigating memory leaks, adjust XSSFFileHandler to free memory more quickly
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1787556 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
531226ac84
commit
69923f8c5a
62
src/integrationtest/org/apache/poi/HeapDump.java
Normal file
62
src/integrationtest/org/apache/poi/HeapDump.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi;
|
||||||
|
|
||||||
|
import com.sun.management.HotSpotDiagnosticMXBean;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
|
||||||
|
public class HeapDump {
|
||||||
|
// This is the name of the HotSpot Diagnostic MBean
|
||||||
|
private static final String HOTSPOT_BEAN_NAME =
|
||||||
|
"com.sun.management:type=HotSpotDiagnostic";
|
||||||
|
|
||||||
|
// field to store the hotspot diagnostic MBean
|
||||||
|
private static volatile HotSpotDiagnosticMXBean hotspotMBean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this method from your application whenever you
|
||||||
|
* want to dump the heap snapshot into a file.
|
||||||
|
*
|
||||||
|
* @param fileName name of the heap dump file
|
||||||
|
* @param live flag that tells whether to dump
|
||||||
|
* only the live objects
|
||||||
|
*/
|
||||||
|
public static void dumpHeap(String fileName, boolean live) throws IOException {
|
||||||
|
// initialize hotspot diagnostic MBean
|
||||||
|
initHotspotMBean();
|
||||||
|
hotspotMBean.dumpHeap(fileName, live);
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize the hotspot diagnostic MBean field
|
||||||
|
private static void initHotspotMBean() throws IOException {
|
||||||
|
if (hotspotMBean == null) {
|
||||||
|
synchronized (HeapDump.class) {
|
||||||
|
if (hotspotMBean == null) {
|
||||||
|
hotspotMBean = getHotspotMBean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the hotspot diagnostic MBean from the platform MBean server
|
||||||
|
private static HotSpotDiagnosticMXBean getHotspotMBean() throws IOException {
|
||||||
|
return ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(),
|
||||||
|
HOTSPOT_BEAN_NAME, HotSpotDiagnosticMXBean.class);
|
||||||
|
}
|
||||||
|
}
|
@ -81,9 +81,9 @@ public abstract class AbstractFileHandler implements FileHandler {
|
|||||||
|
|
||||||
POITextExtractor extractor = ExtractorFactory.createExtractor(file);
|
POITextExtractor extractor = ExtractorFactory.createExtractor(file);
|
||||||
try {
|
try {
|
||||||
assertNotNull(extractor);
|
assertNotNull("Should get a POITextExtractor but had none for file " + file, extractor);
|
||||||
|
|
||||||
assertNotNull(extractor.getText());
|
assertNotNull("Should get some text but had none for file " + file, extractor.getText());
|
||||||
|
|
||||||
// also try metadata
|
// also try metadata
|
||||||
@SuppressWarnings("resource")
|
@SuppressWarnings("resource")
|
||||||
|
@ -31,8 +31,8 @@ public interface FileHandler {
|
|||||||
*
|
*
|
||||||
* Closing is handled by the framework outside this call.
|
* Closing is handled by the framework outside this call.
|
||||||
*
|
*
|
||||||
* @param stream
|
* @param stream The input stream to read the file from.
|
||||||
* @throws Exception
|
* @throws Exception If an error happens in the file-specific handler
|
||||||
*/
|
*/
|
||||||
void handleFile(InputStream stream) throws Exception;
|
void handleFile(InputStream stream) throws Exception;
|
||||||
|
|
||||||
|
@ -19,9 +19,7 @@ package org.apache.poi.stress;
|
|||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
||||||
@ -39,6 +37,7 @@ public class HSLFFileHandler extends SlideShowHandler {
|
|||||||
Record[] records = slide.getRecords();
|
Record[] records = slide.getRecords();
|
||||||
assertNotNull(records);
|
assertNotNull(records);
|
||||||
for(Record record : records) {
|
for(Record record : records) {
|
||||||
|
assertNotNull("Found a record which was null", record);
|
||||||
assertTrue(record.getRecordType() >= 0);
|
assertTrue(record.getRecordType() >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,21 +47,55 @@ public class HSLFFileHandler extends SlideShowHandler {
|
|||||||
handleSlideShow(ss);
|
handleSlideShow(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOne() throws Exception {
|
||||||
|
testOneFile(new File("test-data/slideshow/54880_chinese.ppt"));
|
||||||
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
@Override
|
@Override
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
InputStream stream = new FileInputStream("test-data/hpsf/Test_Humor-Generation.ppt");
|
File[] files = new File("test-data/slideshow/").listFiles(new FilenameFilter() {
|
||||||
try {
|
@Override
|
||||||
handleFile(stream);
|
public boolean accept(File dir, String name) {
|
||||||
} finally {
|
return name.endsWith(".ppt");
|
||||||
stream.close();
|
}
|
||||||
|
});
|
||||||
|
assertNotNull(files);
|
||||||
|
|
||||||
|
System.out.println("Testing " + files.length + " files");
|
||||||
|
|
||||||
|
for(File file : files) {
|
||||||
|
try {
|
||||||
|
testOneFile(file);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testOneFile(File file) throws Exception {
|
||||||
|
System.out.println(file);
|
||||||
|
|
||||||
|
//System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger");
|
||||||
|
InputStream stream = new FileInputStream(file);
|
||||||
|
try {
|
||||||
|
handleFile(stream);
|
||||||
|
} finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
handleExtracting(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
public static void main(String[] args) throws Exception {
|
||||||
@Test
|
System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.SystemOutLogger");
|
||||||
public void testExtractor() throws Exception {
|
InputStream stream = new FileInputStream(args[0]);
|
||||||
handleExtracting(new File("test-data/slideshow/ae.ac.uaeu.faculty_nafaachbili_GeomLec1.pptx"));
|
try {
|
||||||
|
new HSLFFileHandler().handleFile(stream);
|
||||||
|
} finally {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package org.apache.poi.stress;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@ -75,11 +76,14 @@ public class HSMFFileHandler extends POIFSFileHandler {
|
|||||||
@Override
|
@Override
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
InputStream stream = new FileInputStream("test-data/hsmf/example_received_regular.msg");
|
File file = new File("test-data/hsmf/logsat.com_signatures_valid.msg");
|
||||||
|
InputStream stream = new FileInputStream(file);
|
||||||
try {
|
try {
|
||||||
handleFile(stream);
|
handleFile(stream);
|
||||||
} finally {
|
} finally {
|
||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleExtracting(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -38,7 +38,7 @@ public class HSSFFileHandler extends SpreadsheetHandler {
|
|||||||
|
|
||||||
// TODO: some documents fail currently...
|
// TODO: some documents fail currently...
|
||||||
// Note - as of Bugzilla 48036 (svn r828244, r828247) POI is capable of evaluating
|
// Note - as of Bugzilla 48036 (svn r828244, r828247) POI is capable of evaluating
|
||||||
// IntesectionPtg. However it is still not capable of parsing it.
|
// IntersectionPtg. However it is still not capable of parsing it.
|
||||||
// So FormulaEvalTestData.xls now contains a few formulas that produce errors here.
|
// So FormulaEvalTestData.xls now contains a few formulas that produce errors here.
|
||||||
//HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
|
//HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
|
||||||
//evaluator.evaluateAll();
|
//evaluator.evaluateAll();
|
||||||
@ -100,17 +100,14 @@ public class HSSFFileHandler extends SpreadsheetHandler {
|
|||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
InputStream stream = new FileInputStream("test-data/spreadsheet/49219.xls");
|
File file = new File("test-data/spreadsheet/49219.xls");
|
||||||
|
|
||||||
|
InputStream stream = new FileInputStream(file);
|
||||||
try {
|
try {
|
||||||
handleFile(stream);
|
handleFile(stream);
|
||||||
} finally {
|
} finally {
|
||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
|
handleExtracting(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
|
||||||
@Test
|
|
||||||
public void testExtractor() throws Exception {
|
|
||||||
handleExtracting(new File("test-data/spreadsheet/BOOK_in_capitals.xls"));
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -57,7 +57,7 @@ public class OPCFileHandler extends AbstractFileHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleExtracting(File file) throws Exception {
|
public void handleExtracting(File file) throws Exception {
|
||||||
// text-extraction is not possible currenlty for these types of files
|
// text-extraction is not possible currently for these types of files
|
||||||
}
|
}
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
|
@ -50,7 +50,7 @@ public abstract class SlideShowHandler extends POIFSFileHandler {
|
|||||||
|
|
||||||
readContent(ss);
|
readContent(ss);
|
||||||
|
|
||||||
// read in the writen file
|
// read in the written file
|
||||||
SlideShow<?,?> read = SlideShowFactory.create(new ByteArrayInputStream(out.toByteArray()));
|
SlideShow<?,?> read = SlideShowFactory.create(new ByteArrayInputStream(out.toByteArray()));
|
||||||
try {
|
try {
|
||||||
assertNotNull(read);
|
assertNotNull(read);
|
||||||
|
@ -69,17 +69,14 @@ public class XSLFFileHandler extends SlideShowHandler {
|
|||||||
@Override
|
@Override
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
InputStream stream = new FileInputStream("test-data/slideshow/ae.ac.uaeu.faculty_nafaachbili_GeomLec1.pptx");
|
File file = new File("test-data/slideshow/ae.ac.uaeu.faculty_nafaachbili_GeomLec1.pptx");
|
||||||
|
InputStream stream = new FileInputStream(file);
|
||||||
try {
|
try {
|
||||||
handleFile(stream);
|
handleFile(stream);
|
||||||
} finally {
|
} finally {
|
||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
handleExtracting(file);
|
||||||
@Test
|
|
||||||
public void testExtractor() throws Exception {
|
|
||||||
handleExtracting(new File("test-data/slideshow/ae.ac.uaeu.faculty_nafaachbili_GeomLec1.pptx"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,25 +16,6 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.stress;
|
package org.apache.poi.stress;
|
||||||
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.PrintStream;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException;
|
import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException;
|
||||||
@ -56,12 +37,18 @@ public class XSSFFileHandler extends SpreadsheetHandler {
|
|||||||
// ignore password protected files
|
// ignore password protected files
|
||||||
if (POIXMLDocumentHandler.isEncrypted(stream)) return;
|
if (POIXMLDocumentHandler.isEncrypted(stream)) return;
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
||||||
IOUtils.copy(stream, out);
|
|
||||||
|
|
||||||
final byte[] bytes = out.toByteArray();
|
|
||||||
final XSSFWorkbook wb;
|
final XSSFWorkbook wb;
|
||||||
wb = new XSSFWorkbook(new ByteArrayInputStream(bytes));
|
|
||||||
|
// make sure the potentially large byte-array is freed up quickly again
|
||||||
|
{
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
IOUtils.copy(stream, out);
|
||||||
|
final byte[] bytes = out.toByteArray();
|
||||||
|
|
||||||
|
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
|
||||||
|
|
||||||
|
wb = new XSSFWorkbook(new ByteArrayInputStream(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
// use the combined handler for HSSF/XSSF
|
// use the combined handler for HSSF/XSSF
|
||||||
handleWorkbook(wb);
|
handleWorkbook(wb);
|
||||||
@ -76,9 +63,8 @@ public class XSSFFileHandler extends SpreadsheetHandler {
|
|||||||
// and finally ensure that exporting to XML works
|
// and finally ensure that exporting to XML works
|
||||||
exportToXML(wb);
|
exportToXML(wb);
|
||||||
|
|
||||||
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(bytes)));
|
// this allows to trigger a heap-dump at this point to see which memory is still allocated
|
||||||
|
//HeapDump.dumpHeap("/tmp/poi.hprof", false);
|
||||||
wb.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -183,18 +169,16 @@ public class XSSFFileHandler extends SpreadsheetHandler {
|
|||||||
// a test-case to test this locally without executing the full TestAllFiles
|
// a test-case to test this locally without executing the full TestAllFiles
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
InputStream stream = new BufferedInputStream(new FileInputStream("test-data/spreadsheet/ref-56737.xlsx"));
|
File file = new File("test-data/spreadsheet/ref-56737.xlsx");
|
||||||
|
|
||||||
|
InputStream stream = new BufferedInputStream(new FileInputStream(file));
|
||||||
try {
|
try {
|
||||||
handleFile(stream);
|
handleFile(stream);
|
||||||
} finally {
|
} finally {
|
||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// a test-case to test this locally without executing the full TestAllFiles
|
handleExtracting(file);
|
||||||
@Test
|
|
||||||
public void testExtractor() throws Exception {
|
|
||||||
handleExtracting(new File("test-data/spreadsheet/ref-56737.xlsx"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
Reference in New Issue
Block a user