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";
+    }
+}

Reply via email to