Architecture overview

MintJams CMS is a JCR-based operations platform built on OSGi (Apache Felix). It splits into the server (OSGi bundles) and the browser-based virtual desktop (the Webtop client).

Runtime stack

  • Apache Felix / OSGi — the modular server runtime
  • JCR repository (JSR 283) — the content store; isolated per workspace, embedded H2 by default, an external datasource in a cluster
  • SAML 2.0 SP / IdP — single sign-on. The system workspace is the global identity store (/home/users|groups|roles). It boots with zero configuration from CMS_PUBLIC_BASE_URL
  • Camunda BPM 7 — the BPMN 2.0 process engine (per workspace)
  • Apache Camel 4 — the EIP integration engine (per workspace)
  • Apache Groovy / GSP — server-side scripting (Groovy Server Pages)
  • Apache Tika / Lucene — document analysis and full-text search (with Japanese morphological analysis)
  • GraphQL API — the entry point for all data access and subscriptions
  • Webtop client — the browser virtual desktop and standard apps

Server vs. client

Part Location Tech
Server (bundles) bundles/ Java / OSGi
Client (Webtop) webtop/ TypeScript / Rollup

The server runs on Apache Felix; the Webtop is served as JCR content. The Webtop receives server-published events over GraphQL subscriptions.

Bundle catalog (excerpt)

Bundle Role
org.mintjams.jcr JCR (JSR-283) repository implementation
org.mintjams.rt.jcr JCR runtime (workspaces, sessions, index integration)
org.mintjams.cms CMS security, SAML SP/IdP implementations
org.mintjams.rt.cms runtime CMS (workspace management, GraphQL, provisioning, Camel/Camunda, EventAdmin bridges, Groovy)
org.mintjams.idp / org.mintjams.saml2 SAML 2.0 IdP / SP
org.mintjams.searchindex / org.mintjams.rt.searchindex full-text search (Lucene)
org.apache.camel / org.camunda.bpm EIP / BPM engines
org.apache.groovy / org.apache.tika scripting / document analysis

Concepts a developer should know

  • Workspaces — the unit of deployment and isolation. Each has its own DB, index, schemas and engines, and shares system identity
  • Sessions & the JCR API — read/write and query content via javax.jcr.Session. EventAdmin events are posted only on transaction commit
  • Scripts / GSP — run in a per-workspace Groovy engine; a session can be adapted to javax.jcr.Session for direct JCR access
  • deploy()Session.deploy() runs once at workspace startup, idempotently applying content from etc/jcr/deploy/ and provisioning from etc/jcr/provisioning/*.yml

Related