Close file-handles for slideshows also when construction fails or when dual-storage is used

Also avoid file-leak reports in some tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1854192 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2019-02-23 07:52:24 +00:00
parent 98b620889b
commit 6a93b3a9ed
22 changed files with 873 additions and 806 deletions

View File

@ -40,7 +40,7 @@ import org.junit.Test;
public class TestDetectAsOOXML {
@Test
public void testOpensProperly() throws IOException, InvalidFormatException {
OPCPackage.open(HSSFTestDataSamples.openSampleFileStream("sample.xlsx"));
OPCPackage.open(HSSFTestDataSamples.openSampleFileStream("sample.xlsx")).close();
}
@Test

View File

@ -67,5 +67,7 @@ public class TestEmbedded extends TestCase
byte[] b = IOUtils.toByteArray(pp.getInputStream());
assertTrue(b.length > 0);
}
doc.close();
}
}

View File

@ -81,15 +81,10 @@ public final class TestListParts extends TestCase {
/**
* List all parts of a package.
*/
public void testListParts() throws InvalidFormatException {
public void testListParts() throws InvalidFormatException, IOException {
InputStream is = OpenXML4JTestDataSamples.openSampleStream("sample.docx");
OPCPackage p;
try {
p = OPCPackage.open(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
OPCPackage p = OPCPackage.open(is);
for (PackagePart part : p.getParts()) {
values.put(part.getPartName(), part.getContentType());
logger.log(POILogger.DEBUG, part.getPartName());
@ -100,5 +95,7 @@ public final class TestListParts extends TestCase {
assertNotNull(values.get(partName));
assertEquals(expectedValues.get(partName), values.get(partName));
}
p.close();
}
}

View File

@ -30,7 +30,6 @@ import junit.framework.TestCase;
import org.apache.poi.openxml4j.OpenXML4JTestDataSamples;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.xwpf.usermodel.XWPFRelation;
public class TestRelationships extends TestCase {
@ -51,18 +50,19 @@ public class TestRelationships extends TestCase {
*/
public void testLoadRelationships() throws Exception {
InputStream is = OpenXML4JTestDataSamples.openSampleStream("sample.xlsx");
OPCPackage pkg = OPCPackage.open(is);
logger.log(POILogger.DEBUG, "1: " + pkg);
PackageRelationshipCollection rels = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
PackageRelationship coreDocRelationship = rels.getRelationship(0);
PackagePart corePart = pkg.getPart(coreDocRelationship);
String[] relIds = {"rId1", "rId2", "rId3"};
for (String relId : relIds) {
PackageRelationship rel = corePart.getRelationship(relId);
assertNotNull(rel);
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
PackagePart sheetPart = pkg.getPart(relName);
assertEquals("Number of relationships1 for " + sheetPart.getPartName(), 1, sheetPart.getRelationships().size());
try (OPCPackage pkg = OPCPackage.open(is)) {
logger.log(POILogger.DEBUG, "1: " + pkg);
PackageRelationshipCollection rels = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_DOCUMENT);
PackageRelationship coreDocRelationship = rels.getRelationship(0);
PackagePart corePart = pkg.getPart(coreDocRelationship);
String[] relIds = {"rId1", "rId2", "rId3"};
for (String relId : relIds) {
PackageRelationship rel = corePart.getRelationship(relId);
assertNotNull(rel);
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
PackagePart sheetPart = pkg.getPart(relName);
assertEquals("Number of relationships1 for " + sheetPart.getPartName(), 1, sheetPart.getRelationships().size());
}
}
}
@ -72,39 +72,40 @@ public class TestRelationships extends TestCase {
*/
public void testFetchFromCollection() throws Exception {
InputStream is = OpenXML4JTestDataSamples.openSampleStream("ExcelWithHyperlinks.xlsx");
OPCPackage pkg = OPCPackage.open(is);
PackagePart sheet = pkg.getPart(
PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
assertNotNull(sheet);
assertTrue(sheet.hasRelationships());
assertEquals(6, sheet.getRelationships().size());
// Should have three hyperlinks, and one comment
PackageRelationshipCollection hyperlinks =
sheet.getRelationshipsByType(HYPERLINK_REL_TYPE);
PackageRelationshipCollection comments =
sheet.getRelationshipsByType(COMMENTS_REL_TYPE);
assertEquals(3, hyperlinks.size());
assertEquals(1, comments.size());
// Check we can get bits out by id
// Hyperlinks are rId1, rId2 and rId3
// Comment is rId6
assertNotNull(hyperlinks.getRelationshipByID("rId1"));
assertNotNull(hyperlinks.getRelationshipByID("rId2"));
assertNotNull(hyperlinks.getRelationshipByID("rId3"));
assertNull(hyperlinks.getRelationshipByID("rId6"));
assertNull(comments.getRelationshipByID("rId1"));
assertNull(comments.getRelationshipByID("rId2"));
assertNull(comments.getRelationshipByID("rId3"));
assertNotNull(comments.getRelationshipByID("rId6"));
assertNotNull(sheet.getRelationship("rId1"));
assertNotNull(sheet.getRelationship("rId2"));
assertNotNull(sheet.getRelationship("rId3"));
assertNotNull(sheet.getRelationship("rId6"));
try (OPCPackage pkg = OPCPackage.open(is)) {
PackagePart sheet = pkg.getPart(
PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
assertNotNull(sheet);
assertTrue(sheet.hasRelationships());
assertEquals(6, sheet.getRelationships().size());
// Should have three hyperlinks, and one comment
PackageRelationshipCollection hyperlinks =
sheet.getRelationshipsByType(HYPERLINK_REL_TYPE);
PackageRelationshipCollection comments =
sheet.getRelationshipsByType(COMMENTS_REL_TYPE);
assertEquals(3, hyperlinks.size());
assertEquals(1, comments.size());
// Check we can get bits out by id
// Hyperlinks are rId1, rId2 and rId3
// Comment is rId6
assertNotNull(hyperlinks.getRelationshipByID("rId1"));
assertNotNull(hyperlinks.getRelationshipByID("rId2"));
assertNotNull(hyperlinks.getRelationshipByID("rId3"));
assertNull(hyperlinks.getRelationshipByID("rId6"));
assertNull(comments.getRelationshipByID("rId1"));
assertNull(comments.getRelationshipByID("rId2"));
assertNull(comments.getRelationshipByID("rId3"));
assertNotNull(comments.getRelationshipByID("rId6"));
assertNotNull(sheet.getRelationship("rId1"));
assertNotNull(sheet.getRelationship("rId2"));
assertNotNull(sheet.getRelationship("rId3"));
assertNotNull(sheet.getRelationship("rId6"));
}
}
/**
@ -113,31 +114,32 @@ public class TestRelationships extends TestCase {
*/
public void testLoadExcelHyperlinkRelations() throws Exception {
InputStream is = OpenXML4JTestDataSamples.openSampleStream("ExcelWithHyperlinks.xlsx");
OPCPackage pkg = OPCPackage.open(is);
PackagePart sheet = pkg.getPart(
PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
assertNotNull(sheet);
try (OPCPackage pkg = OPCPackage.open(is)) {
PackagePart sheet = pkg.getPart(
PackagingURIHelper.createPartName(SHEET_WITH_COMMENTS));
assertNotNull(sheet);
// rId1 is url
PackageRelationship url = sheet.getRelationship("rId1");
assertNotNull(url);
assertEquals("rId1", url.getId());
assertEquals("/xl/worksheets/sheet1.xml", url.getSourceURI().toString());
assertEquals("http://poi.apache.org/", url.getTargetURI().toString());
// rId2 is file
PackageRelationship file = sheet.getRelationship("rId2");
assertNotNull(file);
assertEquals("rId2", file.getId());
assertEquals("/xl/worksheets/sheet1.xml", file.getSourceURI().toString());
assertEquals("WithVariousData.xlsx", file.getTargetURI().toString());
// rId3 is mailto
PackageRelationship mailto = sheet.getRelationship("rId3");
assertNotNull(mailto);
assertEquals("rId3", mailto.getId());
assertEquals("/xl/worksheets/sheet1.xml", mailto.getSourceURI().toString());
assertEquals("mailto:dev@poi.apache.org?subject=XSSF%20Hyperlinks", mailto.getTargetURI().toString());
// rId1 is url
PackageRelationship url = sheet.getRelationship("rId1");
assertNotNull(url);
assertEquals("rId1", url.getId());
assertEquals("/xl/worksheets/sheet1.xml", url.getSourceURI().toString());
assertEquals("http://poi.apache.org/", url.getTargetURI().toString());
// rId2 is file
PackageRelationship file = sheet.getRelationship("rId2");
assertNotNull(file);
assertEquals("rId2", file.getId());
assertEquals("/xl/worksheets/sheet1.xml", file.getSourceURI().toString());
assertEquals("WithVariousData.xlsx", file.getTargetURI().toString());
// rId3 is mailto
PackageRelationship mailto = sheet.getRelationship("rId3");
assertNotNull(mailto);
assertEquals("rId3", mailto.getId());
assertEquals("/xl/worksheets/sheet1.xml", mailto.getSourceURI().toString());
assertEquals("mailto:dev@poi.apache.org?subject=XSSF%20Hyperlinks", mailto.getTargetURI().toString());
}
}
/*
@ -217,74 +219,73 @@ public class TestRelationships extends TestCase {
}
public void testCreateRelationsFromScratch() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OPCPackage pkg = OPCPackage.create(baos);
PackagePart partA =
pkg.createPart(PackagingURIHelper.createPartName("/partA"), "text/plain");
PackagePart partB =
pkg.createPart(PackagingURIHelper.createPartName("/partB"), "image/png");
assertNotNull(partA);
assertNotNull(partB);
// Internal
partA.addRelationship(partB.getPartName(), TargetMode.INTERNAL, "http://example/Rel");
// External
partA.addExternalRelationship("http://poi.apache.org/", "http://example/poi");
partB.addExternalRelationship("http://poi.apache.org/ss/", "http://example/poi/ss");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OPCPackage pkg = OPCPackage.create(baos);
// Check as expected currently
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
partA.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/ss/",
partB.getRelationship("rId1").getTargetURI().toString());
// Save, and re-load
pkg.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
pkg = OPCPackage.open(bais);
partA = pkg.getPart(PackagingURIHelper.createPartName("/partA"));
partB = pkg.getPart(PackagingURIHelper.createPartName("/partB"));
// Check the relations
assertEquals(2, partA.getRelationships().size());
assertEquals(1, partB.getRelationships().size());
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
partA.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/ss/",
partB.getRelationship("rId1").getTargetURI().toString());
// Check core too
assertEquals("/docProps/core.xml",
pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_PROPERTIES).getRelationship(0).getTargetURI().toString());
// Add some more
partB.addExternalRelationship("http://poi.apache.org/new", "http://example/poi/new");
partB.addExternalRelationship("http://poi.apache.org/alt", "http://example/poi/alt");
// Check the relations
assertEquals(2, partA.getRelationships().size());
assertEquals(3, partB.getRelationships().size());
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
PackagePart partA =
pkg.createPart(PackagingURIHelper.createPartName("/partA"), "text/plain");
PackagePart partB =
pkg.createPart(PackagingURIHelper.createPartName("/partB"), "image/png");
assertNotNull(partA);
assertNotNull(partB);
// Internal
partA.addRelationship(partB.getPartName(), TargetMode.INTERNAL, "http://example/Rel");
// External
partA.addExternalRelationship("http://poi.apache.org/", "http://example/poi");
partB.addExternalRelationship("http://poi.apache.org/ss/", "http://example/poi/ss");
// Check as expected currently
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
partA.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/ss/",
partB.getRelationship("rId1").getTargetURI().toString());
// Save, and re-load
pkg.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
pkg = OPCPackage.open(bais);
partA = pkg.getPart(PackagingURIHelper.createPartName("/partA"));
partB = pkg.getPart(PackagingURIHelper.createPartName("/partB"));
// Check the relations
assertEquals(2, partA.getRelationships().size());
assertEquals(1, partB.getRelationships().size());
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
partA.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/ss/",
partB.getRelationship("rId1").getTargetURI().toString());
// Check core too
PackageRelationship relationship = pkg.getRelationshipsByType(PackageRelationshipTypes.CORE_PROPERTIES).getRelationship(0);
assertNotNull(relationship);
assertEquals("/docProps/core.xml", relationship.getTargetURI().toString());
// Add some more
partB.addExternalRelationship("http://poi.apache.org/new", "http://example/poi/new");
partB.addExternalRelationship("http://poi.apache.org/alt", "http://example/poi/alt");
// Check the relations
assertEquals(2, partA.getRelationships().size());
assertEquals(3, partB.getRelationships().size());
assertEquals("/partB", partA.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/",
partA.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/ss/",
assertEquals("http://poi.apache.org/ss/",
partB.getRelationship("rId1").getTargetURI().toString());
assertEquals("http://poi.apache.org/new",
assertEquals("http://poi.apache.org/new",
partB.getRelationship("rId2").getTargetURI().toString());
assertEquals("http://poi.apache.org/alt",
assertEquals("http://poi.apache.org/alt",
partB.getRelationship("rId3").getTargetURI().toString());
}
public void testTargetWithSpecialChars() throws Exception{
OPCPackage pkg;
@ -371,7 +372,8 @@ public class TestRelationships extends TestCase {
PackageRelationship rel2 = partA.getRelationships().getRelationship(0);
assertEquals(rel1.getRelationshipType(), rel2.getRelationshipType());
assertNotNull(rel2);
assertEquals(rel1.getRelationshipType(), rel2.getRelationshipType());
assertEquals(rel1.getId(), rel2.getId());
assertEquals(rel1.getSourceURI(), rel2.getSourceURI());
assertEquals(rel1.getTargetURI(), rel2.getTargetURI());

View File

@ -119,17 +119,18 @@ public final class TestOPCComplianceCoreProperties {
// We will use the first core properties, and ignore the others
InputStream is = OpenXML4JTestDataSamples.openSampleStream("MultipleCoreProperties.docx");
OPCPackage pkg = OPCPackage.open(is);
// We can see 2 by type
assertEquals(2, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
// But only the first one by relationship
assertEquals(1, pkg.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).size());
// It should be core.xml not the older core1.xml
assertEquals(
"/docProps/core.xml",
pkg.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).get(0).getPartName().toString()
);
try (OPCPackage pkg = OPCPackage.open(is)) {
// We can see 2 by type
assertEquals(2, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
// But only the first one by relationship
assertEquals(1, pkg.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).size());
// It should be core.xml not the older core1.xml
assertEquals(
"/docProps/core.xml",
pkg.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).get(0).getPartName().toString()
);
}
}
private static URI createURI(String text) {

View File

@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Matcher;
@ -27,6 +28,7 @@ import java.util.regex.Pattern;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.util.LocaleUtil;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.junit.AfterClass;
@ -58,7 +60,7 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testGeneralFormat() {
public void testGeneralFormat() throws IOException {
runFormatTests("GeneralFormatTests.xlsx", new CellValue() {
@Override
public Object getValue(Cell cell) {
@ -75,7 +77,7 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testNumberFormat() {
public void testNumberFormat() throws IOException {
runFormatTests("NumberFormatTests.xlsx", new CellValue() {
@Override
public Object getValue(Cell cell) {
@ -85,7 +87,7 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testNumberApproxFormat() {
public void testNumberApproxFormat() throws IOException {
runFormatTests("NumberFormatApproxTests.xlsx", new CellValue() {
@Override
public Object getValue(Cell cell) {
@ -106,7 +108,7 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testDateFormat() {
public void testDateFormat() throws IOException {
TimeZone tz = LocaleUtil.getUserTimeZone();
LocaleUtil.setUserTimeZone(TimeZone.getTimeZone("CET"));
try {
@ -122,7 +124,7 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testElapsedFormat() {
public void testElapsedFormat() throws IOException {
runFormatTests("ElapsedFormatTests.xlsx", new CellValue() {
@Override
public Object getValue(Cell cell) {
@ -132,22 +134,20 @@ public class TestCellFormatPart extends CellFormatTestBase {
}
@Test
public void testTextFormat() {
public void testTextFormat() throws IOException {
runFormatTests("TextFormatTests.xlsx", new CellValue() {
@Override
public Object getValue(Cell cell) {
switch(CellFormat.ultimateType(cell)) {
case BOOLEAN:
return cell.getBooleanCellValue();
default:
return cell.getStringCellValue();
if (CellFormat.ultimateType(cell) == CellType.BOOLEAN) {
return cell.getBooleanCellValue();
}
return cell.getStringCellValue();
}
});
}
@Test
public void testConditions() {
public void testConditions() throws IOException {
runFormatTests("FormatConditionTests.xlsx", new CellValue() {
@Override
Object getValue(Cell cell) {

View File

@ -28,6 +28,8 @@ import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.junit.Test;
import java.io.IOException;
/**
*
*/
@ -37,14 +39,15 @@ public class TestSumifsXSSF {
* handle null cell predicate
*/
@Test
public void testBug60858() {
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("bug60858.xlsx");
FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
public void testBug60858() throws IOException {
try (Workbook wb = XSSFTestDataSamples.openSampleWorkbook("bug60858.xlsx")) {
FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
Sheet sheet = wb.getSheetAt(0);
Cell cell = sheet.getRow(1).getCell(5);
fe.evaluate(cell);
assertEquals(0.0, cell.getNumericCellValue(), 0.0000000000000001);
Sheet sheet = wb.getSheetAt(0);
Cell cell = sheet.getRow(1).getCell(5);
fe.evaluate(cell);
assertEquals(0.0, cell.getNumericCellValue(), 0.0000000000000001);
}
}
}

View File

@ -26,9 +26,12 @@ import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.usermodel.XSSFRangeCopier;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class TestXSSFRangeCopier extends TestRangeCopier {
public TestXSSFRangeCopier() {
super();
@ -44,6 +47,11 @@ public class TestXSSFRangeCopier extends TestRangeCopier {
transSheetRangeCopier = new XSSFRangeCopier(sheet1, sheet2);
}
@After
public void shutdown() throws IOException {
workbook.close();
}
@Test // XSSF only. HSSF version wouldn't be so simple. And also this test is contained in following, more complex tests, so it's not really important.
public void copyRow() {
Row existingRow = sheet1.getRow(4);

View File

@ -33,6 +33,7 @@ import org.apache.poi.xslf.usermodel.XSLFRelation;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideShow;
import org.apache.xmlbeans.XmlException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties;
@ -50,6 +51,11 @@ public class TestXSLFSlideShow {
pack = OPCPackage.open(slTests.openResourceAsStream("sample.pptx"));
}
@After
public void tearDown() throws IOException {
pack.close();
}
@Test
public void testContainsMainContentType() throws Exception {
boolean found = false;

View File

@ -16,21 +16,34 @@
==================================================================== */
package org.apache.poi.xssf;
import junit.framework.TestCase;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestSheetProtection extends TestCase {
import java.io.IOException;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class TestSheetProtection {
private XSSFWorkbook workbook;
private XSSFSheet sheet;
@Override
protected void setUp() throws Exception {
XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_not_protected.xlsx");
@Before
public void setUp() {
workbook = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_not_protected.xlsx");
sheet = workbook.getSheetAt(0);
}
public void testShouldReadWorkbookProtection() throws Exception {
@After
public void tearDown() throws IOException {
workbook.close();
}
@Test
public void testShouldReadWorkbookProtection() throws IOException {
assertFalse(sheet.isAutoFilterLocked());
assertFalse(sheet.isDeleteColumnsLocked());
assertFalse(sheet.isDeleteRowsLocked());
@ -48,27 +61,30 @@ public class TestSheetProtection extends TestCase {
assertFalse(sheet.isSelectUnlockedCellsLocked());
assertFalse(sheet.isSheetLocked());
sheet = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx").getSheetAt(0);
try (XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx")) {
sheet = workbook.getSheetAt(0);
assertTrue(sheet.isAutoFilterLocked());
assertTrue(sheet.isDeleteColumnsLocked());
assertTrue(sheet.isDeleteRowsLocked());
assertTrue(sheet.isFormatCellsLocked());
assertTrue(sheet.isFormatColumnsLocked());
assertTrue(sheet.isFormatRowsLocked());
assertTrue(sheet.isInsertColumnsLocked());
assertTrue(sheet.isInsertHyperlinksLocked());
assertTrue(sheet.isInsertRowsLocked());
assertTrue(sheet.isPivotTablesLocked());
assertTrue(sheet.isSortLocked());
assertTrue(sheet.isObjectsLocked());
assertTrue(sheet.isScenariosLocked());
assertTrue(sheet.isSelectLockedCellsLocked());
assertTrue(sheet.isSelectUnlockedCellsLocked());
assertTrue(sheet.isSheetLocked());
assertTrue(sheet.isAutoFilterLocked());
assertTrue(sheet.isDeleteColumnsLocked());
assertTrue(sheet.isDeleteRowsLocked());
assertTrue(sheet.isFormatCellsLocked());
assertTrue(sheet.isFormatColumnsLocked());
assertTrue(sheet.isFormatRowsLocked());
assertTrue(sheet.isInsertColumnsLocked());
assertTrue(sheet.isInsertHyperlinksLocked());
assertTrue(sheet.isInsertRowsLocked());
assertTrue(sheet.isPivotTablesLocked());
assertTrue(sheet.isSortLocked());
assertTrue(sheet.isObjectsLocked());
assertTrue(sheet.isScenariosLocked());
assertTrue(sheet.isSelectLockedCellsLocked());
assertTrue(sheet.isSelectUnlockedCellsLocked());
assertTrue(sheet.isSheetLocked());
}
}
public void testWriteAutoFilter() throws Exception {
@Test
public void testWriteAutoFilter() {
assertFalse(sheet.isAutoFilterLocked());
sheet.lockAutoFilter(true);
assertFalse(sheet.isAutoFilterLocked());
@ -77,8 +93,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockAutoFilter(false);
assertFalse(sheet.isAutoFilterLocked());
}
public void testWriteDeleteColumns() throws Exception {
@Test
public void testWriteDeleteColumns() {
assertFalse(sheet.isDeleteColumnsLocked());
sheet.lockDeleteColumns(true);
assertFalse(sheet.isDeleteColumnsLocked());
@ -87,8 +104,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockDeleteColumns(false);
assertFalse(sheet.isDeleteColumnsLocked());
}
public void testWriteDeleteRows() throws Exception {
@Test
public void testWriteDeleteRows() {
assertFalse(sheet.isDeleteRowsLocked());
sheet.lockDeleteRows(true);
assertFalse(sheet.isDeleteRowsLocked());
@ -97,8 +115,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockDeleteRows(false);
assertFalse(sheet.isDeleteRowsLocked());
}
public void testWriteFormatCells() throws Exception {
@Test
public void testWriteFormatCells() {
assertFalse(sheet.isFormatCellsLocked());
sheet.lockFormatCells(true);
assertFalse(sheet.isFormatCellsLocked());
@ -107,8 +126,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockFormatCells(false);
assertFalse(sheet.isFormatCellsLocked());
}
public void testWriteFormatColumns() throws Exception {
@Test
public void testWriteFormatColumns() {
assertFalse(sheet.isFormatColumnsLocked());
sheet.lockFormatColumns(true);
assertFalse(sheet.isFormatColumnsLocked());
@ -117,8 +137,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockFormatColumns(false);
assertFalse(sheet.isFormatColumnsLocked());
}
public void testWriteFormatRows() throws Exception {
@Test
public void testWriteFormatRows() {
assertFalse(sheet.isFormatRowsLocked());
sheet.lockFormatRows(true);
assertFalse(sheet.isFormatRowsLocked());
@ -127,8 +148,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockFormatRows(false);
assertFalse(sheet.isFormatRowsLocked());
}
public void testWriteInsertColumns() throws Exception {
@Test
public void testWriteInsertColumns() {
assertFalse(sheet.isInsertColumnsLocked());
sheet.lockInsertColumns(true);
assertFalse(sheet.isInsertColumnsLocked());
@ -137,8 +159,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockInsertColumns(false);
assertFalse(sheet.isInsertColumnsLocked());
}
public void testWriteInsertHyperlinks() throws Exception {
@Test
public void testWriteInsertHyperlinks() {
assertFalse(sheet.isInsertHyperlinksLocked());
sheet.lockInsertHyperlinks(true);
assertFalse(sheet.isInsertHyperlinksLocked());
@ -147,8 +170,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockInsertHyperlinks(false);
assertFalse(sheet.isInsertHyperlinksLocked());
}
public void testWriteInsertRows() throws Exception {
@Test
public void testWriteInsertRows() {
assertFalse(sheet.isInsertRowsLocked());
sheet.lockInsertRows(true);
assertFalse(sheet.isInsertRowsLocked());
@ -157,8 +181,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockInsertRows(false);
assertFalse(sheet.isInsertRowsLocked());
}
public void testWritePivotTables() throws Exception {
@Test
public void testWritePivotTables() {
assertFalse(sheet.isPivotTablesLocked());
sheet.lockPivotTables(true);
assertFalse(sheet.isPivotTablesLocked());
@ -167,8 +192,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockPivotTables(false);
assertFalse(sheet.isPivotTablesLocked());
}
public void testWriteSort() throws Exception {
@Test
public void testWriteSort() {
assertFalse(sheet.isSortLocked());
sheet.lockSort(true);
assertFalse(sheet.isSortLocked());
@ -177,8 +203,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockSort(false);
assertFalse(sheet.isSortLocked());
}
public void testWriteObjects() throws Exception {
@Test
public void testWriteObjects() {
assertFalse(sheet.isObjectsLocked());
sheet.lockObjects(true);
assertFalse(sheet.isObjectsLocked());
@ -187,8 +214,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockObjects(false);
assertFalse(sheet.isObjectsLocked());
}
public void testWriteScenarios() throws Exception {
@Test
public void testWriteScenarios() {
assertFalse(sheet.isScenariosLocked());
sheet.lockScenarios(true);
assertFalse(sheet.isScenariosLocked());
@ -197,8 +225,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockScenarios(false);
assertFalse(sheet.isScenariosLocked());
}
public void testWriteSelectLockedCells() throws Exception {
@Test
public void testWriteSelectLockedCells() {
assertFalse(sheet.isSelectLockedCellsLocked());
sheet.lockSelectLockedCells(true);
assertFalse(sheet.isSelectLockedCellsLocked());
@ -207,8 +236,9 @@ public class TestSheetProtection extends TestCase {
sheet.lockSelectLockedCells(false);
assertFalse(sheet.isSelectLockedCellsLocked());
}
public void testWriteSelectUnlockedCells() throws Exception {
@Test
public void testWriteSelectUnlockedCells() {
assertFalse(sheet.isSelectUnlockedCellsLocked());
sheet.lockSelectUnlockedCells(true);
assertFalse(sheet.isSelectUnlockedCellsLocked());
@ -218,43 +248,46 @@ public class TestSheetProtection extends TestCase {
assertFalse(sheet.isSelectUnlockedCellsLocked());
}
public void testWriteSelectEnableLocking() throws Exception {
sheet = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx").getSheetAt(0);
assertTrue(sheet.isAutoFilterLocked());
assertTrue(sheet.isDeleteColumnsLocked());
assertTrue(sheet.isDeleteRowsLocked());
assertTrue(sheet.isFormatCellsLocked());
assertTrue(sheet.isFormatColumnsLocked());
assertTrue(sheet.isFormatRowsLocked());
assertTrue(sheet.isInsertColumnsLocked());
assertTrue(sheet.isInsertHyperlinksLocked());
assertTrue(sheet.isInsertRowsLocked());
assertTrue(sheet.isPivotTablesLocked());
assertTrue(sheet.isSortLocked());
assertTrue(sheet.isObjectsLocked());
assertTrue(sheet.isScenariosLocked());
assertTrue(sheet.isSelectLockedCellsLocked());
assertTrue(sheet.isSelectUnlockedCellsLocked());
assertTrue(sheet.isSheetLocked());
sheet.disableLocking();
assertFalse(sheet.isAutoFilterLocked());
assertFalse(sheet.isDeleteColumnsLocked());
assertFalse(sheet.isDeleteRowsLocked());
assertFalse(sheet.isFormatCellsLocked());
assertFalse(sheet.isFormatColumnsLocked());
assertFalse(sheet.isFormatRowsLocked());
assertFalse(sheet.isInsertColumnsLocked());
assertFalse(sheet.isInsertHyperlinksLocked());
assertFalse(sheet.isInsertRowsLocked());
assertFalse(sheet.isPivotTablesLocked());
assertFalse(sheet.isSortLocked());
assertFalse(sheet.isObjectsLocked());
assertFalse(sheet.isScenariosLocked());
assertFalse(sheet.isSelectLockedCellsLocked());
assertFalse(sheet.isSelectUnlockedCellsLocked());
assertFalse(sheet.isSheetLocked());
@Test
public void testWriteSelectEnableLocking() throws IOException {
try (XSSFWorkbook workbook = XSSFTestDataSamples.openSampleWorkbook("sheetProtection_allLocked.xlsx")) {
sheet = workbook.getSheetAt(0);
assertTrue(sheet.isAutoFilterLocked());
assertTrue(sheet.isDeleteColumnsLocked());
assertTrue(sheet.isDeleteRowsLocked());
assertTrue(sheet.isFormatCellsLocked());
assertTrue(sheet.isFormatColumnsLocked());
assertTrue(sheet.isFormatRowsLocked());
assertTrue(sheet.isInsertColumnsLocked());
assertTrue(sheet.isInsertHyperlinksLocked());
assertTrue(sheet.isInsertRowsLocked());
assertTrue(sheet.isPivotTablesLocked());
assertTrue(sheet.isSortLocked());
assertTrue(sheet.isObjectsLocked());
assertTrue(sheet.isScenariosLocked());
assertTrue(sheet.isSelectLockedCellsLocked());
assertTrue(sheet.isSelectUnlockedCellsLocked());
assertTrue(sheet.isSheetLocked());
sheet.disableLocking();
assertFalse(sheet.isAutoFilterLocked());
assertFalse(sheet.isDeleteColumnsLocked());
assertFalse(sheet.isDeleteRowsLocked());
assertFalse(sheet.isFormatCellsLocked());
assertFalse(sheet.isFormatColumnsLocked());
assertFalse(sheet.isFormatRowsLocked());
assertFalse(sheet.isInsertColumnsLocked());
assertFalse(sheet.isInsertHyperlinksLocked());
assertFalse(sheet.isInsertRowsLocked());
assertFalse(sheet.isPivotTablesLocked());
assertFalse(sheet.isSortLocked());
assertFalse(sheet.isObjectsLocked());
assertFalse(sheet.isScenariosLocked());
assertFalse(sheet.isSelectLockedCellsLocked());
assertFalse(sheet.isSelectUnlockedCellsLocked());
assertFalse(sheet.isSheetLocked());
}
}
}

View File

@ -42,151 +42,162 @@ import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Ignore;
import org.junit.Test;
public class TestWorkbookProtection {
@Test
public void workbookAndRevisionPassword() throws Exception {
XSSFWorkbook workbook;
String password = "test";
// validate password with an actual office file (Excel 2010)
workbook = openSampleWorkbook("workbookProtection-workbook_password_user_range-2010.xlsx");
assertTrue(workbook.validateWorkbookPassword(password));
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection-workbook_password_user_range-2010.xlsx")) {
assertTrue(workbook.validateWorkbookPassword(password));
}
// validate with another office file (Excel 2013)
workbook = openSampleWorkbook("workbookProtection-workbook_password-2013.xlsx");
assertTrue(workbook.validateWorkbookPassword(password));
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection-workbook_password-2013.xlsx")){
assertTrue(workbook.validateWorkbookPassword(password));
}
workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx");
// setting a null password shouldn't introduce the protection element
workbook.setWorkbookPassword(null, null);
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx")) {
// setting a null password shouldn't introduce the protection element
workbook.setWorkbookPassword(null, null);
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
// compare the hashes
workbook.setWorkbookPassword(password, null);
int hashVal = CryptoFunctions.createXorVerifier1(password);
int actualVal = Integer.parseInt(workbook.getCTWorkbook().getWorkbookProtection().xgetWorkbookPassword().getStringValue(),16);
assertEquals(hashVal, actualVal);
assertTrue(workbook.validateWorkbookPassword(password));
// removing the password again
workbook.setWorkbookPassword(null, null);
assertFalse(workbook.getCTWorkbook().getWorkbookProtection().isSetWorkbookPassword());
// removing the whole protection structure
workbook.unLock();
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
// setting a null password shouldn't introduce the protection element
workbook.setRevisionsPassword(null, null);
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
// compare the hashes
workbook.setWorkbookPassword(password, null);
int hashVal = CryptoFunctions.createXorVerifier1(password);
int actualVal = Integer.parseInt(workbook.getCTWorkbook().getWorkbookProtection().xgetWorkbookPassword().getStringValue(), 16);
assertEquals(hashVal, actualVal);
assertTrue(workbook.validateWorkbookPassword(password));
// compare the hashes
password = "T\u0400ST\u0100passwordWhichIsLongerThan15Chars";
workbook.setRevisionsPassword(password, null);
hashVal = CryptoFunctions.createXorVerifier1(password);
actualVal = Integer.parseInt(workbook.getCTWorkbook().getWorkbookProtection().xgetRevisionsPassword().getStringValue(),16);
assertEquals(hashVal, actualVal);
assertTrue(workbook.validateRevisionsPassword(password));
// removing the password again
workbook.setWorkbookPassword(null, null);
assertFalse(workbook.getCTWorkbook().getWorkbookProtection().isSetWorkbookPassword());
// removing the whole protection structure
workbook.unLock();
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
// setting a null password shouldn't introduce the protection element
workbook.setRevisionsPassword(null, null);
assertNull(workbook.getCTWorkbook().getWorkbookProtection());
// compare the hashes
password = "T\u0400ST\u0100passwordWhichIsLongerThan15Chars";
workbook.setRevisionsPassword(password, null);
hashVal = CryptoFunctions.createXorVerifier1(password);
actualVal = Integer.parseInt(workbook.getCTWorkbook().getWorkbookProtection().xgetRevisionsPassword().getStringValue(), 16);
assertEquals(hashVal, actualVal);
assertTrue(workbook.validateRevisionsPassword(password));
}
}
@Test
public void shouldReadWorkbookProtection() throws Exception {
XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx");
assertFalse(workbook.isStructureLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isRevisionLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx")) {
assertFalse(workbook.isStructureLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isRevisionLocked());
}
workbook = openSampleWorkbook("workbookProtection_workbook_structure_protected.xlsx");
assertTrue(workbook.isStructureLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isRevisionLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_workbook_structure_protected.xlsx")) {
assertTrue(workbook.isStructureLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isRevisionLocked());
}
workbook = openSampleWorkbook("workbookProtection_workbook_windows_protected.xlsx");
assertTrue(workbook.isWindowsLocked());
assertFalse(workbook.isStructureLocked());
assertFalse(workbook.isRevisionLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_workbook_windows_protected.xlsx")) {
assertTrue(workbook.isWindowsLocked());
assertFalse(workbook.isStructureLocked());
assertFalse(workbook.isRevisionLocked());
}
workbook = openSampleWorkbook("workbookProtection_workbook_revision_protected.xlsx");
assertTrue(workbook.isRevisionLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isStructureLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_workbook_revision_protected.xlsx")) {
assertTrue(workbook.isRevisionLocked());
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isStructureLocked());
}
}
@Test
public void shouldWriteStructureLock() throws Exception {
XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx");
assertFalse(workbook.isStructureLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx")) {
assertFalse(workbook.isStructureLocked());
workbook.lockStructure();
workbook.lockStructure();
assertTrue(workbook.isStructureLocked());
assertTrue(workbook.isStructureLocked());
workbook.unLockStructure();
workbook.unLockStructure();
assertFalse(workbook.isStructureLocked());
assertFalse(workbook.isStructureLocked());
}
}
@Test
public void shouldWriteWindowsLock() throws Exception {
XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx");
assertFalse(workbook.isWindowsLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx")) {
assertFalse(workbook.isWindowsLocked());
workbook.lockWindows();
workbook.lockWindows();
assertTrue(workbook.isWindowsLocked());
assertTrue(workbook.isWindowsLocked());
workbook.unLockWindows();
workbook.unLockWindows();
assertFalse(workbook.isWindowsLocked());
assertFalse(workbook.isWindowsLocked());
}
}
@Test
public void shouldWriteRevisionLock() throws Exception {
XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx");
assertFalse(workbook.isRevisionLocked());
try (XSSFWorkbook workbook = openSampleWorkbook("workbookProtection_not_protected.xlsx")) {
assertFalse(workbook.isRevisionLocked());
workbook.lockRevision();
workbook.lockRevision();
assertTrue(workbook.isRevisionLocked());
assertTrue(workbook.isRevisionLocked());
workbook.unLockRevision();
workbook.unLockRevision();
assertFalse(workbook.isRevisionLocked());
assertFalse(workbook.isRevisionLocked());
}
}
@SuppressWarnings("resource")
@Test
public void testHashPassword() throws Exception {
XSSFWorkbook wb = new XSSFWorkbook();
wb.lockRevision();
wb.setRevisionsPassword("test", HashAlgorithm.sha1);
wb = writeOutAndReadBack(wb);
assertTrue(wb.isRevisionLocked());
assertTrue(wb.validateRevisionsPassword("test"));
try (XSSFWorkbook wb = new XSSFWorkbook()) {
wb.lockRevision();
wb.setRevisionsPassword("test", HashAlgorithm.sha1);
try (XSSFWorkbook wbBack = writeOutAndReadBack(wb)) {
assertTrue(wbBack.isRevisionLocked());
assertTrue(wbBack.validateRevisionsPassword("test"));
}
}
}
@SuppressWarnings("resource")
@Test
public void testIntegration() throws Exception {
XSSFWorkbook wb = new XSSFWorkbook();
wb.createSheet("Testing purpose sheet");
assertFalse(wb.isRevisionLocked());
try (XSSFWorkbook wb = new XSSFWorkbook()) {
wb.createSheet("Testing purpose sheet");
assertFalse(wb.isRevisionLocked());
wb.lockRevision();
wb.setRevisionsPassword("test", null);
wb.lockRevision();
wb.setRevisionsPassword("test", null);
wb = writeOutAndReadBack(wb);
assertTrue(wb.isRevisionLocked());
assertTrue(wb.validateRevisionsPassword("test"));
try (XSSFWorkbook wbBack = writeOutAndReadBack(wb)) {
assertTrue(wbBack.isRevisionLocked());
assertTrue(wbBack.validateRevisionsPassword("test"));
}
}
}
@Test
@ -194,43 +205,43 @@ public class TestWorkbookProtection {
final String password = "abc123";
final String sheetName = "TestSheet1";
final String cellValue = "customZipEntrySource";
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet1 = workbook.createSheet(sheetName);
XSSFRow row1 = sheet1.createRow(1);
XSSFCell cell1 = row1.createCell(1);
cell1.setCellValue(cellValue);
File tf1 = TempFile.createTempFile("poitest", ".xlsx");
FileOutputStream fos1 = new FileOutputStream(tf1);
workbook.write(fos1);
IOUtils.closeQuietly(fos1);
POIFSFileSystem poiFileSystem = new POIFSFileSystem();
EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor enc = encryptionInfo.getEncryptor();
enc.confirmPassword(password);
FileInputStream fis = new FileInputStream(tf1);
OPCPackage opc = OPCPackage.open(fis);
IOUtils.closeQuietly(fis);
try {
OutputStream os = enc.getDataStream(poiFileSystem);
opc.save(os);
IOUtils.closeQuietly(os);
} finally {
IOUtils.closeQuietly(opc);
try (XSSFWorkbook workbook = new XSSFWorkbook()) {
XSSFSheet sheet1 = workbook.createSheet(sheetName);
XSSFRow row1 = sheet1.createRow(1);
XSSFCell cell1 = row1.createCell(1);
cell1.setCellValue(cellValue);
File tf1 = TempFile.createTempFile("poitest", ".xlsx");
FileOutputStream fos1 = new FileOutputStream(tf1);
workbook.write(fos1);
IOUtils.closeQuietly(fos1);
POIFSFileSystem poiFileSystem = new POIFSFileSystem();
EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor enc = encryptionInfo.getEncryptor();
enc.confirmPassword(password);
FileInputStream fis = new FileInputStream(tf1);
OPCPackage opc = OPCPackage.open(fis);
IOUtils.closeQuietly(fis);
try {
OutputStream os = enc.getDataStream(poiFileSystem);
opc.save(os);
IOUtils.closeQuietly(os);
} finally {
IOUtils.closeQuietly(opc);
}
assertTrue(tf1.delete());
FileOutputStream fos2 = new FileOutputStream(tf1);
poiFileSystem.writeFilesystem(fos2);
IOUtils.closeQuietly(fos2);
workbook.close();
fis = new FileInputStream(tf1);
POIFSFileSystem poiFileSystem2 = new POIFSFileSystem(fis);
IOUtils.closeQuietly(fis);
EncryptionInfo encryptionInfo2 = new EncryptionInfo(poiFileSystem2);
Decryptor decryptor = encryptionInfo2.getDecryptor();
decryptor.verifyPassword(password);
XSSFWorkbook workbook2 = new XSSFWorkbook(decryptor.getDataStream(poiFileSystem2));
workbook2.close();
assertTrue(tf1.delete());
}
tf1.delete();
FileOutputStream fos2 = new FileOutputStream(tf1);
poiFileSystem.writeFilesystem(fos2);
IOUtils.closeQuietly(fos2);
workbook.close();
fis = new FileInputStream(tf1);
POIFSFileSystem poiFileSystem2 = new POIFSFileSystem(fis);
IOUtils.closeQuietly(fis);
EncryptionInfo encryptionInfo2 = new EncryptionInfo(poiFileSystem2);
Decryptor decryptor = encryptionInfo2.getDecryptor();
decryptor.verifyPassword(password);
XSSFWorkbook workbook2 = new XSSFWorkbook(decryptor.getDataStream(poiFileSystem2));
workbook2.close();
tf1.delete();
}
}

View File

@ -28,29 +28,24 @@ import org.apache.poi.openxml4j.opc.PackagePart;
import org.junit.Test;
public class TestXSSFBSharedStringsTable {
private static POIDataSamples _ssTests = POIDataSamples.getSpreadSheetInstance();
@Test
public void testBasic() throws Exception {
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("51519.xlsb"))) {
List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.bin"));
assertEquals(1, parts.size());
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("51519.xlsb"));
List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.bin"));
assertEquals(1, parts.size());
XSSFBSharedStringsTable rtbl = new XSSFBSharedStringsTable(parts.get(0));
List<String> strings = rtbl.getItems();
assertEquals(49, strings.size());
XSSFBSharedStringsTable rtbl = new XSSFBSharedStringsTable(parts.get(0));
List<String> strings = rtbl.getItems();
assertEquals(49, strings.size());
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB", rtbl.getEntryAt(3));
assertEquals(55, rtbl.getCount());
assertEquals(49, rtbl.getUniqueCount());
//TODO: add in tests for phonetic runs
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB", rtbl.getEntryAt(3));
assertEquals(55, rtbl.getCount());
assertEquals(49, rtbl.getUniqueCount());
//TODO: add in tests for phonetic runs
}
}
}

View File

@ -30,25 +30,21 @@ import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.junit.Test;
public class TestXSSFBSheetHyperlinkManager {
private static POIDataSamples _ssTests = POIDataSamples.getSpreadSheetInstance();
@Test
public void testBasic() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("hyperlink.xlsb"));
XSSFBReader reader = new XSSFBReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) reader.getSheetsData();
it.next();
XSSFBHyperlinksTable manager = new XSSFBHyperlinksTable(it.getSheetPart());
List<XSSFHyperlinkRecord> records = manager.getHyperLinks().get(new CellAddress(0, 0));
assertNotNull(records);
assertEquals(1, records.size());
XSSFHyperlinkRecord record = records.get(0);
assertEquals("http://tika.apache.org/", record.getLocation());
assertEquals("rId2", record.getRelId());
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("hyperlink.xlsb"))) {
XSSFBReader reader = new XSSFBReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) reader.getSheetsData();
it.next();
XSSFBHyperlinksTable manager = new XSSFBHyperlinksTable(it.getSheetPart());
List<XSSFHyperlinkRecord> records = manager.getHyperLinks().get(new CellAddress(0, 0));
assertNotNull(records);
assertEquals(1, records.size());
XSSFHyperlinkRecord record = records.get(0);
assertEquals("http://tika.apache.org/", record.getLocation());
assertEquals("rId2", record.getRelId());
}
}
}

View File

@ -39,47 +39,47 @@ public final class TestReadOnlySharedStringsTable extends TestCase {
private static POIDataSamples _ssTests = POIDataSamples.getSpreadSheetInstance();
public void testParse() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml"));
assertEquals(1, parts.size());
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"))) {
List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml"));
assertEquals(1, parts.size());
SharedStringsTable stbl = new SharedStringsTable(parts.get(0));
ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0));
SharedStringsTable stbl = new SharedStringsTable(parts.get(0));
ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0));
assertEquals(stbl.getCount(), rtbl.getCount());
assertEquals(stbl.getUniqueCount(), rtbl.getUniqueCount());
assertEquals(stbl.getCount(), rtbl.getCount());
assertEquals(stbl.getUniqueCount(), rtbl.getUniqueCount());
assertEquals(stbl.getItems().size(), stbl.getUniqueCount());
assertEquals(rtbl.getItems().size(), rtbl.getUniqueCount());
for(int i=0; i < stbl.getUniqueCount(); i++){
CTRst i1 = stbl.getEntryAt(i);
String i2 = rtbl.getEntryAt(i);
assertEquals(i1.getT(), i2);
assertEquals(stbl.getItems().size(), stbl.getUniqueCount());
assertEquals(rtbl.getItems().size(), rtbl.getUniqueCount());
for (int i = 0; i < stbl.getUniqueCount(); i++) {
CTRst i1 = stbl.getEntryAt(i);
String i2 = rtbl.getEntryAt(i);
assertEquals(i1.getT(), i2);
}
}
}
//51519
public void testPhoneticRuns() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("51519.xlsx"));
List<PackagePart> parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml"));
assertEquals(1, parts.size());
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("51519.xlsx"))) {
List < PackagePart > parts = pkg.getPartsByName(Pattern.compile("/xl/sharedStrings.xml"));
assertEquals(1, parts.size());
ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0), true);
List<String> strings = rtbl.getItems();
assertEquals(49, strings.size());
ReadOnlySharedStringsTable rtbl = new ReadOnlySharedStringsTable(parts.get(0), true);
List<String> strings = rtbl.getItems();
assertEquals(49, strings.size());
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB \u30CB\u30DB\u30F3", rtbl.getEntryAt(3));
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB \u30CB\u30DB\u30F3", rtbl.getEntryAt(3));
//now do not include phonetic runs
rtbl = new ReadOnlySharedStringsTable(parts.get(0), false);
strings = rtbl.getItems();
assertEquals(49, strings.size());
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB", rtbl.getEntryAt(3));
//now do not include phonetic runs
rtbl =new ReadOnlySharedStringsTable(parts.get(0),false);
strings = rtbl.getItems();
assertEquals(49, strings.size());
assertEquals("\u30B3\u30E1\u30F3\u30C8", rtbl.getEntryAt(0));
assertEquals("\u65E5\u672C\u30AA\u30E9\u30AF\u30EB", rtbl.getEntryAt(3));
}
}
public void testEmptySSTOnPackageObtainedViaWorkbook() throws Exception {
@ -90,8 +90,9 @@ public final class TestReadOnlySharedStringsTable extends TestCase {
}
public void testEmptySSTOnPackageDirect() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("noSharedStringTable.xlsx"));
assertEmptySST(pkg);
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("noSharedStringTable.xlsx"))) {
assertEmptySST(pkg);
}
}
private void assertEmptySST(OPCPackage pkg) throws IOException, SAXException {
@ -100,5 +101,4 @@ public final class TestReadOnlySharedStringsTable extends TestCase {
assertEquals(0, sst.getUniqueCount());
assertNull(sst.getItems()); // same state it's left in if fed a package which has no SST part.
}
}

View File

@ -120,40 +120,41 @@ public class TestXSSFBReader {
@Test
public void testAbsPath() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("testVarious.xlsb"));
XSSFBReader r = new XSSFBReader(pkg);
assertEquals("C:\\Users\\tallison\\Desktop\\working\\xlsb\\", r.getAbsPathMetadata());
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("testVarious.xlsb"))) {
XSSFBReader r = new XSSFBReader(pkg);
assertEquals("C:\\Users\\tallison\\Desktop\\working\\xlsb\\", r.getAbsPathMetadata());
}
}
private List<String> getSheets(String testFileName) throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream(testFileName));
List<String> sheetTexts = new ArrayList<>();
XSSFBReader r = new XSSFBReader(pkg);
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream(testFileName))) {
List<String> sheetTexts = new ArrayList<>();
XSSFBReader r = new XSSFBReader(pkg);
// assertNotNull(r.getWorkbookData());
// assertNotNull(r.getSharedStringsData());
assertNotNull(r.getXSSFBStylesTable());
XSSFBSharedStringsTable sst = new XSSFBSharedStringsTable(pkg);
XSSFBStylesTable xssfbStylesTable = r.getXSSFBStylesTable();
XSSFBReader.SheetIterator it = (XSSFBReader.SheetIterator) r.getSheetsData();
// assertNotNull(r.getSharedStringsData());
assertNotNull(r.getXSSFBStylesTable());
XSSFBSharedStringsTable sst = new XSSFBSharedStringsTable(pkg);
XSSFBStylesTable xssfbStylesTable = r.getXSSFBStylesTable();
XSSFBReader.SheetIterator it = (XSSFBReader.SheetIterator) r.getSheetsData();
while (it.hasNext()) {
InputStream is = it.next();
String name = it.getSheetName();
TestSheetHandler testSheetHandler = new TestSheetHandler();
testSheetHandler.startSheet(name);
XSSFBSheetHandler sheetHandler = new XSSFBSheetHandler(is,
xssfbStylesTable,
it.getXSSFBSheetComments(),
sst, testSheetHandler,
new DataFormatter(),
false);
sheetHandler.parse();
testSheetHandler.endSheet();
sheetTexts.add(testSheetHandler.toString());
while (it.hasNext()) {
InputStream is = it.next();
String name = it.getSheetName();
TestSheetHandler testSheetHandler = new TestSheetHandler();
testSheetHandler.startSheet(name);
XSSFBSheetHandler sheetHandler = new XSSFBSheetHandler(is,
xssfbStylesTable,
it.getXSSFBSheetComments(),
sst, testSheetHandler,
new DataFormatter(),
false);
sheetHandler.parse();
testSheetHandler.endSheet();
sheetTexts.add(testSheetHandler.toString());
}
return sheetTexts;
}
return sheetTexts;
}
@Test

View File

@ -51,72 +51,76 @@ public final class TestXSSFReader {
@Test
public void testGetBits() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"))) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader r = new XSSFReader(pkg);
assertNotNull(r.getWorkbookData());
assertNotNull(r.getSharedStringsData());
assertNotNull(r.getStylesData());
assertNotNull(r.getWorkbookData());
assertNotNull(r.getSharedStringsData());
assertNotNull(r.getStylesData());
assertNotNull(r.getSharedStringsTable());
assertNotNull(r.getStylesTable());
assertNotNull(r.getSharedStringsTable());
assertNotNull(r.getStylesTable());
}
}
@Test
public void testStyles() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"))) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader r = new XSSFReader(pkg);
assertEquals(3, r.getStylesTable().getFonts().size());
assertEquals(0, r.getStylesTable().getNumDataFormats());
// The Styles Table should have the themes associated with it too
assertNotNull(r.getStylesTable().getTheme());
// Check we get valid data for the two
assertNotNull(r.getStylesData());
assertNotNull(r.getThemesData());
assertEquals(3, r.getStylesTable().getFonts().size());
assertEquals(0, r.getStylesTable().getNumDataFormats());
// The Styles Table should have the themes associated with it too
assertNotNull(r.getStylesTable().getTheme());
// Check we get valid data for the two
assertNotNull(r.getStylesData());
assertNotNull(r.getThemesData());
}
}
@Test
public void testStrings() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"))) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader r = new XSSFReader(pkg);
assertEquals(11, r.getSharedStringsTable().getItems().size());
assertEquals("Test spreadsheet", new XSSFRichTextString(r.getSharedStringsTable().getEntryAt(0)).toString());
assertEquals(11, r.getSharedStringsTable().getItems().size());
assertEquals("Test spreadsheet", new XSSFRichTextString(r.getSharedStringsTable().getEntryAt(0)).toString());
}
}
@Test
public void testSheets() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"));
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("SampleSS.xlsx"))) {
XSSFReader r = new XSSFReader(pkg);
byte[] data = new byte[4096];
XSSFReader r = new XSSFReader(pkg);
byte[] data = new byte[4096];
// By r:id
assertNotNull(r.getSheet("rId2"));
int read = IOUtils.readFully(r.getSheet("rId2"), data);
assertEquals(974, read);
// By r:id
assertNotNull(r.getSheet("rId2"));
int read = IOUtils.readFully(r.getSheet("rId2"), data);
assertEquals(974, read);
// All
Iterator<InputStream> it = r.getSheetsData();
// All
Iterator<InputStream> it = r.getSheetsData();
int count = 0;
while(it.hasNext()) {
count++;
InputStream inp = it.next();
assertNotNull(inp);
read = IOUtils.readFully(inp, data);
inp.close();
int count = 0;
while (it.hasNext()) {
count++;
InputStream inp = it.next();
assertNotNull(inp);
read = IOUtils.readFully(inp, data);
inp.close();
assertTrue(read > 400);
assertTrue(read < 1500);
}
assertEquals(3, count);
assertTrue(read > 400);
assertTrue(read < 1500);
}
assertEquals(3, count);
}
}
/**
@ -125,82 +129,82 @@ public final class TestXSSFReader {
*/
@Test
public void testOrderOfSheets() throws Exception {
OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("reordered_sheets.xlsx"));
try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("reordered_sheets.xlsx"))) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader r = new XSSFReader(pkg);
String[] sheetNames = {"Sheet4", "Sheet2", "Sheet3", "Sheet1"};
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator)r.getSheetsData();
String[] sheetNames = {"Sheet4", "Sheet2", "Sheet3", "Sheet1"};
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
int count = 0;
while(it.hasNext()) {
InputStream inp = it.next();
assertNotNull(inp);
inp.close();
int count = 0;
while (it.hasNext()) {
InputStream inp = it.next();
assertNotNull(inp);
inp.close();
assertEquals(sheetNames[count], it.getSheetName());
count++;
}
assertEquals(4, count);
assertEquals(sheetNames[count], it.getSheetName());
count++;
}
assertEquals(4, count);
}
}
@Test
public void testComments() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("comments.xlsx");
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator)r.getSheetsData();
int count = 0;
while(it.hasNext()) {
count++;
InputStream inp = it.next();
inp.close();
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("comments.xlsx")) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
if(count == 1) {
assertNotNull(it.getSheetComments());
CommentsTable ct = it.getSheetComments();
assertEquals(1, ct.getNumberOfAuthors());
assertEquals(3, ct.getNumberOfComments());
} else {
assertNull(it.getSheetComments());
}
int count = 0;
while (it.hasNext()) {
count++;
InputStream inp = it.next();
inp.close();
if (count == 1) {
assertNotNull(it.getSheetComments());
CommentsTable ct = it.getSheetComments();
assertEquals(1, ct.getNumberOfAuthors());
assertEquals(3, ct.getNumberOfComments());
} else {
assertNull(it.getSheetComments());
}
}
assertEquals(3, count);
}
assertEquals(3, count);
}
/**
* Iterating over a workbook with chart sheets in it, using the
* XSSFReader method
* @throws Exception
*/
@Test
public void test50119() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithChartSheet.xlsx");
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator)r.getSheetsData();
while(it.hasNext())
{
InputStream stream = it.next();
stream.close();
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithChartSheet.xlsx")) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
while (it.hasNext()) {
InputStream stream = it.next();
stream.close();
}
}
}
/**
* Test text extraction from text box using getShapes()
*
* @throws Exception
*/
@Test
public void testShapes() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx");
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx")) {
XSSFReader r = new XSSFReader(pkg);
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
String text = getShapesString(it);
assertContains(text, "Line 1");
assertContains(text, "Line 2");
assertContains(text, "Line 3");
String text = getShapesString(it);
assertContains(text, "Line 1");
assertContains(text, "Line 2");
assertContains(text, "Line 3");
}
}
private String getShapesString(XSSFReader.SheetIterator it) {
@ -222,25 +226,26 @@ public final class TestXSSFReader {
@Test
public void testBug57914() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("57914.xlsx");
final XSSFReader r;
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("57914.xlsx")) {
final XSSFReader r;
// for now expect this to fail, when we fix 57699, this one should fail so we know we should adjust
// this test as well
try {
r = new XSSFReader(pkg);
fail("This will fail until bug 57699 is fixed");
} catch (POIXMLException e) {
assertContains(e.getMessage(), "57699");
return;
// for now expect this to fail, when we fix 57699, this one should fail so we know we should adjust
// this test as well
try {
r = new XSSFReader(pkg);
fail("This will fail until bug 57699 is fixed");
} catch (POIXMLException e) {
assertContains(e.getMessage(), "57699");
return;
}
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
String text = getShapesString(it);
assertContains(text, "Line 1");
assertContains(text, "Line 2");
assertContains(text, "Line 3");
}
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
String text = getShapesString(it);
assertContains(text, "Line 1");
assertContains(text, "Line 2");
assertContains(text, "Line 3");
}
/**
@ -249,21 +254,20 @@ public final class TestXSSFReader {
*/
@Test
public void test58747() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("58747.xlsx");
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
assertNotNull(strings);
XSSFReader reader = new XSSFReader(pkg);
StylesTable styles = reader.getStylesTable();
assertNotNull(styles);
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("58747.xlsx")) {
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
assertNotNull(strings);
XSSFReader reader = new XSSFReader(pkg);
StylesTable styles = reader.getStylesTable();
assertNotNull(styles);
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
assertEquals(true, iter.hasNext());
iter.next();
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
assertTrue(iter.hasNext());
iter.next();
assertEquals(false, iter.hasNext());
assertEquals("Orders", iter.getSheetName());
pkg.close();
assertFalse(iter.hasNext());
assertEquals("Orders", iter.getSheetName());
}
}
/**
@ -272,18 +276,17 @@ public final class TestXSSFReader {
*/
@Test
public void testSheetWithNoRelationshipId() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("60825.xlsx");
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
assertNotNull(strings);
XSSFReader reader = new XSSFReader(pkg);
StylesTable styles = reader.getStylesTable();
assertNotNull(styles);
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("60825.xlsx")) {
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
assertNotNull(strings);
XSSFReader reader = new XSSFReader(pkg);
StylesTable styles = reader.getStylesTable();
assertNotNull(styles);
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
assertNotNull(iter.next());
assertFalse(iter.hasNext());
pkg.close();
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
assertNotNull(iter.next());
assertFalse(iter.hasNext());
}
}
/**
@ -300,18 +303,18 @@ public final class TestXSSFReader {
*/
@Test
public void test61034() throws Exception {
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("61034.xlsx");
XSSFReader reader = new XSSFReader(pkg);
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
Set<String> seen = new HashSet<>();
while (iter.hasNext()) {
InputStream stream = iter.next();
String sheetName = iter.getSheetName();
assertNotContained(seen, sheetName);
seen.add(sheetName);
stream.close();
try (OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("61034.xlsx")) {
XSSFReader reader = new XSSFReader(pkg);
XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData();
Set<String> seen = new HashSet<>();
while (iter.hasNext()) {
InputStream stream = iter.next();
String sheetName = iter.getSheetName();
assertNotContained(seen, sheetName);
seen.add(sheetName);
stream.close();
}
}
pkg.close();
}
@Test

View File

@ -17,8 +17,10 @@
package org.apache.poi.xwpf.usermodel;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@ -104,23 +106,23 @@ public class TestXWPFRun {
// True values: "true", "1", "on"
bold.setVal(STOnOff.TRUE);
assertEquals(true, run.isBold());
assertTrue(run.isBold());
bold.setVal(STOnOff.X_1);
assertEquals(true, run.isBold());
assertTrue(run.isBold());
bold.setVal(STOnOff.ON);
assertEquals(true, run.isBold());
assertTrue(run.isBold());
// False values: "false", "0", "off"
bold.setVal(STOnOff.FALSE);
assertEquals(false, run.isBold());
assertFalse(run.isBold());
bold.setVal(STOnOff.X_0);
assertEquals(false, run.isBold());
assertFalse(run.isBold());
bold.setVal(STOnOff.OFF);
assertEquals(false, run.isBold());
assertFalse(run.isBold());
}
@Test
@ -129,7 +131,7 @@ public class TestXWPFRun {
rpr.addNewB().setVal(STOnOff.TRUE);
XWPFRun run = new XWPFRun(ctRun, irb);
assertEquals(true, run.isBold());
assertTrue(run.isBold());
run.setBold(false);
// Implementation detail: POI natively prefers <w:b w:val="false"/>,
@ -143,7 +145,7 @@ public class TestXWPFRun {
rpr.addNewI().setVal(STOnOff.TRUE);
XWPFRun run = new XWPFRun(ctRun, irb);
assertEquals(true, run.isItalic());
assertTrue(run.isItalic());
run.setItalic(false);
assertEquals(STOnOff.FALSE, rpr.getI().getVal());
@ -155,7 +157,7 @@ public class TestXWPFRun {
rpr.addNewStrike().setVal(STOnOff.TRUE);
XWPFRun run = new XWPFRun(ctRun, irb);
assertEquals(true, run.isStrikeThrough());
assertTrue(run.isStrikeThrough());
run.setStrikeThrough(false);
assertEquals(STOnOff.FALSE, rpr.getStrike().getVal());
@ -297,17 +299,17 @@ public class TestXWPFRun {
run = p.getRuns().get(0);
assertEquals("This is a test document", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(1);
assertEquals(".", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
// Next paragraph is all in one style, but a different one
@ -317,11 +319,11 @@ public class TestXWPFRun {
run = p.getRuns().get(0);
assertEquals("This bit is in bold and italic", run.toString());
assertEquals(true, run.isBold());
assertEquals(true, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(true, run.getCTR().getRPr().isSetB());
assertEquals(false, run.getCTR().getRPr().getB().isSetVal());
assertTrue(run.isBold());
assertTrue(run.isItalic());
assertFalse(run.isStrikeThrough());
assertTrue(run.getCTR().getRPr().isSetB());
assertFalse(run.getCTR().getRPr().getB().isSetVal());
// Back to normal
@ -331,10 +333,10 @@ public class TestXWPFRun {
run = p.getRuns().get(0);
assertEquals("Back to normal", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
// Different styles in one paragraph
@ -344,75 +346,75 @@ public class TestXWPFRun {
run = p.getRuns().get(0);
assertEquals("This contains ", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(1);
assertEquals("BOLD", run.toString());
assertEquals(true, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertTrue(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
run = p.getRuns().get(2);
assertEquals(", ", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(3);
assertEquals("ITALIC", run.toString());
assertEquals(false, run.isBold());
assertEquals(true, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertFalse(run.isBold());
assertTrue(run.isItalic());
assertFalse(run.isStrikeThrough());
run = p.getRuns().get(4);
assertEquals(" and ", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(5);
assertEquals("BOTH", run.toString());
assertEquals(true, run.isBold());
assertEquals(true, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertTrue(run.isBold());
assertTrue(run.isItalic());
assertFalse(run.isStrikeThrough());
run = p.getRuns().get(6);
assertEquals(", as well as ", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(7);
assertEquals("RED", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
run = p.getRuns().get(8);
assertEquals(" and ", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
run = p.getRuns().get(9);
assertEquals("YELLOW", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
run = p.getRuns().get(10);
assertEquals(" text.", run.toString());
assertEquals(false, run.isBold());
assertEquals(false, run.isItalic());
assertEquals(false, run.isStrikeThrough());
assertEquals(null, run.getCTR().getRPr());
assertFalse(run.isBold());
assertFalse(run.isItalic());
assertFalse(run.isStrikeThrough());
assertNull(run.getCTR().getRPr());
doc.close();
}
@ -643,7 +645,7 @@ public class TestXWPFRun {
}
@Test
public void testSetters() throws IOException {
public void testSetters() {
XWPFDocument document = new XWPFDocument();
final XWPFRun run = document.createParagraph().createRun();
@ -679,12 +681,12 @@ public class TestXWPFRun {
XWPFDocument document = new XWPFDocument();
final XWPFRun run = document.createParagraph().createRun();
assertEquals(STHighlightColor.NONE, run.getTextHightlightColor());
assertEquals(false, run.isHighlighted());
assertFalse(run.isHighlighted());
run.setTextHighlightColor("darkGreen"); // See 17.18.40 ST_HighlightColor (Text Highlight Colors)
assertEquals(STHighlightColor.DARK_GREEN, run.getTextHightlightColor());
assertEquals(true, run.isHighlighted());
assertTrue(run.isHighlighted());
run.setTextHighlightColor("none");
assertEquals(false, run.isHighlighted());
assertFalse(run.isHighlighted());
document.close();
}
@ -693,11 +695,11 @@ public class TestXWPFRun {
public void testSetGetVanish() throws IOException {
XWPFDocument document = new XWPFDocument();
final XWPFRun run = document.createParagraph().createRun();
assertEquals(false, run.isVanish());
assertFalse(run.isVanish());
run.setVanish(true);
assertEquals(true, run.isVanish());
assertTrue(run.isVanish());
run.setVanish(false);
assertEquals(false, run.isVanish());
assertFalse(run.isVanish());
document.close();
}
@ -727,7 +729,6 @@ public class TestXWPFRun {
assertEquals(STVerticalAlignRun.BASELINE, rpr.getVertAlign().getVal());
}
@Test
public void testSetGetEmphasisMark() throws IOException {
XWPFDocument document = new XWPFDocument();
@ -780,7 +781,9 @@ public class TestXWPFRun {
run.setStyle(styleId);
String candStyleId = run.getCTR().getRPr().getRStyle().getVal();
assertNotNull("Expected to find a run style ID", candStyleId);
assertEquals(styleId, candStyleId);
assertEquals(styleId, candStyleId);
document.close();
}
}

View File

@ -77,19 +77,19 @@ public final class SlideShowDumper {
filename = args[1];
}
POIFSFileSystem poifs = new POIFSFileSystem(new File(filename));
SlideShowDumper foo = new SlideShowDumper(poifs, System.out);
poifs.close();
try (POIFSFileSystem poifs = new POIFSFileSystem(new File(filename))) {
SlideShowDumper foo = new SlideShowDumper(poifs, System.out);
if(args.length > 1) {
if(args[0].equalsIgnoreCase("-escher")) {
foo.setDDFEscher(true);
} else {
foo.setBasicEscher(true);
if(args.length > 1) {
if(args[0].equalsIgnoreCase("-escher")) {
foo.setDDFEscher(true);
} else {
foo.setBasicEscher(true);
}
}
}
foo.printDump();
foo.printDump();
}
}
/**

View File

@ -41,38 +41,36 @@ public final class TextStyleListing {
System.exit(1);
}
HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
try (HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0])) {
// Find the documents, and then their SLWT
Record[] records = ss.getRecords();
for (Record record : records) {
if (record.getRecordType() == 1000L) {
Record[] docChildren = record.getChildRecords();
for (Record docChild : docChildren) {
if (docChild instanceof SlideListWithText) {
Record[] slwtChildren = docChild.getChildRecords();
// Find the documents, and then their SLWT
Record[] records = ss.getRecords();
for (Record record : records) {
if (record.getRecordType() == 1000L) {
Record[] docChildren = record.getChildRecords();
for (Record docChild : docChildren) {
if (docChild instanceof SlideListWithText) {
Record[] slwtChildren = docChild.getChildRecords();
int lastTextLen = -1;
for (Record slwtChild : slwtChildren) {
if (slwtChild instanceof TextCharsAtom) {
lastTextLen = ((TextCharsAtom) slwtChild).getText().length();
}
if (slwtChild instanceof TextBytesAtom) {
lastTextLen = ((TextBytesAtom) slwtChild).getText().length();
}
int lastTextLen = -1;
for (Record slwtChild : slwtChildren) {
if (slwtChild instanceof TextCharsAtom) {
lastTextLen = ((TextCharsAtom) slwtChild).getText().length();
}
if (slwtChild instanceof TextBytesAtom) {
lastTextLen = ((TextBytesAtom) slwtChild).getText().length();
}
if (slwtChild instanceof StyleTextPropAtom) {
StyleTextPropAtom stpa = (StyleTextPropAtom) slwtChild;
stpa.setParentTextSize(lastTextLen);
showStyleTextPropAtom(stpa);
if (slwtChild instanceof StyleTextPropAtom) {
StyleTextPropAtom stpa = (StyleTextPropAtom) slwtChild;
stpa.setParentTextSize(lastTextLen);
showStyleTextPropAtom(stpa);
}
}
}
}
}
}
}
ss.close();
}
public static void showStyleTextPropAtom(StyleTextPropAtom stpa) {

View File

@ -43,79 +43,77 @@ public final class UserEditAndPersistListing {
System.exit(1);
}
// Create the slideshow object, for normal working with
HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
fileContents = ss.getUnderlyingBytes();
System.out.println();
try (HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0])) {
fileContents = ss.getUnderlyingBytes();
System.out.println();
// Find any persist ones first
int pos = 0;
for(Record r : ss.getRecords()) {
if(r.getRecordType() == 6001l) {
// PersistPtrFullBlock
System.out.println("Found PersistPtrFullBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
}
if(r.getRecordType() == 6002l) {
// PersistPtrIncrementalBlock
System.out.println("Found PersistPtrIncrementalBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
PersistPtrHolder pph = (PersistPtrHolder)r;
// Find any persist ones first
int pos = 0;
for (Record r : ss.getRecords()) {
if (r.getRecordType() == 6001L) {
// PersistPtrFullBlock
System.out.println("Found PersistPtrFullBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
}
if (r.getRecordType() == 6002L) {
// PersistPtrIncrementalBlock
System.out.println("Found PersistPtrIncrementalBlock at " + pos + " (" + Integer.toHexString(pos) + ")");
PersistPtrHolder pph = (PersistPtrHolder) r;
// Check the sheet offsets
Map<Integer,Integer> sheetOffsets = pph.getSlideLocationsLookup();
for(int id : pph.getKnownSlideIDs()) {
Integer offset = sheetOffsets.get(id);
// Check the sheet offsets
Map<Integer, Integer> sheetOffsets = pph.getSlideLocationsLookup();
for (int id : pph.getKnownSlideIDs()) {
Integer offset = sheetOffsets.get(id);
System.out.println(" Knows about sheet " + id);
System.out.println(" That sheet lives at " + offset);
System.out.println(" Knows about sheet " + id);
System.out.println(" That sheet lives at " + offset);
Record atPos = findRecordAtPos(offset.intValue());
System.out.println(" The record at that pos is of type " + atPos.getRecordType());
System.out.println(" The record at that pos has class " + atPos.getClass().getName());
Record atPos = findRecordAtPos(offset.intValue());
System.out.println(" The record at that pos is of type " + atPos.getRecordType());
System.out.println(" The record at that pos has class " + atPos.getClass().getName());
if(! (atPos instanceof PositionDependentRecord)) {
System.out.println(" ** The record class isn't position aware! **");
if (!(atPos instanceof PositionDependentRecord)) {
System.out.println(" ** The record class isn't position aware! **");
}
}
}
// Increase the position by the on disk size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
r.writeOut(baos);
pos += baos.size();
}
// Increase the position by the on disk size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
r.writeOut(baos);
pos += baos.size();
}
System.out.println();
System.out.println();
pos = 0;
// Now look for UserEditAtoms
for (Record r : ss.getRecords()) {
if (r instanceof UserEditAtom) {
UserEditAtom uea = (UserEditAtom) r;
System.out.println("Found UserEditAtom at " + pos + " (" + Integer.toHexString(pos) + ")");
System.out.println(" lastUserEditAtomOffset = " + uea.getLastUserEditAtomOffset());
System.out.println(" persistPointersOffset = " + uea.getPersistPointersOffset());
System.out.println(" docPersistRef = " + uea.getDocPersistRef());
System.out.println(" maxPersistWritten = " + uea.getMaxPersistWritten());
}
pos = 0;
// Now look for UserEditAtoms
for(Record r : ss.getRecords()) {
if(r instanceof UserEditAtom) {
UserEditAtom uea = (UserEditAtom)r;
System.out.println("Found UserEditAtom at " + pos + " (" + Integer.toHexString(pos) + ")");
System.out.println(" lastUserEditAtomOffset = " + uea.getLastUserEditAtomOffset() );
System.out.println(" persistPointersOffset = " + uea.getPersistPointersOffset() );
System.out.println(" docPersistRef = " + uea.getDocPersistRef() );
System.out.println(" maxPersistWritten = " + uea.getMaxPersistWritten() );
// Increase the position by the on disk size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
r.writeOut(baos);
pos += baos.size();
}
// Increase the position by the on disk size
ByteArrayOutputStream baos = new ByteArrayOutputStream();
r.writeOut(baos);
pos += baos.size();
System.out.println();
// Query the CurrentUserAtom
CurrentUserAtom cua = ss.getCurrentUserAtom();
System.out.println("Checking Current User Atom");
System.out.println(" Thinks the CurrentEditOffset is " + cua.getCurrentEditOffset());
System.out.println();
}
System.out.println();
// Query the CurrentUserAtom
CurrentUserAtom cua = ss.getCurrentUserAtom();
System.out.println("Checking Current User Atom");
System.out.println(" Thinks the CurrentEditOffset is " + cua.getCurrentEditOffset());
System.out.println();
ss.close();
}

View File

@ -66,13 +66,14 @@ import org.apache.poi.util.POILogger;
* "reader". It is only a very basic class for now
*/
public final class HSLFSlideShowImpl extends POIDocument implements Closeable {
private static final POILogger logger = POILogFactory.getLogger(HSLFSlideShowImpl.class);
static final int UNSET_OFFSET = -1;
//arbitrarily selected; may need to increase
private static final int MAX_RECORD_LENGTH = 200_000_000;
// For logging
private POILogger logger = POILogFactory.getLogger(this.getClass());
private static final String DUAL_STORAGE_NAME = "PP97_DUALSTORAGE";
// Holds metadata on where things are in our document
private CurrentUserAtom currentUser;
@ -136,29 +137,35 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable {
public HSLFSlideShowImpl(DirectoryNode dir) throws IOException {
super(handleDualStorage(dir));
// First up, grab the "Current User" stream
// We need this before we can detect Encrypted Documents
readCurrentUserStream();
try {
// First up, grab the "Current User" stream
// We need this before we can detect Encrypted Documents
readCurrentUserStream();
// Next up, grab the data that makes up the
// PowerPoint stream
readPowerPointStream();
// Next up, grab the data that makes up the
// PowerPoint stream
readPowerPointStream();
// Now, build records based on the PowerPoint stream
buildRecords();
// Now, build records based on the PowerPoint stream
buildRecords();
// Look for any other streams
readOtherStreams();
// Look for any other streams
readOtherStreams();
} catch (RuntimeException | IOException e) {
// clean up the filesystem when we cannot read it here to avoid
// leaking file handles
dir.getFileSystem().close();
throw e;
}
}
private static DirectoryNode handleDualStorage(DirectoryNode dir) throws IOException {
// when there's a dual storage entry, use it, as the outer document can't be read quite probably ...
String dualName = "PP97_DUALSTORAGE";
if (!dir.hasEntry(dualName)) {
if (!dir.hasEntry(DUAL_STORAGE_NAME)) {
return dir;
}
dir = (DirectoryNode) dir.getEntry(dualName);
return dir;
return (DirectoryNode) dir.getEntry(DUAL_STORAGE_NAME);
}
/**
@ -834,7 +841,8 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable {
public void close() throws IOException {
// only close the filesystem, if we are based on the root node.
// embedded documents/slideshows shouldn't close the parent container
if (getDirectory().getParent() == null) {
if (getDirectory().getParent() == null ||
getDirectory().getName().equals(DUAL_STORAGE_NAME)) {
POIFSFileSystem fs = getDirectory().getFileSystem();
if (fs != null) {
fs.close();

View File

@ -96,7 +96,7 @@ public class CellFormatTestBase {
}
}
protected void runFormatTests(String workbookName, CellValue valueGetter) {
protected void runFormatTests(String workbookName, CellValue valueGetter) throws IOException {
openWorkbook(workbookName);
@ -127,6 +127,8 @@ public class CellFormatTestBase {
tryFormat(row.getRowNum(), expectedText, format, valueGetter, value);
}
}
workbook.close();
}
/**