# Local JSP Docker Analysis ## Goal Turn the public `www` site plus the legacy `rus` admin menu/runtime into a Docker-based local development environment with: - full JSP and servlet execution - enough filesystem layout to satisfy docbase-based file lookups - a mocked MySQL-compatible database that lets the app boot and the admin menu render - a workflow that supports editing JSPs and restarting quickly during local development This document is an implementation analysis, not a finished deployment recipe. ## What The Live System Actually Looks Like Read-only checks on `83.149.164.4` show the production site is not running from a packaged WAR. It is running from an exploded Tomcat webapp: - OS: FreeBSD 14.2 - Java: OpenJDK 11.0.25 - Tomcat: 9.0.102 - `catalina.home` and `catalina.base`: `/usr/local/apache-tomcat-9.0` - Tomcat `server.xml` contains a dedicated host for `www.regalamiunsorriso.it` - The live context for `/` points at `/home/sites/regalamiunsorriso/www/` - Tomcat AJP is enabled on port `8009` Important nuance: - `/home/sites/regalamiunsorriso/www/WEB-INF` is a real directory - `/home/sites/regalamiunsorriso/rus/WEB-INF` is also a real directory - the live `www/WEB-INF/lib` is much larger than `rus/WEB-INF/lib` - the live `rus/WEB-INF/classes` contains the DB property files - the live `www/WEB-INF/classes` appears minimal - Tomcat `server.xml` maps the live public host only to `/home/sites/regalamiunsorriso/www/` - no live Tomcat `Context` for `/home/sites/regalamiunsorriso/rus/` was visible in `server.xml` That means the runtime is split across two legacy trees, but the currently mapped live webapp is `www`. For local Docker work, assuming `www` alone is sufficient would still be unsafe, because the older `rus` tree remains the clearest source of legacy admin code, schema SQL, and bootstrap logic. ## What The Repo Shows ### `www` The `www` tree is the public web root and already includes: - JSP pages - `WEB-INF/web.xml` - taglibs such as `acxent.tld`, `pg.tld`, `news.tld`, `cc.tld` - a large `WEB-INF/lib` with modernized `it.acxent.*` jars - an `admin/menu` tree with JSP admin UI Evidence of the rename/migration is strong in `www`: - JSPs import `it.acxent.*` - `www/WEB-INF/web.xml` maps servlets under `it.acxent.*` - `www/WEB-INF/lib` contains `acxent-core`, `acxent-common`, `acxent-face`, and related jars The current `www/WEB-INF/web.xml` shows: - servlet/filter mappings for JSP and rewritten `.html` URLs - admin menu servlet mappings under `/admin/menu/*` - startup servlets that update DB structures on boot - DB config pointing to MySQL-compatible settings - direct dependence on application parameters and filesystem-backed assets ### `rus` The `rus` tree contains the older admin/runtime stack and still matters for local development: - `rus/WEB-INF/web.xml` is another full Java webapp descriptor - `rus/admin/menu` contains the older admin dashboard JSPs - `rus/WEB-INF/lib/*_src` contains source code for key servlet, DB, and parameter logic - `rus/admin/_alterTable/pg2rus.sql` contains a large schema for the application domain, including `GARA`, `TIPO_GARA`, `PUNTO_FOTO`, `ACCESS`, `USER_ACCESS`, and `LOG_FOTO` - `rus/WEB-INF/classes/dbcomuni.properties` sets `USE_PARM_HT=true` Evidence that `rus` is the older lineage is equally strong: - `rus/admin/menu` JSPs import `com.ablia.*` - `rus/WEB-INF/web.xml` maps servlets under `com.ablia.*` - `rus/WEB-INF/lib` contains `ablia.jar`, `abliaDbCom.jar`, and multiple `*_src` trees - `rus/WEB-INF/lib/decomp.bat` suggests this tree has already been treated as a reverse-engineering or recovery surface rather than a clean source distribution This is also where the clearest bootstrap logic lives. `Parm.java` seeds defaults for some records such as: - `SINGLE_SIGN_ON=false` - `LOGO_MENU=Titolo Applicazione` - `PATH_TMP=_tmp/` - `MAIL_MSG_PATH_MAILER=mailMessage/` - `REWRITE_URL_FILE_PATH=/admin/_alterTable/` That helps, but it does not remove the need for a real schema or baseline user/access data. ## Migration Interpretation The evidence supports this interpretation of the `ablia` to `acxent` transition: - the active public runtime has moved to the `acxent` namespace and libraries under `www` - the `rus` tree is still valuable, but it is a legacy `ablia` runtime/reference tree rather than the clean current implementation - the live host mapping reinforces that shift, because Tomcat serves `www` and does not visibly publish `rus` as its own live host context That means the safest handling is: - keep the current `rus` tree as a legacy backup/reference - do not treat the existing `rus` tree as the current canonical codebase - if you want a fresh, updated `rus`-equivalent admin/runtime tree, obtain it separately and preserve it as a new artifact rather than overwriting this legacy one - if the fresh artifact is delivered only as jars or compiled classes, decompiling those classes into a browsable source mirror is reasonable for local analysis and maintenance What the current evidence does not prove: - that such a fresh downloadable `rus` tree is already present in this repo - that the live server still executes `rus` directly for public requests So the evidence supports the preservation and decompilation strategy, but not a claim that this repository already contains the fresh replacement. ### The Admin Boundary There are effectively two admin surfaces in the repo: - `www/admin/menu`, using the newer `it.acxent.*` stack - `rus/admin/menu`, using the older `com.ablia.*` stack The `www` admin menu already contains compatibility links such as `/admin/pg_RUS/Gara`, which is a strong sign that the public app has been carrying forward legacy admin functionality instead of replacing it cleanly. For Docker, that means there are two viable targets: 1. boot only the `www` webapp and bring over enough `rus` data/assets to satisfy the legacy admin links 2. boot both `www` and `rus` as separate Tomcat contexts and keep the boundary explicit The second option is safer for analysis and migration because it matches the repository reality better. ## What “Full JSP Support” Actually Requires To satisfy the request, a local container must support more than static JSP rendering. It needs: - Tomcat 9 with JSP compilation enabled - Java 11 first, because that is what production is currently running - exploded webapp deployment so JSP edits are visible without rebuilding a WAR each time - both taglib trees and both `WEB-INF/lib` trees available at runtime - a writable temp/work area for Tomcat compiled JSPs - a writable app docbase for uploads, generated files, CSV imports, image lookups, and mail templates - a MySQL-compatible database reachable by the app at startup It also needs to tolerate the app's legacy assumptions: - path concatenation against `DOCBASE` - direct filesystem existence checks inside taglibs and servlets - startup DB mutation via `InitUpdateDbSvlt` - servlet code that chooses JSP pages dynamically based on `ACCESS`, request params, and file existence ## Data Strategy The application does not just query a few content tables. It uses the database as runtime configuration. For this codebase, the most practical local-development strategy is not to handcraft mock rows first. It is to start from a dump of the real production-shaped database and trim or sanitize later if needed. This is now directly supported by the local workspace state. The following dumps already exist under `db/`: - `dump-pg-202604211927.sql` - `dump-pg_log-202604211930.sql` - `dump-mysql-202604211926.sql` - `dump-performance_schema-202604211926.sql` - `dump-sys-202604211930.sql` For local development, `dump-pg-202604211927.sql` should be treated as the primary seed source. At minimum, local boot for useful development will require: - `PARM` - `USERS` - `USER_PROFILE` - `ACCESS` - `USER_ACCESS` - `TABLE_DESC` - photo/event tables such as `GARA`, `TIPO_GARA`, `PUNTO_FOTO`, and likely additional related tables referenced by the servlets The admin menu depends on both authentication and metadata-driven routing. A DB with only schema and no seed data will not be enough. There are some useful seed hints already in the repo: - old user/profile bootstrap SQL under `www/admin/_alterTable/_old` - schema SQL under `rus/admin/_alterTable/pg2rus.sql` - parameter defaults embedded in `rus/WEB-INF/lib/ablia_src/com/ablia/common/Parm.java` What is missing from the repo is not raw data, but a curated minimal subset and a documented import procedure for local use. If you use the real dump as the starting point, the first local milestone becomes: - import the real `pg` dump locally - override the environment-sensitive values after import, especially `PARM.DOCBASE` and any mailer or file-path settings - document one admin login and one public sample flow that are known to work against the imported snapshot This is materially easier and more faithful than trying to synthesize a coherent mock dataset from schema alone. ## Recommended Docker Shape ### Recommendation Build a multi-service local stack with one shared source volume and one MySQL service. Suggested services: - `tomcat-www`: Tomcat 9 serving `www` as the ROOT webapp - `tomcat-rus`: Tomcat 9 serving `rus` at `/rus` or `/admin-rus` - `mysql`: MySQL 8 or MariaDB 10.11 used only for local development Optional but useful: - `nginx`: reverse proxy that exposes one friendly local hostname and routes `/` to `tomcat-www` and `/rus` to `tomcat-rus` Why this is the best first step: - it preserves both legacy runtimes instead of prematurely merging them - it allows JSP edits against exploded directories - it gives you a clean place to prove which admin flows still belong to `rus` - it minimizes risky assumptions about the live cross-tree wiring ### Alternative Run only one Tomcat container with `www` as ROOT and manually overlay selected `rus` assets into it. This is possible, but I would not start there because: - it bakes in guesses about a split runtime that is already unclear - it makes failures look like classpath bugs even when the problem is missing legacy assets - it is harder to reason about during early local bring-up ## Filesystem Layout Needed Inside Docker A working local setup should not rely only on the web roots. It should create an application docbase volume as well. Suggested mounted paths: - `/workspace/www` -> repo `www` - `/workspace/rus` -> repo `rus` - `/data/docbase` -> local writable application docbase - `/data/docbase/_tmp` -> temp uploads and generated files - `/data/docbase/admin/csv` -> CSV import/export location used by admin code - `/usr/local/tomcat/work` -> writable JSP compilation cache Then seed `PARM.DOCBASE` in local DB to `/data/docbase/`. Without that, a large amount of JSP and servlet code will fail on file existence checks even if the JSP compiler itself works. ## DB Strategy ### Practical Target Use MySQL-compatible SQL, not H2. Reasons: - production points to MySQL-compatible configuration - legacy SQL and update scripts are written for that family - dynamic SQL and driver assumptions are unlikely to be portable to H2 without patches ### Preferred Seed Plan The local DB should be assembled in layers, but the first layer should now be the real dump rather than repo SQL alone: 1. import `db/dump-pg-202604211927.sql` into the local MySQL-compatible container 2. apply local-only overrides for environment-sensitive `PARM` values 3. import optional auxiliary dumps only if the chosen local workflows need them 4. document one known-good login and one known-good public sample flow 5. only then consider trimming or anonymizing for a lighter-weight developer dataset This shifts the main implementation work item from “invent a stable dataset” to “stabilize a production-shaped snapshot for local use.” ### Required Local Overrides After Import Even with the real dump, local development still needs a few post-import adjustments. At minimum, review or override: - `DOCBASE=/data/docbase/` - `PATH_TMP=_tmp/` - `MAIL_MSG_PATH_MAILER` if local mail-template resolution should stay inside the repo/docbase - any path-oriented `PARM` values that point at production-only filesystem locations - any credentials or integration flags that should not target live services from a developer machine The important change is that users, profiles, access metadata, and most domain rows should come from the real dump first, not from a hand-built minimal seed. ## What Will Probably Break First These are the highest-probability local bring-up failures. ### 1. Incomplete DB Seed Most likely symptom: - menu renders partially or login works but navigation fails - JSPs throw nulls around `Parm`, `Access`, or user profile resolution ### 2. Missing Filesystem Assets Under `DOCBASE` Most likely symptom: - image checks fail - CSV import/export paths fail - mail template lookups fail - servlet code throws `FileNotFoundException` or silently renders degraded UI ### 3. Mixed Legacy Classpaths Most likely symptom: - one context starts while the other fails on missing classes, conflicting libs, or older APIs Running two Tomcat contexts is the easiest way to isolate this. ### 4. Rewrite And Context Path Assumptions Most likely symptom: - `.html` routes or menu links resolve incorrectly when not hosted exactly like production This is manageable, but local routing should be explicit. ## Estimated Work Breakdown ### Phase 1: Container Bring-Up Expected effort: low to medium. Deliverables: - Docker Compose file - Tomcat Dockerfile or runtime image selection - exploded mounting of `www` and `rus` - MySQL service - baseline local environment variables and startup scripts ### Phase 2: Local DB Import And Stabilization Expected effort: medium to high. Deliverables: - repeatable import of `db/dump-pg-202604211927.sql` - local override script for environment-sensitive `PARM` rows - one documented admin test login - one documented public sample race/photo flow This is the real critical path. ### Phase 3: Runtime Stabilization Expected effort: medium. Deliverables: - working `DOCBASE` directory layout - local rewrite compatibility - sample assets so photo/event pages can render without production storage - a short smoke-test checklist ## The Smallest Sensible First Implementation If the goal is a usable development environment quickly, the best first slice is: 1. one Tomcat 9 container for `www` 2. one MySQL container 3. import the real `pg` dump and apply a small set of local `PARM` overrides 4. expose the `www/admin/menu` dashboard first 5. add a second `rus` context only when a missing admin flow proves it is still needed If the goal is completeness and fewer hidden assumptions, start with both contexts immediately. Given the current repo and the server findings, I would still design the Docker setup so a second `rus` context can be added without reworking the stack. ## Recommendation Summary This is feasible, but the hard part is not Docker. The hard part is stabilizing a production-shaped local runtime contract across: - two legacy web trees - a metadata-driven admin UI - filesystem-backed application behavior - a DB that acts as both content store and runtime config store ### What It Would Take - Tomcat 9 on Java 11 - exploded deployment of `www`, and probably `rus` as well - a writable local docbase mounted outside the web roots - a MySQL-compatible local database - import of the real `pg` dump plus a deliberate set of local overrides for environment-sensitive rows - a short compatibility pass on rewrite behavior and admin links ### Overall Assessment Containerizing the JSP runtime is straightforward. Making it genuinely useful for local development is still a moderate migration task, but the existence of the real local DB dump changes the shape of the work. The cleanest path is to import the real `pg` snapshot, override the environment-sensitive parts, treat `www` as the active `acxent` runtime, and retain `rus` as a legacy `ablia` reference tree unless and until a fresh updated replacement is obtained and decompiled. ## Suggested Next Deliverables If this analysis is accepted, the next implementation docs should be: 1. a concrete `docker-compose.yml` design 2. a `local-db-import-plan.md` covering dump import plus local `PARM` overrides 3. a `local-smoke-test.md` covering login, admin dashboard, one public event page, and one file-backed operation