From bdfc864ca148a3867f553507c688f782627e5e03 Mon Sep 17 00:00:00 2001 From: FriedJannik Date: Mon, 10 Nov 2025 10:14:38 +0100 Subject: [PATCH 1/4] Disables PatchSubmodelElementByPathValueOnly Endpoint for SubmodelElementList --- .../http/SubmodelRepositoryApiHTTPController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java b/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java index 8f265e237..fbe27d938 100644 --- a/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java +++ b/basyx.submodelrepository/basyx.submodelrepository-http/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/http/SubmodelRepositoryApiHTTPController.java @@ -55,6 +55,7 @@ import org.eclipse.digitaltwin.basyx.pagination.GetSubmodelElementsResult; import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository; import org.eclipse.digitaltwin.basyx.submodelrepository.http.pagination.GetSubmodelsResult; +import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementListValue; import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelElementValue; import org.eclipse.digitaltwin.basyx.submodelservice.value.SubmodelValueOnly; import org.springframework.beans.factory.annotation.Autowired; @@ -277,6 +278,9 @@ public ResponseEntity patchSubmodelByIdValueOnly(Base64UrlEncodedIdentifie } private ResponseEntity handleSubmodelElementValueSetRequest(Base64UrlEncodedIdentifier submodelIdentifier, String idShortPath, SubmodelElementValue body) { + if(body instanceof SubmodelElementListValue){ + return new ResponseEntity(HttpStatus.NOT_IMPLEMENTED); + } repository.setSubmodelElementValue(submodelIdentifier.getIdentifier(), idShortPath, body); return new ResponseEntity(HttpStatus.NO_CONTENT); } From 68d558fe20713ee7cd169e0d8243a9ec19118cf6 Mon Sep 17 00:00:00 2001 From: FriedJannik Date: Mon, 10 Nov 2025 11:43:51 +0100 Subject: [PATCH 2/4] Disables Tests for PatchSubmodelElementByPathValueOnly Endpoint for SubmodelElementList --- .../client/TestConnectedSubmodelElements.java | 6 ++---- .../http/SubmodelServiceSubmodelElementsTestSuiteHTTP.java | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/basyx.submodelservice/basyx.submodelservice-client/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/client/TestConnectedSubmodelElements.java b/basyx.submodelservice/basyx.submodelservice-client/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/client/TestConnectedSubmodelElements.java index 153d9fc33..83a3781a0 100644 --- a/basyx.submodelservice/basyx.submodelservice-client/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/client/TestConnectedSubmodelElements.java +++ b/basyx.submodelservice/basyx.submodelservice-client/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/client/TestConnectedSubmodelElements.java @@ -90,10 +90,7 @@ import org.eclipse.digitaltwin.basyx.submodelservice.value.mapper.RelationshipElementValueMapper; import org.eclipse.digitaltwin.basyx.submodelservice.value.mapper.SubmodelElementCollectionValueMapper; import org.eclipse.digitaltwin.basyx.submodelservice.value.mapper.SubmodelElementListValueMapper; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.*; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; @@ -388,6 +385,7 @@ public void getSubmodelElementListValue() { assertEquals(1, submodelElementList.getValue().getSubmodelElementValues().size()); } + @Ignore("Patch Endpoint for SubmodelElementList Values is disabled as it is not working.") @Test public void setSubmodelElementListValue() { DefaultSubmodelElementList submodelElementList = getDefaultSubmodelElementList(); diff --git a/basyx.submodelservice/basyx.submodelservice-http/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceSubmodelElementsTestSuiteHTTP.java b/basyx.submodelservice/basyx.submodelservice-http/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceSubmodelElementsTestSuiteHTTP.java index cb59737b5..27615504f 100644 --- a/basyx.submodelservice/basyx.submodelservice-http/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceSubmodelElementsTestSuiteHTTP.java +++ b/basyx.submodelservice/basyx.submodelservice-http/src/test/java/org/eclipse/digitaltwin/basyx/submodelservice/http/SubmodelServiceSubmodelElementsTestSuiteHTTP.java @@ -49,6 +49,7 @@ import org.eclipse.digitaltwin.basyx.http.serialization.BaSyxHttpTestUtils; import org.eclipse.digitaltwin.basyx.submodelservice.DummySubmodelFactory; import org.eclipse.digitaltwin.basyx.submodelservice.SubmodelServiceHelper; +import org.junit.Ignore; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpStatus; @@ -360,6 +361,7 @@ public void getSubmodelElementListValue() throws IOException, ParseException { BaSyxHttpTestUtils.assertSameJSONContent(expectedValue, BaSyxHttpTestUtils.getResponseAsString(response)); } + @Ignore("Patch Endpoint for SubmodelElementList Values is disabled as it is not working.") @Test public void setSubmodelElementListValue() throws IOException, ParseException { String expectedValue = getJSONValueAsString("value/setSubmodelElementListValue.json"); From 18af2e7ac1c62a89819f889eeb30c37fecd638e2 Mon Sep 17 00:00:00 2001 From: FriedJannik Date: Tue, 11 Nov 2025 13:36:58 +0100 Subject: [PATCH 3/4] Changes NGINX Revers Proxy to Apache2 because of URL Encoding issues --- examples/BaSyxNGINX/nginx/nginx.conf | 52 --------------- .../README.md | 0 .../aas/ExampleV3.aasx | Bin .../aas/test_demo_full_example.xml | 0 examples/BaSyxReverseProxy/apache/httpd.conf | 63 ++++++++++++++++++ .../basyx/aas-discovery.properties | 0 .../basyx/aas-env.properties | 0 .../docker-compose.yml | 10 +-- 8 files changed, 68 insertions(+), 57 deletions(-) delete mode 100644 examples/BaSyxNGINX/nginx/nginx.conf rename examples/{BaSyxNGINX => BaSyxReverseProxy}/README.md (100%) rename examples/{BaSyxNGINX => BaSyxReverseProxy}/aas/ExampleV3.aasx (100%) rename examples/{BaSyxNGINX => BaSyxReverseProxy}/aas/test_demo_full_example.xml (100%) create mode 100644 examples/BaSyxReverseProxy/apache/httpd.conf rename examples/{BaSyxNGINX => BaSyxReverseProxy}/basyx/aas-discovery.properties (100%) rename examples/{BaSyxNGINX => BaSyxReverseProxy}/basyx/aas-env.properties (100%) rename examples/{BaSyxNGINX => BaSyxReverseProxy}/docker-compose.yml (95%) diff --git a/examples/BaSyxNGINX/nginx/nginx.conf b/examples/BaSyxNGINX/nginx/nginx.conf deleted file mode 100644 index 7fa500bc0..000000000 --- a/examples/BaSyxNGINX/nginx/nginx.conf +++ /dev/null @@ -1,52 +0,0 @@ -events {} - -http { - server { - listen 80; - - # Configuration for the AAS Environment - location /aas-env/ { - proxy_pass http://aas-env:8081/aas-env/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Configuration for the AAS Registry - location /aas-registry/ { - proxy_pass http://aas-registry:8080/aas-registry/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Configuration for the Submodel Registry - location /sm-registry/ { - proxy_pass http://sm-registry:8080/sm-registry/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Configuration for the AAS Discovery Service - location /aas-discovery/ { - proxy_pass http://aas-discovery:8081/aas-discovery/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Configuration for the AAS Web UI - location /aas-ui/ { - proxy_pass http://aas-ui:3000/aas-ui/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - } -} \ No newline at end of file diff --git a/examples/BaSyxNGINX/README.md b/examples/BaSyxReverseProxy/README.md similarity index 100% rename from examples/BaSyxNGINX/README.md rename to examples/BaSyxReverseProxy/README.md diff --git a/examples/BaSyxNGINX/aas/ExampleV3.aasx b/examples/BaSyxReverseProxy/aas/ExampleV3.aasx similarity index 100% rename from examples/BaSyxNGINX/aas/ExampleV3.aasx rename to examples/BaSyxReverseProxy/aas/ExampleV3.aasx diff --git a/examples/BaSyxNGINX/aas/test_demo_full_example.xml b/examples/BaSyxReverseProxy/aas/test_demo_full_example.xml similarity index 100% rename from examples/BaSyxNGINX/aas/test_demo_full_example.xml rename to examples/BaSyxReverseProxy/aas/test_demo_full_example.xml diff --git a/examples/BaSyxReverseProxy/apache/httpd.conf b/examples/BaSyxReverseProxy/apache/httpd.conf new file mode 100644 index 000000000..7c8c51402 --- /dev/null +++ b/examples/BaSyxReverseProxy/apache/httpd.conf @@ -0,0 +1,63 @@ +# Minimal Apache HTTP Server configuration for reverse proxy + +ServerRoot "/usr/local/apache2" +Listen ${PORT} +ServerName ${HOSTNAME} +ErrorLog /dev/stderr +CustomLog /dev/stdout combined +User daemon +Group daemon + +# Load required modules +LoadModule mpm_event_module modules/mod_mpm_event.so +LoadModule unixd_module modules/mod_unixd.so +LoadModule log_config_module modules/mod_log_config.so +LoadModule authz_core_module modules/mod_authz_core.so +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_http_module modules/mod_proxy_http.so +LoadModule headers_module modules/mod_headers.so + +# Virtual host for reverse proxy + + + Require all granted + + + # Configuration for the AAS Environment + ProxyPass /aas-environment/ http://aas-env:8081/aas-environment/ + ProxyPassReverse /aas-environment/ http://aas-env:8081/aas-environment/ + + # Configuration for the AAS Registry + ProxyPass /aas-registry/ http://aas-registry:8080/aas-registry/ + ProxyPassReverse /aas-registry/ http://aas-registry:8080/aas-registry/ + + # Configuration for the AAS Registry 2 + ProxyPass /aas-registry-2/ http://aas-registry-2:8080/aas-registry-2/ + ProxyPassReverse /aas-registry-2/ http://aas-registry-2:8080/aas-registry-2/ + + # Configuration for the Submodel Registry + ProxyPass /sm-registry/ http://sm-registry:8080/sm-registry/ + ProxyPassReverse /sm-registry/ http://sm-registry:8080/sm-registry/ + + # Configuration for the Submodel Registry 2 + ProxyPass /sm-registry-2/ http://sm-registry-2:8080/sm-registry-2/ + ProxyPassReverse /sm-registry-2/ http://sm-registry-2:8080/sm-registry-2/ + + # Configuration for the AAS Discovery Service + ProxyPass /aas-discovery/ http://aas-discovery:8081/aas-discovery/ + ProxyPassReverse /aas-discovery/ http://aas-discovery:8081/aas-discovery/ + + # Configuration for the AAS Web UI (aas-gui path) + ProxyPass /aas-gui/ http://aas-web-ui:3000/aas-gui/ + ProxyPassReverse /aas-gui/ http://aas-web-ui:3000/aas-gui/ + # Remove X-Frame-Options and Content-Security-Policy headers + Header unset X-Frame-Options + Header unset Content-Security-Policy + # Add custom security headers for iframe embedding + Header always set Content-Security-Policy "frame-ancestors 'self' https://demo3.digital-twin.host" + Header always set X-Frame-Options "ALLOW-FROM https://demo3.digital-twin.host" + + # Configuration for the SPS Demonstrator UI (root path) + ProxyPass / http://sps-demonstrator-ui:3000/ + ProxyPassReverse / http://sps-demonstrator-ui:3000/ + \ No newline at end of file diff --git a/examples/BaSyxNGINX/basyx/aas-discovery.properties b/examples/BaSyxReverseProxy/basyx/aas-discovery.properties similarity index 100% rename from examples/BaSyxNGINX/basyx/aas-discovery.properties rename to examples/BaSyxReverseProxy/basyx/aas-discovery.properties diff --git a/examples/BaSyxNGINX/basyx/aas-env.properties b/examples/BaSyxReverseProxy/basyx/aas-env.properties similarity index 100% rename from examples/BaSyxNGINX/basyx/aas-env.properties rename to examples/BaSyxReverseProxy/basyx/aas-env.properties diff --git a/examples/BaSyxNGINX/docker-compose.yml b/examples/BaSyxReverseProxy/docker-compose.yml similarity index 95% rename from examples/BaSyxNGINX/docker-compose.yml rename to examples/BaSyxReverseProxy/docker-compose.yml index 6e8e2d698..4333ac649 100644 --- a/examples/BaSyxNGINX/docker-compose.yml +++ b/examples/BaSyxReverseProxy/docker-compose.yml @@ -1,12 +1,12 @@ services: - # nginx - nginx: - image: nginx:alpine - container_name: nginx + # apache + apache: + image: httpd:alpine + container_name: apache ports: - "80:80" volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro + - ./apache/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro restart: always depends_on: aas-env: From e09d2f9d003239f6fc2239ffa365c2e7feced0f5 Mon Sep 17 00:00:00 2001 From: FriedJannik Date: Tue, 11 Nov 2025 13:39:43 +0100 Subject: [PATCH 4/4] Adapts workflow --- .github/workflows/examples_test.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/examples_test.yml b/.github/workflows/examples_test.yml index cedd4ea7d..37d30a055 100644 --- a/.github/workflows/examples_test.yml +++ b/.github/workflows/examples_test.yml @@ -114,9 +114,9 @@ jobs: - name: Stop BaSyx Minimal Example run: docker compose -f examples/BaSyxMinimal/docker-compose.yml down - test-basyx-nginx: + test-basyx-reverse-proxy: runs-on: ubuntu-latest - name: Test BaSyx NGINX Example + name: Test BaSyx Reverse Proxy Example steps: - uses: actions/checkout@v5 @@ -127,11 +127,11 @@ jobs: distribution: 'adopt' cache: maven - - name: Start BaSyx NGINX Example - run: docker compose -f examples/BaSyxNGINX/docker-compose.yml up -d + - name: Start BaSyx Reverse Proxy Example + run: docker compose -f examples/BaSyxReverseProxy/docker-compose.yml up -d - - name: Stop BaSyx NGINX Example - run: docker compose -f examples/BaSyxNGINX/docker-compose.yml down + - name: Stop BaSyx Reverse Proxy Example + run: docker compose -f examples/BaSyxReverseProxy/docker-compose.yml down test-basyx-operation-delegation: runs-on: ubuntu-latest