Metadata-driven presentations and interactive dashboards for the Data Hopper ecosystem.
This project is the presentation engine behind server-side SVG reporting, data connectors, and a browser canvas editor. It is built to grow into simple interactive, dashboard-style UIs on the same metadata model.
Hopper Presentation was not built to be a heavily productized commercial reporting suite. It is offered to the community as a possible open-source alternative to older reporting stacks that once filled the same niche—especially Pentaho Reporting and Jasper Reports.
Those projects could produce pixel-perfect PDFs (invoices, statements, formal print layout) and were widely used when open-source BI and reporting were stronger. Both have lost momentum: support and everyday use have thinned, and teams that need a web interface with serious print/PDF output often end up with closed-source tools or hand-coded PDF generation.
This engine aims at that gap with a different shape: server-side layout and SVG, metadata-driven pages, and print/PDF-capable rendering—without requiring a proprietary stack or a one-off PDF codebase for every document. Growth is intentionally slow and steady: solid output, clear APIs, and community usefulness over star-count campaigns. The implementation effort was modest relative to the value of having another option in the open, so this is a deliberate way to give back.
| Module | Artifact | Role |
|---|---|---|
hopper-presentation-core |
JAR | Rendering, connectors, components, themes |
hopper-presentation-swt |
JAR | Hop GUI / SWT viewer (canvas; no web server) |
hopper-presentation-rest |
WAR | REST API + canvas editor / viewer |
- Java packages:
org.hopper.* - Domain types use a short
Hprefix (e.g.HPresentation,HComponent,HConnector) - HTTP context:
/hopper/— API base/hopper/api/ - Config file:
hopper-presentation.properties
mvn clean installRequires Java 21 and Maven. Hop 2.20.0-SNAPSHOT is pulled from the ASF snapshots repository (or a local install of the Hop tree). Use 2.20.0 when that release is final.
Jetty is declared only on the REST module (the parent is a pom aggregator). Use one of:
# From the repository root: install modules, then run Jetty in the REST module
# (parent POM has no jetty plugin — bare "mvn jetty:run" at root fails with
# "No plugin found for prefix jetty")
mvn -pl hopper-presentation-rest -am install -DskipTests
cd hopper-presentation-rest && mvn jetty:run
# Or fully-qualified goal from the root:
# mvn -pl hopper-presentation-rest -am org.eclipse.jetty:jetty-maven-plugin:11.0.24:runPoint metadata.path at a folder with presentation/, connector/, theme/, hopper-database-connection/ (see hopper-presentation.properties).
Presentation joins the Data Hopper fleet (Keycloak realm hopper, role aliases, compose fragment) without Spring Boot. See docs/platform-sso-docker.md.
Then open:
http://localhost:8080/hopper/api/render/main/
Example property:
metadata.path=/data/hopper/metadata/
cors.allow.origin=true- Connectors load/transform row data (SQL, sample, chain, sort, filter, REST, …).
- Components (table, crosstab, charts, Gantt, label, text block, group, composite, …) layout and draw SVG.
- Presentations compose pages, themes, interactions, and parameter mappings as Hop metadata JSON.
- REST serves render pages, edit forms (annotation-driven), undo history, and the JS canvas editor.
Agents and tools should start from docs/ai/: wire-format notes, layout recipes, golden templates, JSON Schema export, validate/compile APIs (/hopper/api/ai/*), and a compact JSON DSL.
Core types: HMetadataCodec, HMetadataValidator, HAuthoringDsl in hopper-presentation-core.
HSvgComponent loads SVG via Hop/SvgCache and Apache Batik 1.19 (SVG 1.1). Artwork is embedded into the page SVG during server-side render.
Authoring tips
- Prefer SVG 1.1 primitives. Batik does not support SVG2-only filters such as
feDropShadow(usefeGaussianBlur+feOffset+feFlood+feMergeinstead). - Embedding composes with page/header/footer margin transforms so icons stay aligned with component bounds (including header logos).
- Scale types (
NONE,MIN,MAX,FILL, …) control how natural SVG size maps into the layout box.
See hopper-presentation-core/docs/components.md.
The canvas editor and read-only viewer use in-memory render IDs (POST /render/presentation returns a UUID).
- Edit → View (toolbar) opens a new tab using the current editor
renderId, so the edit session is not discarded. - Avoid
reload: trueon that path: reload removes the cached rendering for the presentation name and would leave the Edit tab with a dead id (Unable to find rendering with ID …). - Soft re-render after save/apply (
POST …/edit/presentation/{name}/render/) replaces the editor render and updates the page’srenderIdin place.
See hopper-presentation-rest/README.md.
Project mark: assets/icons/hopper-presentation.svg — hopper funnel feeding a presentation canvas / chart. Packaged copies live under hopper-presentation-rest static resources (Batik-safe filters).
| Path | Content |
|---|---|
| AGENTS.md | Agent + developer guide: layout, requirements, schemas, authoring workflow |
| docs/ai/ | AI authoring: wire format, templates, JSON Schema, validate/compile APIs |
| hopper-presentation-core/README.md | Core library overview |
| hopper-presentation-core/docs/ | Architecture, API, components, connectors |
| docs/security-and-audit.md | Auth, action RBAC, usage audit plugins |
| hopper-presentation-rest/README.md | REST API, run, smoke test |
| hopper-presentation-rest/docs/smoke-test.md | End-to-end render checklist |
Apache License 2.0 — see LICENSE.