You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2021/03/16 19:26:38 UTC
[tika] branch main updated: TIKA-3316 -- fix for slightly different
behavior of RereadableInputStream
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new ba9bcb2 TIKA-3316 -- fix for slightly different behavior of RereadableInputStream
ba9bcb2 is described below
commit ba9bcb2559a0aed0351a0ea338de3f6f60542bfe
Author: tallison <ta...@apache.org>
AuthorDate: Tue Mar 16 15:26:20 2021 -0400
TIKA-3316 -- fix for slightly different behavior of RereadableInputStream
---
.../microsoft/ooxml/OOXMLExtractorFactory.java | 3 +-
.../parser/microsoft/ooxml/xps/XPSParserTest.java | 7 ++--
.../org/apache/tika/zip/utils/ZipSalvager.java | 42 +++++++++++++---------
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
index baadeaa..cc81c99 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
@@ -23,6 +23,7 @@ import java.io.InputStream;
import java.util.Locale;
import org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException;
+import org.apache.commons.io.input.CloseShieldInputStream;
import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.ooxml.extractor.ExtractorFactory;
import org.apache.poi.ooxml.extractor.POIXMLTextExtractor;
@@ -107,7 +108,7 @@ public class OOXMLExtractorFactory {
try (RereadableInputStream rereadableInputStream =
new RereadableInputStream(stream, MAX_BUFFER_LENGTH, false)) {
try {
- pkg = OPCPackage.open(rereadableInputStream);
+ pkg = OPCPackage.open(new CloseShieldInputStream(rereadableInputStream));
} catch (EOFException e) {
rereadableInputStream.rewind();
tmpRepairedCopy = File.createTempFile("tika-ooxml-repair-", "");
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
index 9c3ae65..d154a05 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/xps/XPSParserTest.java
@@ -19,7 +19,6 @@ package org.apache.tika.parser.microsoft.ooxml.xps;
import org.apache.tika.TikaTest;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaCoreProperties;
-import org.apache.tika.sax.AbstractRecursiveParserWrapperHandler;
import org.junit.Test;
import java.io.ByteArrayInputStream;
@@ -102,7 +101,8 @@ public class XPSParserTest extends TikaTest {
@Test
public void testXPSWithDataDescriptor() throws Exception {
Path path = Paths.get(
- XPSParserTest.class.getResource("/test-documents/testXPSWithDataDescriptor.xps").toURI());
+ XPSParserTest.class.getResource(
+ "/test-documents/testXPSWithDataDescriptor.xps").toURI());
//test both path and stream based
List<Metadata> metadataList = getRecursiveMetadata(path, true);
assertEquals(2, metadataList.size());
@@ -123,7 +123,8 @@ public class XPSParserTest extends TikaTest {
@Test
public void testOpenXPSWithDataDescriptor() throws Exception {
Path path = Paths.get(
- XPSParserTest.class.getResource("/test-documents/testXPSWithDataDescriptor2.xps").toURI());
+ XPSParserTest.class.getResource(
+ "/test-documents/testXPSWithDataDescriptor2.xps").toURI());
List<Metadata> metadataList = getRecursiveMetadata(path, true);
assertEquals(2, metadataList.size());
assertContains("How was I supposed to know",
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
index f39ef91..92f51c6 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-zip-commons/src/main/java/org/apache/tika/zip/utils/ZipSalvager.java
@@ -28,10 +28,12 @@ import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.IOUtils;
-import org.apache.tika.utils.RereadableInputStream;
+import org.apache.commons.io.input.CloseShieldInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.tika.utils.RereadableInputStream;
+
public class ZipSalvager {
private static final Logger LOG = LoggerFactory.getLogger(ZipSalvager.class);
@@ -42,25 +44,29 @@ public class ZipSalvager {
* may be truncated, but the result should be a valid zip file.
* <p>
* This does nothing fancy to fix the underlying broken zip.
+ * <p>
+ * This will close the inputstream
*
* @param brokenZip
* @param salvagedZip
*/
- public static void salvageCopy(InputStream brokenZip, File salvagedZip, boolean allowStoredEntries) throws IOException {
- if (!(brokenZip instanceof RereadableInputStream)) {
- brokenZip = new RereadableInputStream(brokenZip, 50000,
- true);
- }
+ public static void salvageCopy(InputStream brokenZip, File salvagedZip,
+ boolean allowStoredEntries) throws IOException {
+
try {
+ if (!(brokenZip instanceof RereadableInputStream)) {
+ brokenZip = new RereadableInputStream(brokenZip, 50000, true);
+ }
+
try (ZipArchiveOutputStream outputStream = new ZipArchiveOutputStream(salvagedZip);
- ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(brokenZip,
+ ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(
+ new CloseShieldInputStream(brokenZip),
"UTF8", false, allowStoredEntries)) {
ZipArchiveEntry zae = zipArchiveInputStream.getNextZipEntry();
try {
processZAE(zae, zipArchiveInputStream, outputStream);
} catch (UnsupportedZipFeatureException uzfe) {
- if (uzfe.getFeature() ==
- UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
+ if (uzfe.getFeature() == UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
//percolate up to allow for retry
throw uzfe;
}
@@ -71,17 +77,19 @@ public class ZipSalvager {
outputStream.flush();
outputStream.finish();
} catch (UnsupportedZipFeatureException e) {
- //percolate up to allow for retry
- throw e;
+ //now retry
+ if (allowStoredEntries == false && e.getFeature() ==
+ UnsupportedZipFeatureException.Feature.DATA_DESCRIPTOR) {
+ ((RereadableInputStream) brokenZip).rewind();
+ salvageCopy(brokenZip, salvagedZip, true);
+ } else {
+ throw e;
+ }
} catch (IOException e) {
LOG.warn("problem fixing zip", e);
}
- } catch (UnsupportedZipFeatureException e) {
- //now retry
- if (allowStoredEntries == false) {
- ((RereadableInputStream) brokenZip).rewind();
- salvageCopy(brokenZip, salvagedZip, true);
- }
+ } finally {
+ brokenZip.close();
}
}