This is an automated email from the ASF dual-hosted git repository.

tballison 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 188a755add TIKA-4985: consolidate 4.2.0 CHANGES (#3390)
188a755add is described below

commit 188a755addaa395e7174df19ebdbecdfd9a99322
Author: Tim Allison <[email protected]>
AuthorDate: Wed Oct 21 20:08:51 2026 -0400

    TIKA-4985: consolidate 4.2.0 CHANGES (#3390)
---
 CHANGES.txt | 261 ++++++++++++------------------------------------------------
 1 file changed, 52 insertions(+), 209 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 85b6897645..f31aced0ed 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,34 +1,16 @@
 Release 4.2.0 - unreleased
 
-   * The file-system emitter can gzip its output ("compression": "GZIP"), and 
tika-eval
-     finds gzipped extracts (.json.gz) when comparing against a plain extract 
set, measuring
-     their extract lengths and -m/-n limits on uncompressed size (TIKA-4989).
-
-   * tika-server activates catalog presets from the command line (--preset 
<name>, repeatable)
-     and the environment (TIKA_PRESETS, comma-separated), the equivalent of 
"<name>": true in
-     the config's presets, overriding the file's own entry for the name; a 
config file needs
-     no longer be mounted for that (TIKA-4988).
-
   BREAKING CHANGES AND DEPRECATIONS
-   * Extract stored line and paragraph counts from legacy Microsoft Word
-     (.doc) documents. The existing metadata properties are now populated
-     when these values are available in the document (TIKA-4694).
-
-   * ISArchiveParser no longer reads every ISA-Tab document's investigation 
and assay files
-     from the directory of the first document it parsed; concurrent parses no 
longer share
-     the study file name (TIKA-4986).
-
-   * ISArchiveParser(String location) is removed: the ISA-Tab directory is 
always the
-     parent directory of the study file, so pass a file-backed TikaInputStream
-     (TikaInputStream.get(Path)) (TIKA-4986).
 
    * Unpack output is a Frictionless Data Package by default on tika-server 
/unpack,
      tika-app -z/-Z and pipes UNPACK; unpack-config.outputFormat=REGULAR
      (--unpack-format=REGULAR) restores the old layout (TIKA-4681). A document 
without
      attachments is still a package, so /unpack returns 200, not 204;
      unpack-config.emptyPackage=SKIP restores the 204. The package's 
metadata.json is now
-     rmeta.json. FrictionlessResource.name() is the resource name (the 
filename moved to
-     resourceName()); FrictionlessResource.create and DataPackage.addResource 
are
+     rmeta.json and gets the metadata filters; a package sent to the 
container's emitter
+     replaces its <emitKey>.json. REGULAR .metadata.json sidecars are the 
file's row from
+     the metadata list. FrictionlessResource.name() is the resource name (the 
filename
+     moved to resourceName()); FrictionlessResource.create and 
DataPackage.addResource are
      removed (TIKA-4971).
 
    * Config is untrusted unless the operator says so. @OperatorOnly properties 
(paths,
@@ -46,7 +28,8 @@ Release 4.2.0 - unreleased
      refuse to start with it (TIKA-4978, TIKA-4985).
 
    * A duplicate key in configuration JSON is an error, not last-wins. A 
request's
-     http-fetcher config may set only httpRequestHeaders. forbidden-apis bans
+     http-fetcher config may set only httpRequestHeaders, and a file-system 
emitter's
+     runtime config naming basePath fails as an unknown key. forbidden-apis 
bans
      JsonConfig.json() outside ConfigDeserializer and PluginJson, and projects 
that
      inherit tika-parent inherit the ban (point 
json.forbiddenapis.signaturesFile at an
      empty file to opt out). ExtensionConfig no longer implements JsonConfig 
(TIKA-4975).
@@ -65,6 +48,10 @@ Release 4.2.0 - unreleased
      and openai-image-embedding-parser, deprecated in 4.1.0, are removed; use 
an engine
      and an inference binding (TIKA-4985).
 
+   * text-recognizers: an inline entry must have exactly one key, setting both
+     _min-width and min-width is an error, and gated entries load as 
GatedEnricher,
+     not SizeGatedEnricher (TIKA-4972).
+
    * embedded-limits maxDepth defaults to 20, was unlimited, and replaces
      output-limits maxPackageEntryDepth.
 
@@ -72,182 +59,17 @@ Release 4.2.0 - unreleased
      OutputLimits and SecureContentHandler; tika-parser-mail-commons (MailUtil 
and
      MailDateParser moved, see TIKA-4917).
 
-   * text-recognizers: an inline entry must have exactly one key, setting both
-     _min-width and min-width is an error, and gated entries load as 
GatedEnricher,
-     not SizeGatedEnricher (TIKA-4972).
-
    * Pipes plugins load only from the zips in plugin-roots; a plugin on the 
classpath
      needs -Dtika.plugins.classpath=true, which PipesForkParser sets when it 
finds no
      plugins directory holding tika-pipes-file-system (TIKA-4918, TIKA-4985).
 
-   * ExecutableParser emits a PE file's icon (its first icon group) as an 
embedded
-     THUMBNAIL .ico; extractAllIcons=true emits every group, 
extractIcons=false none
-     (TIKA-4936).
-
-   * New ICOParser for icons and cursors; image/vnd.microsoft.icon moves to it 
from
-     ImageParser. Tighter OS/2 bitmap array and TGA detection (TIKA-4937).
-     Animated cursors (RIFF ACON) are application/x-navi-animation, even when 
named
-     *.cur (TIKA-4985).
+   * image/vnd.microsoft.icon moves from ImageParser to the new ICOParser, 
which also
+     parses cursors. Tighter OS/2 bitmap array and TGA detection (TIKA-4937). 
Animated
+     cursors (RIFF ACON) are application/x-navi-animation, even when named 
*.cur
+     (TIKA-4985).
 
-   * BigTIFF is read through metadata-extractor 2.22.0: EXIF and DNG tags are 
extracted from
-     BigTIFF DNGs, which previously yielded only XMP and previews, and a plain 
BigTIFF file no
-     longer fails in TiffParser. Little-endian BigTIFF is detected as 
image/tiff by content
-     (TIKA-4987).
-
-   * Previews are extracted from Olympus ORF (also with the OM SYSTEM 
MakerNote), Panasonic
-     RW2, Epson ERF, Kodak KDC and Leaf MOS. Epson ERF is detected by content, 
and
-     image/x-raw-epson, image/x-raw-kodak and image/x-raw-leaf are sub-classes 
of
-     image/tiff (TIKA-4980).
-
-   * ImageMetadataExtractor skips a tag whose metadata-extractor descriptor 
throws instead of
-     failing the parse; this applies to every image format metadata-extractor 
reads (TIKA-4980).
-
-   * A JsonConfig's raw text is read only through ConfigDeserializer or
-     PluginJson.read(JsonConfig, Class), which apply the request restrictions 
and
-     @OperatorOnly; forbidden-apis rejects JsonConfig.json() elsewhere in 
Tika's main code.
-     Projects that inherit tika-parent inherit the ban; set 
json.forbiddenapis.signaturesFile
-     to forbidden-apis-none.txt to opt out. ExtensionConfig no longer 
implements
-     JsonConfig. A request's http-fetcher config may now set only 
httpRequestHeaders; other
-     keys, previously ignored, are an error. A file-system emitter's runtime 
config that
-     names basePath fails as an unknown key. A duplicate key in configuration 
JSON,
-     previously last-wins, is now an error (TIKA-4975).
-
-   * @OperatorOnly is now enforced on every component a request builds, 
wherever
-     it is named -- a metadata-filters entry, a nested property, or a bare
-     string -- not just on self-configuring parsers. On a class, it keeps a
-     request from building the component at all (TIKA-4974).
-
-   * All JSON config now flows through tika-serialization, so every component
-     gets the same operator-only checks, whether it comes from 
tika-config.json,
-     a request, or a JsonConfig constructor (e.g. new PDFParser(jsonConfig)).
-     Constructing a component with a JsonConfig therefore needs 
tika-serialization
-     on the classpath; tika-app, tika-server and tika-grpc already include it
-     (TIKA-4974).
-
-   * tika-serialization is now an OSGi bundle, so JsonConfig constructors work 
in
-     OSGi: deploy it with jackson-databind and jackson-annotations (TIKA-4982).
-
-   * Config is untrusted unless the operator says so: Java code that writes its
-     own config and sets an operator-only property wraps it with
-     JsonConfig.trusted(json) (TIKA-4974).
-     
-   * PipesForkParser: a ParseMode, ContentHandlerFactory or EmbeddedLimits set 
in the
-     ParseContext passed to parse() now overrides PipesForkParserConfig 
instead of being
-     overwritten by it, and the caller's ParseContext is no longer modified 
(TIKA-4981).
-
-   * Frictionless unpack: the package's metadata.json is renamed rmeta.json, 
is listed in
-     datapackage.json as a resource (size, sha256), and now gets the metadata 
filters and
-     user metadata the emitted list gets; resources are in embedded-id order. 
A document
-     with no attachments is a package of datapackage.json and rmeta.json: 
tika-server
-     /unpack returns it with 200 instead of 204 
(unpack-config.emptyPackage=SKIP, which the
-     thumbnail preset sets, restores the 204). The package name is the 
caller's filename
-     on tika-server, never the server's spool file. When the package goes to 
the container's
-     own emitter it replaces the metadata emit on every surface: no 
<emitKey>.json next to
-     it, and with includeMetadata=false no metadata at all. tika-app -z/-Z on 
a single file
-     makes the output dir the package, defaulting to <name>-unpacked/ in 
either format, and
-     names files unpacked/1.<ext> as tika-server /unpack does. REGULAR 
.metadata.json
-     sidecars are now the file's row from the metadata list: they get the 
metadata filters
-     and text inference, and a row a filter removes gets no sidecar. New
-     unpack-config.packageRoot and packageName set where a DIRECTORY-mode 
package goes
-     and its name. Packages pass frictionless validate: each resource's name 
is derived
-     from its path, the original filename moves to tk:resource-name, and 
tk:embedded-id
-     matches its rmeta.json row, if present (TIKA-4971).
-
-   * API: FrictionlessResource.name() is now the Frictionless resource name 
derived from
-     the path; the original filename moved to resourceName(), and embeddedId() 
is new.
-     FrictionlessResource.create(path, mediatype, bytes, hash, name) and
-     DataPackage.addResource(...) are removed (TIKA-4971).
-     
-   * Per-request limits may tighten the server's but no longer loosen them 
(TIKA-4978).
-     
-   * tika-server starts its forks before opening its port, so a fork that 
can't start
-     (bad forkedJvmArgs or javaPath, a missing plugin) fails startup instead 
of the first
-     request (TIKA-4983).
-     
-   * Image checks (byte-size, min-image-size, blank-image-check; new 
tika-image-processing
-     module) make it less likely that blank or tiny images reach text 
recognizers. VLM
-     output gets tk:ocr-warnings (truncated, repetition, empty); VLM parsers 
take
-     temperature; dropped HTTP connections are retried. SizeGatedEnricher is 
deprecated;
-     text-recognizers entries take min-width/min-height 
(_min-width/_min-height still
-     work) (TIKA-4972).
-
-   * An email that starts with MIME-Version and nests a multipart/related part 
(a Gmail
-     export, for one) is detected as message/rfc822, not as MHTML: the
-     multipart/related magic now reads only the message's own header block 
(TIKA-4973).
-     
-   * The docx parser wraps OMML equations (m:oMath) in <span class="omml">, 
their
-     text flattened to plain characters; it was previously emitted as unmarked 
body
-     text (TIKA-4968).
-     
-   * Files named *.rs are now detected as text/x-rust (Rust source) instead of
-     application/rls-services+xml. RLS services XML is still detected from its
-     root element, whatever the file name (TIKA-4977).
-     
-   * Opt-in "metadata-list": {"typedValues": true} writes INTEGER, REAL and
-     BOOLEAN metadata as JSON numbers and booleans, and tk:chunks as nested
-     JSON rather than an escaped string, in -J, /rmeta and the JSON emitters.
-     New Property.ValueType.JSON; tk:chunks is now JSON-typed. Readers accept
-     both forms (TIKA-4969).
-
-   * The docx parser wraps OMML equations (m:oMath) in <span class="math">; 
their
-     text was previously emitted as unmarked body text (TIKA-4968).
-
-   * The docx parser links REF, PAGEREF and NOTEREF fields, and in-document
-     HYPERLINK \l fields, to their bookmarks (<a href="#bookmark">). Fields 
are now
-     tracked as a stack, so a field nested in a HYPERLINK field no longer ends 
the
-     enclosing link early. Simple fields (w:fldSimple) are now parsed as well, 
so
-     HYPERLINK, INCLUDEPICTURE and similar fields written that way are linked 
or
-     reported like their complex-field equivalents (TIKA-4967).
-
-   * The docx parser now applies bold and italics set by a run's character 
style
-     (e.g. Word's built-in Strong and Emphasis), following basedOn chains; 
previously
-     only direct formatting was emitted. The new OfficeParserConfig option
-     includeCharacterStyleClasses wraps such runs in <span class="..."> named 
after
-     the style. Style-derived classes (paragraph and character) now replace 
every
-     character other than letters, digits, '_' and '-' with '_' and are capped 
at 128
-     characters, so a style name can no longer yield extra class tokens 
(TIKA-4966).
-
-   * OpenAI-compatible VLM parser can send the output token limit as
-     max_completion_tokens for models that reject max_tokens. The new
-     useMaxCompletionTokens setting is opt-in; max_tokens remains the default.
-
-   * Config properties whose value reaches the host (paths, executables, class 
names,
-     URLs, credentials, operator-sized limits) are marked @OperatorOnly and 
refused in
-     per-request JSON before any setter runs. Newly locked: pdf-parser's
-     imageGraphicsEngineFactoryClass and the VLM parsers' completionsPath. The 
per-parser
-     RuntimeConfig subclasses are removed (TIKA-4965).
-
-   * JSoupParser emits the text of CDATA sections again. jsoup 1.23 tokenizes 
CDATA in
-     HTML content as a bogus comment, which silently dropped every CDATA value 
in XML
-     that reaches the HTML parser (TIKA-4963).
-     
-   * The text/html magic now requires the html tag to end, so an XML file with 
an
-     element such as <htmlPath> in its first 8K is no longer detected as HTML 
and sent
-     to the HTML parser (TIKA-4962).
-
-   * OutlookExtractor now falls back to the "Date:" transport header for
-     dcterms:created/modified when a .msg has no MAPI date property; the
-     fallback previously could never match (TIKA-4959).
-
-   * Unpack output is a Frictionless Data Package by default on every surface: 
tika-server
-     /unpack, tika-app -z/-Z and pipes UNPACK mode, where it is one 
<key>-frictionless.zip per
-     container unless outputMode is DIRECTORY. Set unpack-config.outputFormat 
to REGULAR
-     (--unpack-format=REGULAR) for the pre-4.2 flat layout (TIKA-4681).
-
-   * Pipes plugins load only from the zips in plugin-roots; a plugin jar on 
the classpath
-     needs -Dtika.plugins.classpath=true, which PipesForkParser sets on its 
fork when it
-     has no plugins directory. Dev mode loads an exploded target/classes 
(TIKA-4918).
-
-   * GeoGebraParser reads structure.json and inline text content with 
jackson-core's
-     streaming parser; tika-parser-miscoffice-module and 
tika-parser-cad-module no
-     longer depend on jackson-databind, and OSGi deployments of 
tika-bundle-standard
-     need only jackson-core (TIKA-4956).
-
-   * Forked pipes servers get their config and auth token over stdin; nothing 
is written
-     to the temp dir. Server-manager and PipesServer signatures change 
accordingly (TIKA-4952).
-
-   * GeoGebraParser switched to stream parsing to drop jackson-databind as
-     a dependency (TIKA-4956).
+   * ISArchiveParser(String location) is removed; pass a file-backed 
TikaInputStream
+     (TikaInputStream.get(Path)) (TIKA-4986).
 
    * tika-bundle-standard no longer embeds dependencies that are OSGi bundles
      themselves (commons-*, pdfbox, fontbox, bouncycastle, jsoup, asm, xz, 
xmpcore,
@@ -256,9 +78,6 @@ Release 4.2.0 - unreleased
      and it requires Java 17; OOXML, HTTP and GeoGebra parsing and charset 
detection
      work in OSGi again (TIKA-4955).
 
-   * Forked pipes servers get their config and auth token over stdin, never 
through the
-     temp dir; server-manager and PipesServer signatures change (TIKA-4952).
-
   SECURITY
 
    * The default zip-bomb ratio (output-limits.zipBombRatio) is 1000, up from 
100. The
@@ -269,14 +88,21 @@ Release 4.2.0 - unreleased
    * The Gemini VLM parser sends its API key in x-goog-api-key instead of the 
URL,
      which error messages and logs quote (TIKA-4985).
 
-   * Tika's own entity-expansion limit is retired in favor of the JDK's 
settings
-     (TIKA-4940), and forbidden-apis rejects building XML parsers outside 
XMLReaderUtils
-     (TIKA-4939). New tk:xml-external-reference and -count list the external 
DTDs and
-     entities a document referenced, which Tika never resolves (TIKA-4941). 
XFA is read
-     with SAX; XMLReaderUtils.getXMLInputFactory() is deprecated (TIKA-4938).
+   * XML parsers are configured through Apache Commons Secure XML (TIKA-4935), 
Tika's
+     own entity-expansion limit is retired in favor of the JDK's settings 
(TIKA-4940),
+     and forbidden-apis rejects building XML parsers outside XMLReaderUtils 
(TIKA-4939).
+     New tk:xml-external-reference and -count list the external DTDs and 
entities a
+     document referenced, which Tika never resolves (TIKA-4941). XFA is read 
with SAX;
+     XMLReaderUtils.getXMLInputFactory() is deprecated (TIKA-4938).
 
   SERVER, PIPES AND OPERATIONS
 
+   * The file-system emitter can gzip its output ("compression": "GZIP"); 
tika-eval reads
+     .json.gz extracts and measures them uncompressed (TIKA-4989).
+
+   * tika-server activates catalog presets with --preset <name> (repeatable) or
+     TIKA_PRESETS (comma-separated), overriding the config file's entry 
(TIKA-4988).
+
    * PipesParser.start() and PipesForkParser.start() bring the forks up before 
the
      first parse (TIKA-4953), and tika-server starts its forks before opening 
its port,
      so a fork that can't start fails startup, not the first request 
(TIKA-4983).
@@ -285,6 +111,9 @@ Release 4.2.0 - unreleased
      per-call ParseContext overrides PipesForkParserConfig, and the caller's 
context is
      no longer modified (TIKA-4981).
 
+   * Forked pipes servers get their config and auth token over stdin, never 
through the
+     temp dir; server-manager and PipesServer signatures change (TIKA-4952).
+
    * maxFilesProcessedPerProcess defaults to 100,000, up from 10,000 
(TIKA-4950).
 
    * Pipes forks inherit the parent's default locale unless forkedJvmArgs set
@@ -310,23 +139,37 @@ Release 4.2.0 - unreleased
      bold and italics from character styles are applied, with opt-in
      includeCharacterStyleClasses (TIKA-4966).
 
+   * .doc: stored line and paragraph counts are extracted (TIKA-4694).
+
+   * ExecutableParser emits a PE file's icon (its first icon group) as an 
embedded
+     THUMBNAIL .ico; extractAllIcons=true emits every group, 
extractIcons=false none
+     (TIKA-4936).
+
+   * BigTIFF is read through metadata-extractor 2.22.0: EXIF and DNG tags from 
BigTIFF
+     DNGs, and plain BigTIFF no longer fails; little-endian BigTIFF is 
detected by content
+     (TIKA-4987).
+
+   * Previews from Olympus ORF, Panasonic RW2, Epson ERF, Kodak KDC and Leaf 
MOS; Epson
+     ERF is detected by content. A metadata-extractor tag descriptor that 
throws skips
+     the tag instead of failing the parse (TIKA-4980).
+
    * OneNote: table and list structure in FSSHTTPB files (TIKA-4943); section 
and page
      GUID metadata (TIKA-4944).
 
    * Detection: *.rs is text/x-rust (TIKA-4977); a MIME email nesting
      multipart/related is message/rfc822, not MHTML (TIKA-4973); XML with an 
element
-     like <htmlPath> is no longer HTML (TIKA-4962), so XUL with <html:...> 
elements is
-     now XUL; XUL is detected by content, not just *.xul, and the HTML parser 
still
-     parses it, as XMLParser fails on its DTD entities (TIKA-4985).
+     like <htmlPath> is no longer HTML (TIKA-4962); XUL is detected by content 
and
+     parsed by the HTML parser, as XMLParser fails on its DTD entities 
(TIKA-4985).
 
    * Image checks (byte-size, min-image-size, blank-image-check; new
      tika-image-processing module) keep blank and tiny images from text 
recognizers.
      VLM output gets tk:ocr-warnings (an empty Claude response is a warning, 
not an
-     exception), vlm:skipped-reason and vlm:image-pixels; dropped HTTP 
connections are
-     retried; SizeGatedEnricher is deprecated (TIKA-4972).
+     exception), vlm:skipped-reason and vlm:image-pixels; VLM parsers take 
temperature;
+     dropped HTTP connections are retried; SizeGatedEnricher is deprecated 
(TIKA-4972).
 
    * Opt-in "metadata-list": {"typedValues": true} writes numbers, booleans and
-     tk:chunks as JSON values rather than strings (TIKA-4969).
+     tk:chunks as JSON values rather than strings; new Property.ValueType.JSON
+     (TIKA-4969).
 
   OTHER CHANGES
 
@@ -338,7 +181,7 @@ Release 4.2.0 - unreleased
      corrupt or encrypted file), with the exception in 
tk:exception:container-exception on
      the first record, as /rmeta does; it used to print nothing. The exit 
status still
      reports the failure (TIKA-4985).
-     
+
    * A RAR entry junrar fails to extract (truncated archive, bad CRC, missing 
password)
      is now recorded as tk:exception:embedded-stream-exception on the 
container; the
      entry still yields what was extracted before the failure, and the rest of 
the

Reply via email to