You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: federated-catalogue/src/docs/architecture/chapters/05_building_block_view.adoc
+5-3Lines changed: 5 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -401,7 +401,8 @@ Format-specific JWT unwrapping is delegated back to the matching `CredentialForm
401
401
402
402
A trust framework's identity, ontology, and SHACL shapes are packaged together as a **bundle** under `classpath:trustframeworks/<bundle-id>/`.
403
403
The catalogue ships with the `gaia-x-2511` bundle and discovers any additional bundles dropped on the classpath at boot.
404
-
See ADR 10 for the full rationale.
404
+
An optional filesystem override directory (env var `FEDERATED_CATALOGUE_TRUST_FRAMEWORKS_OVERRIDE_PATH`) may be mounted at deployment time; bundles found there are merged onto their classpath counterparts by `id` or registered as new bundles when no classpath match exists.
405
+
See ADR 10 for the full rationale and overlay deep-merge rules.
405
406
406
407
[options="header",cols="1,3"]
407
408
|===
@@ -412,7 +413,7 @@ See ADR 10 for the full rationale.
412
413
| `properties:` block in `framework.yaml` | Framework-specific runtime values consumed by the bundle's own beans (e.g. `trust_anchor_url` read by `LoirePolicyEnforcer`). Not interpreted by the registry.
413
414
|===
414
415
415
-
`TrustFrameworkBundleLoader` scans `classpath:trustframeworks/*/framework.yaml` at startup and constructs a `TrustFrameworkBundle` (config + ontology + shapes) per directory.
416
+
`TrustFrameworkBundleLoader` scans `classpath:trustframeworks/*/framework.yaml` at startup, and additionally scans the filesystem override directory when `FEDERATED_CATALOGUE_TRUST_FRAMEWORKS_OVERRIDE_PATH` is set, constructing a `TrustFrameworkBundle` (config + ontology + shapes) per directory.
416
417
Bundles that fail to load are logged at WARN and skipped — they do not abort the load of remaining bundles.
417
418
418
419
`TrustFrameworkRegistry` indexes the loaded bundles and exposes role resolution to the verification pipeline:
Copy file name to clipboardExpand all lines: federated-catalogue/src/docs/architecture/chapters/07_deployment_view.adoc
+6Lines changed: 6 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,6 +24,12 @@ NOTE: CAT-NFR-01footnote:[Enhancement of the XFSC Federated Catalogue. 2025. htt
24
24
25
25
<<img_deployment_view>> shows the default ports for the components' interaction. The connection settings (hostnames, ports) are configurable. It is recommended to replace the default credentials. To store persistent data, the `Federated Catalogue Server`, `PostgreSQL` as well as the graph database (Neo4j or Fuseki) require a volume, which must be mounted into the container. Non-RDF assets are stored in a separate File Store directory (`federated-catalogue.file-store.asset.location`), which also requires a persistent volume in production.
26
26
27
+
**Trust Framework Bundle Override Directory.**
28
+
An optional read-only directory can be mounted into the container and pointed to by the env var `FEDERATED_CATALOGUE_TRUST_FRAMEWORKS_OVERRIDE_PATH`.
29
+
The expected layout is `<mount-point>/<bundle-id>/framework.yaml` (plus optional sibling `ontology.ttl` and `shapes.ttl` files), mirroring the classpath structure.
30
+
Use this mount to customise bundle properties — for example to point `trust_anchor_url` or `service_url` at in-cluster targets — or to add new bundles entirely, without rebuilding the JAR.
31
+
See ADR 10 for overlay deep-merge semantics.
32
+
27
33
Kubernetesfootnote:[https://kubernetes.io/[Kubernetes]] is the recommended infrastructure for production deployment. For development, Dockerfootnote:[https://www.docker.com/[Docker: Accelerated, Containerized Application Development]] in combination with docker-compose can be used.
Copy file name to clipboardExpand all lines: federated-catalogue/src/docs/architecture/chapters/08_concepts.adoc
+20-1Lines changed: 20 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,7 +33,7 @@ As default, all components should log to Standard out. Log aggregation is realiz
33
33
34
34
=== Trust Framework Bundles
35
35
36
-
Each supported trust framework is delivered as a self-contained classpath bundle (`framework.yaml` + ontology + SHACL shapes) under `trustframeworks/<bundle-id>/`.
36
+
Each supported trust framework is delivered as a self-contained bundle (`framework.yaml` + ontology + SHACL shapes), either packaged with the JAR or supplied at deployment time as a filesystem directory, under `trustframeworks/<bundle-id>/`.
37
37
A `TrustFrameworkRegistry` bean indexes all bundles at boot and resolves credential subject types to bundle-defined roles, replacing the previous hardcoded URI-to-enum mapping.
38
38
See ADR 10 for the design rationale and <<_trust_framework_bundles_and_role_resolution,Building Block View — Trust Framework Bundles and Role Resolution>> for the runtime structure.
39
39
@@ -76,6 +76,25 @@ The resulting list is short by design (typically three to ten entries) and stabl
76
76
When the conformity body is silent on such a class — no validation component, no criteria document, no test payload — the safe default is a defensive mapping: route the class to the most semantically adjacent existing role via `additional_roots` so credentials of that type, if they ever appear, land somewhere rather than being rejected.
77
77
Document the mapping inline with a pointer to what would un-block dropping it (typically: confirmation from the conformity body that the class is never issued at the top level).
78
78
79
+
==== Deploying Bundle Overlays
80
+
81
+
A bundle overlay lets operators customise an existing bundle or add a new one at deployment time, without rebuilding the JAR.
82
+
Set `FEDERATED_CATALOGUE_TRUST_FRAMEWORKS_OVERRIDE_PATH` (Spring property: `federated-catalogue.trust-frameworks.override-path`) to a directory mounted read-only into the container.
83
+
The loader expects the layout `<override-path>/<bundle-id>/framework.yaml` (same as the classpath layout), with optional sibling `ontology.ttl` and `shapes.ttl` files.
84
+
85
+
When the `id` in a filesystem `framework.yaml` matches a classpath bundle, the file is treated as an overlay: it only needs to declare `id` plus the fields to change.
86
+
Nested maps merge recursively (filesystem wins per leaf key); lists and scalars replace wholesale when the overlay supplies them; sibling TTL files are inherited from the classpath bundle when the overlay directory omits them.
87
+
A filesystem entry whose `id` has no classpath match is loaded as a brand-new bundle and must declare all mandatory fields.
88
+
See ADR 10 for the full deep-merge rules.
89
+
90
+
.Minimal overlay example — override the Trust Anchor URL for the `gaia-x-2511` bundle
Copy file name to clipboardExpand all lines: federated-catalogue/src/docs/architecture/chapters/09_architecture_decisions.adoc
+37-4Lines changed: 37 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -357,13 +357,13 @@ Fixes DSO immediately but deepens every structural problem above.
357
357
2. **SHACL-driven discovery, retain enum:** Replace hardcoded URIs with runtime discovery; keep `TrustFrameworkBaseClass` enum as the routing label.
358
358
Fixes DSO and enables new frameworks via config, but the fixed enum still couples the API and storage schema to Gaia-X concepts.
359
359
360
-
3. **Bundle-per-framework with explicit role declarations (chosen):** Each trust framework is a self-contained classpath bundle (ontology + SHACL + a YAML config that declares the framework's roles).
360
+
3. **Bundle-per-framework with explicit role declarations (chosen):** Each trust framework is a self-contained bundle (ontology + SHACL + a YAML config that declares the framework's roles), packaged with the JAR or supplied at deployment time as a filesystem directory.
361
361
At startup the catalogue loads all bundles, builds a `<typeUri> → <ResolvedRole>` index by walking each declared role's subclass closure, and routes credentials by role string.
362
362
No trust-framework concept exists in Java source — only in the bundle configs.
363
363
364
364
**Decision:** Option 3 — bundle-per-framework with explicit role declarations and dynamic subclass-closure indexing.
365
365
366
-
**Bundle layout (classpath resources):**
366
+
**Bundle layout:**
367
367
368
368
----
369
369
trustframeworks/
@@ -373,7 +373,12 @@ trustframeworks/
373
373
shapes.ttl # SHACL shapes (optional for non-SHACL bundles)
374
374
----
375
375
376
-
The `TrustFrameworkBundleLoader` scans `classpath:trustframeworks/*/framework.yaml` at boot.
376
+
Bundles ship from two sources:
377
+
378
+
* **Classpath** (`classpath:trustframeworks/*/framework.yaml`): bundles packaged in the JAR; scanned first.
379
+
* **Filesystem overlay directory** (optional, configured via `FEDERATED_CATALOGUE_TRUST_FRAMEWORKS_OVERRIDE_PATH`): a runtime-configurable directory whose subdirectories follow the same `<bundle-id>/framework.yaml` layout.
380
+
When set, the loader scans it after the classpath and merges its entries into the classpath result.
381
+
377
382
A bundle that fails to load is logged at WARN and skipped — it does not abort loading of remaining bundles.
The filesystem overlay directory exists to customise bundle properties — most commonly the URL of an external service the bundle calls, such as `properties.trust_anchor_url` — without rebuilding the JAR.
411
+
It also allows new bundles to be added at deployment time for environments that need them.
412
+
413
+
Resolution rule for filesystem entries:
414
+
415
+
* The filesystem `framework.yaml` is parsed for its `id` field first.
416
+
If `id` is missing or blank the entry is skipped with a warning.
417
+
* If `id` matches a classpath bundle, the filesystem entry is treated as an **overlay**: it is deep-merged onto the classpath base.
418
+
The filesystem file therefore only needs to declare `id` plus the fields it changes.
419
+
* If `id` is new (no classpath match), the entry is treated as a **new bundle** and must declare all mandatory fields (`id`, `family`, `namespace`, `validation_type`, `roles`).
420
+
421
+
Merge semantics for overlays:
422
+
423
+
* Nested maps (e.g. `properties:`, `roles:`) merge recursively; the filesystem value wins at each leaf key.
424
+
* Lists (e.g. `additional_roots`, `types`) and scalars (e.g. `namespace`, `validation_type`) replace wholesale when the filesystem provides them.
425
+
* Sibling files (`ontology.ttl`, `shapes.ttl`) are inherited from the classpath bundle when the overlay directory does not ship its own.
426
+
427
+
Minimal overlay example — redirect the Gaia-X bundle's trust anchor URL to an in-cluster service without copying the rest of the bundle:
Namespaces are disjoint by construction; resolution is unambiguous.
460
493
A VP containing credentials from different frameworks routes each credential through its own bundle's role.
461
-
Adding a new framework is a classpath-resource change — drop a new `trustframeworks/<bundle-id>/` directory containing `framework.yaml` plus the ontology/SHACL files; no Java changes.
494
+
Adding a new framework is a bundle drop-in — either as a classpath resource baked into a custom JAR or as a directory under the deployment-time overlay path, in both cases containing `framework.yaml` plus the ontology/SHACL files; no Java changes.
462
495
463
496
**Removed configuration:** the `federated-catalogue.verification.{participant,resource,service-offering}.type` properties (and the `service-offering.additional-types` workaround) are no longer read.
464
497
Type URIs are now declared exclusively in each bundle's `framework.yaml`.
Copy file name to clipboardExpand all lines: federated-catalogue/src/docs/architecture/chapters/12_glossary.adoc
+4-1Lines changed: 4 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -90,8 +90,11 @@ The identifier must be a valid IRI (see ADR 7).
90
90
|fcmeta:hasMachineReadable
91
91
|RDF property in the protected `fcmeta:` namespace written to the graph DB when an asset link is created. Points from a human-readable asset's IRI to its machine-readable counterpart's IRI.
92
92
93
+
|Bundle Overlay
94
+
|A `framework.yaml` placed in the trust-framework filesystem override directory that shares an `id` with a classpath bundle. The overlay's fields deep-merge onto the classpath base (see ADR 10), allowing deployment-time customisation of bundle properties without rebuilding the JAR.
95
+
93
96
|Trust Framework Bundle
94
-
|A self-contained, classpath-loaded unit (`framework.yaml` + `ontology.ttl` + `shapes.ttl`) defining a single trust-framework profile. Discovered at boot under `trustframeworks/<bundle-id>/`. Indexed by `TrustFrameworkRegistry` to drive role resolution. See ADR 10.
97
+
|A self-contained, classpath- or filesystem-loaded unit (`framework.yaml` + `ontology.ttl` + `shapes.ttl`) defining a single trust-framework profile. Discovered at boot under `trustframeworks/<bundle-id>/` (classpath) and/or in the filesystem override directory. Filesystem entries can either overlay a classpath bundle by `id` or introduce a new bundle. Indexed by `TrustFrameworkRegistry` to drive role resolution. See ADR 10.
95
98
96
99
|Framework Profile (id)
97
100
|Stable identifier of a single trust-framework bundle (e.g. `gaia-x-2511`). Acts as the registry key and the `frameworkProfileId` of every `ResolvedRole` it produces.
0 commit comments