From 04ae3247eb9cbf426bb550d89f129dc71958725d Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Sat, 21 Feb 2015 11:58:45 +0000
Subject: [PATCH 001/301] Revert organize imports
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661327 13f79535-47bb-0310-9956-ffa450edef68
---
.../org/apache/poi/xssf/usermodel/TestXSSFBugs.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
index e2f03058d..0f8549562 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
@@ -17,7 +17,13 @@
package org.apache.poi.xssf.usermodel;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+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 static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
From 4023b1eae0897cd67226021e838ced8ee32f9358 Mon Sep 17 00:00:00 2001
From: Andreas Beeker
Date: Sat, 21 Feb 2015 12:16:37 +0000
Subject: [PATCH 002/301] Updated POI copyright to 2015
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661336 13f79535-47bb-0310-9956-ffa450edef68
---
legal/NOTICE | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/legal/NOTICE b/legal/NOTICE
index e5aa5f5a7..be2eae70d 100644
--- a/legal/NOTICE
+++ b/legal/NOTICE
@@ -1,5 +1,5 @@
Apache POI
-Copyright 2003-2014 The Apache Software Foundation
+Copyright 2003-2015 The Apache Software Foundation
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
From e282d7f997de95e5610a7b9979651e60b5aba0ac Mon Sep 17 00:00:00 2001
From: Andreas Beeker
Date: Sat, 21 Feb 2015 12:36:17 +0000
Subject: [PATCH 003/301] pin documentation
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661343 13f79535-47bb-0310-9956-ffa450edef68
From 90b4cb52487637323c5831de91de7b2337d4dab2 Mon Sep 17 00:00:00 2001
From: Andreas Beeker
Date: Sat, 21 Feb 2015 12:49:38 +0000
Subject: [PATCH 004/301] unpin documentation
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661348 13f79535-47bb-0310-9956-ffa450edef68
From 0864168c23959bac437ab0ebe6e946db58996e91 Mon Sep 17 00:00:00 2001
From: Andreas Beeker
Date: Sat, 21 Feb 2015 12:55:03 +0000
Subject: [PATCH 005/301] update to next beta and docu fix
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661349 13f79535-47bb-0310-9956-ffa450edef68
---
build.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.xml b/build.xml
index cfa95666e..947ec411d 100644
--- a/build.xml
+++ b/build.xml
@@ -47,8 +47,8 @@ under the License.
The Apache POI project Ant build.
-
-
+
+
From 8d19e8b741ccf3671358baf6337cc2c721ab9b9b Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Mon, 23 Feb 2015 13:21:06 +0000
Subject: [PATCH 006/301] Fix typo - remove duplicate characters
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661662 13f79535-47bb-0310-9956-ffa450edef68
---
build.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.xml b/build.xml
index 947ec411d..a0fe7c5ec 100644
--- a/build.xml
+++ b/build.xml
@@ -579,7 +579,7 @@ under the License.
-
+
From 327df5cf76dfad1150c1a28c316782bf6ff99874 Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Mon, 23 Feb 2015 13:21:23 +0000
Subject: [PATCH 007/301] Unit tests for OPC handling of files without a Core
Properties part
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661663 13f79535-47bb-0310-9956-ffa450edef68
---
.../TestOPCComplianceCoreProperties.java | 81 ++++++++++++++++++
.../OPCCompliance_NoCoreProperties.xlsx | Bin 0 -> 11483 bytes
2 files changed, 81 insertions(+)
create mode 100644 test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx
diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
index 0cf520009..cc6f7ca83 100644
--- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
+++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
@@ -17,6 +17,10 @@
package org.apache.poi.openxml4j.opc.compliance;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -34,6 +38,8 @@ import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
import org.apache.poi.openxml4j.opc.TargetMode;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.util.TempFile;
/**
* Test core properties Open Packaging Convention compliance.
@@ -224,4 +230,79 @@ public final class TestOPCComplianceCoreProperties extends TestCase {
String msg = extractInvalidFormatMessage("LimitedXSITypeAttribute_PresentWithUnauthorizedValueFAIL.docx");
assertEquals("The element 'modified' must have the 'xsi:type' attribute with the value 'dcterms:W3CDTF' !", msg);
}
+
+ /**
+ * Document with no core properties - testing at the OPC level,
+ * saving into a new stream
+ */
+ public void testNoCoreProperties_saveNew() throws Exception {
+ String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx";
+ OPCPackage pkg = null;
+ try {
+ pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ // Empty properties
+ assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+
+ // Save and re-load
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ pkg.save(baos);
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+ pkg = OPCPackage.open(bais);
+
+ // An Empty Properties part has been added in the save/load
+ assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+ }
+
+ /**
+ * Document with no core properties - testing at the OPC level,
+ * from a temp-file, saving in-place
+ */
+ public void testNoCoreProperties_saveInPlace() throws Exception {
+ String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx";
+
+ // Copy this into a temp file, so we can play with it
+ File tmp = TempFile.createTempFile("poi-test", ".opc");
+ FileOutputStream out = new FileOutputStream(tmp);
+ IOUtils.copy(
+ POIDataSamples.getOpenXML4JInstance().openResourceAsStream(sampleFileName),
+ out);
+ out.close();
+
+ // Open it from that temp file
+ OPCPackage pkg = OPCPackage.open(tmp);
+
+ // Empty properties
+ assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+
+ // Save and close
+ pkg.close();
+
+
+ // Re-open and check
+ pkg = OPCPackage.open(tmp);
+
+ // An Empty Properties part has been added in the save/load
+ assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+
+ // Finish and tidy
+ pkg.revert();
+ tmp.delete();
+ }
}
diff --git a/test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx b/test-data/openxml4j/OPCCompliance_NoCoreProperties.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..fa1049c68d788b928b5bb7c8d44eff9560ab0474
GIT binary patch
literal 11483
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
U2bPa6%Si#eaINA2?a_b#1F&?89smFU
literal 0
HcmV?d00001
From 1bbbd985d45c362e01732b56377a4d673b1644ce Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Mon, 23 Feb 2015 20:45:21 +0000
Subject: [PATCH 008/301] Bug 57612: Fix checking for proxy/accessible website
in TestSignatureInfo
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661774 13f79535-47bb-0310-9956-ffa450edef68
---
build.xml | 6 +++++-
.../org/apache/poi/poifs/crypt/TestSignatureInfo.java | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/build.xml b/build.xml
index a0fe7c5ec..f29aa8d37 100644
--- a/build.xml
+++ b/build.xml
@@ -82,7 +82,11 @@ under the License.
-
+
+
+
diff --git a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
index ded14dfba..fe8ce8011 100644
--- a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
+++ b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
@@ -316,7 +316,7 @@ public class TestSignatureInfo {
signatureConfig.addSignatureFacet(new XAdESXLSignatureFacet());
// check for internet, no error means it works
- boolean mockTsp = (getAccessError("http://timestamp.comodoca.com/rfc3161", true, 10000) == null);
+ boolean mockTsp = (getAccessError("http://timestamp.comodoca.com/rfc3161", true, 10000) != null);
// http://timestamping.edelweb.fr/service/tsp
// http://tsa.belgium.be/connect
From d5065b1742b2b978369bf11076d8cfddb65074f2 Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Tue, 24 Feb 2015 12:03:53 +0000
Subject: [PATCH 009/301] Change from XMLEventFactory.newFactory to
XMLEventFactory.newInstance, for IBM JDK Compatibility, fixes #57622
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661903 13f79535-47bb-0310-9956-ffa450edef68
---
.../internal/marshallers/PackagePropertiesMarshaller.java | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java
index ca549f91f..76e292bea 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/internal/marshallers/PackagePropertiesMarshaller.java
@@ -34,15 +34,11 @@ import org.w3c.dom.Element;
/**
* Package properties marshaller.
- *
- * @author CDubet, Julien Chable
*/
public class PackagePropertiesMarshaller implements PartMarshaller {
-
-
private final static Namespace namespaceDC, namespaceCoreProperties, namespaceDcTerms, namespaceXSI;
static {
- final XMLEventFactory f = XMLEventFactory.newFactory();
+ final XMLEventFactory f = XMLEventFactory.newInstance();
namespaceDC = f.createNamespace("dc", PackagePropertiesPart.NAMESPACE_DC_URI);
namespaceCoreProperties = f.createNamespace("cp", PackagePropertiesPart.NAMESPACE_CP_URI);
namespaceDcTerms = f.createNamespace("dcterms", PackagePropertiesPart.NAMESPACE_DCTERMS_URI);
From b6a88f09c8346cf8ac7fbd58e3869994ed5d125f Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Tue, 24 Feb 2015 12:09:30 +0000
Subject: [PATCH 010/301] Patch from rojotek from github-18 - Handle documents
with a picture-only header
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1661908 13f79535-47bb-0310-9956-ffa450edef68
---
.../apache/poi/xwpf/usermodel/XWPFDocument.java | 2 +-
.../poi/xwpf/usermodel/TestXWPFDocument.java | 15 +++++++++++++++
test-data/document/zero-length.docx | Bin 0 -> 10469 bytes
3 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 test-data/document/zero-length.docx
diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
index 9adc39704..6a28db2a8 100644
--- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
+++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java
@@ -92,7 +92,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
/**
* Keeps track on all id-values used in this document and included parts, like headers, footers, etc.
*/
- private IdentifierManager drawingIdManager = new IdentifierManager(1L,4294967295L);
+ private IdentifierManager drawingIdManager = new IdentifierManager(0L,4294967295L);
protected List footers = new ArrayList();
protected List headers = new ArrayList();
protected List comments = new ArrayList();
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java
index 7621404b8..85da27b9e 100644
--- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java
+++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java
@@ -337,6 +337,21 @@ public final class TestXWPFDocument extends TestCase {
doc.getPackage().revert();
}
+ public void testZeroLengthLibreOfficeDocumentWithWaterMarkHeader() throws IOException {
+ XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("zero-length.docx");
+ POIXMLProperties properties = doc.getProperties();
+
+ assertNotNull(properties.getCoreProperties());
+
+ XWPFHeader headerArray = doc.getHeaderArray(0);
+ assertEquals(1, headerArray.getAllPictures().size());
+ assertEquals("image1.png", headerArray.pictures.get(0).getFileName());
+ assertEquals("", headerArray.getText());
+
+ POIXMLProperties.ExtendedProperties extendedProperties = properties.getExtendedProperties();
+ assertNotNull(extendedProperties);
+ assertEquals(0, extendedProperties.getUnderlyingProperties().getCharacters());
+ }
public void testSettings(){
XWPFSettings settings = new XWPFSettings();
diff --git a/test-data/document/zero-length.docx b/test-data/document/zero-length.docx
new file mode 100644
index 0000000000000000000000000000000000000000..eb34b47b1a5f854f785c09ab9a2f6ec4b315c176
GIT binary patch
literal 10469
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
*
Note that in order to properly release resources the
* Workbook should be closed after use.
+ * @throws EncryptedDocumentException If the workbook given is password protected
*/
- public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {
+ public static Workbook create(InputStream inp) throws IOException, InvalidFormatException, EncryptedDocumentException {
// If clearly doesn't do mark/reset, wrap up
if (! inp.markSupported()) {
inp = new PushbackInputStream(inp, 8);
@@ -94,8 +96,9 @@ public class WorkbookFactory {
* the given File, which must exist and be readable.
*
Note that in order to properly release resources the
* Workbook should be closed after use.
+ * @throws EncryptedDocumentException If the workbook given is password protected
*/
- public static Workbook create(File file) throws IOException, InvalidFormatException {
+ public static Workbook create(File file) throws IOException, InvalidFormatException, EncryptedDocumentException {
if (! file.exists()) {
throw new FileNotFoundException(file.toString());
}
From b57a4f04e3f82ddcf4a784ad13ccacfae372a6d9 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Thu, 26 Feb 2015 13:43:10 +0000
Subject: [PATCH 013/301] Adjust to provide full exception information for
cases where we catch unexpected exceptions
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662447 13f79535-47bb-0310-9956-ffa450edef68
---
.../org/apache/poi/poifs/crypt/TestSignatureInfo.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
index fe8ce8011..d0eeb3d47 100644
--- a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
+++ b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
@@ -382,11 +382,13 @@ public class TestSignatureInfo {
si.confirmSignature();
} catch (RuntimeException e) {
// only allow a ConnectException because of timeout, we see this in Jenkins from time to time...
- assertNotNull("Only allowing ConnectException here, but had: " + e, e.getCause());
+ if(e.getCause() == null) {
+ throw e;
+ }
if(!(e.getCause() instanceof ConnectException)) {
throw e;
}
- assertTrue("Only allowing ConnectException here, but had: " + e, e.getCause().getMessage().contains("timed out"));
+ assertTrue("Only allowing ConnectException with 'timed out' as message here, but had: " + e, e.getCause().getMessage().contains("timed out"));
}
// verify
From 7dfcd6c684508d60c9500525b0f3b2b836a5c239 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Fri, 27 Feb 2015 09:52:57 +0000
Subject: [PATCH 014/301] Adjust tests and fix small typo
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662650 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/xssf/streaming/SXSSFWorkbook.java | 2 +-
.../poi/xssf/streaming/TestSXSSFWorkbook.java | 26 +++++++++++--------
.../poi/hssf/usermodel/TestHSSFCell.java | 3 +--
3 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
index 87d8847bd..79d2cc83b 100644
--- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
+++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
@@ -831,7 +831,7 @@ public class SXSSFWorkbook implements Workbook
/**
* Closes the underlying {@link XSSFWorkbook} and {@link OPCPackage}
- * on which this Workbook is based, if any. Has no effect on Worbooks
+ * on which this Workbook is based, if any. Has no effect on Workbooks
* created from scratch.
*/
@Override
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
index ce217e234..7aa9422a6 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
@@ -88,19 +88,23 @@ public final class TestSXSSFWorkbook extends BaseTestWorkbook {
}
@Test
- public void existingWorkbook() {
+ public void existingWorkbook() throws IOException {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
xssfWorkbook.createSheet("S1");
SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook);
- xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
- assertTrue(wb.dispose());
-
- wb = new SXSSFWorkbook(xssfWorkbook);
- assertEquals(1, wb.getNumberOfSheets());
- Sheet sheet = wb.getSheetAt(0);
- assertNotNull(sheet);
- assertEquals("S1", sheet.getSheetName());
- assertTrue(wb.dispose());
+ try {
+ xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
+ assertTrue(wb.dispose());
+
+ wb = new SXSSFWorkbook(xssfWorkbook);
+ assertEquals(1, wb.getNumberOfSheets());
+ Sheet sheet = wb.getSheetAt(0);
+ assertNotNull(sheet);
+ assertEquals("S1", sheet.getSheetName());
+ } finally {
+ assertTrue(wb.dispose());
+ wb.close();
+ }
}
@@ -123,7 +127,7 @@ public final class TestSXSSFWorkbook extends BaseTestWorkbook {
XSSFWorkbook xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
sss = (SharedStringsTable)f.get(wb);
assertEquals(2, sss.getUniqueCount());
- wb.dispose();
+ assertTrue(wb.dispose());
Sheet sheet1 = xssfWorkbook.getSheetAt(0);
assertEquals("S1", sheet1.getSheetName());
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
index 36a48f46f..066c12e7f 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFCell.java
@@ -33,7 +33,6 @@ import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.BaseTestCell;
import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.ErrorConstants;
import org.apache.poi.ss.usermodel.FormulaError;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
@@ -330,7 +329,7 @@ public final class TestHSSFCell extends BaseTestCell {
// string to error code
cell.setCellValue("abc");
confirmStringRecord(sheet, true);
- cell.setCellErrorValue((byte)ErrorConstants.ERROR_REF);
+ cell.setCellErrorValue(FormulaError.REF.getCode());
confirmStringRecord(sheet, false);
// string to boolean
From e86ed72c2b2dd75341a2966483d5f1187f35ec5f Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Fri, 27 Feb 2015 09:59:14 +0000
Subject: [PATCH 015/301] * Add text-extraction verification to
integration-tests via a new abstract base FileHandler * Fix
NullPointerException found in some documents when running against the
test-data * Add support for extracting text from Dir-Entries WORKBOOK and
BOOK to support some old/strangely formatted XLS files.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662652 13f79535-47bb-0310-9956-ffa450edef68
---
.../org/apache/poi/TestAllFiles.java | 36 +++++++-----
.../poi/stress/AbstractFileHandler.java | 55 +++++++++++++++++++
.../org/apache/poi/stress/FileHandler.java | 7 +++
.../apache/poi/stress/HMEFFileHandler.java | 2 +-
.../apache/poi/stress/HPSFFileHandler.java | 2 +-
.../apache/poi/stress/HSSFFileHandler.java | 7 +++
.../apache/poi/stress/POIFSFileHandler.java | 2 +-
.../apache/poi/stress/SpreadsheetHandler.java | 2 +-
.../apache/poi/stress/XSLFFileHandler.java | 2 +-
.../apache/poi/stress/XWPFFileHandler.java | 2 +-
.../poi/extractor/ExtractorFactory.java | 4 +-
.../xssf/extractor/XSSFExcelExtractor.java | 8 ++-
12 files changed, 107 insertions(+), 22 deletions(-)
create mode 100644 src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java
index 460830353..d0439b40f 100644
--- a/src/integrationtest/org/apache/poi/TestAllFiles.java
+++ b/src/integrationtest/org/apache/poi/TestAllFiles.java
@@ -253,20 +253,26 @@ public class TestAllFiles {
@Test
public void testAllFiles() throws Exception {
assertNotNull("Unknown file extension for file: " + file + ": " + getExtension(file), handler);
- InputStream stream = new BufferedInputStream(new FileInputStream(new File(ROOT_DIR, file)),100);
+ File inputFile = new File(ROOT_DIR, file);
+
try {
- handler.handleFile(stream);
-
- assertFalse("Expected to fail for file " + file + " and handler " + handler + ", but did not fail!",
- EXPECTED_FAILURES.contains(file));
- } catch (Exception e) {
- // check if we expect failure for this file
- if(!EXPECTED_FAILURES.contains(file)) {
- throw new Exception("While handling " + file, e);
- }
- } finally {
- stream.close();
- }
+ InputStream stream = new BufferedInputStream(new FileInputStream(inputFile),100);
+ try {
+ handler.handleFile(stream);
+
+ assertFalse("Expected to fail for file " + file + " and handler " + handler + ", but did not fail!",
+ EXPECTED_FAILURES.contains(file));
+ } finally {
+ stream.close();
+ }
+
+ handler.handleExtracting(inputFile);
+ } catch (Exception e) {
+ // check if we expect failure for this file
+ if(!EXPECTED_FAILURES.contains(file) && !AbstractFileHandler.EXPECTED_EXTRACTOR_FAILURES.contains(file)) {
+ throw new Exception("While handling " + file, e);
+ }
+ }
}
private static String getExtension(String file) {
@@ -282,5 +288,9 @@ public class TestAllFiles {
@Override
public void handleFile(InputStream stream) throws Exception {
}
+
+ @Override
+ public void handleExtracting(File file) throws Exception {
+ }
}
}
diff --git a/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
new file mode 100644
index 000000000..85ebb1b45
--- /dev/null
+++ b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
@@ -0,0 +1,55 @@
+package org.apache.poi.stress;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.poi.POITextExtractor;
+import org.apache.poi.extractor.ExtractorFactory;
+
+public abstract class AbstractFileHandler implements FileHandler {
+ public static final Set EXPECTED_EXTRACTOR_FAILURES = new HashSet();
+ static {
+ // password protected files
+ EXPECTED_EXTRACTOR_FAILURES.add("document/bug53475-password-is-pass.docx");
+ EXPECTED_EXTRACTOR_FAILURES.add("poifs/extenxls_pwd123.xlsx");
+ EXPECTED_EXTRACTOR_FAILURES.add("poifs/protect.xlsx");
+ EXPECTED_EXTRACTOR_FAILURES.add("poifs/protected_agile.docx");
+ EXPECTED_EXTRACTOR_FAILURES.add("poifs/protected_sha512.xlsx");
+
+ // unsupported file-types, no supported OLE2 parts
+ EXPECTED_EXTRACTOR_FAILURES.add("hmef/quick-winmail.dat");
+ EXPECTED_EXTRACTOR_FAILURES.add("hmef/winmail-sample1.dat");
+ EXPECTED_EXTRACTOR_FAILURES.add("hmef/bug52400-winmail-simple.dat");
+ EXPECTED_EXTRACTOR_FAILURES.add("hmef/bug52400-winmail-with-attachments.dat");
+ EXPECTED_EXTRACTOR_FAILURES.add("hpsf/Test0313rur.adm");
+ EXPECTED_EXTRACTOR_FAILURES.add("hsmf/attachment_msg_pdf.msg");
+ EXPECTED_EXTRACTOR_FAILURES.add("poifs/Notes.ole2");
+ EXPECTED_EXTRACTOR_FAILURES.add("slideshow/testPPT.thmx");
+ }
+
+ public void handleExtracting(File file) throws Exception {
+ POITextExtractor extractor = ExtractorFactory.createExtractor(file);
+ try {
+ assertNotNull(extractor);
+
+ assertNotNull(extractor.getText());
+
+ // also try metadata
+ POITextExtractor metadataExtractor = extractor.getMetadataTextExtractor();
+ assertNotNull(metadataExtractor.getText());
+
+ assertFalse("Expected Extraction to fail for file " + file + " and handler " + this + ", but did not fail!",
+ EXPECTED_EXTRACTOR_FAILURES.contains(file));
+ } catch (IllegalArgumentException e) {
+ if(!EXPECTED_EXTRACTOR_FAILURES.contains(file)) {
+ throw new Exception("While handling " + file, e);
+ }
+ } finally {
+ extractor.close();
+ }
+ }
+}
diff --git a/src/integrationtest/org/apache/poi/stress/FileHandler.java b/src/integrationtest/org/apache/poi/stress/FileHandler.java
index e6f3385f0..ce2991b0b 100644
--- a/src/integrationtest/org/apache/poi/stress/FileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/FileHandler.java
@@ -16,6 +16,7 @@
==================================================================== */
package org.apache.poi.stress;
+import java.io.File;
import java.io.InputStream;
/**
@@ -34,4 +35,10 @@ public interface FileHandler {
* @throws Exception
*/
void handleFile(InputStream stream) throws Exception;
+
+ /**
+ * Ensures that extracting text from the given file
+ * is returning some text.
+ */
+ void handleExtracting(File file) throws Exception;
}
diff --git a/src/integrationtest/org/apache/poi/stress/HMEFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HMEFFileHandler.java
index dfa875005..9f492bf0e 100644
--- a/src/integrationtest/org/apache/poi/stress/HMEFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/HMEFFileHandler.java
@@ -26,7 +26,7 @@ import org.apache.poi.hmef.attribute.MAPIAttribute;
import org.apache.poi.hmef.attribute.MAPIStringAttribute;
import org.junit.Test;
-public class HMEFFileHandler implements FileHandler {
+public class HMEFFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
diff --git a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
index b7d846ae6..477ee859c 100644
--- a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
@@ -25,7 +25,7 @@ import org.apache.poi.hpsf.HPSFPropertiesOnlyDocument;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.junit.Test;
-public class HPSFFileHandler implements FileHandler {
+public class HPSFFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
HPSFPropertiesOnlyDocument hpsf = new HPSFPropertiesOnlyDocument(new POIFSFileSystem(stream));
diff --git a/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java
index 19dbd97a0..dd579c4db 100644
--- a/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/HSSFFileHandler.java
@@ -16,6 +16,7 @@
==================================================================== */
package org.apache.poi.stress;
+import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -49,4 +50,10 @@ public class HSSFFileHandler extends SpreadsheetHandler {
stream.close();
}
}
+
+ // a test-case to test this locally without executing the full TestAllFiles
+ @Test
+ public void testExtractor() throws Exception {
+ handleExtracting(new File("test-data/spreadsheet/BOOK_in_capitals.xls"));
+ }
}
\ No newline at end of file
diff --git a/src/integrationtest/org/apache/poi/stress/POIFSFileHandler.java b/src/integrationtest/org/apache/poi/stress/POIFSFileHandler.java
index 31deac710..5c4a36e3c 100644
--- a/src/integrationtest/org/apache/poi/stress/POIFSFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/POIFSFileHandler.java
@@ -25,7 +25,7 @@ import java.io.InputStream;
import org.apache.poi.POIDocument;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-public class POIFSFileHandler implements FileHandler {
+public class POIFSFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
diff --git a/src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java b/src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java
index aad703ce9..f12bbd2de 100644
--- a/src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java
@@ -30,7 +30,7 @@ import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
-public abstract class SpreadsheetHandler implements FileHandler {
+public abstract class SpreadsheetHandler extends AbstractFileHandler {
public void handleWorkbook(Workbook wb, String extension) throws IOException {
// try to access some of the content
readContent(wb);
diff --git a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
index 3464218fd..e6cbb184b 100644
--- a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
@@ -25,7 +25,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xslf.XSLFSlideShow;
import org.junit.Test;
-public class XSLFFileHandler implements FileHandler {
+public class XSLFFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
// ignore password protected files
diff --git a/src/integrationtest/org/apache/poi/stress/XWPFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XWPFFileHandler.java
index a96d46da3..47c18d8aa 100644
--- a/src/integrationtest/org/apache/poi/stress/XWPFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/XWPFFileHandler.java
@@ -22,7 +22,7 @@ import java.io.InputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.junit.Test;
-public class XWPFFileHandler implements FileHandler {
+public class XWPFFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
// ignore password protected files
diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
index 65d1e3d69..a0b6b5db1 100644
--- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
+++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
@@ -213,7 +213,9 @@ public class ExtractorFactory {
{
// Look for certain entries in the stream, to figure it
// out from
- if (poifsDir.hasEntry("Workbook")) {
+ if (poifsDir.hasEntry("Workbook") ||
+ // some XLS files have different entry-names
+ poifsDir.hasEntry("WORKBOOK") || poifsDir.hasEntry("BOOK")) {
if (getPreferEventExtractor()) {
return new EventBasedExcelExtractor(poifsDir);
}
diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java
index 6f43ba126..39ef5be8a 100644
--- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java
+++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExcelExtractor.java
@@ -80,7 +80,11 @@ public class XSSFExcelExtractor extends POIXMLTextExtractor
}
POIXMLTextExtractor extractor =
new XSSFExcelExtractor(args[0]);
- System.out.println(extractor.getText());
+ try {
+ System.out.println(extractor.getText());
+ } finally {
+ extractor.close();
+ }
}
/**
@@ -237,7 +241,7 @@ public class XSSFExcelExtractor extends POIXMLTextExtractor
if (type == Cell.CELL_TYPE_NUMERIC) {
CellStyle cs = cell.getCellStyle();
- if (cs.getDataFormatString() != null) {
+ if (cs != null && cs.getDataFormatString() != null) {
text.append(formatter.formatRawCellContents(
cell.getNumericCellValue(), cs.getDataFormat(), cs.getDataFormatString()
));
From 80d0d3b5bd7a01632e143ab95e1cd0e6a596f878 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Fri, 27 Feb 2015 11:33:36 +0000
Subject: [PATCH 016/301] Add missing javadoc-header
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662661 13f79535-47bb-0310-9956-ffa450edef68
---
.../apache/poi/stress/AbstractFileHandler.java | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
index 85ebb1b45..d7e303e4a 100644
--- a/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
@@ -1,3 +1,19 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
package org.apache.poi.stress;
import static org.junit.Assert.assertFalse;
From f043c4401717854713599806e64a5bcbb306f718 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Fri, 27 Feb 2015 14:58:41 +0000
Subject: [PATCH 017/301] * Verify some more Text-Extraction features as part
of integration tests, fix some NullPointerExceptions that showed up now
because the event-based extraction does not have a Document available * Also
handle a XLSX which does not have row-numbers in the sheet-xml. Excel can
read it so it makes sense to also allow to read it in the XSSFSheetXMLHandler
* Remove some Eclipse warnings in test-code
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662691 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/stress/AbstractFileHandler.java | 47 +++++
.../apache/poi/stress/HPSFFileHandler.java | 7 +
.../apache/poi/stress/XSSFFileHandler.java | 7 +
.../extractor/HPSFPropertiesExtractor.java | 8 +
.../hssf/eventusermodel/HSSFEventFactory.java | 22 ++-
.../poi/POIXMLPropertiesTextExtractor.java | 23 ++-
.../poi/extractor/ExtractorFactory.java | 6 +-
.../eventusermodel/XSSFSheetXMLHandler.java | 13 +-
.../TestXSSFEventBasedExcelExtractor.java | 23 ++-
.../TestHPSFPropertiesExtractor.java | 165 ++++++++++++------
.../eventusermodel/TestHSSFEventFactory.java | 16 +-
.../hssf/extractor/TestExcelExtractor.java | 151 +++++++++-------
12 files changed, 354 insertions(+), 134 deletions(-)
diff --git a/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
index d7e303e4a..8a27e6d0e 100644
--- a/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/AbstractFileHandler.java
@@ -16,15 +16,23 @@
==================================================================== */
package org.apache.poi.stress;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.xmlbeans.XmlException;
public abstract class AbstractFileHandler implements FileHandler {
public static final Set EXPECTED_EXTRACTOR_FAILURES = new HashSet();
@@ -48,6 +56,22 @@ public abstract class AbstractFileHandler implements FileHandler {
}
public void handleExtracting(File file) throws Exception {
+ boolean before = ExtractorFactory.getThreadPrefersEventExtractors();
+ try {
+ ExtractorFactory.setThreadPrefersEventExtractors(true);
+ handleExtractingInternal(file);
+
+ ExtractorFactory.setThreadPrefersEventExtractors(false);
+ handleExtractingInternal(file);
+ } finally {
+ ExtractorFactory.setThreadPrefersEventExtractors(before);
+ }
+ }
+
+ private void handleExtractingInternal(File file) throws Exception {
+ long length = file.length();
+ long modified = file.lastModified();
+
POITextExtractor extractor = ExtractorFactory.createExtractor(file);
try {
assertNotNull(extractor);
@@ -60,6 +84,11 @@ public abstract class AbstractFileHandler implements FileHandler {
assertFalse("Expected Extraction to fail for file " + file + " and handler " + this + ", but did not fail!",
EXPECTED_EXTRACTOR_FAILURES.contains(file));
+
+ assertEquals("File should not be modified by extractor", length, file.length());
+ assertEquals("File should not be modified by extractor", modified, file.lastModified());
+
+ handleExtractingAsStream(file);
} catch (IllegalArgumentException e) {
if(!EXPECTED_EXTRACTOR_FAILURES.contains(file)) {
throw new Exception("While handling " + file, e);
@@ -68,4 +97,22 @@ public abstract class AbstractFileHandler implements FileHandler {
extractor.close();
}
}
+
+ private void handleExtractingAsStream(File file) throws FileNotFoundException,
+ IOException, InvalidFormatException, OpenXML4JException,
+ XmlException {
+ InputStream stream = new FileInputStream(file);
+ try {
+ POITextExtractor streamExtractor = ExtractorFactory.createExtractor(stream);
+ try {
+ assertNotNull(streamExtractor);
+
+ assertNotNull(streamExtractor.getText());
+ } finally {
+ streamExtractor.close();
+ }
+ } finally {
+ stream.close();
+ }
+ }
}
diff --git a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
index 477ee859c..6a53b2e00 100644
--- a/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/HPSFFileHandler.java
@@ -18,6 +18,7 @@ package org.apache.poi.stress;
import static org.junit.Assert.assertNotNull;
+import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -43,4 +44,10 @@ public class HPSFFileHandler extends AbstractFileHandler {
stream.close();
}
}
+
+ // a test-case to test this locally without executing the full TestAllFiles
+ @Test
+ public void testExtractor() throws Exception {
+ handleExtracting(new File("test-data/hpsf/TestBug44375.xls"));
+ }
}
diff --git a/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java
index 54a386ea0..a268ed465 100644
--- a/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/XSSFFileHandler.java
@@ -17,6 +17,7 @@
package org.apache.poi.stress;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -71,4 +72,10 @@ public class XSSFFileHandler extends SpreadsheetHandler {
stream.close();
}
}
+
+ // a test-case to test this locally without executing the full TestAllFiles
+ @Test
+ public void testExtractor() throws Exception {
+ handleExtracting(new File("test-data/spreadsheet/56278.xlsx"));
+ }
}
\ No newline at end of file
diff --git a/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java b/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java
index ce5301ac6..1a0db0389 100644
--- a/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java
+++ b/src/java/org/apache/poi/hpsf/extractor/HPSFPropertiesExtractor.java
@@ -57,6 +57,10 @@ public class HPSFPropertiesExtractor extends POITextExtractor {
}
public String getDocumentSummaryInformationText() {
+ if(document == null) { // event based extractor does not have a document
+ return "";
+ }
+
DocumentSummaryInformation dsi = document.getDocumentSummaryInformation();
StringBuffer text = new StringBuffer();
@@ -78,6 +82,10 @@ public class HPSFPropertiesExtractor extends POITextExtractor {
return text.toString();
}
public String getSummaryInformationText() {
+ if(document == null) { // event based extractor does not have a document
+ return "";
+ }
+
SummaryInformation si = document.getSummaryInformation();
// Just normal properties
diff --git a/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java b/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
index 45ab8d813..4d0b894e0 100644
--- a/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
+++ b/src/java/org/apache/poi/hssf/eventusermodel/HSSFEventFactory.java
@@ -19,6 +19,7 @@ package org.apache.poi.hssf.eventusermodel;
import java.io.InputStream;
import java.io.IOException;
+import java.util.Set;
import org.apache.poi.hssf.eventusermodel.HSSFUserException;
import org.apache.poi.hssf.record.*;
@@ -56,11 +57,24 @@ public class HSSFEventFactory {
* @param req an Instance of HSSFRequest which has your registered listeners
* @param dir a DirectoryNode containing your workbook
*/
- public void processWorkbookEvents(HSSFRequest req, DirectoryNode dir) throws IOException {
- InputStream in = dir.createDocumentInputStream("Workbook");
+ public void processWorkbookEvents(HSSFRequest req, DirectoryNode dir) throws IOException {
+ // some old documents have "WORKBOOK" or "BOOK"
+ final String name;
+ Set entryNames = dir.getEntryNames();
+ if (entryNames.contains("Workbook")) {
+ name = "Workbook";
+ } else if (entryNames.contains("WORKBOOK")) {
+ name = "WORKBOOK";
+ } else if (entryNames.contains("BOOK")) {
+ name = "BOOK";
+ } else {
+ name = "Workbook";
+ }
- processEvents(req, in);
- }
+ InputStream in = dir.createDocumentInputStream(name);
+
+ processEvents(req, in);
+ }
/**
* Processes a file into essentially record events.
diff --git a/src/ooxml/java/org/apache/poi/POIXMLPropertiesTextExtractor.java b/src/ooxml/java/org/apache/poi/POIXMLPropertiesTextExtractor.java
index ce576439f..8a35a34e4 100644
--- a/src/ooxml/java/org/apache/poi/POIXMLPropertiesTextExtractor.java
+++ b/src/ooxml/java/org/apache/poi/POIXMLPropertiesTextExtractor.java
@@ -67,9 +67,14 @@ public class POIXMLPropertiesTextExtractor extends POIXMLTextExtractor {
* Returns the core document properties, eg author
*/
public String getCorePropertiesText() {
+ POIXMLDocument document = getDocument();
+ if(document == null) { // event based extractor does not have a document
+ return "";
+ }
+
StringBuffer text = new StringBuffer();
- PackagePropertiesPart props =
- getDocument().getProperties().getCoreProperties().getUnderlyingProperties();
+ PackagePropertiesPart props =
+ document.getProperties().getCoreProperties().getUnderlyingProperties();
appendIfPresent(text, "Category", props.getCategoryProperty().getValue());
appendIfPresent(text, "Category", props.getCategoryProperty().getValue());
@@ -99,9 +104,14 @@ public class POIXMLPropertiesTextExtractor extends POIXMLTextExtractor {
* application
*/
public String getExtendedPropertiesText() {
+ POIXMLDocument document = getDocument();
+ if(document == null) { // event based extractor does not have a document
+ return "";
+ }
+
StringBuffer text = new StringBuffer();
org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties
- props = getDocument().getProperties().getExtendedProperties().getUnderlyingProperties();
+ props = document.getProperties().getExtendedProperties().getUnderlyingProperties();
appendIfPresent(text, "Application", props.getApplication());
appendIfPresent(text, "AppVersion", props.getAppVersion());
@@ -127,9 +137,14 @@ public class POIXMLPropertiesTextExtractor extends POIXMLTextExtractor {
*/
@SuppressWarnings("deprecation")
public String getCustomPropertiesText() {
+ POIXMLDocument document = getDocument();
+ if(document == null) { // event based extractor does not have a document
+ return "";
+ }
+
StringBuilder text = new StringBuilder();
org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperties
- props = getDocument().getProperties().getCustomProperties().getUnderlyingProperties();
+ props = document.getProperties().getCustomProperties().getUnderlyingProperties();
for(CTProperty property : props.getPropertyArray()) {
String val = "(not implemented!)";
diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
index a0b6b5db1..60a0f5181 100644
--- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
+++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
@@ -265,10 +265,10 @@ public class ExtractorFactory {
/**
* Returns an array of text extractors, one for each of
- * the embeded documents in the file (if there are any).
- * If there are no embeded documents, you'll get back an
+ * the embedded documents in the file (if there are any).
+ * If there are no embedded documents, you'll get back an
* empty array. Otherwise, you'll get one open
- * {@link POITextExtractor} for each embeded file.
+ * {@link POITextExtractor} for each embedded file.
*/
public static POITextExtractor[] getEmbededDocsTextExtractors(POIOLE2TextExtractor ext) throws IOException, InvalidFormatException, OpenXML4JException, XmlException {
// All the embded directories we spotted
diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
index 767742687..227441859 100644
--- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
+++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFSheetXMLHandler.java
@@ -96,6 +96,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
private String formatString;
private final DataFormatter formatter;
private int rowNum;
+ private int nextRowNum; // some sheets do not have rowNums, Excel can read them so we should try to handle them correctly as well
private String cellRef;
private boolean formulasNotResults;
@@ -240,7 +241,12 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
headerFooter.setLength(0);
}
else if("row".equals(name)) {
- rowNum = Integer.parseInt(attributes.getValue("r")) - 1;
+ String rowNumStr = attributes.getValue("r");
+ if(rowNumStr != null) {
+ rowNum = Integer.parseInt(rowNumStr) - 1;
+ } else {
+ rowNum = nextRowNum;
+ }
output.startRow(rowNum);
}
// c => cell
@@ -343,7 +349,7 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
case NUMBER:
String n = value.toString();
- if (this.formatString != null)
+ if (this.formatString != null && n.length() > 0)
thisStr = formatter.formatRawCellContents(Double.parseDouble(n), this.formatIndex, this.formatString);
else
thisStr = n;
@@ -370,6 +376,9 @@ public class XSSFSheetXMLHandler extends DefaultHandler {
// Finish up the row
output.endRow(rowNum);
+
+ // some sheets do not have rowNum set in the XML, Excel can read them so we should try to read them as well
+ nextRowNum = rowNum + 1;
} else if ("sheetData".equals(name)) {
// Handle any "missing" cells which had comments attached
checkForEmptyCellComments(EmptyCellCommentsCheckType.END_OF_SHEET_DATA);
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java
index e48787be0..b56b3791f 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
import junit.framework.TestCase;
import org.apache.poi.POITextExtractor;
+import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.xssf.XSSFTestDataSamples;
@@ -155,7 +156,6 @@ public class TestXSSFEventBasedExcelExtractor extends TestCase {
POITextExtractor[] extractors =
new POITextExtractor[] { ooxmlExtractor, ole2Extractor };
for (int i = 0; i < extractors.length; i++) {
- @SuppressWarnings("resource")
POITextExtractor extractor = extractors[i];
String text = extractor.getText().replaceAll("[\r\t]", "");
@@ -316,4 +316,25 @@ public class TestXSSFEventBasedExcelExtractor extends TestCase {
fixture.close();
}
}
+
+ public void testFile56278_normal() throws Exception {
+ // first with normal Text Extractor
+ POIXMLTextExtractor extractor = new XSSFExcelExtractor(
+ XSSFTestDataSamples.openSampleWorkbook("56278.xlsx"));
+ try {
+ assertNotNull(extractor.getText());
+ } finally {
+ extractor.close();
+ }
+ }
+
+ public void testFile56278_event() throws Exception {
+ // then with event based one
+ POIXMLTextExtractor extractor = getExtractor("56278.xlsx");
+ try {
+ assertNotNull(extractor.getText());
+ } finally {
+ extractor.close();
+ }
+ }
}
diff --git a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
index 22238d75f..c6ad03db2 100644
--- a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
+++ b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
@@ -22,10 +22,12 @@ import java.io.IOException;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
+import org.apache.poi.POITextExtractor;
import org.apache.poi.hpsf.Thumbnail;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hwpf.extractor.Word6Extractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public final class TestHPSFPropertiesExtractor extends TestCase {
@@ -34,45 +36,53 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
public void testNormalProperties() throws Exception {
POIFSFileSystem fs = new POIFSFileSystem(_samples.openResourceAsStream("TestMickey.doc"));
HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs);
- ext.getText();
-
- // Check each bit in turn
- String sinfText = ext.getSummaryInformationText();
- String dinfText = ext.getDocumentSummaryInformationText();
-
- assertTrue(sinfText.indexOf("TEMPLATE = Normal") > -1);
- assertTrue(sinfText.indexOf("SUBJECT = sample subject") > -1);
- assertTrue(dinfText.indexOf("MANAGER = sample manager") > -1);
- assertTrue(dinfText.indexOf("COMPANY = sample company") > -1);
-
- // Now overall
- String text = ext.getText();
- assertTrue(text.indexOf("TEMPLATE = Normal") > -1);
- assertTrue(text.indexOf("SUBJECT = sample subject") > -1);
- assertTrue(text.indexOf("MANAGER = sample manager") > -1);
- assertTrue(text.indexOf("COMPANY = sample company") > -1);
+ try {
+ ext.getText();
+
+ // Check each bit in turn
+ String sinfText = ext.getSummaryInformationText();
+ String dinfText = ext.getDocumentSummaryInformationText();
+
+ assertTrue(sinfText.indexOf("TEMPLATE = Normal") > -1);
+ assertTrue(sinfText.indexOf("SUBJECT = sample subject") > -1);
+ assertTrue(dinfText.indexOf("MANAGER = sample manager") > -1);
+ assertTrue(dinfText.indexOf("COMPANY = sample company") > -1);
+
+ // Now overall
+ String text = ext.getText();
+ assertTrue(text.indexOf("TEMPLATE = Normal") > -1);
+ assertTrue(text.indexOf("SUBJECT = sample subject") > -1);
+ assertTrue(text.indexOf("MANAGER = sample manager") > -1);
+ assertTrue(text.indexOf("COMPANY = sample company") > -1);
+ } finally {
+ ext.close();
+ }
}
public void testNormalUnicodeProperties() throws Exception {
POIFSFileSystem fs = new POIFSFileSystem(_samples.openResourceAsStream("TestUnicode.xls"));
HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs);
- ext.getText();
-
- // Check each bit in turn
- String sinfText = ext.getSummaryInformationText();
- String dinfText = ext.getDocumentSummaryInformationText();
-
- assertTrue(sinfText.indexOf("AUTHOR = marshall") > -1);
- assertTrue(sinfText.indexOf("TITLE = Titel: \u00c4h") > -1);
- assertTrue(dinfText.indexOf("COMPANY = Schreiner") > -1);
- assertTrue(dinfText.indexOf("SCALE = false") > -1);
-
- // Now overall
- String text = ext.getText();
- assertTrue(text.indexOf("AUTHOR = marshall") > -1);
- assertTrue(text.indexOf("TITLE = Titel: \u00c4h") > -1);
- assertTrue(text.indexOf("COMPANY = Schreiner") > -1);
- assertTrue(text.indexOf("SCALE = false") > -1);
+ try {
+ ext.getText();
+
+ // Check each bit in turn
+ String sinfText = ext.getSummaryInformationText();
+ String dinfText = ext.getDocumentSummaryInformationText();
+
+ assertTrue(sinfText.indexOf("AUTHOR = marshall") > -1);
+ assertTrue(sinfText.indexOf("TITLE = Titel: \u00c4h") > -1);
+ assertTrue(dinfText.indexOf("COMPANY = Schreiner") > -1);
+ assertTrue(dinfText.indexOf("SCALE = false") > -1);
+
+ // Now overall
+ String text = ext.getText();
+ assertTrue(text.indexOf("AUTHOR = marshall") > -1);
+ assertTrue(text.indexOf("TITLE = Titel: \u00c4h") > -1);
+ assertTrue(text.indexOf("COMPANY = Schreiner") > -1);
+ assertTrue(text.indexOf("SCALE = false") > -1);
+ } finally {
+ ext.close();
+ }
}
public void testCustomProperties() throws Exception {
@@ -80,18 +90,21 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
_samples.openResourceAsStream("TestMickey.doc")
);
HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(fs);
-
- // Custom properties are part of the document info stream
- String dinfText = ext.getDocumentSummaryInformationText();
- assertTrue(dinfText.indexOf("Client = sample client") > -1);
- assertTrue(dinfText.indexOf("Division = sample division") > -1);
-
- String text = ext.getText();
- assertTrue(text.indexOf("Client = sample client") > -1);
- assertTrue(text.indexOf("Division = sample division") > -1);
+ try {
+ // Custom properties are part of the document info stream
+ String dinfText = ext.getDocumentSummaryInformationText();
+ assertTrue(dinfText.indexOf("Client = sample client") > -1);
+ assertTrue(dinfText.indexOf("Division = sample division") > -1);
+
+ String text = ext.getText();
+ assertTrue(text.indexOf("Client = sample client") > -1);
+ assertTrue(text.indexOf("Division = sample division") > -1);
+ } finally {
+ ext.close();
+ }
}
- public void testConstructors() {
+ public void testConstructors() throws IOException {
POIFSFileSystem fs;
HSSFWorkbook wb;
try {
@@ -102,9 +115,29 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
}
ExcelExtractor excelExt = new ExcelExtractor(wb);
- String fsText = (new HPSFPropertiesExtractor(fs)).getText();
- String hwText = (new HPSFPropertiesExtractor(wb)).getText();
- String eeText = (new HPSFPropertiesExtractor(excelExt)).getText();
+ final String fsText;
+ HPSFPropertiesExtractor fsExt = new HPSFPropertiesExtractor(fs);
+ try {
+ fsText = fsExt.getText();
+ } finally {
+ fsExt.close();
+ }
+
+ final String hwText;
+ HPSFPropertiesExtractor hwExt = new HPSFPropertiesExtractor(wb);
+ try {
+ hwText = hwExt.getText();
+ } finally {
+ hwExt.close();
+ }
+
+ final String eeText;
+ HPSFPropertiesExtractor eeExt = new HPSFPropertiesExtractor(excelExt);
+ try {
+ eeText = eeExt.getText();
+ } finally {
+ eeExt.close();
+ }
assertEquals(fsText, hwText);
assertEquals(fsText, eeText);
@@ -113,13 +146,17 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
assertTrue(fsText.indexOf("TITLE = Titel: \u00c4h") > -1);
}
- public void test42726() {
- HPSFPropertiesExtractor ex = new HPSFPropertiesExtractor(HSSFTestDataSamples.openSampleWorkbook("42726.xls"));
- String txt = ex.getText();
- assertTrue(txt.indexOf("PID_AUTHOR") != -1);
- assertTrue(txt.indexOf("PID_EDITTIME") != -1);
- assertTrue(txt.indexOf("PID_REVNUMBER") != -1);
- assertTrue(txt.indexOf("PID_THUMBNAIL") != -1);
+ public void test42726() throws IOException {
+ HPSFPropertiesExtractor ext = new HPSFPropertiesExtractor(HSSFTestDataSamples.openSampleWorkbook("42726.xls"));
+ try {
+ String txt = ext.getText();
+ assertTrue(txt.indexOf("PID_AUTHOR") != -1);
+ assertTrue(txt.indexOf("PID_EDITTIME") != -1);
+ assertTrue(txt.indexOf("PID_REVNUMBER") != -1);
+ assertTrue(txt.indexOf("PID_THUMBNAIL") != -1);
+ } finally {
+ ext.close();
+ }
}
public void testThumbnail() throws Exception {
@@ -131,4 +168,24 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
assertNotNull(thumbnail.getThumbnailAsWMF());
wb.close();
}
+
+ public void testExtractorFromWord6Extractor() throws Exception {
+ POIFSFileSystem fs = new POIFSFileSystem(_samples.openResourceAsStream("TestMickey.doc"));
+ Word6Extractor wExt = new Word6Extractor(fs);
+ try {
+ POITextExtractor ext = wExt.getMetadataTextExtractor();
+ try {
+ // Now overall
+ String text = ext.getText();
+ assertTrue(text.indexOf("TEMPLATE = Normal") > -1);
+ assertTrue(text.indexOf("SUBJECT = sample subject") > -1);
+ assertTrue(text.indexOf("MANAGER = sample manager") > -1);
+ assertTrue(text.indexOf("COMPANY = sample company") > -1);
+ } finally {
+ ext.close();
+ }
+ } finally {
+ wExt.close();
+ }
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java b/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
index 976633108..ff76cfa19 100644
--- a/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
+++ b/src/testcases/org/apache/poi/hssf/eventusermodel/TestHSSFEventFactory.java
@@ -107,8 +107,6 @@ public final class TestHSSFEventFactory extends TestCase {
POIFSFileSystem fs = new POIFSFileSystem(openSample("42844.xls"));
HSSFEventFactory factory = new HSSFEventFactory();
factory.processWorkbookEvents(req, fs);
-
- assertTrue("no errors while processing the file", true);
}
private static class MockHSSFListener implements HSSFListener {
@@ -125,4 +123,18 @@ public final class TestHSSFEventFactory extends TestCase {
records.add(record);
}
}
+
+ public void testWithDifferentWorkbookName() throws Exception {
+ HSSFRequest req = new HSSFRequest();
+ MockHSSFListener mockListen = new MockHSSFListener();
+ req.addListenerForAllRecords(mockListen);
+
+ POIFSFileSystem fs = new POIFSFileSystem(openSample("BOOK_in_capitals.xls"));
+ HSSFEventFactory factory = new HSSFEventFactory();
+ factory.processWorkbookEvents(req, fs);
+
+ fs = new POIFSFileSystem(openSample("WORKBOOK_in_capitals.xls"));
+ factory = new HSSFEventFactory();
+ factory.processWorkbookEvents(req, fs);
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
index de8221029..f7584ff11 100644
--- a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
+++ b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java
@@ -46,15 +46,18 @@ public final class TestExcelExtractor extends TestCase {
}
- public void testSimple() {
-
+ public void testSimple() throws IOException {
ExcelExtractor extractor = createExtractor("Simple.xls");
- assertEquals("Sheet1\nreplaceMe\nSheet2\nSheet3\n", extractor.getText());
-
- // Now turn off sheet names
- extractor.setIncludeSheetNames(false);
- assertEquals("replaceMe\n", extractor.getText());
+ try {
+ assertEquals("Sheet1\nreplaceMe\nSheet2\nSheet3\n", extractor.getText());
+
+ // Now turn off sheet names
+ extractor.setIncludeSheetNames(false);
+ assertEquals("replaceMe\n", extractor.getText());
+ } finally {
+ extractor.close();
+ }
}
public void testNumericFormula() {
@@ -126,45 +129,47 @@ public final class TestExcelExtractor extends TestCase {
public void testEventExtractor() throws Exception {
- EventBasedExcelExtractor extractor;
-
// First up, a simple file with string
// based formulas in it
- extractor = new EventBasedExcelExtractor(
+ EventBasedExcelExtractor extractor = new EventBasedExcelExtractor(
new POIFSFileSystem(
HSSFTestDataSamples.openSampleFileStream("SimpleWithFormula.xls")
)
);
- extractor.setIncludeSheetNames(true);
-
- String text = extractor.getText();
- assertEquals("Sheet1\nreplaceme\nreplaceme\nreplacemereplaceme\nSheet2\nSheet3\n", text);
-
- extractor.setIncludeSheetNames(false);
- extractor.setFormulasNotResults(true);
-
- text = extractor.getText();
- assertEquals("replaceme\nreplaceme\nCONCATENATE(A1,A2)\n", text);
-
-
- // Now, a slightly longer file with numeric formulas
- extractor = new EventBasedExcelExtractor(
- new POIFSFileSystem(
- HSSFTestDataSamples.openSampleFileStream("sumifformula.xls")
- )
- );
- extractor.setIncludeSheetNames(false);
- extractor.setFormulasNotResults(true);
-
- text = extractor.getText();
- assertEquals(
- "1000\t1\tSUMIF(A1:A5,\">4000\",B1:B5)\n" +
- "2000\t2\n" +
- "3000\t3\n" +
- "4000\t4\n" +
- "5000\t5\n",
- text
- );
+ try {
+ extractor.setIncludeSheetNames(true);
+
+ String text = extractor.getText();
+ assertEquals("Sheet1\nreplaceme\nreplaceme\nreplacemereplaceme\nSheet2\nSheet3\n", text);
+
+ extractor.setIncludeSheetNames(false);
+ extractor.setFormulasNotResults(true);
+
+ text = extractor.getText();
+ assertEquals("replaceme\nreplaceme\nCONCATENATE(A1,A2)\n", text);
+
+
+ // Now, a slightly longer file with numeric formulas
+ extractor = new EventBasedExcelExtractor(
+ new POIFSFileSystem(
+ HSSFTestDataSamples.openSampleFileStream("sumifformula.xls")
+ )
+ );
+ extractor.setIncludeSheetNames(false);
+ extractor.setFormulasNotResults(true);
+
+ text = extractor.getText();
+ assertEquals(
+ "1000\t1\tSUMIF(A1:A5,\">4000\",B1:B5)\n" +
+ "2000\t2\n" +
+ "3000\t3\n" +
+ "4000\t4\n" +
+ "5000\t5\n",
+ text
+ );
+ } finally {
+ extractor.close();
+ }
}
public void testWithComments() {
@@ -272,15 +277,22 @@ public final class TestExcelExtractor extends TestCase {
HSSFWorkbook wbB = new HSSFWorkbook(dirB, fs, true);
ExcelExtractor exA = new ExcelExtractor(wbA);
- ExcelExtractor exB = new ExcelExtractor(wbB);
-
- assertEquals("Sheet1\nTest excel file\nThis is the first file\nSheet2\nSheet3\n",
- exA.getText());
- assertEquals("Sample Excel", exA.getSummaryInformation().getTitle());
-
- assertEquals("Sheet1\nAnother excel file\nThis is the second file\nSheet2\nSheet3\n",
- exB.getText());
- assertEquals("Sample Excel 2", exB.getSummaryInformation().getTitle());
+ try {
+ ExcelExtractor exB = new ExcelExtractor(wbB);
+ try {
+ assertEquals("Sheet1\nTest excel file\nThis is the first file\nSheet2\nSheet3\n",
+ exA.getText());
+ assertEquals("Sample Excel", exA.getSummaryInformation().getTitle());
+
+ assertEquals("Sheet1\nAnother excel file\nThis is the second file\nSheet2\nSheet3\n",
+ exB.getText());
+ assertEquals("Sample Excel 2", exB.getSummaryInformation().getTitle());
+ } finally {
+ exB.close();
+ }
+ } finally {
+ exA.close();
+ }
}
/**
@@ -299,21 +311,32 @@ public final class TestExcelExtractor extends TestCase {
HSSFWorkbook wbB = new HSSFWorkbook(dirB, fs, true);
ExcelExtractor exA = new ExcelExtractor(wbA);
- ExcelExtractor exB = new ExcelExtractor(wbB);
-
- assertEquals("Sheet1\nTest excel file\nThis is the first file\nSheet2\nSheet3\n",
- exA.getText());
- assertEquals("Sample Excel", exA.getSummaryInformation().getTitle());
-
- assertEquals("Sheet1\nAnother excel file\nThis is the second file\nSheet2\nSheet3\n",
- exB.getText());
- assertEquals("Sample Excel 2", exB.getSummaryInformation().getTitle());
-
- // And the base file too
- ExcelExtractor ex = new ExcelExtractor(fs);
- assertEquals("Sheet1\nI have lots of embeded files in me\nSheet2\nSheet3\n",
- ex.getText());
- assertEquals("Excel With Embeded", ex.getSummaryInformation().getTitle());
+ try {
+ ExcelExtractor exB = new ExcelExtractor(wbB);
+ try {
+ assertEquals("Sheet1\nTest excel file\nThis is the first file\nSheet2\nSheet3\n",
+ exA.getText());
+ assertEquals("Sample Excel", exA.getSummaryInformation().getTitle());
+
+ assertEquals("Sheet1\nAnother excel file\nThis is the second file\nSheet2\nSheet3\n",
+ exB.getText());
+ assertEquals("Sample Excel 2", exB.getSummaryInformation().getTitle());
+
+ // And the base file too
+ ExcelExtractor ex = new ExcelExtractor(fs);
+ try {
+ assertEquals("Sheet1\nI have lots of embeded files in me\nSheet2\nSheet3\n",
+ ex.getText());
+ assertEquals("Excel With Embeded", ex.getSummaryInformation().getTitle());
+ } finally {
+ ex.close();
+ }
+ } finally {
+ exB.close();
+ }
+ } finally {
+ exA.close();
+ }
}
/**
From 0e16d1434982a0b271087e30faf66dc77cdb2c40 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Fri, 27 Feb 2015 15:01:46 +0000
Subject: [PATCH 018/301] Move test-case to location where the
scratchpad-classes are available
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662712 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/hwpf/extractor/TestWordExtractor.java | 28 ++++++++++++++++++-
.../TestHPSFPropertiesExtractor.java | 22 ---------------
2 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordExtractor.java b/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordExtractor.java
index 82d6f34f4..1a69630a2 100644
--- a/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordExtractor.java
+++ b/src/scratchpad/testcases/org/apache/poi/hwpf/extractor/TestWordExtractor.java
@@ -20,6 +20,7 @@ package org.apache.poi.hwpf.extractor;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
+import org.apache.poi.POITextExtractor;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.HWPFTestDataSamples;
import org.apache.poi.hwpf.OldWordFileFormatException;
@@ -377,10 +378,35 @@ public final class TestWordExtractor extends TestCase {
for (Entry entry : fs.getRoot()) {
if ("WordDocument".equals(entry.getName())) {
WordExtractor ex = new WordExtractor(fs);
- text = ex.getText();
+ try {
+ text = ex.getText();
+ } finally {
+ ex.close();
+ }
}
}
assertNotNull(text);
}
+
+
+ public void testExtractorFromWord6Extractor() throws Exception {
+ POIFSFileSystem fs = new POIFSFileSystem(POIDataSamples.getHPSFInstance().openResourceAsStream("TestMickey.doc"));
+ Word6Extractor wExt = new Word6Extractor(fs);
+ try {
+ POITextExtractor ext = wExt.getMetadataTextExtractor();
+ try {
+ // Now overall
+ String text = ext.getText();
+ assertTrue(text.indexOf("TEMPLATE = Normal") > -1);
+ assertTrue(text.indexOf("SUBJECT = sample subject") > -1);
+ assertTrue(text.indexOf("MANAGER = sample manager") > -1);
+ assertTrue(text.indexOf("COMPANY = sample company") > -1);
+ } finally {
+ ext.close();
+ }
+ } finally {
+ wExt.close();
+ }
+ }
}
diff --git a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
index c6ad03db2..0ef39719d 100644
--- a/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
+++ b/src/testcases/org/apache/poi/hpsf/extractor/TestHPSFPropertiesExtractor.java
@@ -22,12 +22,10 @@ import java.io.IOException;
import junit.framework.TestCase;
import org.apache.poi.POIDataSamples;
-import org.apache.poi.POITextExtractor;
import org.apache.poi.hpsf.Thumbnail;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hwpf.extractor.Word6Extractor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
public final class TestHPSFPropertiesExtractor extends TestCase {
@@ -168,24 +166,4 @@ public final class TestHPSFPropertiesExtractor extends TestCase {
assertNotNull(thumbnail.getThumbnailAsWMF());
wb.close();
}
-
- public void testExtractorFromWord6Extractor() throws Exception {
- POIFSFileSystem fs = new POIFSFileSystem(_samples.openResourceAsStream("TestMickey.doc"));
- Word6Extractor wExt = new Word6Extractor(fs);
- try {
- POITextExtractor ext = wExt.getMetadataTextExtractor();
- try {
- // Now overall
- String text = ext.getText();
- assertTrue(text.indexOf("TEMPLATE = Normal") > -1);
- assertTrue(text.indexOf("SUBJECT = sample subject") > -1);
- assertTrue(text.indexOf("MANAGER = sample manager") > -1);
- assertTrue(text.indexOf("COMPANY = sample company") > -1);
- } finally {
- ext.close();
- }
- } finally {
- wExt.close();
- }
- }
}
From 3ba7b59afc44d0ec5c74f5c16e6a5a9d8edaffaa Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Sat, 28 Feb 2015 17:36:19 +0000
Subject: [PATCH 019/301] Ensure that the core properties are there before
saving them, in case they have not yet been lazy-created
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662971 13f79535-47bb-0310-9956-ffa450edef68
---
src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
index 62f26b754..888f50130 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
@@ -443,7 +443,9 @@ public final class ZipPackage extends Package {
if (this.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES).size() == 0 &&
this.getPartsByRelationshipType(PackageRelationshipTypes.CORE_PROPERTIES_ECMA376).size() == 0 ) {
logger.log(POILogger.DEBUG,"Save core properties part");
-
+
+ // Ensure that core properties are added if missing
+ getPackageProperties();
// Add core properties to part list ...
addPackagePart(this.packageProperties);
// ... and to add its relationship ...
From 2ccd6db57e2300c987aed4fb2db9d6cca22e11da Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Sat, 28 Feb 2015 17:37:11 +0000
Subject: [PATCH 020/301] More missing core properties unit tests, covering
read-write without checks, and encryption
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662972 13f79535-47bb-0310-9956-ffa450edef68
---
.../TestOPCComplianceCoreProperties.java | 25 ++++++---
.../apache/poi/poifs/crypt/TestEncryptor.java | 53 +++++++++++++++++++
2 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
index cc6f7ca83..b9517ba2e 100644
--- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
+++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/compliance/TestOPCComplianceCoreProperties.java
@@ -237,14 +237,9 @@ public final class TestOPCComplianceCoreProperties extends TestCase {
*/
public void testNoCoreProperties_saveNew() throws Exception {
String sampleFileName = "OPCCompliance_NoCoreProperties.xlsx";
- OPCPackage pkg = null;
- try {
- pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath());
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ OPCPackage pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath());
- // Empty properties
+ // Verify it has empty properties
assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
assertNotNull(pkg.getPackageProperties());
assertNotNull(pkg.getPackageProperties().getLanguageProperty());
@@ -262,6 +257,22 @@ public final class TestOPCComplianceCoreProperties extends TestCase {
assertNotNull(pkg.getPackageProperties());
assertNotNull(pkg.getPackageProperties().getLanguageProperty());
assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+
+
+ // Open a new copy of it
+ pkg = OPCPackage.open(POIDataSamples.getOpenXML4JInstance().getFile(sampleFileName).getPath());
+
+ // Save and re-load, without having touched the properties yet
+ baos = new ByteArrayOutputStream();
+ pkg.save(baos);
+ bais = new ByteArrayInputStream(baos.toByteArray());
+ pkg = OPCPackage.open(bais);
+
+ // Check that this too added empty properties without error
+ assertEquals(1, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
}
/**
diff --git a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java
index 37deba5e8..2cd9889bd 100644
--- a/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java
+++ b/src/ooxml/testcases/org/apache/poi/poifs/crypt/TestEncryptor.java
@@ -18,6 +18,8 @@ package org.apache.poi.poifs.crypt;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
@@ -32,6 +34,8 @@ import java.util.Iterator;
import javax.crypto.Cipher;
import org.apache.poi.POIDataSamples;
+import org.apache.poi.openxml4j.opc.ContentTypes;
+import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.agile.AgileEncryptionHeader;
import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.poifs.filesystem.DocumentNode;
@@ -266,6 +270,55 @@ public class TestEncryptor {
assertArrayEquals(payloadExpected, payloadActual);
}
+ /**
+ * Ensure we can encrypt a package that is missing the Core
+ * Properties, eg one from dodgy versions of Jasper Reports
+ * See https://github.com/nestoru/xlsxenc/ and
+ * http://stackoverflow.com/questions/28593223
+ */
+ @Test
+ public void encryptPackageWithoutCoreProperties() throws Exception {
+ // Open our file without core properties
+ File inp = POIDataSamples.getOpenXML4JInstance().getFile("OPCCompliance_NoCoreProperties.xlsx");
+ OPCPackage pkg = OPCPackage.open(inp.getPath());
+
+ // It doesn't have any core properties yet
+ assertEquals(0, pkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(pkg.getPackageProperties());
+ assertNotNull(pkg.getPackageProperties().getLanguageProperty());
+ assertNull(pkg.getPackageProperties().getLanguageProperty().getValue());
+
+ // Encrypt it
+ EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
+ NPOIFSFileSystem fs = new NPOIFSFileSystem();
+
+ Encryptor enc = info.getEncryptor();
+ enc.confirmPassword("password");
+ OutputStream os = enc.getDataStream(fs);
+ pkg.save(os);
+ pkg.revert();
+
+ // Save the resulting OLE2 document, and re-open it
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ fs.writeFilesystem(baos);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ NPOIFSFileSystem inpFS = new NPOIFSFileSystem(bais);
+
+ // Check we can decrypt it
+ info = new EncryptionInfo(inpFS);
+ Decryptor d = Decryptor.getInstance(info);
+ assertEquals(true, d.verifyPassword("password"));
+
+ OPCPackage inpPkg = OPCPackage.open(d.getDataStream(inpFS));
+
+ // Check it now has empty core properties
+ assertEquals(1, inpPkg.getPartsByContentType(ContentTypes.CORE_PROPERTIES_PART).size());
+ assertNotNull(inpPkg.getPackageProperties());
+ assertNotNull(inpPkg.getPackageProperties().getLanguageProperty());
+ assertNull(inpPkg.getPackageProperties().getLanguageProperty().getValue());
+ }
+
@Test
@Ignore
public void inPlaceRewrite() throws Exception {
From d9b5b0239ee5d4e45030345f99d623848e3aed34 Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Sat, 28 Feb 2015 17:49:18 +0000
Subject: [PATCH 021/301] Link to the replacement constructions for the
deprecated ones, and a few extra bits of JavaDoc
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1662979 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/poifs/crypt/EncryptionInfo.java | 28 +++++++++++++------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/src/java/org/apache/poi/poifs/crypt/EncryptionInfo.java b/src/java/org/apache/poi/poifs/crypt/EncryptionInfo.java
index 0418befe2..2c2a42258 100644
--- a/src/java/org/apache/poi/poifs/crypt/EncryptionInfo.java
+++ b/src/java/org/apache/poi/poifs/crypt/EncryptionInfo.java
@@ -68,14 +68,21 @@ public class EncryptionInfo {
public static BitField flagAES = BitFieldFactory.getInstance(0x20);
+ /**
+ * Opens for decryption
+ */
public EncryptionInfo(POIFSFileSystem fs) throws IOException {
this(fs.getRoot());
}
-
+ /**
+ * Opens for decryption
+ */
public EncryptionInfo(NPOIFSFileSystem fs) throws IOException {
this(fs.getRoot());
}
-
+ /**
+ * Opens for decryption
+ */
public EncryptionInfo(DirectoryNode dir) throws IOException {
this(dir.createDocumentInputStream("EncryptionInfo"), false);
}
@@ -131,7 +138,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without fs parameter
+ * @deprecated Use {@link #EncryptionInfo(EncryptionMode)} (fs parameter no longer required)
*/
@Deprecated
public EncryptionInfo(POIFSFileSystem fs, EncryptionMode encryptionMode) {
@@ -139,7 +146,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without fs parameter
+ * @deprecated Use {@link #EncryptionInfo(EncryptionMode)} (fs parameter no longer required)
*/
@Deprecated
public EncryptionInfo(NPOIFSFileSystem fs, EncryptionMode encryptionMode) {
@@ -147,7 +154,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without dir parameter
+ * @deprecated Use {@link #EncryptionInfo(EncryptionMode)} (dir parameter no longer required)
*/
@Deprecated
public EncryptionInfo(DirectoryNode dir, EncryptionMode encryptionMode) {
@@ -155,7 +162,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without fs parameter
+ * @deprecated use {@link #EncryptionInfo(EncryptionMode, CipherAlgorithm, HashAlgorithm, int, int, ChainingMode)}
*/
@Deprecated
public EncryptionInfo(
@@ -171,7 +178,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without fs parameter
+ * @deprecated use {@link #EncryptionInfo(EncryptionMode, CipherAlgorithm, HashAlgorithm, int, int, ChainingMode)}
*/
@Deprecated
public EncryptionInfo(
@@ -187,7 +194,7 @@ public class EncryptionInfo {
}
/**
- * @deprecated use constructor without dir parameter
+ * @deprecated use {@link #EncryptionInfo(EncryptionMode, CipherAlgorithm, HashAlgorithm, int, int, ChainingMode)}
*/
@Deprecated
public EncryptionInfo(
@@ -202,6 +209,11 @@ public class EncryptionInfo {
this(encryptionMode, cipherAlgorithm, hashAlgorithm, keyBits, blockSize, chainingMode);
}
+ /**
+ * Prepares for encryption, using the given Encryption Mode, and
+ * all other parameters as default.
+ * @see #EncryptionInfo(EncryptionMode, CipherAlgorithm, HashAlgorithm, int, int, ChainingMode)
+ */
public EncryptionInfo(EncryptionMode encryptionMode) {
this(encryptionMode, null, null, -1, -1, null);
}
From 54bbd99ce49254411d67a6e3f04e2cfa3f15cb24 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Sun, 1 Mar 2015 17:50:16 +0000
Subject: [PATCH 022/301] Add missing close and handle theme-pptx in
ExtractorFactory. Add creating slide-bitmaps to PPTX integration test.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1663137 13f79535-47bb-0310-9956-ffa450edef68
---
.../apache/poi/stress/XSLFFileHandler.java | 66 +++++++++++++++++--
.../poi/extractor/ExtractorFactory.java | 9 +++
2 files changed, 71 insertions(+), 4 deletions(-)
diff --git a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
index e6cbb184b..b734c4e4b 100644
--- a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
@@ -18,35 +18,93 @@ package org.apache.poi.stress;
import static org.junit.Assert.assertNotNull;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileInputStream;
+import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xslf.XSLFSlideShow;
+import org.apache.poi.xslf.usermodel.XMLSlideShow;
+import org.apache.poi.xslf.usermodel.XSLFNotes;
+import org.apache.poi.xslf.usermodel.XSLFShape;
+import org.apache.poi.xslf.usermodel.XSLFSlide;
+import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
+import org.apache.poi.xslf.usermodel.XSLFTextShape;
import org.junit.Test;
public class XSLFFileHandler extends AbstractFileHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
- // ignore password protected files
- if (POIXMLDocumentHandler.isEncrypted(stream)) return;
-
XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
assertNotNull(slide.getPresentation());
assertNotNull(slide.getSlideMasterReferences());
assertNotNull(slide.getSlideReferences());
new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ slide.write(out);
+ } finally {
+ out.close();
+ }
+
+ createBitmaps(out);
}
+ private void createBitmaps(ByteArrayOutputStream out) throws IOException {
+ XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
+ Dimension pgsize = ppt.getPageSize();
+ XSLFSlide[] xmlSlide = ppt.getSlides();
+ int slideSize = xmlSlide.length;
+ for (int i = 0; i < slideSize; i++) {
+// System.out.println("slide-" + (i + 1));
+// System.out.println("" + xmlSlide[i].getTitle());
+
+ BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
+ Graphics2D graphics = img.createGraphics();
+
+ // draw stuff
+ xmlSlide[i].draw(graphics);
+
+ // Also try to read notes
+ XSLFNotes notes = xmlSlide[i].getNotes();
+ if(notes != null) {
+ for (XSLFShape note : notes) {
+ note.draw(graphics);
+
+ if (note instanceof XSLFTextShape) {
+ XSLFTextShape txShape = (XSLFTextShape) note;
+ for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
+ xslfParagraph.getText();
+ }
+ }
+ }
+ }
+ }
+ }
+
// a test-case to test this locally without executing the full TestAllFiles
@Test
public void test() throws Exception {
- InputStream stream = new FileInputStream("test-data/slideshow/testPPT.pptx");
+ InputStream stream = new FileInputStream("test-data/slideshow/pptx2svg.pptx");
try {
handleFile(stream);
} finally {
stream.close();
}
}
+
+
+ // a test-case to test this locally without executing the full TestAllFiles
+ @Test
+ public void testExtractor() throws Exception {
+ handleExtracting(new File("test-data/slideshow/testPPT.thmx"));
+ }
}
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
index 60a0f5181..46cd2cd38 100644
--- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
+++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
@@ -51,6 +51,7 @@ import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.poifs.filesystem.Entry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.xslf.XSLFSlideShow;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.apache.poi.xslf.usermodel.XSLFRelation;
import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor;
@@ -190,6 +191,14 @@ public class ExtractorFactory {
}
}
+ // special handling for SlideShow-Theme-files,
+ if(XSLFRelation.THEME_MANAGER.getContentType().equals(corePart.getContentType())) {
+ return new XSLFPowerPointExtractor(new XSLFSlideShow(pkg));
+ }
+
+ // ensure that we close the package again if there is an error opening it, however
+ // we need to revert the package to not re-write the file via close(), which is very likely not wanted for a TextExtractor!
+ pkg.revert();
throw new IllegalArgumentException("No supported documents found in the OOXML package (found "+corePart.getContentType()+")");
}
From e13374683adc4c82080085840bf147e02f0f9c96 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Sun, 1 Mar 2015 19:56:56 +0000
Subject: [PATCH 023/301] Bug 57165: Avoid PartAlreadyExistsException when
removing/cloning sheets
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1663153 13f79535-47bb-0310-9956-ffa450edef68
---
.../org/apache/poi/POIXMLDocumentPart.java | 20 +++++++++++
.../apache/poi/openxml4j/opc/OPCPackage.java | 4 +--
.../apache/poi/openxml4j/opc/PackagePart.java | 5 +++
.../poi/xssf/usermodel/XSSFWorkbook.java | 22 ++++++++++--
.../poi/xssf/usermodel/TestUnfixedBugs.java | 34 -------------------
.../poi/xssf/usermodel/TestXSSFBugs.java | 32 +++++++++++++++++
6 files changed, 79 insertions(+), 38 deletions(-)
diff --git a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
index 24b4af238..4759ddbd3 100644
--- a/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
+++ b/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
@@ -349,11 +349,27 @@ public class POIXMLDocumentPart {
* @param descriptor the part descriptor
* @param factory the factory that will create an instance of the requested relation
* @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
*/
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory){
return createRelationship(descriptor, factory, -1, false);
}
+ /**
+ * Create a new child POIXMLDocumentPart
+ *
+ * @param descriptor the part descriptor
+ * @param factory the factory that will create an instance of the requested relation
+ * @param idx part number
+ * @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
+ */
public final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx){
return createRelationship(descriptor, factory, idx, false);
}
@@ -366,6 +382,10 @@ public class POIXMLDocumentPart {
* @param idx part number
* @param noRelation if true, then no relationship is added.
* @return the created child POIXMLDocumentPart
+ * @throws PartAlreadyExistsException
+ * If rule M1.12 is not verified : Packages shall not contain
+ * equivalent part names and package implementers shall neither
+ * create nor recognize packages with equivalent part names.
*/
protected final POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, POIXMLFactory factory, int idx, boolean noRelation){
try {
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java
index e210be6f6..4f3d6ca65 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/OPCPackage.java
@@ -739,7 +739,7 @@ public abstract class OPCPackage implements RelationshipSource, Closeable {
* @param contentType
* Part content type.
* @return The newly created part.
- * @throws InvalidFormatException
+ * @throws PartAlreadyExistsException
* If rule M1.12 is not verified : Packages shall not contain
* equivalent part names and package implementers shall neither
* create nor recognize packages with equivalent part names.
@@ -762,7 +762,7 @@ public abstract class OPCPackage implements RelationshipSource, Closeable {
* Specify if the existing relationship part, if any, logically
* associated to the newly created part will be loaded.
* @return The newly created part.
- * @throws InvalidFormatException
+ * @throws PartAlreadyExistsException
* If rule M1.12 is not verified : Packages shall not contain
* equivalent part names and package implementers shall neither
* create nor recognize packages with equivalent part names.
diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
index 8b72770a7..8cfdb0fb3 100644
--- a/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
+++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/PackagePart.java
@@ -228,8 +228,13 @@ public abstract class PackagePart implements RelationshipSource {
* Relationship unique id.
* @return The newly created and added relationship
*
+ * @throws InvalidOperationException
+ * If a writing operation is done on a read only package or
+ * invalid nested relations are created.
* @throws InvalidFormatException
* If the URI point to a relationship part URI.
+ * @throws IllegalArgumentException if targetPartName, targetMode
+ * or relationshipType are passed as null
* @see org.apache.poi.openxml4j.opc.RelationshipSource#addRelationship(org.apache.poi.openxml4j.opc.PackagePartName,
* org.apache.poi.openxml4j.opc.TargetMode, java.lang.String, java.lang.String)
*/
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
index ae09af141..41a6d613f 100644
--- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
+++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
@@ -751,8 +751,26 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable try next one
+ sheetNumber++;
+ continue outerloop;
+ }
+ }
+
+ // no duplicate found => use this one
+ break;
}
XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFFactory.getInstance(), sheetNumber);
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
index c90ba8061..0e5864b36 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
@@ -17,8 +17,6 @@
package org.apache.poi.xssf.usermodel;
-import static org.junit.Assert.assertEquals;
-
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Calendar;
@@ -184,38 +182,6 @@ public final class TestUnfixedBugs extends TestCase {
}
}
-
- @Test
- public void test57165() throws IOException {
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
- try {
- removeAllSheetsBut(3, wb);
- wb.cloneSheet(0); // Throws exception here
- wb.setSheetName(1, "New Sheet");
- //saveWorkbook(wb, fileName);
-
- XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
- try {
-
- } finally {
- wbBack.close();
- }
- } finally {
- wb.close();
- }
- }
-
- private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
- {
- int sheetNb = wb.getNumberOfSheets();
- // Move this sheet at the first position
- wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
- for (int sn = sheetNb - 1; sn > 0; sn--)
- {
- wb.removeSheetAt(sn);
- }
- }
-
// When this is fixed, the test case should go to BaseTestXCell with
// adjustments to use _testDataProvider to also verify this for XSSF
public void testBug57294() throws IOException {
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
index 0f8549562..1ebb56178 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
@@ -2134,4 +2134,36 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals("~CIRCULAR~REF~", FormulaError.forInt(value.getErrorValue()).getString());
assertEquals("CIRCULAR_REF", FormulaError.forInt(value.getErrorValue()).toString());
}
+
+
+ @Test
+ public void test57165() throws IOException {
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
+ try {
+ removeAllSheetsBut(3, wb);
+ wb.cloneSheet(0); // Throws exception here
+ wb.setSheetName(1, "New Sheet");
+ //saveWorkbook(wb, fileName);
+
+ XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
+ try {
+
+ } finally {
+ wbBack.close();
+ }
+ } finally {
+ wb.close();
+ }
+ }
+
+ private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
+ {
+ int sheetNb = wb.getNumberOfSheets();
+ // Move this sheet at the first position
+ wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
+ for (int sn = sheetNb - 1; sn > 0; sn--)
+ {
+ wb.removeSheetAt(sn);
+ }
+ }
}
From 9ede62441a800e969ff4505c28e2827c4b4803b5 Mon Sep 17 00:00:00 2001
From: Dominik Stadler
Date: Sun, 1 Mar 2015 20:01:43 +0000
Subject: [PATCH 024/301] Bug 57165: also verify that createSheet() had the
same problem and is also fixed now
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1663154 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/xssf/usermodel/TestXSSFBugs.java | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
index 1ebb56178..6eaa3f14d 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
@@ -2156,6 +2156,26 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
}
}
+ @Test
+ public void test57165_create() throws IOException {
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
+ try {
+ removeAllSheetsBut(3, wb);
+ wb.createSheet("newsheet"); // Throws exception here
+ wb.setSheetName(1, "New Sheet");
+ //saveWorkbook(wb, fileName);
+
+ XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
+ try {
+
+ } finally {
+ wbBack.close();
+ }
+ } finally {
+ wb.close();
+ }
+ }
+
private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
{
int sheetNb = wb.getNumberOfSheets();
From aff564220230103395af178d7b9c6c74e1ce88ff Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Thu, 5 Mar 2015 06:31:18 +0000
Subject: [PATCH 025/301] Patch from tntim96 from bug #56799 - Include
CTTblGrid in the smaller poi-ooxml-schemas jar
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1664236 13f79535-47bb-0310-9956-ffa450edef68
---
.../org/apache/poi/xwpf/usermodel/TestXWPFTable.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java
index 00496b299..7d185637f 100644
--- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java
+++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java
@@ -29,6 +29,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblCellMar;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
@@ -64,6 +65,17 @@ public class TestXWPFTable extends TestCase {
assertNotNull(ctTable.getTrArray(0).getTcArray(0).getPArray(0));
}
+ public void testTblGrid() {
+ XWPFDocument doc = new XWPFDocument();
+ CTTbl ctTable = CTTbl.Factory.newInstance();
+ CTTblGrid cttblgrid = ctTable.addNewTblGrid();
+ cttblgrid.addNewGridCol().setW(new BigInteger("123"));
+ cttblgrid.addNewGridCol().setW(new BigInteger("321"));
+
+ XWPFTable xtab = new XWPFTable(ctTable, doc);
+ assertEquals(123, xtab.getCTTbl().getTblGrid().getGridColArray(0).getW().intValue());
+ assertEquals(321, xtab.getCTTbl().getTblGrid().getGridColArray(1).getW().intValue());
+ }
public void testGetText() {
XWPFDocument doc = new XWPFDocument();
From 555e42f4dec6ab8096d6b43ebcf1b02a269f8ad7 Mon Sep 17 00:00:00 2001
From: Nick Burch
Date: Wed, 11 Mar 2015 16:17:41 +0000
Subject: [PATCH 026/301] Give a more helpful exception if a Visio VSDX ooxml
file is passed to ExtractorFactory
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1665929 13f79535-47bb-0310-9956-ffa450edef68
---
.../poi/extractor/ExtractorFactory.java | 19 ++++++++++++++++--
.../poi/extractor/TestExtractorFactory.java | 18 ++++++++++++++++-
test-data/diagram/test.vsdx | Bin 0 -> 32350 bytes
3 files changed, 34 insertions(+), 3 deletions(-)
create mode 100644 test-data/diagram/test.vsdx
diff --git a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
index 46cd2cd38..0bc7eb31d 100644
--- a/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
+++ b/src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
@@ -68,6 +68,8 @@ import org.apache.xmlbeans.XmlException;
public class ExtractorFactory {
public static final String CORE_DOCUMENT_REL =
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
+ public static final String VISIO_DOCUMENT_REL =
+ "http://schemas.microsoft.com/visio/2010/relationships/document";
/** Should this thread prefer event based over usermodel based extractors? */
@@ -158,12 +160,25 @@ public class ExtractorFactory {
}
public static POIXMLTextExtractor createExtractor(OPCPackage pkg) throws IOException, OpenXML4JException, XmlException {
+ // Check for the normal Office core document
PackageRelationshipCollection core =
pkg.getRelationshipsByType(CORE_DOCUMENT_REL);
- if(core.size() != 1) {
- throw new IllegalArgumentException("Invalid OOXML Package received - expected 1 core document, found " + core.size());
+
+ // If nothing was found, try some of the other OOXML-based core types
+ if (core.size() == 0) {
+ // Could it be a visio one?
+ PackageRelationshipCollection visio =
+ pkg.getRelationshipsByType(VISIO_DOCUMENT_REL);
+ if (visio.size() == 1) {
+ throw new IllegalArgumentException("Text extraction not supported for Visio OOXML files");
+ }
+ }
+ // Should just be a single core document, complain if not
+ if (core.size() != 1) {
+ throw new IllegalArgumentException("Invalid OOXML Package received - expected 1 core document, found " + core.size());
}
+ // Grab the core document part, and try to identify from that
PackagePart corePart = pkg.getPart(core.getRelationship(0));
// Is it XSSF?
diff --git a/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java b/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
index 7f79afaad..35198a80e 100644
--- a/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
+++ b/src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
@@ -71,6 +71,7 @@ public class TestExtractorFactory extends TestCase {
private File msgEmbMsg;
private File vsd;
+ private File vsdx;
private File pub;
@@ -109,6 +110,7 @@ public class TestExtractorFactory extends TestCase {
POIDataSamples dgTests = POIDataSamples.getDiagramInstance();
vsd = getFileAndCheck(dgTests, "Test_Visio-Some_Random_Text.vsd");
+ vsdx = getFileAndCheck(dgTests, "test.vsdx");
POIDataSamples pubTests = POIDataSamples.getPublisherInstance();
pub = getFileAndCheck(pubTests, "Simple.pub");
@@ -230,7 +232,7 @@ public class TestExtractorFactory extends TestCase {
);
extractor.close();
- // Visio
+ // Visio - binary
assertTrue(
ExtractorFactory.createExtractor(vsd)
instanceof VisioTextExtractor
@@ -238,6 +240,13 @@ public class TestExtractorFactory extends TestCase {
assertTrue(
ExtractorFactory.createExtractor(vsd).getText().length() > 50
);
+ // Visio - vsdx
+ try {
+ ExtractorFactory.createExtractor(vsdx);
+ fail();
+ } catch(IllegalArgumentException e) {
+ // Good
+ }
// Publisher
assertTrue(
@@ -342,6 +351,13 @@ public class TestExtractorFactory extends TestCase {
assertTrue(
ExtractorFactory.createExtractor(new FileInputStream(vsd)).getText().length() > 50
);
+ // Visio - vsdx
+ try {
+ ExtractorFactory.createExtractor(new FileInputStream(vsdx));
+ fail();
+ } catch(IllegalArgumentException e) {
+ // Good
+ }
// Publisher
assertTrue(
diff --git a/test-data/diagram/test.vsdx b/test-data/diagram/test.vsdx
new file mode 100644
index 0000000000000000000000000000000000000000..1fa690356e477ef15c1e9605e9f7312576b382f7
GIT binary patch
literal 32350
zcmeEt^PA{Qw`HHUZQHhu)9yZP+qP}nwr$(CZQGjj-8=Vv?#z7i7tG{`q>^1vQhQac
z?44B=IY}U3WB^bAZ~y=R0sxk|V1lq;003Jc002k;;D8!JHr9?t){Z)gZnj1aTC}cK
zmiYO=faJLVfPd@%|Ly-_1R52`tOMxbyHw8k@O7wc{tmQOsxYKD>6N)br!(lUwa#Mi{@ez
zfLs}Kwzj2Gz@T^q8lO4TLUi#co;+c~-zHUOTNThtRC`rg@{{jmn*lj7qOK{}IDKKw
zLa_~5y@LI%#$!7#?;Ngx6$Ro;-Zc})!xRyEWDj6@BJAYeVMEn4B&GqC#ah%IGmD}s
zpyQS>dXkrS@}6{%_ovG$asXkjaSj~+@Yn0ob}|HQpDF9BDWZ4FtGYU;kzp$FR?(-~
zT82!GA}73`USznW4nhY*rRT?DuM6WhYx|;?
zPqFc$KbgFx7nithNqx=%O~Y7a^H4YPSmCFvyU7@EYZ{ae9`X@W!&Z-A0jv-_qU^f=
z+PMt4539X6WOwhs1YNVnUugr=3NXS!AVg
z-}3Hu*Q-Wc3+ZlBcjyu6simb;rCkRm5u;z?Whg#09Pc9hEgwqG#SG7MGFO~23<8uG
zori*Z2-ZlR?B-3^uLGkU#k?k(#BI3qypJlAa5{O!M
zI6ju57#$K#E$_ep)7VK3?-bzHlKTOXn9~6*%`~Dgd5caH5K)~c#Yxo6Ns`&DeRxn6
z!Th2-J74pqa#81Pj^e_!jMUaqJcpRmJw>{YW*>Su$+w2>E<>=TjR@fqsGP?M1G0@5
zHh8L{nDZB?|C3d^j#{l@NB{taE&u?Ce``3KIhfhd8QK^)S^bTU{|bwjS{e=qt##hA
zO5XwH_qm69l^I5B8qEsr?wLF$R?F9M
z>iC#3`3vSunM)UXyf=WOOi;W&6QAkauoYJj*%$wqe(yclVbr0zF$-|V-`Uuw>^OweTYL}T%EuA*9tSt`S
z^b``mD4He2G*AI|l#p#YnK?rDOCm+Isp!q{n)Fd!DSl^Eep&UmeI;6UfpA$^8zk4h
zrm@V(J`g%27tbaZ-oablbdmuG0FhZ9UHL!yc}bp}Ndmxm-0vmfF<$IV!U10F4NdDD
z&kB{^6Ry^Ewm&2+B;S2G;<{^yUu8eaY78UE*h~*nY
zD4>(w`vYbO$6qOBWeAoTU4Rd0y#KR6AEkqtk~5ROHDG-3t?#(}xu6@IL)w@q#PXXj
zQKs?7E`zUq*!kc^)KO{2dPDp_NA&9!+4EmdVG%OI`-~W++hdAZTQo{Dk$$s<^
zm=C#-iU5Byu@c--RngI&IWtN;^m1#?k~_<}G~Dn8*BLY`fdNFmi;IgFH;O#;e5((g
z7g_lEI`KyyeytYd%!_~Ov%D2Gym${dW0S-K&Sy{
z*EIm%j+D+)>VeDBL%k0V`A|8TlN~KGE{{5I|U~e0mLr?P3ozE!pO*
zk^QzX46G$9ZNeR`c!9L2Z*`wf7K<5hC7ABYFf}+Pn~AiZ@hq?ZFM){lK{b?35^KI$d@&a>Bza9m>NvZlXDVe;S5=OeE>ktZ=K
zMTe9(#X8_s_&QdZHDM3f-#K4=j561kim>X)_zoRi#54Mf9-CPO>Iy0nraVHs*x_n=YpzqLMe>NGqRa1J8q3Cq!GZx5?$qkSV
zoeFfxMnzM^?>%w6nl4)PD<0P)1W2sbd1MIC5I%{~%#e$8IW-q!sAarNXX$TqLd}92
zw(}I*xQ=_Uiv=o!w5fWg~^TZqsfPOkw0&Hjq0;r
zDB>;NDVE$JAbc*#fMmkmbV|Px!M?&~>0fVqeaxn14dJzWLaWwkb)O|Mv1{B*N)~?t
z$Uv!MhIdB#$O0;^KmnHzMiu!gmyf&T)SF>6uzWkE
z>0TAy6rKb9NI>&!i&zUEs?{Okgdm*}y5!@j+jM0$-kcGbS_R4GZO~&}3KE=|-|uyg
zz%tkd%z80m{AHCT){%;MPuhN;qtAIRxb15*#o7@-Pg)b>A9a>hx+|T0PV;oPk$T*zDR3v23>2m
z0(IkXvhTYnaeQK$fL4f-jP9cFzMeMERUYlGf5S5H8N(bRnKO#On?Ur2e-OIfIPx_$
zkb0~*M?B~aUPzS^%h?KXP8-8f`H*Z->Zp2jSx7_V(sIxr%$-UCvtITSIN1+PoLN*y
zH3iJ}QFWPJ%Y_yxlEF+d;La$X?vi#8xE+Qk`)(aB8NYoCYEyHw&UJtuSj1J7)b}<<
zsu!ngcPoQ{Z?%4{`*!kYIQgIx%IaMU-iwA{pqUP3j$4IFzR?m(3mM?CqR>5e-}=g?
zV=5VyAE=dTRL%E5^08qU5MbJSm~|46kIf*R*96*?O{&Z&9d6MROHMmKzo-<<8O~V3
zb0}L)SK&qt&;py5id9+|XLfP5(Q_-1CPNy##ExEycHk;H6=UFJR7XFkAk|GLG$@5C
z-++ExF(@UYmZquA)`UmwqiK@O0nQ$_-0X`{$-pO-6TL#WaQNrdb-}al
zF0(2fVp&asC!G_s`Lee?ZL2KrzKW*ROR%!OK
zN3(IsOLO^zS(7RltjKF~Hzab)DJ=NuMU7|%NnzWE{UfQbBM2Y?6+#u^!MSwh0qp3M
zAG;V1ULEE}h8>V;2yQ<){O|%^#(z6ZL9CIVQ&M(X6rvb!IYx>p-Y##D8Lc9Fo+uexgRIr>6!Im5mO
zJntTsuJB-HVq*qG4=9eygDvitM#SQXuiKw%X5k|Yj2C?zmRMN-8SFi8I1&Qv0wgHL
zHeX>Ai~*ts*?QqvLV%eZs}994fg)1q*8vzWhYy`sZ|1|&*B
z;5KeI@VV0MC6`SZ1*e9Gy%{AQ#}Qgb(f2jn*w<0iQ*?^qS1^Zun?40aQ12yj-r*l)
zTIM1ETs!CA1S)8>wkV-BuduVofJy?pWERk_ob+m!m<4B>&KB|lRtsf$jkfqOwjz&A
zxae8~0jHjHAw<0GU0wbQ4l1i?UZh*pDMT<2m%-~|p-#1JWT(UVwUnpp$CzGTTJ!DV
zmtG)TpBdx5-VzPb)_ISd<|wVuE8hh<`l^&nAlApL`ipoE=!M6v`h8=t`6y6Mn92pG
zA(B!K9*+d$cYi2!_vqKQ5UY`%<80l2@!GEM(L=W>BsAE;+a=EXrA7>aJ#h4157|CL
zGn_mue4J9v^q5<`;hI{x;`NFH$~w#)7Y#(&3X>1xq9Arf+_#l8ppwEy)4EO#!-`hX
zfVt0$*%d&SfZ**)(ZK2|jRwmd_&}9KGaJErfT>0--%Zo9ggL`6$A_A}G&T#U#F~dr
z1GyQFa81@#!y@fK8QEZU!yDTHUv79Jd~7s=3O~Y0pR!SmEPFdA!=hFLx)f!LK+M+XeQ8w-kxdpvsO&e0~x6hC}d>o>Pz
z9H==d|Itcj0GkGhwmD!O6lPIT&I0l`bAZ7n(}t7f9ln;^sm=T><`iZhQ=N_DB?B0(
zK<;Hhnq~}oV;T0U0p`B8qJ66ezG&yQlM`hzJYwgen2ZVxEf^nn7}zE5NzD(bFc#oW
z(ny)&0ZeePCvqiX;v1%kE0KuUHWBlzZ`(Z1i6(p%qFl2w>S@FF);L;3)^{Wv`ntx$ZUZemluSo
zO2ZeIYCO~cuobQv0>D`Z|Ft4cn5oPsJ7O%!jKIK#Ya-=!&Djp?qJ_zGsvw)~PT~q6{~U|K>%1Z~9B=h%
zjfy(_I)*zM-`)`idr@xE_Ux{`5FLTA-OH8O)v
zHs!KUm1)KCu;=~oG&%LBkL45Z`RN<%3)KMjbUOCB96k4^+$Da7AxY79SjlRLVM0*j
z%#xi|503q`I%!CL8qa^+<5uhpsto1mQsC3;);T%kG$#UX;A1Rj!)MN_=3K#1>A9>3
zK8~*SA-sk={{S^HL~z10Ci~c<7YF-yrK1NPYuBkyF98LtH>!)j&8hg9O-~8AB7+w+
zZFri`pj}N<3U{eOdF@!G((ty|GNq_i4w0hPHNw`$C|;K|jl!BxS^eh~gmo0js7MgV
z(+VU5W&4%XY?#IjaCqmJ)GmJ71l6`bsqV6sDWF0tiZp(uCI;X@
z3gkmFvtPcABohC0wQa<_oFfuGp)d)6Q^Y)gd<(hOJaP?FyKNAc6)ie@>G72W+HAXv
z7yyA1
z&{wiCg=kNeI6#<22BriT1lEc)iQ`8RCAp!o?!m_!CE&QadmgEF_jD<MVB-Lh{(oB}$Z~8_i1PJ(>+wcTqCZ;;e+fwGCbl0`M
zM?dW}p6!!DSVHwRah#M19C!TDp;@45BNVCt8}(BG*}Si=Alya-H&?!{Y;SDsueDIS
zbh}V>+pojwdS5Cz0m+0DU2zx!rV_>AB#-yQ%uVoZd#;QKR4FAj+Vo2qmKn;9QfhYr
z$$;|H-wpO?avZcth &^l68FqWSFc_Yzq`>njz-Wk~5q0|xT99E%?fe;l}
zA1A||A_kE3Tj{qnBHLp7ljN&i=kxxR4jQa8{V~n1dsi$$+F=ceq8m3Yj}p)oPGa&%8y7$G(otZ@nEmMSduXJ@!DIXjBzK
z9YQ7LLst$k-sD;YI{wCB`%8UmYFO8(8)cY=OGl{MO{-FK_%v)cvHL7n1>QX-z^tc|
zd#KRVbY2Xbg5h$(ZZKPbb|Qh52bW0&s9LNsZ27RUA(Ilm(G&ai$39Hq!dR?D2}?{d
zkn|j_IoJh4+DTQ|KAYAPSk3k#KQBV^>Dm|Dui7p+
zR6#Rrg!iN;yijh>oCMSsnp=*`l=)U~N_Jl*zoUk(l3BQuyo$tQUDAWJ~AJ?UHFQv10z^#H`C5nQ>z%cqa0(O;&*6
zjr2YD4v+PL=`X&10&hjd2L?X(TO|I@cn?=U(AyzT`dGJb+Zr;_fu*b|<<2cAyb9Hz
z(p^%_>p!PtxY8tTSY`2?Y|!0(H$?lhCOue&MK}TxZ!`PGH<9KTJxLzlbbmGPe4I2zeI(EX=4{y)$DrQ-dEPTm+hVLreQE%M^`Igsl`vk`$P
zIJ^x~Pjd|hZ7_tp??#U)`1yj8D2P)(bx-Ixoh0)$KzA;arUi|eUJfeKH#`?4KJa4u
z&F;Ie-*1|X{(C?I+N)(JtJ{=8B-zzDEJ+T~B2`jcOt_iJZ9qv1+0Z^}ErXCjHZ`&<
zEv&ZcLU!^8W7aD5oY8zVr4EFpQhZX@^2Rb6yQZjq?qF-|7ogQS4RVoa9yN3V86~E-
zgN8Uw@5=Bo&hYU}XvT;W-@nBnW+3gd^{)l$FAn(s;9#p~V)S1q{73m83^ZqEAp7Z|
zL2o;Dxe_0UKRK3>Qmy)T{1x^6H=sFOp#HHO`}7zP#7Fe@g(U|
z#te;FUJkG)el+up-dp%;r|D-RC)%C!Ywn~a{9Nu@i6>q+)lrO=oB&2TUtu0`hft^P
z*HXU9XbsT$Ep}-t&EoxAuPb9>r2+qX9Qb#(66YVU|FhTsyLkH_-Ch{qXZ}|f7rqJl
z4p{Y|;i4%@9BoVFuO|5dAgHmDm!u*lG5hY8JdbZ}Z961(4m`PXZPfH?6S!m`mDCnc
zO2nVVGOxTr_Ox7qqr?BR+&u^6rf53|T=D*G{T3ZC{V9KL_1j;|^Uv%Fwsw(Ju~>!UMs0U~o;&0WQGre782sju-b23a>Ga=W>ze5H_BI><
z8OleCinx_Fr?IQTBd`tr^5m{`u@9p|R-?Udw7w;A4h^m_>RX^kJ6UZ*4%70n2W~K5
zk8tkAyyhAfw^5VRc{5Bj|SOrGd27SW*)I`;*of
z>?%x=ln%GS*=6=t0~$^icS=yxFEyqfC1d
zsf*M@38j!|g%Xa$#%9T63Hb=AwK8&?I3sEhlY!ZigO2Q*#6-LKRornN3;ADSJ!!Ed
zN=-C}z>UcNruK4-cErCiKwOunj~>pu0LjLKZf}8mU&f2-+H++`
z{|GRhMI__!tuKxg%5NTKs-snt@BF6ORqOi1!OIeoS6z{o+gbZ_^gBT0mLA{d5<~!5
z^xKx15VhFONhGs-h)uUb6C+`CncW5*bPpeVvxPd|^No3;9&@pa!Om(Xf_vsEAn&Fl
zATEaEdae_b2fZKwPR(p6s+lGZD>5MNB07Jr_o;slK*K!dOmLp;vh9b(phvf^Dwp6A
za_MP9jG9=Zir@U}#5XH8J3{a`^$~V`LsgUMxZt|A;8oW0eiI~8c7s?kqD+OCaaF%!
zA>Xka%4#tUzlk?%hI9wRbu8LNxh{p$jh+pe3%g28rLK9$OxeZKjQxs!aeNHOM_aH$
zH>ERjR`NVJ(GQ6<3Z$NT9hNcG5%ziYx;C0VWzGU5;$)%O)OJ@K`Wzs0IAB_PzJ1XPT6D3+#~#*HMVtdqBwhfm@Dsys
znw&%;Ua!P(60ANc1}%L9sdQ(zGOIwDtq|GYY;M#+E$@Rc+7Nu7y{Mv#$RTnb1SU$^flBm&?@vhjFYKT7BVwjb`CN|bLF
zJ9#s$B2#+ET4EDj?q3x|O47(ZRUWk|soh4C8R8O(_842p+d-E`{yoX&_?&~1{w}s4
z_&d3T@ej%VD?a_V$aJY9@377e@BNo(0Xv_u=xf8e34V@-NSMd*$xzZYUW$?Q(-<2~
zBII3dKi(bnzcA7p#c%2)=;zNDO16@yy&iWwwMf^2=*HP4!P=J?ouW$gSR)opb87}S
zZym3u-Y!(WER-RA&3t7i{JP-@`G^Xk(LBe-mlJ0NOjYJd`pc`zP4$A-#8zdpK>3?}AN3he8Y^bF*#KJvx
z?vl{qwt8!SltqOAZ7nysSdQ6%xyRPlM+#|SrSz2}uhlnepzI?6915+FiZo9S@rTsu
zCCePx(Bq_d2tc
zlQSbp%R9zkJW&^~xx@(%EcJ
z0H7X@YHpZ3u7;6kjSh}8cS;_E_WTzj(CpO+Tc-zMcrY9cXwk^PX4FAJkC?Jyh9;Qk
z;u;W~d3VCy*sJ#mj^*+5~`+Cdt3;%^d4O#6wov8rf>v0cZ-
zUAZ8pZ-%KS_Hu&GU5QX;_6a6w>el3eD3|aiMU5oQbk^>{i}B_Sg>POvzmL)Xz;jQ3lO<=waMNWvSqu$>k1tFa9*
zn+iP*f{f9Muy>eWsEW%BcF2XuHm*zqPn|UP_W>0{eNeU*i8}}9{bj2zJWo}H?@D8Q
z`~g1k)?n4>iEFtg+8E*}(jYL-`I2ccRv!~KSaw%R(tpHUWaTPztKPRc_$gFhGQ(YZ
zw3;lBWPVtI@m=T?RgWFd86fhUP)z%z_gl&^7`g
z!Q02gu<*ua#3J+Zuk>-g<|U38M$yE?RaKTfNxOaj`)m_SI6OQ96ae55`~UtfXZ%-&
zJ*lQ;v%!k&g;)EN>jWn;uSiM}mml6LWK3q|J1B0z)|3OeB(JYmPySnC{c`2zd;rmG
zAsh@k^