This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch branch_3x
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/branch_3x by this push:
new f9dea5b974 TIKA-4995: parsers no longer carry per-document state
across parses (backport of #3406, #3408) (#3499)
f9dea5b974 is described below
commit f9dea5b974a0bec2035e143d881d701d7aa0d220
Author: Tim Allison <[email protected]>
AuthorDate: Mon Nov 2 12:22:24 2026 -0500
TIKA-4995: parsers no longer carry per-document state across parses
(backport of #3406, #3408) (#3499)
---
CHANGES.txt | 9 +++
.../apache/tika/parser/envi/EnviHeaderParser.java | 28 +++----
.../tika/parser/envi/EnviHeaderParserTest.java | 41 +++++++++++
.../apache/tika/parser/indesign/IDMLParser.java | 46 ++++++------
.../tika/parser/indesign/IDMLParserTest.java | 10 +++
.../apache/tika/parser/iptc/IptcAnpaParser.java | 85 ++++++++++------------
.../tika/parser/iptc/IptcAnpaParserTest.java | 58 +++++++++++++++
7 files changed, 194 insertions(+), 83 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index e7f20c636d..f67bcbef7f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,14 @@
Release 3.4.0 - ???
+ * IptcAnpaParser no longer carries the wire format across parses: an
unmarked wire
+ parsed after a Reuters/AP/NYT/Bloomberg one inherited that agency's format
rules
+ and publisher (TIKA-4995).
+
+ * EnviHeaderParser and IDMLParser keep per-document state local to the parse:
+ EnviHeaderParser reported a second multi-line field under the first
field's key and
+ carried a previous document's description; IDMLParser's page counts
accumulated
+ across parses.
+
* GDALParser passes the input path to gdalinfo as one argument; a path
containing
whitespace was split into several arguments.
diff --git
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
index 4b715d2ec1..ba27bb8144 100644
---
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
+++
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java/org/apache/tika/parser/envi/EnviHeaderParser.java
@@ -47,10 +47,6 @@ public class EnviHeaderParser extends
AbstractEncodingDetectorParser {
private static final Set<MediaType> SUPPORTED_TYPES =
Collections.singleton(MediaType.application("envi.hdr"));
- private List<String> multiLineFieldValueList = new ArrayList<>();
-
- private transient XHTMLContentHandler xhtml;
-
public EnviHeaderParser() {
super();
}
@@ -78,9 +74,9 @@ public class EnviHeaderParser extends
AbstractEncodingDetectorParser {
Charset charset = reader.getCharset();
// deprecated, see TIKA-431
metadata.set(Metadata.CONTENT_ENCODING, charset.name());
- xhtml = new XHTMLContentHandler(handler, metadata);
+ XHTMLContentHandler xhtml = new XHTMLContentHandler(handler,
metadata);
xhtml.startDocument();
- readLines(reader, metadata);
+ readLines(reader, metadata, xhtml);
xhtml.endDocument();
} catch (IOException | TikaException e) {
LOG.error("Error reading input data stream.", e);
@@ -88,18 +84,19 @@ public class EnviHeaderParser extends
AbstractEncodingDetectorParser {
}
- private void readLines(AutoDetectReader reader, Metadata metadata)
- throws IOException, SAXException {
+ private void readLines(AutoDetectReader reader, Metadata metadata,
+ XHTMLContentHandler xhtml) throws IOException,
SAXException {
// text contents of the xhtml
String line;
+ List<String> multiLineFieldValueList = new ArrayList<>();
while ((line = reader.readLine()) != null) {
if (line.contains("{") && !line.endsWith("}") || line.startsWith("
")) {
- String completeField = parseMultiLineFieldValue(line);
+ String completeField = parseMultiLineFieldValue(line,
multiLineFieldValueList);
if (completeField != null) {
- writeParagraphAndSetMetadata(completeField, metadata);
+ writeParagraphAndSetMetadata(completeField, metadata,
xhtml);
}
} else {
- writeParagraphAndSetMetadata(line, metadata);
+ writeParagraphAndSetMetadata(line, metadata, xhtml);
}
}
}
@@ -107,7 +104,8 @@ public class EnviHeaderParser extends
AbstractEncodingDetectorParser {
/*
* Write a line to the XHTMLContentHandler and populate the key, value
into the Metadata
*/
- private void writeParagraphAndSetMetadata(String line, Metadata metadata)
throws SAXException {
+ private void writeParagraphAndSetMetadata(String line, Metadata metadata,
+ XHTMLContentHandler xhtml)
throws SAXException {
if (line.length() < 300) {
String[] keyValue = line.split("=", 2);
if (keyValue.length != 1) {
@@ -219,10 +217,12 @@ public class EnviHeaderParser extends
AbstractEncodingDetectorParser {
* check it made to ensure the multi-line contents are contained in
* opening and closing braces.
*/
- private String parseMultiLineFieldValue(String line) {
+ private String parseMultiLineFieldValue(String line, List<String>
multiLineFieldValueList) {
multiLineFieldValueList.add(line);
if (line.endsWith("}")) {
- return String.join("", multiLineFieldValueList);
+ String completeField = String.join("", multiLineFieldValueList);
+ multiLineFieldValueList.clear();
+ return completeField;
} else {
//do nothing
}
diff --git
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/envi/EnviHeaderParserTest.java
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/envi/EnviHeaderParserTest.java
index 1f746983b6..b1d15b31ec 100644
---
a/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/envi/EnviHeaderParserTest.java
+++
b/tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/test/java/org/apache/tika/parser/envi/EnviHeaderParserTest.java
@@ -17,6 +17,8 @@
package org.apache.tika.parser.envi;
import static org.apache.tika.TikaTest.assertContains;
+import static org.apache.tika.TikaTest.assertNotContained;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.io.ByteArrayOutputStream;
@@ -28,6 +30,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
@@ -156,4 +159,42 @@ public class EnviHeaderParserTest {
public void setMetadata(Metadata metadata) {
this.metadata = metadata;
}
+
+ @Test
+ public void testMultiLineFieldsDoNotLeakAcrossParses() throws Exception {
+ // one instance serves every parse: the first document's multi-line
description
+ // must not surface in the second document's content or metadata
+ parse("/test-documents/envi_test_header.hdr", new
ToXMLContentHandler(), new Metadata());
+ ToXMLContentHandler second = new ToXMLContentHandler();
+ Metadata secondMetadata = new Metadata();
+ parse("/test-documents/ang20150420t182050_corr_v1e_img.hdr", second,
secondMetadata);
+ String content = second.toString();
+ assertNotContained("GEO-TIFF File Imported into ENVI", content);
+ assertContains(
+ "<p>description = { Georeferenced Image built from input GLT.
" +
+ "[Wed Jun 10 04:37:54 2015] [Wed Jun 10 04:48:52
2015]}</p>",
+ content);
+ assertEquals("{ Georeferenced Image built from input GLT. [Wed Jun 10
04:37:54 2015] " +
+ "[Wed Jun 10 04:48:52 2015]}",
secondMetadata.get("envi.description"));
+ }
+
+ @Test
+ public void testSecondMultiLineFieldStartsEmpty() throws Exception {
+ String header = "ENVI\ndescription = {\n first}\nband names = {\n
Band 1,\n Band 2}\n";
+ try (TikaInputStream tis =
TikaInputStream.get(header.getBytes(StandardCharsets.US_ASCII))) {
+ parser.parse(tis, handler, metadata, new ParseContext());
+ }
+ assertContains("<p>band names = { Band 1, Band 2}</p>",
handler.toString());
+ assertEquals("{ first}", metadata.get("envi.description"));
+ assertEquals("{ Band 1, Band 2}", metadata.get("envi.band.names"));
+ }
+
+ private void parse(String resource, ToXMLContentHandler handler, Metadata
metadata)
+ throws Exception {
+ try (TikaInputStream tis = TikaInputStream.get(
+ EnviHeaderParser.class.getResourceAsStream(resource))) {
+ assertNotNull(tis, "Test ENVI file '" + resource + "' not found");
+ parser.parse(tis, handler, metadata, new ParseContext());
+ }
+ }
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
index a76bf90b10..f3b1f15c50 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/indesign/IDMLParser.java
@@ -63,16 +63,6 @@ public class IDMLParser implements Parser {
*/
private static final String META_NAME = "META-INF/metadata.xml";
- /**
- * Internal page count.
- */
- private int pageCount = 0;
-
- /**
- * Internal master spread count.
- */
- private int masterSpreadCount = 0;
-
@Override
public Set<MediaType> getSupportedTypes(ParseContext context) {
return SUPPORTED_TYPES;
@@ -101,24 +91,25 @@ public class IDMLParser implements Parser {
XHTMLContentHandler xhtml = new XHTMLContentHandler(baseHandler,
metadata);
xhtml.startDocument();
EndDocumentShieldingContentHandler handler = new
EndDocumentShieldingContentHandler(xhtml);
+ PageCounts counts = new PageCounts();
if (zipFile != null) {
try {
- handleZipFile(zipFile, metadata, context, handler);
+ handleZipFile(zipFile, metadata, context, handler, counts);
} finally {
zipFile.close();
}
} else {
try {
- handleZipStream(zipStream, metadata, context, handler);
+ handleZipStream(zipStream, metadata, context, handler, counts);
} finally {
zipStream.close();
}
}
- metadata.set("SpreadPageCount", Integer.toString(pageCount));
- metadata.set("MasterSpreadPageCount",
Integer.toString(masterSpreadCount));
- metadata.set("TotalPageCount", Integer.toString(pageCount +
masterSpreadCount));
+ metadata.set("SpreadPageCount", Integer.toString(counts.pages));
+ metadata.set("MasterSpreadPageCount",
Integer.toString(counts.masterSpreadPages));
+ metadata.set("TotalPageCount", Integer.toString(counts.pages +
counts.masterSpreadPages));
xhtml.endDocument();
@@ -128,36 +119,37 @@ public class IDMLParser implements Parser {
}
private void handleZipStream(ZipInputStream zipStream, Metadata metadata,
ParseContext context,
- ContentHandler handler) throws IOException,
TikaException, SAXException {
+ ContentHandler handler, PageCounts counts)
+ throws IOException, TikaException, SAXException {
ZipEntry entry = zipStream.getNextEntry();
if (entry == null) {
throw new IOException("No entries found in ZipInputStream");
}
do {
- handleZipEntry(entry, zipStream, metadata, context, handler);
+ handleZipEntry(entry, zipStream, metadata, context, handler,
counts);
entry = zipStream.getNextEntry();
} while (entry != null);
}
- private void handleZipFile(ZipFile zipFile, Metadata metadata,
ParseContext context, ContentHandler handler)
- throws IOException, TikaException, SAXException {
+ private void handleZipFile(ZipFile zipFile, Metadata metadata,
ParseContext context, ContentHandler handler,
+ PageCounts counts) throws IOException,
TikaException, SAXException {
ZipEntry entry = zipFile.getEntry(META_NAME);
if (entry != null) {
- handleZipEntry(entry, zipFile.getInputStream(entry), metadata,
context, handler);
+ handleZipEntry(entry, zipFile.getInputStream(entry), metadata,
context, handler, counts);
}
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
entry = entries.nextElement();
if (!META_NAME.equals(entry.getName())) {
- handleZipEntry(entry, zipFile.getInputStream(entry), metadata,
context, handler);
+ handleZipEntry(entry, zipFile.getInputStream(entry), metadata,
context, handler, counts);
}
}
}
private void handleZipEntry(ZipEntry entry, InputStream zip, Metadata
metadata,
- ParseContext context, ContentHandler handler)
+ ParseContext context, ContentHandler handler,
PageCounts counts)
throws IOException, SAXException, TikaException {
if (entry == null) {
@@ -173,15 +165,21 @@ public class IDMLParser implements Parser {
Metadata embeddedMeta = new Metadata();
ContentAndMetadataExtractor.extract(zip, handler, embeddedMeta,
context);
int spreadCount = Integer.parseInt(embeddedMeta.get("PageCount"));
- masterSpreadCount += spreadCount;
+ counts.masterSpreadPages += spreadCount;
} else if (entry.getName().contains("Spreads/Spread")) {
Metadata embeddedMeta = new Metadata();
ContentAndMetadataExtractor.extract(zip, handler, embeddedMeta,
context);
int spreadCount = Integer.parseInt(embeddedMeta.get("PageCount"));
- pageCount += spreadCount;
+ counts.pages += spreadCount;
} else if (entry.getName().contains("Stories")) {
ContentAndMetadataExtractor.extract(zip, handler, new Metadata(),
context);
}
}
+
+ /** Page totals of one document; the parser instance is shared across
parses. */
+ private static final class PageCounts {
+ int pages;
+ int masterSpreadPages;
+ }
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/indesign/IDMLParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/indesign/IDMLParserTest.java
index 505a1e6f05..2e8d0aebae 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/indesign/IDMLParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/indesign/IDMLParserTest.java
@@ -64,4 +64,14 @@ public class IDMLParserTest extends TikaTest {
assertContains("<meta name=\"xmp:CreatorTool\" content=\"Adobe
InDesign CC 14.0 (Windows)\" />", xml);
}
+ @Test
+ public void testPageCountsAreNotCarriedAcrossParses() throws Exception {
+ // one instance serves every parse: the totals must start from zero
each time
+ getText("testIndesign.idml", parser, new Metadata());
+ Metadata metadata = new Metadata();
+ getText("testIndesign.idml", parser, metadata);
+ assertEquals("3", metadata.get("TotalPageCount"));
+ assertEquals("2", metadata.get("MasterSpreadPageCount"));
+ assertEquals("1", metadata.get("SpreadPageCount"));
+ }
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
index dac96295c3..fe2d71c1de 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java/org/apache/tika/parser/iptc/IptcAnpaParser.java
@@ -74,21 +74,20 @@ public class IptcAnpaParser implements Parser {
private final static char SR = 0x92; // single-quote right
private final static char DL = 0x93; // double-quote left
private final static char DR = 0x94; // double-quote right
- private int FMT_ANPA_1312 = 0x00; // "NAA 89-3 (ANPA 1312)"
- private int FMT_ANPA_UPI = 0x01; // "United Press International ANPA
1312 variant"
- private int FMT_ANPA_UPI_DL = 0x02; // "United Press International
Down-Load Message"
- private int FMT_IPTC_7901 = 0x03; // "IPTC7901 Recommended Message
Format"
- private int FMT_IPTC_PHOTO = 0x04; // "IPTC-NAA Digital Newsphoto
Parameter Record"
- private int FMT_IPTC_CHAR = 0x05;
+ private static final int FMT_ANPA_1312 = 0x00; // "NAA 89-3 (ANPA 1312)"
+ private static final int FMT_ANPA_UPI = 0x01; // "United Press
International ANPA 1312 variant"
+ private static final int FMT_ANPA_UPI_DL = 0x02; // "United Press
International Down-Load Message"
+ private static final int FMT_IPTC_7901 = 0x03; // "IPTC7901 Recommended
Message Format"
+ private static final int FMT_IPTC_PHOTO = 0x04; // "IPTC-NAA Digital
Newsphoto Parameter Record"
+ private static final int FMT_IPTC_CHAR = 0x05;
// "IPTC Unstructured Character Oriented File Format (UCOFF)"
- private int FMT_NITF = 0x06; // "News Industry Text Format (NITF)"
- private int FMT_NITF_TT = 0x07; // "Tidningarnas Telegrambyra NITF
version (TTNITF DTD)"
- private int FMT_NITF_RB = 0x08; // "Ritzaus Bureau NITF version (RBNITF
DTD)"
- private int FMT_IPTC_AP = 0x09; // "Associated Press news wire format"
- private int FMT_IPTC_BLM = 0x0A; // "Bloomberg News news wire format"
- private int FMT_IPTC_NYT = 0x0B; // "New York Times news wire format"
- private int FMT_IPTC_RTR = 0x0C; // "Reuters news wire format"
- private int FORMAT = FMT_ANPA_1312; // assume the default format to be
ANPA-1312
+ private static final int FMT_NITF = 0x06; // "News Industry Text Format
(NITF)"
+ private static final int FMT_NITF_TT = 0x07; // "Tidningarnas
Telegrambyra NITF version (TTNITF DTD)"
+ private static final int FMT_NITF_RB = 0x08; // "Ritzaus Bureau NITF
version (RBNITF DTD)"
+ private static final int FMT_IPTC_AP = 0x09; // "Associated Press news
wire format"
+ private static final int FMT_IPTC_BLM = 0x0A; // "Bloomberg News news
wire format"
+ private static final int FMT_IPTC_NYT = 0x0B; // "New York Times news
wire format"
+ private static final int FMT_IPTC_RTR = 0x0C; // "Reuters news wire
format"
public Set<MediaType> getSupportedTypes(ParseContext context) {
return SUPPORTED_TYPES;
@@ -97,8 +96,9 @@ public class IptcAnpaParser implements Parser {
public void parse(InputStream stream, ContentHandler handler, Metadata
metadata,
ParseContext context) throws IOException, SAXException,
TikaException {
- HashMap<String, String> properties = this.loadProperties(stream);
- this.setMetadata(metadata, properties);
+ int format = scanFormat(stream);
+ HashMap<String, String> properties = loadProperties(stream, format);
+ setMetadata(metadata, properties, format);
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
xhtml.startDocument();
@@ -124,29 +124,27 @@ public class IptcAnpaParser implements Parser {
/**
* scan the news messsage and store the metadata and data into a map
*/
- private HashMap<String, String> loadProperties(InputStream is) {
+ private HashMap<String, String> loadProperties(InputStream is, int format)
{
HashMap<String, String> properties = new HashMap<>();
- FORMAT = this.scanFormat(is);
-
byte[] residual = this.getSection(is, "residual");
byte[] header = this.getSection(is, "header");
parseHeader(header, properties);
byte[] body = this.getSection(is, "body");
- parseBody(body, properties);
+ parseBody(body, properties, format);
byte[] footer = this.getSection(is, "footer");
- parseFooter(footer, properties);
+ parseFooter(footer, properties, format);
return (properties);
}
private int scanFormat(InputStream is) {
- int format = this.FORMAT;
+ int format = FMT_ANPA_1312;
int maxsize = 524288; // 512K
byte[] buf = new byte[maxsize];
@@ -163,16 +161,16 @@ public class IptcAnpaParser implements Parser {
// explicit codes to identify the wire source in the message itself
if (message.contains("ap-wf")) {
- format = this.FMT_IPTC_AP;
+ format = FMT_IPTC_AP;
}
if (message.contains("reuters")) {
- format = this.FMT_IPTC_RTR;
+ format = FMT_IPTC_RTR;
}
if (message.contains("new york times")) {
- format = this.FMT_IPTC_NYT;
+ format = FMT_IPTC_NYT;
}
if (message.contains("bloomberg news")) {
- format = this.FMT_IPTC_BLM;
+ format = FMT_IPTC_BLM;
}
} catch (IOException eio) {
// we are in an unstable state
@@ -189,22 +187,17 @@ public class IptcAnpaParser implements Parser {
}
- private void setFormat(int format) {
- this.FORMAT = format;
- }
-
-
- private String getFormatName() {
+ private String getFormatName(int format) {
String name = "";
- if (FORMAT == this.FMT_IPTC_AP) {
+ if (format == FMT_IPTC_AP) {
name = "Associated Press";
- } else if (FORMAT == this.FMT_IPTC_BLM) {
+ } else if (format == FMT_IPTC_BLM) {
name = "Bloomberg";
- } else if (FORMAT == this.FMT_IPTC_NYT) {
+ } else if (format == FMT_IPTC_NYT) {
name = "New York Times";
- } else if (FORMAT == this.FMT_IPTC_RTR) {
+ } else if (format == FMT_IPTC_RTR) {
name = "Reuters";
}
@@ -455,7 +448,7 @@ public class IptcAnpaParser implements Parser {
return added;
}
- private boolean parseBody(byte[] value, HashMap<String, String>
properties) {
+ private boolean parseBody(byte[] value, HashMap<String, String>
properties, int format) {
boolean added = false;
StringBuilder bdy_heading = new StringBuilder();
@@ -499,7 +492,7 @@ public class IptcAnpaParser implements Parser {
// for reuters, the heading does not start with the ^, so
we push one back
// into the stream
- if (FORMAT == this.FMT_IPTC_RTR) {
+ if (format == FMT_IPTC_RTR) {
if (val_next != CT) {
// for any non-whitespace, we need to go back an
additional step to
// non destroy the data
@@ -558,7 +551,7 @@ public class IptcAnpaParser implements Parser {
// for bloomberg, the title does not start with the ^, so
we push one back
// into the stream
- if (FORMAT == this.FMT_IPTC_BLM) {
+ if (format == FMT_IPTC_BLM) {
if (val_next == TB) {
value[--read] = CT;
continue;
@@ -567,7 +560,7 @@ public class IptcAnpaParser implements Parser {
// for reuters, the title does not start with the ^, so we
push one back into
// the stream
- if (FORMAT == this.FMT_IPTC_RTR) {
+ if (format == FMT_IPTC_RTR) {
if (val_next != CT) {
// for any non-whitespace, we need to go back an
additional step to
// non destroy the data
@@ -652,7 +645,7 @@ public class IptcAnpaParser implements Parser {
longline =
((tmp_line.toString().contains("=")) &&
(!longline.equals(longkey)) ? longkey :
"");
- } else if (FORMAT == this.FMT_IPTC_BLM) {
+ } else if (format == FMT_IPTC_BLM) {
String byline = " by ";
if
(tmp_line.toString().toLowerCase(Locale.ROOT).contains(byline)) {
longkey = "bdy_author";
@@ -750,7 +743,8 @@ public class IptcAnpaParser implements Parser {
}
- private boolean parseFooter(byte[] value, HashMap<String, String>
properties) {
+ private boolean parseFooter(byte[] value, HashMap<String, String>
properties,
+ int format) {
boolean added = false;
StringBuilder ftr_source = new StringBuilder();
@@ -798,7 +792,7 @@ public class IptcAnpaParser implements Parser {
// standard ap format
String format_in = "MM-dd-yy HHmmzzz";
- if (FORMAT == this.FMT_IPTC_RTR) {
+ if (format == FMT_IPTC_RTR) {
// standard reuters format
format_in = "HH:mm MM-dd-yy";
}
@@ -830,7 +824,8 @@ public class IptcAnpaParser implements Parser {
}
- private void setMetadata(Metadata metadata, HashMap<String, String>
properties) {
+ private void setMetadata(Metadata metadata, HashMap<String, String>
properties,
+ int format) {
// every property that gets set must be non-null, or it will cause NPE
// in other consuming applications, like Lucene
@@ -842,7 +837,7 @@ public class IptcAnpaParser implements Parser {
metadata.set(TikaCoreProperties.MODIFIED,
clean(properties.get("modified")));
metadata.set(TikaCoreProperties.SOURCE,
clean(properties.get("source")));
// metadata.set(TikaCoreProperties.PUBLISHER,
clean(properties.get("publisher")));
- metadata.set(TikaCoreProperties.PUBLISHER,
clean(this.getFormatName()));
+ metadata.set(TikaCoreProperties.PUBLISHER,
clean(getFormatName(format)));
/*
metadata.set(TikaCoreProperties.DATE,
font.getHeader().getCreated().getTime());
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/test/java/org/apache/tika/parser/iptc/IptcAnpaParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/test/java/org/apache/tika/parser/iptc/IptcAnpaParserTest.java
new file mode 100644
index 0000000000..e49f7cfc3d
--- /dev/null
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/test/java/org/apache/tika/parser/iptc/IptcAnpaParserTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.tika.parser.iptc;
+
+import static java.nio.charset.StandardCharsets.US_ASCII;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.tika.TikaTest;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.BodyContentHandler;
+
+public class IptcAnpaParserTest extends TikaTest {
+
+ private static final String REUTERS = message("Markets rallied, Reuters
reported.");
+ private static final String UNMARKED = message("Markets rallied on
Tuesday.");
+
+ @Test
+ public void testFormatIsNotCarriedAcrossParses() throws Exception {
+ String expected = parse(new IptcAnpaParser(),
UNMARKED).get(TikaCoreProperties.PUBLISHER);
+
+ IptcAnpaParser parser = new IptcAnpaParser();
+ assertEquals("Reuters", parse(parser,
REUTERS).get(TikaCoreProperties.PUBLISHER));
+ assertEquals(expected, parse(parser,
UNMARKED).get(TikaCoreProperties.PUBLISHER));
+ }
+
+ private static Metadata parse(IptcAnpaParser parser, String message)
throws Exception {
+ Metadata metadata = new Metadata();
+ try (TikaInputStream tis =
TikaInputStream.get(message.getBytes(US_ASCII))) {
+ parser.parse(tis, new BodyContentHandler(), metadata, new
ParseContext());
+ }
+ return metadata;
+ }
+
+ // SYN SYN SOH header STX body ETX footer EOT
+ private static String message(String body) {
+ return "\u0016\u0016\u0001a0001 \u0013\u0011BC-Markets 10-21
0000\u0002\n" + body +
+ "\n\u0003 21-10-26 0000GMT\u0004";
+ }
+}