mirror of https://github.com/apache/poi.git
Fix some additional file-handle-leaks reported by unit-tests via an enhanced version of the file-leak-detector
Also add a test for Bug 64045 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872287 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
578d78da37
commit
4aa8334e3b
|
@ -317,6 +317,7 @@ public class TestAllFiles {
|
||||||
"spreadsheet/poc-shared-strings.xlsx", // contains shared-string-entity-expansion
|
"spreadsheet/poc-shared-strings.xlsx", // contains shared-string-entity-expansion
|
||||||
"document/61612a.docx",
|
"document/61612a.docx",
|
||||||
"document/word2.doc",
|
"document/word2.doc",
|
||||||
|
"spreadsheet/xlsx-corrupted.xlsx",
|
||||||
|
|
||||||
// old Excel files, which we only support simple text extraction of
|
// old Excel files, which we only support simple text extraction of
|
||||||
"spreadsheet/testEXCEL_2.xls",
|
"spreadsheet/testEXCEL_2.xls",
|
||||||
|
|
|
@ -43,8 +43,9 @@ class EMFHandler extends MFProxy {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parse(File file) throws IOException {
|
public void parse(File file) throws IOException {
|
||||||
// stream needs to be kept open
|
// stream needs to be kept open until the instance is closed
|
||||||
parse(file.toURI().toURL().openStream());
|
is = file.toURI().toURL().openStream();
|
||||||
|
parse(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -66,7 +67,6 @@ class EMFHandler extends MFProxy {
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getContentType() {
|
protected String getContentType() {
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
|
|
||||||
package org.apache.poi.xssf;
|
package org.apache.poi.xssf;
|
||||||
|
|
||||||
|
import org.apache.poi.ooxml.POIXMLException;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.util.MemoryLeakVerifier;
|
import org.apache.poi.util.MemoryLeakVerifier;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFCell;
|
import org.apache.poi.xssf.usermodel.XSSFCell;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRow;
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
@ -27,12 +30,14 @@ import org.junit.Test;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertSame;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A test which uses {@link MemoryLeakVerifier} to ensure that certain
|
* A test which uses {@link MemoryLeakVerifier} to ensure that certain
|
||||||
|
@ -141,4 +146,24 @@ public class XSSFMemoryLeakTests {
|
||||||
|
|
||||||
wb1.close();
|
wb1.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = POIXMLException.class)
|
||||||
|
public void testFileLeak() throws IOException, InvalidFormatException {
|
||||||
|
File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
|
||||||
|
verifier.addObject(file);
|
||||||
|
try (XSSFWorkbook ignored = new XSSFWorkbook(file)) {
|
||||||
|
fail("Should catch exception as the file is corrupted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = POIXMLException.class)
|
||||||
|
public void testFileLeak2() throws IOException, InvalidFormatException {
|
||||||
|
File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
|
||||||
|
verifier.addObject(file);
|
||||||
|
try (OPCPackage pkg = OPCPackage.open(file)) {
|
||||||
|
try (XSSFWorkbook ignored = new XSSFWorkbook(pkg)) {
|
||||||
|
fail("Should catch exception as the file is corrupted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,17 +113,17 @@ public class TestXSSFBEventBasedExcelExtractor {
|
||||||
extractor.setIncludeCellComments(true);
|
extractor.setIncludeCellComments(true);
|
||||||
String[] rows = extractor.getText().split("[\r\n]+");
|
String[] rows = extractor.getText().split("[\r\n]+");
|
||||||
assertEquals(283, rows.length);
|
assertEquals(283, rows.length);
|
||||||
BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(),
|
try (BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(),
|
||||||
StandardCharsets.UTF_8);
|
StandardCharsets.UTF_8)) {
|
||||||
String line = reader.readLine();
|
String line = reader.readLine();
|
||||||
for (String row : rows) {
|
for (String row : rows) {
|
||||||
assertEquals(line, row);
|
assertEquals(line, row);
|
||||||
line = reader.readLine();
|
|
||||||
while (line != null && line.startsWith("#")) {
|
|
||||||
line = reader.readLine();
|
line = reader.readLine();
|
||||||
|
while (line != null && line.startsWith("#")) {
|
||||||
|
line = reader.readLine();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.nio.file.Path;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Sheet;
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
@ -233,11 +234,12 @@ public final class TestSharedStringsTable {
|
||||||
|
|
||||||
Path path = XSSFTestDataSamples.getSampleFile("48936-strings.txt").toPath();
|
Path path = XSSFTestDataSamples.getSampleFile("48936-strings.txt").toPath();
|
||||||
|
|
||||||
List<String> lst = Files
|
Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
|
||||||
.lines(path, StandardCharsets.UTF_8)
|
List<String> lst = lines
|
||||||
.map(String::trim)
|
.map(String::trim)
|
||||||
.filter(((Predicate<String>)String::isEmpty).negate())
|
.filter(((Predicate<String>)String::isEmpty).negate())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
lines.close();
|
||||||
|
|
||||||
for (String str : lst) {
|
for (String str : lst) {
|
||||||
s.createRow(i++).createCell(0).setCellValue(str);
|
s.createRow(i++).createCell(0).setCellValue(str);
|
||||||
|
|
|
@ -3455,4 +3455,12 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = POIXMLException.class)
|
||||||
|
public void test64045() throws IOException, InvalidFormatException {
|
||||||
|
File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
|
||||||
|
try (XSSFWorkbook ignored = new XSSFWorkbook(file)) {
|
||||||
|
fail("Should catch exception as the file is corrupted");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2914,43 +2914,40 @@ public final class TestBugs extends BaseTestBugzillaIssues {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test46515() throws IOException {
|
public void test46515() throws IOException {
|
||||||
Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls");
|
try (Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls")) {
|
||||||
|
|
||||||
// Get structure from webservice
|
// Get structure from webservice
|
||||||
String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg";
|
String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg";
|
||||||
URL structURL = new URL(urlString);
|
URL structURL = new URL(urlString);
|
||||||
BufferedImage bimage;
|
BufferedImage bimage;
|
||||||
try {
|
try {
|
||||||
bimage = ImageIO.read(structURL);
|
bimage = ImageIO.read(structURL);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e);
|
Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e);
|
||||||
return;
|
return;
|
||||||
} finally {
|
}
|
||||||
wb.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert BufferedImage to byte[]
|
// Convert BufferedImage to byte[]
|
||||||
ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream();
|
ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream();
|
||||||
ImageIO.write(bimage, "jpeg", imageBAOS);
|
ImageIO.write(bimage, "jpeg", imageBAOS);
|
||||||
imageBAOS.flush();
|
imageBAOS.flush();
|
||||||
byte[] imageBytes = imageBAOS.toByteArray();
|
byte[] imageBytes = imageBAOS.toByteArray();
|
||||||
imageBAOS.close();
|
imageBAOS.close();
|
||||||
|
|
||||||
// Pop structure into Structure HSSFSheet
|
// Pop structure into Structure HSSFSheet
|
||||||
int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
|
int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
|
||||||
Sheet sheet = wb.getSheet("Structure");
|
Sheet sheet = wb.getSheet("Structure");
|
||||||
assertNotNull("Did not find sheet", sheet);
|
assertNotNull("Did not find sheet", sheet);
|
||||||
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
|
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
|
||||||
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22);
|
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22);
|
||||||
anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);
|
anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);
|
||||||
patriarch.createPicture(anchor, pict);
|
patriarch.createPicture(anchor, pict);
|
||||||
|
|
||||||
// Write out destination file
|
// Write out destination file
|
||||||
// FileOutputStream fileOut = new FileOutputStream("/tmp/46515.xls");
|
// FileOutputStream fileOut = new FileOutputStream("/tmp/46515.xls");
|
||||||
// wb.write(fileOut);
|
// wb.write(fileOut);
|
||||||
// fileOut.close();
|
// fileOut.close();
|
||||||
|
}
|
||||||
wb.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue