Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
346625b
[maven-release-plugin] prepare for next development iteration
namedgraph Jun 4, 2026
406c637
Post-release version bump
namedgraph Jun 4, 2026
c8862ea
Merge branch 'master' into develop
namedgraph Jun 5, 2026
d7e9521
Jena 6.1.0 (#309)
namedgraph Jun 5, 2026
e8de473
Remove bash trace debug from entrypoint
namedgraph Jun 5, 2026
1c47f09
Move CSR-only helpers, lapp:Application form restrictions, bs2:FormCo…
namedgraph Jun 5, 2026
78bef87
Move CSR-only helpers, lapp:Application form restrictions (cont.)
namedgraph Jun 5, 2026
9adb046
Lift bs2:Form $required to a predicate at rdf:RDF level
namedgraph Jun 5, 2026
197ab9c
Convert modal-form metadata fetches to async load/set pairs (#310)
namedgraph Jun 6, 2026
bef607f
Scope lapp:Application form restrictions to the app-settings flow
namedgraph Jun 6, 2026
cdd8567
Allow editing rdf:type on ldh:View instance forms
namedgraph Jun 6, 2026
5df94ce
Drop just-added block on empty-graph submit
namedgraph Jun 6, 2026
2de0235
Add migration plan for Jena ontapi refactor
namedgraph Jun 6, 2026
2ebf211
Remove outermost duplicate .block wrapper on btn-remove-resource
namedgraph Jun 6, 2026
c6de3f7
Untrack ONTAPI_MIGRATION.md
namedgraph Jun 6, 2026
74f91fe
Add 5.5.0 changelog entry
namedgraph Jun 6, 2026
75516dc
Bump version to 5.5.0-SNAPSHOT
namedgraph Jun 6, 2026
1a15e1f
Add property-metadata, constraints, and object-metadata to row-form l…
namedgraph Jun 6, 2026
92a0724
Carry sd:endpoint() in row-form context map
namedgraph Jun 6, 2026
babb314
CHANGELOG update
namedgraph Jun 6, 2026
bd0417c
Use absolute translations.rdf URI in remaining client-side stylesheets
namedgraph Jun 6, 2026
ac69536
Persist GraphMode canvas across re-renders; render dangling and anony…
namedgraph Jun 6, 2026
4e76528
CHANGELOG update
namedgraph Jun 6, 2026
edea113
Add fullscreen toggle and Esc handler to 3D force graph canvas
namedgraph Jun 6, 2026
5e0f64d
Close topmost modal on Esc key press
namedgraph Jun 6, 2026
88fca91
CHANGELOG update
namedgraph Jun 6, 2026
b321da8
Move admin XSLT overrides into shared CSR+SSR chain
namedgraph Jun 7, 2026
0ebde65
CHANGELOG update
namedgraph Jun 7, 2026
aa31716
Harden CSR fallout from shared admin override chain
namedgraph Jun 7, 2026
c75808c
Skolemize bnode objects; per-flow render-fn for modal form violations
namedgraph Jun 7, 2026
6b4aa7b
Share pure constructor build across CREATE/EDIT/violation flows
namedgraph Jun 7, 2026
3a1f7d5
CHANGELOG update
namedgraph Jun 7, 2026
9d22737
Fix javadoc error: unresolved JsonLDReadContext link
namedgraph Jun 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion .github/workflows/http-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@ jobs:
runs-on: ubuntu-latest
env:
ASF_ARCHIVE: https://archive.apache.org/dist/
JENA_VERSION: 4.7.0
JENA_VERSION: 6.1.0
BASE_URI: https://localhost:4443/
steps:
- name: Install Linux packages
run: sudo apt-get update && sudo apt-get install -qq raptor2-utils && sudo apt-get install curl
- name: Set up Java 21
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Download Jena
run: curl -sS --fail "${{ env.ASF_ARCHIVE }}jena/binaries/apache-jena-${{ env.JENA_VERSION }}.tar.gz" -o "${{ runner.temp }}/jena.tar.gz"
- name: Unpack Jena
Expand Down Expand Up @@ -49,6 +54,12 @@ jobs:
run: ./run.sh "$PWD/ssl/owner/cert.pem" "${{ secrets.HTTP_TEST_OWNER_CERT_PASSWORD }}" "$PWD/ssl/secretary/cert.pem" "${{ secrets.HTTP_TEST_SECRETARY_CERT_PASSWORD }}"
shell: bash
working-directory: http-tests
- name: Dump container logs on failure
if: failure()
run: docker compose --env-file ./http-tests/.env logs --no-color
- name: Dump Tomcat logs from linkeddatahub container on failure
if: failure()
run: docker compose --env-file ./http-tests/.env exec -T linkeddatahub sh -c 'for f in /usr/local/tomcat/logs/*; do echo "=== $f ==="; cat "$f"; done' || true
- name: Stop Docker containers and remove volumes
run: docker compose --env-file ./http-tests/.env down -v
- name: Remove Docker containers
Expand Down
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,33 @@
## [5.5.0] - 2026-06-07
### Added
- GraphMode 3D canvas Fullscreen toggle (CSS maximize, Esc exits)
- Esc closes topmost modal
- HTTP test for orphan bnode object skolemization

### Changed
- Jena upgraded to 6.1.0 (#309)
- Modal- and row-form metadata fetches converted to async load/set pairs; row-form chain extended with property-metadata, constraints, object-metadata; `sd:endpoint()` carried in context (#310)
- `bs2:Form` `$required` lifted to a predicate at `rdf:RDF` level
- CSR-only helpers moved out of `layout.xsl`; `bs2:FormControl` boolean overrides relocated
- Admin XSLT overrides (`bs2:Row`, `bs2:Create`, `bs2:FormControl`, `bs2:NavBarNavList`) and ACL/cert vocab templates moved from the SSR-only `admin/` chain into shared `document.xsl`/`resource.xsl`/`layout.xsl` and new `imports/{acl,cert}.xsl`; gated by `admin.`-subdomain on `lapp:origin()`
- `lapp:Application` form restrictions scoped to the app-settings flow
- `rdf:type` editable on `ldh:View` instance forms
- GraphMode canvas persisted across view re-renders via a `{container-id}-graph-host`; WebGL context and force-simulation state survive search/filter re-runs; dangling `@rdf:nodeID` and anonymous nested `rdf:Description` rendered as bnodes; click handlers skip bnodes
- View mode preserved across re-runs of the same search container
- Container result count short-circuits COUNT when the result set fits one page
- Removed bash trace debug from entrypoint
- Modal-form per-flow `render-fn` stamping unified via `ldh:constructor-form-response` / `ldh:edit-form-response` (parallel to `ldh:settings-form-response`); new `ldh:render-constructor-form#2` routes Container/Item creation violation re-render through `mode="bs2:Form"`, leaving `mode="ldh:DocumentForm"` for the edit flow

### Fixed
- Drop just-added block on empty-graph submit
- `btn-remove-resource` removes outermost duplicate `.block` wrapper
- Relative `document('translations.rdf')` calls in `imports/{nfo,sioc,sp}.xsl`, `admin/layout.xsl`, `document.xsl` 404'd against the SEF root under SaxonJS 3; switched to absolute `resolve-uri(..., lapp:origin())`
- Admin dropdowns, form-control defaults, and navbar reverted to end-user variants after CSR navigation (overrides only lived in the SSR `admin/` chain)
- Admin `bs2:Row` `foaf:Person`/`foaf:Group` lookup failed under SaxonJS XHR because `ac:document-uri` leaves slash-vocab term URIs intact; override now fetches the namespace doc
- `Skolemizer` covers blank nodes in object position; orphan bnode references (e.g. `<container> rdf:_1 [ ]`) rewritten to skolem URIs
- Container/Item modal violation re-render preserves co-shipped peer Descriptions (default `ldh:ChildrenView` content block was lost)
- EDIT and violation re-render were missing the SPIN-constructor merge that CREATE performs; `bs2:FormControl`'s SHACL branch silently dropped SPIN-defined property templates for classes with both (e.g. `skos:Concept`); merge extracted into shared `ldh:build-merged-constructor` and wired into both flows via the `constructor` tunnel

## [5.4.0] - 2026-06-04
### Added
- Multi-tab document navigation (`Document tabs`) with per-pane modal scoping and cached tab switching (#294, #302)
Expand Down
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
FROM maven:3.8.4-openjdk-17 AS maven
FROM maven:3.9-eclipse-temurin-21 AS maven

# download and extract Jena

ARG JENA_VERSION=4.7.0
ARG JENA_VERSION=6.1.0

ARG JENA_TAR_URL="https://archive.apache.org/dist/jena/binaries/apache-jena-${JENA_VERSION}.tar.gz"

Expand All @@ -22,7 +22,7 @@ RUN mvn -Pstandalone clean install

# ==============================

FROM atomgraph/letsencrypt-tomcat:10.1.46
FROM atomgraph/letsencrypt-tomcat:10.1.52

LABEL maintainer="martynas@atomgraph.com"

Expand Down
12 changes: 6 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ volumes:
varnish_end_user_cache:
services:
nginx:
image: nginx:1.23.3
image: nginx:1.31.1
mem_limit: 128m
configs:
- source: nginx_conf
Expand Down Expand Up @@ -105,7 +105,7 @@ services:
- ./config/dataspaces.trig:/var/linkeddatahub/datasets/dataspaces.trig
- ./config/system.trig:/var/linkeddatahub/datasets/system.trig
fuseki-admin:
image: atomgraph/fuseki:4.7.0
image: atomgraph/fuseki:6.1.0
user: root # otherwise fuseki user does not have permissions to the mounted folder which is owner by root
expose:
- 3030
Expand All @@ -114,7 +114,7 @@ services:
- ./fuseki/admin:/fuseki/databases
command: [ "--config", "/fuseki/config.ttl" ]
fuseki-end-user:
image: atomgraph/fuseki:4.7.0
image: atomgraph/fuseki:6.1.0
user: root # otherwise the fuseki user does not have permissions to the mounted folder which is owner by root
expose:
- 3030
Expand All @@ -123,7 +123,7 @@ services:
- ./fuseki/end-user:/fuseki/databases
command: [ "--config", "/fuseki/config.ttl" ]
varnish-frontend:
image: varnish:7.3.0
image: varnish:7.7.3
user: root # otherwise varnish user does not have permissions to the mounted folder which is owner by root
configs:
- source: varnish-frontend_vcl
Expand All @@ -136,7 +136,7 @@ services:
entrypoint: varnishd
command: [ "-F", "-f", "/etc/varnish/default.vcl", "-a", "http=:6060,HTTP", "-a", "proxy=:8443,PROXY", "-p", "feature=+http2", "-s", "file,/var/lib/varnish/storage.bin,3G", "-t", "86400" ] # -F: foreground, -f: config, -a: listeners, -p: http2, -s: storage, -t: TTL
varnish-admin:
image: varnish:7.3.0
image: varnish:7.7.3
user: root # otherwise the varnish user does not have permissions to the mounted folder which is owner by root
configs:
- source: varnish-admin_vcl
Expand All @@ -147,7 +147,7 @@ services:
entrypoint: varnishd
command: [ "-F", "-f", "/etc/varnish/default.vcl", "-a", "http=:80,HTTP", "-a", "proxy=:8443,PROXY", "-p", "feature=+http2", "-s", "malloc,1G", "-t", "86400", "-p", "timeout_idle=60s" ] # -F: foreground, -f: config, -a: listeners, -p: http2 + idle timeout, -s: storage, -t: TTL
varnish-end-user:
image: varnish:7.3.0
image: varnish:7.7.3
user: root # otherwise varnish user does not have permissions to the mounted folder which is owner by root
configs:
- source: varnish-end-user_vcl
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# add agent to the writers group

add-agent-to-group.sh \
-f "$OWNER_CERT_FILE" \
-p "$OWNER_CERT_PWD" \
--agent "$AGENT_URI" \
"${ADMIN_BASE_URL}acl/groups/writers/"

# create a container under root; it becomes the PUT target

slug=$(uuidgen | tr '[:upper:]' '[:lower:]')

container=$(create-container.sh \
-f "$AGENT_CERT_FILE" \
-p "$AGENT_CERT_PWD" \
-b "$END_USER_BASE_URL" \
--title "Test container" \
--slug "$slug" \
--parent "$END_USER_BASE_URL")

# PUT a body where rdf:_1 references a bnode that has NO further triples
# (an orphan blank node in object position). The body is otherwise valid
# (title is present, parent is present), so SPIN constraints pass.
# Expected: 200 OK.

curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$AGENT_CERT_FILE":"$AGENT_CERT_PWD" \
-X PUT \
-H "Accept: application/n-triples" \
-H "Content-Type: application/n-triples" \
--data-binary @- \
"$container" <<EOF \
| grep -q "$STATUS_OK"
<${container}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/ns/ldt/document-hierarchy#Container> .
<${container}> <http://purl.org/dc/terms/title> "Test container" .
<${container}> <http://rdfs.org/sioc/ns#has_parent> <${END_USER_BASE_URL}> .
<${container}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1> _:orphan .
EOF

# fetch the persisted representation and assert: the object of rdf:_1 is a URI,
# never a blank node label. The Skolemizer must have rewritten _:orphan to a
# skolem URI before the graph reached the store.

response=$(curl -k -f -s -G \
-E "$AGENT_CERT_FILE":"$AGENT_CERT_PWD" \
-H "Accept: application/n-triples" \
"$container")

rdf_1_line=$(echo "$response" | grep -E "^<${container}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1>" || true)

[ -n "$rdf_1_line" ] || exit 1

# object of rdf:_1 must be a URI (<...>), not a blank node label (_:...)
! echo "$rdf_1_line" | grep -qE '_:[A-Za-z0-9]+ \.$'
echo "$rdf_1_line" | grep -qE '<\S+> \.$'
Loading
Loading