# Document Text Extraction Kit: Apache projects for small business October 30, 2026. Companion to [Apache Tika: searchable business documents](https://jwatte.com/blog/apache-tika-document-text-extraction-small-business/). ## How to use this kit Start on a new private evaluation server with synthetic documents. A capable administrator should review the account, service limits and network controls; a developer connects the output to your repository or search application. These are documented configuration examples with our pilot limits, not an installation we performed. Complete the first test and restore exercise before using client material. Keep the original documents and send uncertain extraction results to a person. ## Project card and version choices | Project or route | Tier and owner | Release checked October 30, 2026 | Runtime and purpose | |---|---|---|---| | Apache Tika library | Developer | 4.2.0 current | Java 17 or newer; detection, text and metadata inside an application | | Tika Server and tika-app | Developer integration; administrator or provider operates the process | 4.2.0 current | ZIP distribution with thin JAR and adjacent lib directory; HTTP service or command line | | Tika maintenance line | Developer | 3.3.3 supported | Java 11 or newer; older runnable JAR packaging and configuration conventions | | Tesseract | Administrator installs; staff check output | Use a maintained package for your OS; no version pinned here | External OCR engine and selected language packs | Source: [Tika downloads](https://tika.apache.org/download.html). No catalog reclassification is implied by operating the server wrapper. Tika remains a developer component, with administration required when deployed as a service. **Fits:** approved document collections that an existing system does not search well. For example, a six person accounting firm can find which client upload contains a statement; a twenty person manufacturer can find an approved specification revision. The small operating budget below is $92 to $230 monthly; the medium budget is $116 to $254, excluding integration and search hosting. These examples are assumptions, not customer deployments. **Skip:** a handful of files, an existing document system that already works, or a workflow needing a finished forms processing product. Tika does not certify extracted amounts, manage document permissions or provide a chatbot. **Hardware and skills:** our small pilot uses 2 shared vCPU, 4 GiB RAM and 80 GiB disk; medium uses 4 shared vCPU, 8 GiB RAM and 160 GiB disk. These are hosting allowances, not upstream minimums or capacity guarantees. You need Java, Linux service management, access controls, backups and enough development skill to handle failed jobs. OCR requires representative measurement. **Provider questions:** Who patches Java, Tika, dependencies and OCR packages? Who can recover the source files and processing ledger? How are permissions and deletions propagated? Which legitimate files will the limits reject? What costs extra when a backlog or incident exceeds the routine hours? ## 1. Approve the data and acceptance collection Record the source owner, permitted callers, destination, retention, deletion rules and person responsible for failures. Check GLBA Safeguards Rule applicability for financial or tax records, attorney client confidentiality for matter files, HIPAA applicability for health information, and state retention and public records request rules for government records. Law enforcement data needs a separate CJIS review. This kit makes no compliance claim. Our suggested acceptance collection is 20 to 50 documents: a digital PDF, an image only PDF, poor and rotated scans, a multicolumn page, an Office document and an email with an attachment. Include known names, dates, amounts and symbols. Use synthetic or specifically approved material. Record the expected answer before testing. Set a maximum tolerated loss window and recovery time. Retain originals separately from the parser's scratch area. Give the parser no customer share mount, backup credential or cloud administrator key. ## 2. Install the documented ZIP route Use a supported Ubuntu evaluation server. Have an administrator review the package choices and the commands. The [download page](https://tika.apache.org/download.html) specifies Java 17 or newer for 4.2; the [TikaOCR wiki](https://cwiki.apache.org/confluence/display/TIKA/TikaOCR) documents the Tesseract package route. ```sh sudo apt-get update sudo apt-get install openjdk-17-jre-headless unzip curl tesseract-ocr tesseract-ocr-eng java -version tesseract --version tesseract --list-langs ``` Get `tika-server-standard-4.2.0.zip`, its SHA512 checksum and signature material from Apache's download links. Follow that page's verification instructions before unpacking. The [4.2 server guide](https://tika.apache.org/docs/4.2.x/using-tika/server/index.html) documents the layout; the ZIP has no enclosing directory, so supply one: ```sh unzip -d tika-server-standard-4.2.0 tika-server-standard-4.2.0.zip sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin tika sudo install -d -o root -g root -m 0755 /opt/tika /etc/tika sudo cp -a tika-server-standard-4.2.0 /opt/tika/ sudo chown -R root:root /opt/tika/tika-server-standard-4.2.0 sudo chmod -R u=rwX,go=rX /opt/tika/tika-server-standard-4.2.0 sudo -u tika java -version sudo -u tika tesseract --list-langs ``` These account creation commands assume a new server without an existing `tika` account or installation. Keep the JAR and `lib` directory together. Service code is administrator owned and readable by the service; documents and output must not be written into the software directory. For a command line job instead, use the [tika-app ZIP and CLI guide](https://tika.apache.org/docs/4.2.x/using-tika/cli/index.html), preserving its own library directory. Check the packaged help rather than mixing command options from different major releases. ## 3. Add the 4.2 OCR and limit configuration Save the following as `tika-config.json` in your working directory. It combines documented [server](https://tika.apache.org/docs/4.2.x/using-tika/server/index.html), [OCR](https://tika.apache.org/docs/4.2.x/configuration/parsers/tesseract-ocr-parser.html), [PDF](https://tika.apache.org/docs/4.2.x/configuration/parsers/pdf-parser.html), [Pipes](https://tika.apache.org/docs/4.2.x/pipes/configuration.html) and [limit](https://tika.apache.org/docs/4.2.x/advanced/setting-limits.html) settings. The numerical caps are our pilot choices: 20 MiB per upload, one worker, a 1 GiB worker heap, two minutes per task, one minute without progress, nesting depth 5, 100 embedded items and one million extracted characters. Legitimate large documents may fail these limits. Review the recorded failure before increasing them or routing a larger job to a separate service. ```json { "server": { "maxRequestSizeBytes": 20971520, "allowPipes": false, "allowPerRequestConfig": false }, "pipes": { "numClients": 1, "forkedJvmArgs": ["-Xmx1g"] }, "parsers": [ {"pdf-parser": {"pages": {"text": "AUTO"}}}, {"default-parser": {}} ], "engines": { "tesseract": { "tesseract-ocr-parser": { "language": "eng", "timeoutMillis": 120000 } } }, "text-recognizers": [{"engine": "tesseract"}], "parse-context": { "embedded-limits": { "maxDepth": 5, "throwOnMaxDepth": true, "maxCount": 100, "throwOnMaxCount": true }, "output-limits": { "writeLimit": 1000000, "throwOnWriteLimit": true }, "timeout-limits": { "totalTaskTimeoutMillis": 120000, "progressTimeoutMillis": 60000 } } } ``` Keep `default-parser` in the explicit parser list so other document formats remain available. In 4.2, Tesseract belongs under the engine and text recognizer configuration. Older XML and `X-Tika-PDFOcrStrategy` examples from the wiki are not this configuration format. `AUTO` extracts embedded PDF text and uses OCR according to the configured text quality criteria. Compare it with `EXTRACT` and `OCR` on representative files; `EXTRACT_AND_OCR` can yield duplicates. Leave inline image extraction off unless there is a specific need. Install `tesseract-ocr-fra` before changing the language to `eng+fra`. Language detection after extraction is separate from these engine settings. ```sh sudo install -o root -g tika -m 0640 tika-config.json /etc/tika/tika-config.json ``` ## 4. Run as a restricted service Save this unit as `tika.service`, then install it as shown. Review the [systemd execution controls](https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html) and [resource controls](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html) for the host's supported version. The unit keeps Tika's documented default loopback binding and port 9998. The 512 MiB parent heap, 3 GiB total memory cap, two CPU allowance, 128 tasks and 512 MiB temporary filesystem are our initial limits. The service's memory budget includes native OCR and child JVMs; a heap setting alone does not. A temporary filesystem consumes memory too. ```ini [Unit] Description=Private document text extraction After=network.target [Service] Type=simple User=tika Group=tika WorkingDirectory=/opt/tika/tika-server-standard-4.2.0 ExecStart=/usr/bin/java -Xmx512m -Djava.io.tmpdir=/tmp -jar /opt/tika/tika-server-standard-4.2.0/tika-server-standard-4.2.0.jar -p 9998 -c /etc/tika/tika-config.json Restart=on-failure RestartSec=5 UMask=0077 NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateDevices=true RestrictSUIDSGID=true TemporaryFileSystem=/tmp:rw,size=512M,mode=1777 MemoryMax=3G CPUQuota=200% TasksMax=128 [Install] WantedBy=multi-user.target ``` ```sh sudo install -o root -g root -m 0644 tika.service /etc/systemd/system/tika.service sudo systemd-analyze verify /etc/systemd/system/tika.service sudo systemctl daemon-reload sudo systemctl enable --now tika.service sudo systemctl status tika.service --no-pager ``` Service startup is an acceptance test, not proof that this configuration works with every OS and document. These templates have not been deployed for the article. Verify the actual Java path, service permissions, OCR execution and limit behavior on your server. Before real documents, restrict outbound access for the service and prevent access to internal network resources it does not need. The unit's file and resource controls do not implement a network firewall. Keep parser input callers restricted. Set gateway upload and concurrency controls as well as Tika's limits. Never expose the unauthenticated service directly to the public internet. The [project's Docker instructions](https://tika.apache.org/docs/4.2.x/using-tika/docker.html) provide another route. Install Docker through its [official Ubuntu guide](https://docs.docker.com/engine/install/ubuntu/), select a verified `apache/tika` image release and pin its digest. Choose `full` for the included Tesseract environment, then confirm installed languages. Current documentation uses UID and GID 35002; verify actual image permissions. Restrict host publication to loopback or the approved private network, limit memory and processes, drop unnecessary capabilities and mount configuration read only. A specific image digest has not been verified for this kit, so none is invented here. ## 5. First requests and result checks On the same server, set `TIKA_URL` to Tika's loopback HTTP URL including port 9998, without a trailing slash. Use a synthetic PDF in the current working directory: ```sh read -r -p "Private Tika base URL, including port: " TIKA_URL curl --fail --silent --show-error --max-time 150 \ --upload-file sample.pdf "$TIKA_URL/tika/text" -o sample.txt curl --fail --silent --show-error --max-time 150 \ --upload-file sample.pdf -H 'Accept: application/json' \ "$TIKA_URL/meta" -o sample-metadata.json curl --fail --silent --show-error --max-time 150 \ --upload-file sample.pdf -H 'Accept: application/json' \ "$TIKA_URL/rmeta/text" -o sample-records.json ``` The recursive response is a JSON list; extracted content is in `tk:content`. Inspect `tk:exception:container-exception`, `tk:exception:embedded-exception` and truncation or limit indicators. Structured responses can contain partial results even with HTTP 200. The plain text endpoint alone is insufficient for recording detailed outcomes. The 150 second client limit is our test allowance, slightly longer than the configured worker task limit. Client timeout alone does not stop a parser. Never raise timeouts repeatedly without checking whether a problematic file is exhausting resources. | Acceptance test | Pass condition | |---|---| | Digital PDF | Expected text and document identity match the original | | Image only PDF | Known phrase appears after OCR; names and numbers checked manually | | Email with attachment | Parent and attachment remain identifiable; no unexplained merging | | Malformed or excessive document | Failure is recorded, bounded and sent for review; service recovers | | Unauthorized caller | Cannot reach parsing endpoints through any published route | | Permission change | Source denial removes access to indexed text, snippets and model context | | Restart | Service and approved access route recover without an interactive terminal | | Restore | Original, configuration and processing ledger recover into an isolated test environment | ## 6. Private access and the next application Use an approved private network, or follow the [Cloudflare Tunnel and Access guide](https://jwatte.com/blog/kimsufi-vps-cloudflare-tunnel-access/). Create and test the Access application before publishing a hostname. Machine callers need the documented service authentication policy; do not bypass Access to fix an automated request. Check that no direct public route exposes the parser. Approve Cloudflare as part of the document transit path when using it. The intake application owns a record like this; it is an application design, not a promise that Tika supplies every field: ```text document_id: stable identifier from the source repository source_reference: approved reference to the original source_permissions: authorization information from the repository source_revision: version or content hash extraction_version: Tika release plus approved configuration version status: complete, rejected, incomplete or failed text: checked extracted content children: identified embedded documents with their own outcomes ``` Map approved fields to an explicit Solr schema and submit through its supported update interface. Use the stable identifier for replacement and removal. [The search guide](https://jwatte.com/blog/apache-search-knowledge-base-small-business/) covers the server and interface. Solr 10 requires Java 21; it need not share Tika's Java runtime. For a backlog, [Tika Pipes](https://tika.apache.org/docs/4.2.x/pipes/index.html) separates document iteration, fetching, parsing, emitting and reporting. Store progress per document, bound retries and quarantine failures. Keep source permissions and deletion tracking in the surrounding application. The parsing server's `allowPipes` setting above intentionally leaves its extra Pipes endpoints unavailable to callers; it does not disable its internal forked parsing workers. For AI answers, retrieve only passages the current user may read. Treat document text as data, not executable instructions. Keep source references and require review of consequential answers. Embeddings and answering models need separate costs and tests; Tika does not generate those vectors or supply the answer interface. ## 7. Backups, updates and the first week Back up originals, approved runtime and configuration versions, the processing ledger, identifiers and permissions. Keep derived text if replay would exceed the recovery window. Protect extracted text and backups at least as carefully as the source files. Keep encryption and recovery credentials outside the parsing process. Before updating, read [Tika advisories](https://tika.apache.org/security.html), its [security model](https://tika.apache.org/security-model.html) and [ASF security guidance](https://www.apache.org/security/). Historical vulnerabilities include XML external entity processing, command execution and resource exhaustion. [CVE-2025-66516](https://raw.githubusercontent.com/CVEProject/cvelistV5/main/cves/2025/66xxx/CVE-2025-66516.json) clarifies that the older PDF XXE fix needs updated Tika core; updating only the PDF module is insufficient. Use a current supported release and matching dependencies, not the historical minimum fix as a target. Keep the current approved distribution for rollback where safe, test a candidate on the same acceptance set and compare outputs. An old vulnerable version is not an acceptable long term rollback. Restore originals and ledger into an isolated environment and replay without creating duplicate index records. Test revocation and deletion after recovery. Our suggested first week: 1. Define one business question, source owner, data boundaries and expected results. 2. Prepare the new server, verify downloads, configure private access and review limits. 3. Run the acceptance collection; record OCR errors, elapsed time, memory and scratch use. 4. Connect one approved collection to the destination; test replacement, denial and removal. 5. Restore a sample, review the measured labor and decide whether to continue or buy managed extraction. ## Cost worksheet All prices are USD before tax. Published prices were read October 29 or 30, 2026 as dated below. Workload volumes, hardware fit and hours are our assumptions. No installation benchmark is implied. ```text Monthly pages P = ______ Monthly hosting H = ______ Retained backup GB B = ______ Hourly employee compensation L = 68.09, or your actual rate ______ Self hosted setup hours S = ______ Self hosted monthly admin hours A = ______ Managed setup hours Sm = ______ Managed monthly admin hours Am = ______ Backup storage = max(0, B minus 10) x 0.00695 Self hosted setup = S x L Self hosted monthly = H + backup storage + A x L Managed monthly = P x 0.0015 + backup storage + Am x L Self hosted 36 months = S x L + 36 x self hosted monthly Managed 36 months = Sm x L + 36 x managed monthly Savings = managed total minus self hosted total Break even = ceiling(extra self hosted setup / positive monthly saving) If setup and monthly costs are both higher, break even = never Additional staging, requests, transfer and other services = ______ Integration, scanning and human document review = separate quote ______ ``` The Textract rate is its **US West Oregon Detect Document Text** example, $0.0015 per page for the first million monthly. Do not reuse it for forms, tables, invoices or volumes above that tier. It is not a replacement for all Office or email parsing. Introductory credits are excluded. For both scenarios, self hosted setup/admin hours are 4/1 low and 12/3 high. Managed hours are 1/0.25 low and 3/0.75 high. Retained backups are 50 GB low and 200 GB high. B2 costs $6.95 per decimal TB monthly, with the first 10 GB free once per account: $0.278 or $1.3205 here. Transfer and requests are assumed within included allowances. | Worked cost | 10,000 pages, small low | 10,000 pages, small high | 100,000 pages, medium low | 100,000 pages, medium high | |---|---:|---:|---:|---:| | Monthly Tika host | $24 | $24 | $48 | $48 | | Monthly Textract page charge | $15 | $15 | $150 | $150 | | Self hosted setup | $272 | $817 | $272 | $817 | | Managed setup | $68 | $204 | $68 | $204 | | Self hosted monthly including admin | $92 | $230 | $116 | $254 | | Managed monthly including admin | $32 | $67 | $167 | $202 | | Self hosted 36 months | $3,598 | $9,082 | $4,462 | $9,946 | | Managed 36 months | $1,231 | $2,630 | $6,091 | $7,490 | | Tika savings | Negative $2,367 | Negative $6,452 | $1,629 | Negative $2,456 | | Tika break even month | Never | Never | 5 | Never | Small low example: `4 x 68.09 + 36 x (24 + 0.278 + 68.09) = 3597.608`. Managed small low: `68.09 + 36 x (15 + 0.278 + 0.25 x 68.09) = 1230.908`. Round after calculation. Small ongoing Tika cost per page is $0.00924 to $0.02296, excluding setup. The medium scenario assumes the measured workload fits its host; it is not evidence of capacity. Low break even is `ceiling((272.36 minus 68.09) / (167.3005 minus 116.368)) = 5`. In high cases, recurring administration erases the apparent license saving. Both choices exclude custom development, scanning and review, search/model hosting, migrations, training, compliance assessments, major incidents, additional cloud services and setup month hosting. Retained backup volume must fit the actual retention policy. The $68.09 rate estimates employee compensation; an outside provider needs a separate quote. Managed extraction wins at the small volume modeled here. ## AI assisted setup worksheet These assumptions reproduce the article's small host comparison. AI setup takes 50% to 80% of manual hours: 2 to 9.6 hours. Monthly administration takes 75% to 100%: 0.75 to 3 hours. Human review is inside these totals: 1 to 3 hours during setup and 0.5 to 1.5 monthly. Prompting, supervision, testing and correction are included; no measured installation speedup is claimed. Claude Pro or ChatGPT Plus costs $20 monthly. Charge one separate setup month, then $5 monthly for 36 operating months only when other work uses the remaining 75%. Sole use adds $540. Check usage limits before relying on a subscription for the complete job. | Small Tika service, 36 months | Low | High | |---|---:|---:| | Manual | $3,598 | $9,082 | | Claude Pro | $3,049 | $9,119 | | ChatGPT Plus | $3,049 | $9,119 | | Claude Opus 5.5 API | $2,863 | $9,033 | | GPT-6 Astra API | $2,886 | $9,204 | | Managed extraction reference | $1,231 | $2,630 | | Tika break even against managed | Never | Never | Formula: `S x q x L + T0 + 36 x (H + backup + A x r x L + Tm)`. T0 is setup tool cost; Tm is monthly tool cost. Do not count review hours twice. | Standard API rates per million tokens | Ordinary input | Output | Cache read | Short cache write | |---|---:|---:|---:|---:| | Claude Opus 5.5 | $4 | $20 | $0.20 | $5 | | GPT-6 Astra | $10 | $50 | $1 | $12.50 | Assumed cumulative setup tokens: 200,000 to 1,000,000 input and 20,000 to 100,000 output; monthly budgets are half. Low input splits into 30% ordinary, 10% short cache writes and 60% cache reads. High input is all ordinary. Keep each request within the applicable context price band. Categories replace ordinary billing for those tokens; they are not added on top. Token cost = `(ordinary input x input rate + writes x write rate + reads x read rate + output x output rate) / 1,000,000`. Low Opus setup is `0.06 x 4 + 0.02 x 5 + 0.12 x 0.20 + 0.02 x 20 = $0.764`; monthly is $0.382. High is $6 setup and $3 monthly. Astra is $1.97/$0.985 low and $15/$7.50 high. Output includes billed reasoning; budgets include retries. No credits, batch discounts, regional premiums or paid tools are assumed. Use Claude Code or Codex CLI for authorized terminal work. Desktop Commander's free local server can edit configuration and inspect logs on an authorized host; it is not a sandbox. Claude in Chrome can inspect provider settings while a person watches. ChatGPT's separate cloud browser requires availability and access checks. Neither browser grants server access by itself. Use a new server, approve commands or restrict a sandbox, keep secrets and client documents out of setup chats, and test a restore. Supported supervised subscription tools and custom API pipelines are separate access decisions. The person responsible owns the outcome. ## Sources and observation dates - [Tika downloads](https://tika.apache.org/download.html): October 30, 2026 at 00:27 UTC; supplied ordinary browser version checks October 29 and 30. [Formats](https://tika.apache.org/3.2.3/formats.html): supplied browser observation on those dates, exact time unrecorded. - [Server](https://tika.apache.org/docs/4.2.x/using-tika/server/index.html), [CLI](https://tika.apache.org/docs/4.2.x/using-tika/cli/index.html), [Pipes configuration](https://tika.apache.org/docs/4.2.x/pipes/configuration.html) and [limits](https://tika.apache.org/docs/4.2.x/advanced/setting-limits.html): October 30 at 00:29 UTC. Configuration assembled from these fields; not runtime tested. - [TikaOCR](https://cwiki.apache.org/confluence/display/TIKA/TikaOCR): October 30 at 00:27; [4.2 OCR](https://tika.apache.org/docs/4.2.x/configuration/parsers/tesseract-ocr-parser.html), [PDF](https://tika.apache.org/docs/4.2.x/configuration/parsers/pdf-parser.html), [language detection](https://tika.apache.org/docs/4.2.x/advanced/language-detection.html), [Pipes](https://tika.apache.org/docs/4.2.x/pipes/index.html) and [Docker](https://tika.apache.org/docs/4.2.x/using-tika/docker.html): 00:28. - [Security history](https://tika.apache.org/security.html): October 30 at 00:27; [security model](https://tika.apache.org/security-model.html): 00:28; [CVE-2025-66516](https://raw.githubusercontent.com/CVEProject/cvelistV5/main/cves/2025/66xxx/CVE-2025-66516.json): official CVE list record checked at 00:29. [ASF security](https://www.apache.org/security/) and [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0): reused October 29 at 21:40. - [Docker installation](https://docs.docker.com/engine/install/ubuntu/): October 30 at 00:27. [systemd execution](https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html) and [resource controls](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html): October 30 at 00:41 UTC; verify against the installed OS version. - [Amazon Textract pricing](https://aws.amazon.com/textract/pricing/): October 30 at 00:27:59 UTC, Oregon Detect Document Text example. No managed forms or tables price is used. - [DigitalOcean](https://www.digitalocean.com/pricing/droplets) and [B2](https://www.backblaze.com/cloud-storage/pricing): October 29 at 21:10; [BLS wage](https://data.bls.gov/oesprofile/?areas=INDUSTRY,STATE,MSA&major_group=150000&measure=01&occupation=151244&year=2025): 21:12; [wage share](https://data.bls.gov/timeseries/CMU2020000000000P): 21:17. $47.66 divided by 0.700, rounded to $68.09 before multiplication. - [Claude pricing](https://claude.com/pricing), [Claude API](https://platform.claude.com/docs/en/about-claude/pricing), [OpenAI API](https://developers.openai.com/api/docs/pricing): October 29 at 23:31. [ChatGPT pricing](https://chatgpt.com/pricing/): supplied ordinary browser observation about 23:27. - [Codex CLI](https://developers.openai.com/codex/cli): October 30 at 00:27; [Desktop Commander](https://desktopcommander.app/) and [pricing](https://desktopcommander.app/pricing/), [Claude in Chrome](https://support.claude.com/en/articles/12012173-get-started-with-claude-in-chrome): October 29 at 23:31; [ChatGPT cloud browser](https://help.openai.com/en/articles/20001280-using-cloud-browser-in-chatgpt): 23:32. - [FTC Safeguards guidance](https://www.ftc.gov/business-guidance/resources/ftc-safeguards-rule-what-your-business-needs-know) and [ABA Rule 1.6](https://www.americanbar.org/groups/professional_responsibility/publications/model_rules_of_professional_conduct/rule_1_6_confidentiality_of_information/): October 30 at 00:29. Consult the rules governing your actual organization and data. *This kit is informational, not legal, financial or security consulting advice.* *Apache, the Apache feather logo and the Apache project names are trademarks of The Apache Software Foundation. This site is not affiliated with or endorsed by the ASF. Other product names are used for identification only.*