Skip to content

Commit 26c8f91

Browse files
committed
javadoc fix
1 parent 82534d9 commit 26c8f91

4 files changed

Lines changed: 165 additions & 1 deletion

File tree

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/usr/bin/env python3
2+
# Licensed to the Apache Software Foundation (ASF) under one or more
3+
# contributor license agreements. See the NOTICE file distributed with
4+
# this work for additional information regarding copyright ownership.
5+
# The ASF licenses this file to You under the Apache License, Version 2.0
6+
# (the "License"); you may not use this file except in compliance with
7+
# the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
"""
17+
Guard the hand-maintained <sourcepath> in tika-parent/pom.xml used by the
18+
TIKA-4318 javadoc:aggregate workaround. That list must name every module's
19+
src/main/java (except tika-grpc); a module missing from it is silently dropped
20+
from the aggregated API docs. Run this right before building the javadocs.
21+
22+
check: python3 .github/scripts/check_javadoc_sourcepath.py [repo_root]
23+
fix: python3 .github/scripts/check_javadoc_sourcepath.py --fix [repo_root]
24+
25+
Exit 0 = list matches the reactor; 1 = drift (missing/stale roots) or --fix rewrote it.
26+
"""
27+
import os
28+
import re
29+
import sys
30+
31+
PRUNE = {"target", ".git", ".local_m2_repo", "node_modules", ".mvn"}
32+
EXCLUDE_MODULE_PREFIX = "tika-grpc/" # protobuf gen-sources not on the aggregate classpath
33+
POM = "tika-parent/pom.xml"
34+
35+
36+
def actual_roots(root: str):
37+
roots = set()
38+
for dirpath, dirnames, _ in os.walk(root):
39+
dirnames[:] = [d for d in dirnames if d not in PRUNE]
40+
if not dirpath.replace(os.sep, "/").endswith("/src/main/java"):
41+
continue
42+
rel = os.path.relpath(dirpath, root).replace(os.sep, "/")
43+
if rel.startswith(EXCLUDE_MODULE_PREFIX):
44+
continue
45+
for _, _, files in os.walk(dirpath):
46+
if any(f.endswith(".java") and f != "package-info.java" for f in files):
47+
roots.add(rel)
48+
break
49+
return roots
50+
51+
52+
def listed_roots(pom_text: str):
53+
m = re.search(r"<sourcepath>([^<]*)</sourcepath>", pom_text)
54+
if not m:
55+
sys.exit(f"ERROR: no <sourcepath> found in {POM}")
56+
return set(p.strip() for p in m.group(1).split(";") if p.strip()), m
57+
58+
59+
def main() -> int:
60+
args = [a for a in sys.argv[1:] if a != "--fix"]
61+
fix = "--fix" in sys.argv
62+
root = os.path.abspath(args[0] if args else ".")
63+
pom_path = os.path.join(root, POM)
64+
text = open(pom_path, encoding="utf-8").read()
65+
66+
actual = actual_roots(root)
67+
listed, m = listed_roots(text)
68+
missing = sorted(actual - listed) # modules present but NOT in the list -> dropped from docs
69+
stale = sorted(listed - actual) # entries in the list that no longer exist
70+
71+
if not missing and not stale:
72+
print(f"OK: javadoc <sourcepath> covers all {len(actual)} module source roots.")
73+
return 0
74+
75+
if fix:
76+
new_list = ";".join(sorted(actual))
77+
open(pom_path, "w", encoding="utf-8").write(
78+
text[: m.start(1)] + new_list + text[m.end(1):])
79+
print(f"FIXED: rewrote <sourcepath> in {POM} ({len(actual)} roots).")
80+
return 0
81+
82+
print(f"ERROR: javadoc <sourcepath> in {POM} is out of sync with the reactor.\n")
83+
if missing:
84+
print(" MISSING (module exists but is not in <sourcepath> -> its API docs are dropped):")
85+
for r in missing:
86+
print(f" {r}")
87+
if stale:
88+
print(" STALE (in <sourcepath> but no longer a module source root):")
89+
for r in stale:
90+
print(f" {r}")
91+
print("\nFix: re-run with --fix, or edit tika-parent/pom.xml's javadoc <sourcepath>.")
92+
print("See TIKA-4318.")
93+
return 1
94+
95+
96+
if __name__ == "__main__":
97+
sys.exit(main())

docs/modules/ROOT/pages/maintainers/release-guides/tika.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ Refresh the website documentation to reflect the new release:
416416
* Update download links
417417
* Update version numbers in documentation
418418
* Add release notes
419+
* Publish the aggregated API docs (Javadoc) -- see
420+
xref:maintainers/site.adoc[Publishing the Documentation Site], "Publishing the
421+
API docs (Javadoc)"
419422

420423
=== Release Docker and Helm Images
421424

docs/modules/ROOT/pages/maintainers/site.adoc

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,60 @@ cd /path/to/tika-site
183183
svn commit -m "Update 4.0.0 docs"
184184
----
185185

186+
== Publishing the API docs (Javadoc)
187+
188+
The per-version API docs at `https://tika.apache.org/<version>/api/` are a single
189+
aggregated Javadoc across all modules, generated from the release source tree and
190+
copied into the tika-site checkout next to the Antora docs.
191+
192+
[NOTE]
193+
====
194+
Tika modules declare an `Automatic-Module-Name` but ship no `module-info.java`, so
195+
`maven-javadoc-plugin`'s aggregate goal defaults to a modular invocation that emits
196+
nothing (see https://issues.apache.org/jira/browse/TIKA-4318[TIKA-4318]).
197+
`tika-parent` works around this with an explicit `<sourcepath>` listing every
198+
module's `src/main/java` (except `tika-grpc`). That list is hand-maintained, so run
199+
the check in step 2 before generating -- a newly added module would otherwise drop
200+
out of the docs silently.
201+
====
202+
203+
. Build and install first. `javadoc:aggregate` compiles nothing; it needs every
204+
module jar (and grpc's generated sources) in the local repo. `-Pfast` skips tests
205+
for speed:
206+
+
207+
[source,bash]
208+
----
209+
mvn clean install -Pfast
210+
----
211+
212+
. Verify the aggregate `<sourcepath>` still covers every module:
213+
+
214+
[source,bash]
215+
----
216+
python3 .github/scripts/check_javadoc_sourcepath.py
217+
# on failure it names the missing module(s); regenerate the list with --fix:
218+
python3 .github/scripts/check_javadoc_sourcepath.py --fix
219+
----
220+
221+
. Generate the aggregate Javadoc (output in `target/reports/apidocs/`; `tika-grpc`
222+
is intentionally excluded):
223+
+
224+
[source,bash]
225+
----
226+
mvn javadoc:aggregate
227+
----
228+
229+
. Copy it into the tika-site checkout as this version's `api/` directory and commit:
230+
+
231+
[source,bash]
232+
----
233+
mkdir -p /path/to/tika-site/publish/<version>
234+
cp -r target/reports/apidocs /path/to/tika-site/publish/<version>/api
235+
cd /path/to/tika-site
236+
svn add publish/<version>
237+
svn commit -m "Add <version> API docs"
238+
----
239+
186240
== Site Structure
187241

188242
The Antora configuration files:

tika-parent/pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1716,7 +1716,17 @@
17161716
<version>${maven.javadoc.version}</version>
17171717
<configuration>
17181718
<doclint>none</doclint>
1719-
<sourcepath>src/main/java</sourcepath>
1719+
<!-- TIKA-4318: an explicit multi-root sourcepath forces the javadoc plugin onto its
1720+
legacy (pre-JPMS) -sourcepath code path, so javadoc:aggregate actually produces a
1721+
combined report. Tika modules carry Automatic-Module-Name manifest hints but have no
1722+
module-info.java; without this, the plugin runs javadoc in modular (module source
1723+
path) mode, classifies the reactor modules inconsistently as named vs unnamed, and
1724+
javadoc aborts ('aggregated report for both named and unnamed modules is not
1725+
possible'). tika-grpc is excluded: its protobuf generated-sources and compile deps
1726+
are not on the aggregate classpath. NOTE: keep this list in sync when modules are
1727+
added or removed (see TIKA-4318). -->
1728+
<sourcepath>tika-annotation-processor/src/main/java;tika-app/src/main/java;tika-bundles/tika-bundle-standard/src/main/java;tika-core/src/main/java;tika-detectors/tika-detector-magika/src/main/java;tika-detectors/tika-detector-siegfried/src/main/java;tika-encoding-detectors/tika-encoding-detector-html/src/main/java;tika-encoding-detectors/tika-encoding-detector-icu4j/src/main/java;tika-encoding-detectors/tika-encoding-detector-mojibuster/src/main/java;tika-encoding-detectors/tika-encoding-detector-universal/src/main/java;tika-eval/tika-eval-app/src/main/java;tika-eval/tika-eval-core/src/main/java;tika-example/src/main/java;tika-handlers/tika-handler-boilerpipe/src/main/java;tika-java7/src/main/java;tika-langdetect/tika-langdetect-charsoup-core/src/main/java;tika-langdetect/tika-langdetect-charsoup/src/main/java;tika-langdetect/tika-langdetect-lingo24/src/main/java;tika-langdetect/tika-langdetect-mitll-text/src/main/java;tika-langdetect/tika-langdetect-opennlp/src/main/java;tika-langdetect/tika-langdetect-optimaize/src/main/java;tika-langdetect/tika-langdetect-test-commons/src/main/java;tika-ml/tika-ml-chardetect/src/main/java;tika-ml/tika-ml-core/src/main/java;tika-ml/tika-ml-junkdetect/src/main/java;tika-ml/tika-ml-junkdetect-tools/src/main/java;tika-parsers/tika-http-jdk/src/main/java;tika-parsers/tika-parsers-extended/tika-parser-ocr-encode-module/src/main/java;tika-parsers/tika-parsers-extended/tika-parser-scientific-module/src/main/java;tika-parsers/tika-parsers-extended/tika-parser-sqlite3-module/src/main/java;tika-parsers/tika-parsers-ml/tika-inference/src/main/java;tika-parsers/tika-parsers-ml/tika-parser-nlp-module/src/main/java;tika-parsers/tika-parsers-ml/tika-parser-tess4j-module/src/main/java;tika-parsers/tika-parsers-ml/tika-transcribe-aws/src/main/java;tika-parsers/tika-parsers-ml/tika-vlm/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-cad-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-code-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-crypto-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-datauri-commons/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-digest-commons/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-font-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-html-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-jdbc-commons/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-commons/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-mail-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-news-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-ocr-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-text-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-webarchive-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xml-module/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-xmp-commons/src/main/java;tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-zip-commons/src/main/java;tika-pipes/tika-async-cli/src/main/java;tika-pipes/tika-httpclient-commons/src/main/java;tika-pipes/tika-pipes-api/src/main/java;tika-pipes/tika-pipes-config-store-ignite/src/main/java;tika-pipes/tika-pipes-core/src/main/java;tika-pipes/tika-pipes-fork-parser/src/main/java;tika-pipes/tika-pipes-iterator-commons/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-atlassian-jwt/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-az-blob/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-csv/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-es/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-file-system/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-gcs/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-google-drive/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-http/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-jdbc/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-json/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-kafka/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-microsoft-graph/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-opensearch/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-s3/src/main/java;tika-pipes/tika-pipes-plugins/tika-pipes-solr/src/main/java;tika-pipes/tika-pipes-reporter-commons/src/main/java;tika-plugins-core/src/main/java;tika-serialization/src/main/java;tika-server/tika-server-client/src/main/java;tika-server/tika-server-core/src/main/java;tika-server/tika-server-standard/src/main/java;tika-translate/src/main/java;tika-xmp/src/main/java</sourcepath>
1729+
<subpackages>org.apache.tika</subpackages>
17201730
</configuration>
17211731
</plugin>
17221732
</plugins>

0 commit comments

Comments
 (0)