From 78d2bdefa34b9c35c321891e623a12a28d822357 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 4 May 2026 15:19:19 +0200 Subject: [PATCH 01/25] deps: update aas4j to 2.0.1 --- .../AssetConnectionManager.java | 22 +++++++++---------- .../registry/RegistrySynchronization.java | 2 +- .../request/RequestHandlerManager.java | 16 +++++++------- .../InvokeOperationAsyncRequestHandler.java | 4 ++-- .../registry/RegistrySynchronizationTest.java | 8 +++---- .../handler/RequestHandlerManagerTest.java | 6 ++--- .../json/fixture/ValueOnlyExamples.java | 4 ++-- .../endpoint/http/HttpErrorHandler.java | 4 ++-- .../endpoint/http/RequestHandlerServlet.java | 4 ++-- .../endpoint/http/util/HttpHelper.java | 16 +++++++------- .../http/AbstractHttpEndpointTest.java | 12 +++++----- .../serialization/HttpJsonSerializerTest.java | 6 ++--- .../model/api/InternalErrorResponse.java | 4 ++-- .../ilt/faaast/service/model/api/Message.java | 6 ++--- .../model/api/response/AbstractResponse.java | 6 ++--- pom.xml | 2 +- .../aimc/AimcSubmodelTemplateProcessor.java | 2 +- 17 files changed, 62 insertions(+), 62 deletions(-) diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java index 2fc79c619..b8d50fae8 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java @@ -61,7 +61,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.eclipse.digitaltwin.aas4j.v3.model.DataElement; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.aas4j.v3.model.SubmodelElement; @@ -169,7 +169,7 @@ public List updateConnections(List oldConfigs, L } catch (ConfigurationException e) { return List.of(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(e.getMessage()) .build()); } @@ -728,7 +728,7 @@ private List apply(List newConnections) { } catch (ConfigurationException e) { result.add(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(String.format("Adding asset connection failed (reason: %s)", e.getMessage())) .build()); @@ -796,12 +796,12 @@ private List mergeChanges(List currentCo } else { messages.add(Message.builder() - .messageType(MessageTypeEnum.INFO) + .messageType(MessageType.INFO) .text("Deleting asset connection skipped (reason: connection does not exist)") .build()); } } - if (messages.stream().anyMatch(x -> x.getMessageType() == MessageTypeEnum.ERROR || x.getMessageType() == MessageTypeEnum.EXCEPTION)) { + if (messages.stream().anyMatch(x -> x.getMessageType() == MessageType.ERROR || x.getMessageType() == MessageType.EXCEPTION)) { throw new ExceptionWithDetails("failed to apply changes in asset connections", messages); } return result; @@ -819,7 +819,7 @@ private List deleteProviders(AssetConnectionConfig target, AssetConnect } else { result.add(Message.builder() - .messageType(MessageTypeEnum.WARNING) + .messageType(MessageType.WARNING) .text(String.format( "Failed to unregister %s provider (reference: %s, reason: existing provider details for reference differs from expected provider)", providerType.toString().toLowerCase(), @@ -829,7 +829,7 @@ private List deleteProviders(AssetConnectionConfig target, AssetConnect } else { result.add(Message.builder() - .messageType(MessageTypeEnum.INFO) + .messageType(MessageType.INFO) .text(String.format("Failed to unregister %s provider (reference: %s, reason: provider does not exist)", providerType.toString().toLowerCase(), ReferenceHelper.asString(reference))) @@ -861,7 +861,7 @@ private List addProvidersToConnection(AssetConnection target, AssetConn } catch (AssetConnectionException e) { result.add(Message.builder() - .messageType(MessageTypeEnum.WARNING) + .messageType(MessageType.WARNING) .text(String.format("Failed to unsubscribe subscription (reference: %s, reason: %s)", ReferenceHelper.asString(reference), e.getMessage())) @@ -881,7 +881,7 @@ private List addProvidersToConnection(AssetConnection target, AssetConn } catch (AssetConnectionException e) { result.add(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(String.format("Failed to register %s provider (reference: %s, reason: %s)", providerType.toString().toLowerCase(), ReferenceHelper.asString(reference), @@ -899,7 +899,7 @@ private List addProvidersToConnection(AssetConnection target, AssetConn } catch (AssetConnectionException e) { result.add(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(String.format("Failed to unregister %s provider (reference: %s, reason: %s)", providerType.toString().toLowerCase(), ReferenceHelper.asString(reference), @@ -921,7 +921,7 @@ private List addProviders(AssetConnectionConfig target, AssetConnection if (Objects.nonNull(reference) && provider.getValue().equals(providerType.getProvidersFromConfigAccessor().apply(target).get(reference))) { result.add(Message.builder() - .messageType(MessageTypeEnum.INFO) + .messageType(MessageType.INFO) .text(String.format("Skipped adding %s provider (reference: %s, reason: already exists)", providerType.toString().toLowerCase(), ReferenceHelper.asString(reference))) diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronization.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronization.java index 14ed6abb4..75d90d378 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronization.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronization.java @@ -455,7 +455,7 @@ private SubmodelDescriptor asDescriptor(Submodel submodel) { .idShort(submodel.getIdShort()) .description(submodel.getDescription()) .semanticId(submodel.getSemanticId()) - .supplementalSemanticId(submodel.getSupplementalSemanticIds()) + .supplementalSemanticIds(submodel.getSupplementalSemanticIds()) .displayName(submodel.getDisplayName()) .extensions(submodel.getExtensions()) .endpoints(endpoints.stream() diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/RequestHandlerManager.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/RequestHandlerManager.java index c96f4c35d..51d015cb3 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/RequestHandlerManager.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/RequestHandlerManager.java @@ -39,7 +39,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.apache.commons.lang3.reflect.ConstructorUtils; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -135,29 +135,29 @@ public , O extends Response> O execute(I request, RequestEx throw new IllegalArgumentException("request must be non-null"); } if (!handlers.containsKey(request.getClass())) { - return createResponse(request, StatusCode.SERVER_INTERNAL_ERROR, MessageTypeEnum.EXCEPTION, "no handler defined for this request"); + return createResponse(request, StatusCode.SERVER_INTERNAL_ERROR, MessageType.EXCEPTION, "no handler defined for this request"); } try { return (O) handlers.get(request.getClass()).process(request, context); } catch (ResourceNotFoundException e) { - return createResponse(request, StatusCode.CLIENT_ERROR_RESOURCE_NOT_FOUND, MessageTypeEnum.ERROR, e); + return createResponse(request, StatusCode.CLIENT_ERROR_RESOURCE_NOT_FOUND, MessageType.ERROR, e); } catch (ResourceAlreadyExistsException e) { - return createResponse(request, StatusCode.CLIENT_RESOURCE_CONFLICT, MessageTypeEnum.ERROR, e); + return createResponse(request, StatusCode.CLIENT_RESOURCE_CONFLICT, MessageType.ERROR, e); } catch (ValidationException e) { - return createResponse(request, StatusCode.CLIENT_ERROR_BAD_REQUEST, MessageTypeEnum.ERROR, e); + return createResponse(request, StatusCode.CLIENT_ERROR_BAD_REQUEST, MessageType.ERROR, e); } } - private static , O extends Response> O createResponse(I request, StatusCode statusCode, MessageTypeEnum messageType, Exception e) { + private static , O extends Response> O createResponse(I request, StatusCode statusCode, MessageType messageType, Exception e) { return createResponse(request, statusCode, messageType, e.getMessage()); } - private static , O extends Response> O createResponse(I request, StatusCode statusCode, MessageTypeEnum messageType, String message) { + private static , O extends Response> O createResponse(I request, StatusCode statusCode, MessageType messageType, String message) { try { O response = (O) ConstructorUtils.invokeConstructor(TypeToken.of(request.getClass()).resolveType(Request.class.getTypeParameters()[0]).getRawType()); response.setStatusCode(statusCode); @@ -196,7 +196,7 @@ public , O extends Response> void executeAsync(I request, C } catch (Exception e) { LOGGER.trace("Error while executing request", e); - callback.accept(createResponse(request, StatusCode.SERVER_INTERNAL_ERROR, MessageTypeEnum.EXCEPTION, e)); + callback.accept(createResponse(request, StatusCode.SERVER_INTERNAL_ERROR, MessageType.EXCEPTION, e)); } }); } diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/submodel/InvokeOperationAsyncRequestHandler.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/submodel/InvokeOperationAsyncRequestHandler.java index 8946b2465..0e7947484 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/submodel/InvokeOperationAsyncRequestHandler.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/submodel/InvokeOperationAsyncRequestHandler.java @@ -35,7 +35,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.eclipse.digitaltwin.aas4j.v3.model.ExecutionState; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Operation; import org.eclipse.digitaltwin.aas4j.v3.model.OperationResult; import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable; @@ -121,7 +121,7 @@ private void handleOperationFailure(Reference reference, List .inoutputArguments(inoutput) .outputArguments(List.of()) .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text(String.format( "operation failed to execute (reason: %s)", error.getMessage())) diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java index afe6101f1..60e352b57 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java @@ -373,7 +373,7 @@ private void mockPersistence() throws ResourceNotFoundException, PersistenceExce } - private String getAasDescriptorBody(AssetAdministrationShell aas) throws JsonProcessingException, SerializationException { + private String getAasDescriptorBody(AssetAdministrationShell aas) throws SerializationException { return mapper.write(new DefaultAssetAdministrationShellDescriptor.Builder() .administration(aas.getAdministration()) .id(aas.getId()) @@ -390,14 +390,14 @@ private String getAasDescriptorBody(AssetAdministrationShell aas) throws JsonPro } - private String getSubmodelDescriptorBody(Submodel submodel) throws JsonProcessingException, SerializationException { + private String getSubmodelDescriptorBody(Submodel submodel) throws SerializationException { return mapper.write(new DefaultSubmodelDescriptor.Builder() .administration(submodel.getAdministration()) .id(submodel.getId()) .idShort(submodel.getIdShort()) .description(submodel.getDescription()) .semanticId(submodel.getSemanticId()) - .supplementalSemanticId(submodel.getSupplementalSemanticIds()) + .supplementalSemanticIds(submodel.getSupplementalSemanticIds()) .displayName(submodel.getDisplayName()) .extensions(submodel.getExtensions()) .endpoints(endpoint.getSubmodelEndpointInformation(submodel.getId())) @@ -416,7 +416,7 @@ private List getSubmodelDescriptorsFromAas(AssetAdministrati .idShort(x.getIdShort()) .description(x.getDescription()) .semanticId(x.getSemanticId()) - .supplementalSemanticId(x.getSupplementalSemanticIds()) + .supplementalSemanticIds(x.getSupplementalSemanticIds()) .displayName(x.getDisplayName()) .extensions(x.getExtensions()) .endpoints(endpoint.getSubmodelEndpointInformation(x.getId())) diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java index cbf8f9fe8..684977f37 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java @@ -183,7 +183,7 @@ import org.eclipse.digitaltwin.aas4j.v3.model.Environment; import org.eclipse.digitaltwin.aas4j.v3.model.ExecutionState; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Operation; import org.eclipse.digitaltwin.aas4j.v3.model.OperationVariable; import org.eclipse.digitaltwin.aas4j.v3.model.Property; @@ -1736,7 +1736,7 @@ public void testGetIdentifiableWithInvalidIdRequest() throws Exception { GetSubmodelResponse expected = new GetSubmodelResponse.Builder() .result(new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text("Resource not found with id") .build()) .build()) @@ -1757,7 +1757,7 @@ public void testGetReferableWithInvalidIdRequest() throws Exception { GetSubmodelElementByPathResponse expected = new GetSubmodelElementByPathResponse.Builder() .result(new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text("Resource not found with id") .build()) .build()) diff --git a/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/fixture/ValueOnlyExamples.java b/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/fixture/ValueOnlyExamples.java index b6743f6e1..629ba4782 100644 --- a/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/fixture/ValueOnlyExamples.java +++ b/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/fixture/ValueOnlyExamples.java @@ -32,7 +32,7 @@ import org.eclipse.digitaltwin.aas4j.v3.model.EntityType; import org.eclipse.digitaltwin.aas4j.v3.model.ExecutionState; import org.eclipse.digitaltwin.aas4j.v3.model.KeyTypes; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.MultiLanguageProperty; import org.eclipse.digitaltwin.aas4j.v3.model.Operation; import org.eclipse.digitaltwin.aas4j.v3.model.Property; @@ -211,7 +211,7 @@ public class ValueOnlyExamples { .build()) .result(new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.INFO) + .messageType(MessageType.INFO) .text("some message text") .timestamp("2024-01-01T00:00:00.000+00:00") .build()) diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpErrorHandler.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpErrorHandler.java index 9a5cac7ab..bc75c082a 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpErrorHandler.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpErrorHandler.java @@ -34,7 +34,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Result; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultResult; import org.eclipse.jetty.http.HttpHeader; @@ -122,7 +122,7 @@ private void send(Response response, StatusCode statusCode, Throwable cause, Cal .build(); if (config.isIncludeErrorDetails() && Objects.nonNull(cause)) { result.getMessages().add(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(getStacktrace( cause)) .build()); diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/RequestHandlerServlet.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/RequestHandlerServlet.java index 17f9ee496..813f41372 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/RequestHandlerServlet.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/RequestHandlerServlet.java @@ -35,7 +35,7 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.jetty.server.Response; @@ -146,7 +146,7 @@ private static boolean isSuccessful(de.fraunhofer.iosb.ilt.faaast.service.model. .orElse(List.of()) .stream() .map(message -> message.getMessageType()) - .noneMatch(x -> Objects.equals(x, MessageTypeEnum.ERROR) || Objects.equals(x, MessageTypeEnum.EXCEPTION)); + .noneMatch(x -> Objects.equals(x, MessageType.ERROR) || Objects.equals(x, MessageType.EXCEPTION)); } } diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/util/HttpHelper.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/util/HttpHelper.java index 685428f1f..774dec3ec 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/util/HttpHelper.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/util/HttpHelper.java @@ -34,7 +34,7 @@ import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Result; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultResult; import org.eclipse.jetty.http.HttpStatus; @@ -113,19 +113,19 @@ public static List parseCommaSeparatedList(String input) { /** * Converts a {@link de.fraunhofer.iosb.ilt.faaast.service.model.api.StatusCode} to a - * {@link org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum}. + * {@link org.eclipse.digitaltwin.aas4j.v3.model.MessageType}. * * @param statusCode the input {@link de.fraunhofer.iosb.ilt.faaast.service.model.api.StatusCode} - * @return the resulting {@link org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum} + * @return the resulting {@link org.eclipse.digitaltwin.aas4j.v3.model.MessageType} */ - public static MessageTypeEnum messageTypeFromstatusCode(StatusCode statusCode) { + public static MessageType messageTypeFromstatusCode(StatusCode statusCode) { if (statusCode.isError()) { - return MessageTypeEnum.ERROR; + return MessageType.ERROR; } if (statusCode.isException()) { - return MessageTypeEnum.EXCEPTION; + return MessageType.EXCEPTION; } - return MessageTypeEnum.INFO; + return MessageType.INFO; } @@ -255,7 +255,7 @@ public static void sendException(HttpServletResponse response, Exception excepti StatusCode.SERVER_INTERNAL_ERROR, new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(exception.getMessage()) .build()) .build()); diff --git a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java index 319e050e0..f5f648819 100644 --- a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java +++ b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java @@ -82,7 +82,7 @@ import org.eclipse.digitaltwin.aas4j.v3.model.Endpoint; import org.eclipse.digitaltwin.aas4j.v3.model.Environment; import org.eclipse.digitaltwin.aas4j.v3.model.ExecutionState; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.ProtocolInformation; import org.eclipse.digitaltwin.aas4j.v3.model.Reference; import org.eclipse.digitaltwin.aas4j.v3.model.Result; @@ -785,7 +785,7 @@ public void testOperationAsync() throws Exception { public void testResultServerError() throws Exception { Result expected = new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text(HttpStatus.getMessage(500)) .build()) .build(); @@ -804,7 +804,7 @@ public void testResultServerError() throws Exception { public void testResultBadRequest() throws Exception { Result expected = new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text("no matching request mapper found for URL 'shellsX'") .build()) .build(); @@ -818,7 +818,7 @@ public void testResultBadRequest() throws Exception { public void testMethodNotAllowed() throws Exception { Result expected = new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text("method 'PUT' not allowed for URL 'shells' (allowed methods: GET, POST)") .build()) .build(); @@ -832,7 +832,7 @@ public void testMethodNotAllowed() throws Exception { public void testResultNotFound() throws Exception { Result expected = new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text(HttpStatus.getMessage(404)) .build()) .build(); @@ -844,7 +844,7 @@ public void testResultNotFound() throws Exception { String id = "foo"; ContentResponse response = execute(HttpMethod.GET, "/submodels/" + EncodingHelper.base64UrlEncode(id) + "/submodel-elements/Invalid"); Result actual = deserializer.read(new String(response.getContent()), Result.class); - Assert.assertEquals(MessageTypeEnum.ERROR, actual.getMessages().get(0).getMessageType()); + Assert.assertEquals(MessageType.ERROR, actual.getMessages().get(0).getMessageType()); } diff --git a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/serialization/HttpJsonSerializerTest.java b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/serialization/HttpJsonSerializerTest.java index 4d039c27a..56088ac2f 100644 --- a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/serialization/HttpJsonSerializerTest.java +++ b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/serialization/HttpJsonSerializerTest.java @@ -20,7 +20,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.TimeZone; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Result; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultResult; import org.eclipse.jetty.http.HttpStatus; @@ -37,7 +37,7 @@ public class HttpJsonSerializerTest { @Test public void testEnumsWithCustomNaming() throws SerializationException, UnsupportedModifierException { - Assert.assertEquals("\"Error\"", serializer.write(MessageTypeEnum.ERROR)); + Assert.assertEquals("\"Error\"", serializer.write(MessageType.ERROR)); } @@ -48,7 +48,7 @@ public void testResult() throws SerializationException, ParseException, JSONExce Result result = new DefaultResult.Builder() .messages(Message.builder() .text(HttpStatus.getMessage(404)) - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .code(HttpStatus.getMessage(404)) .timestamp("2022-01-01T00:00:00.000+00:00") .build()) diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/InternalErrorResponse.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/InternalErrorResponse.java index 455d99be1..83dd302c7 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/InternalErrorResponse.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/InternalErrorResponse.java @@ -15,7 +15,7 @@ package de.fraunhofer.iosb.ilt.faaast.service.model.api; import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.AbstractResponse; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultResult; @@ -28,7 +28,7 @@ public InternalErrorResponse(String message) { this.statusCode = StatusCode.SERVER_INTERNAL_ERROR; this.result = new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.EXCEPTION) + .messageType(MessageType.EXCEPTION) .text(message) .build()) .build(); diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/Message.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/Message.java index 7925284cc..a3e2da7d5 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/Message.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/Message.java @@ -16,7 +16,7 @@ import de.fraunhofer.iosb.ilt.faaast.service.util.TimeFormatHelper; import java.util.Date; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.builder.MessageBuilder; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultMessage; @@ -26,13 +26,13 @@ */ public class Message extends DefaultMessage { - // enshure variables are set to the default values as required by the implementation + // ensure variables are set to the default values as required by the implementation public Message() { Date date = new Date(); this.timestamp = TimeFormatHelper.asISO8601(date); this.text = ""; this.code = ""; - this.messageType = MessageTypeEnum.INFO; + this.messageType = MessageType.INFO; } diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/AbstractResponse.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/AbstractResponse.java index 30ac5f0a2..43ebb9e25 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/AbstractResponse.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/AbstractResponse.java @@ -18,7 +18,7 @@ import de.fraunhofer.iosb.ilt.faaast.service.model.api.Response; import de.fraunhofer.iosb.ilt.faaast.service.model.api.StatusCode; import java.util.Objects; -import org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum; +import org.eclipse.digitaltwin.aas4j.v3.model.MessageType; import org.eclipse.digitaltwin.aas4j.v3.model.Result; import org.eclipse.digitaltwin.aas4j.v3.model.builder.ExtendableBuilder; import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultResult; @@ -72,7 +72,7 @@ public void setError(StatusCode statusCode, String message) { setStatusCode(statusCode); setResult(new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text(message) .build()) .build()); @@ -129,7 +129,7 @@ public B error(StatusCode statusCode, String message) { getBuildingInstance().setResult( new DefaultResult.Builder() .messages(Message.builder() - .messageType(MessageTypeEnum.ERROR) + .messageType(MessageType.ERROR) .text(message) .build()) .build()); diff --git a/pom.xml b/pom.xml index 8317d5433..207f93403 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ https://github.com/FraunhoferIOSB/FAAAST-Service/issues - 1.0.5 + 2.0.1 4.3.0 1.84 12.3.0 diff --git a/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java b/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java index ace0178cf..187afc244 100644 --- a/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java +++ b/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java @@ -14,7 +14,7 @@ */ package de.fraunhofer.iosb.ilt.faaast.service.submodeltemplate.aimc; -import static org.eclipse.digitaltwin.aas4j.v3.model.MessageTypeEnum.ERROR; +import static org.eclipse.digitaltwin.aas4j.v3.model.MessageType.ERROR; import de.fraunhofer.iosb.ilt.faaast.service.ServiceContext; import de.fraunhofer.iosb.ilt.faaast.service.assetconnection.AssetConnectionConfig; From 4b3edf888fcf246efc05fe18e6d0b3ded734c010 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 4 May 2026 15:19:58 +0200 Subject: [PATCH 02/25] fix: minor issues --- .../json/MetadataJsonSerializerTest.java | 25 +++++++++---------- .../iosb/ilt/faaast/service/starter/App.java | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/MetadataJsonSerializerTest.java b/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/MetadataJsonSerializerTest.java index 8a8e27587..db4b4bf91 100644 --- a/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/MetadataJsonSerializerTest.java +++ b/dataformat/json/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/serialization/json/MetadataJsonSerializerTest.java @@ -16,7 +16,6 @@ import de.fraunhofer.iosb.ilt.faaast.service.dataformat.SerializationException; import de.fraunhofer.iosb.ilt.faaast.service.dataformat.json.MetadataJsonSerializer; -import de.fraunhofer.iosb.ilt.faaast.service.model.exception.ValueMappingException; import de.fraunhofer.iosb.ilt.faaast.service.serialization.json.fixture.MetadataExamples; import java.io.File; import java.io.IOException; @@ -44,43 +43,43 @@ public void testSubmodel() throws SerializationException, JSONException, IOExcep @Test - public void testBlob() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testBlob() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.BLOB_FILE, MetadataExamples.BLOB); } @Test - public void testElementCollection() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testElementCollection() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.ELEMENT_COLLECTION_FILE, MetadataExamples.ELEMENT_COLLECTION); } @Test - public void testElementList() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testElementList() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.ELEMENT_LIST_FILE, MetadataExamples.ELEMENT_LIST); } @Test - public void testEntity() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testEntity() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.ENTITY_FILE, MetadataExamples.ENTITY); } @Test - public void testFile() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testFile() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.FILE_FILE, MetadataExamples.FILE); } @Test - public void testMultiLanguageProperty() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testMultiLanguageProperty() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.MULTI_LANGUAGE_PROPERTY_FILE, MetadataExamples.MULTI_LANGUAGE_PROPERTY); } @Test - public void testProperty() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testProperty() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.PROPERTY_DATETIME_FILE, MetadataExamples.PROPERTY_DATETIME); assertEquals(MetadataExamples.PROPERTY_DOUBLE_FILE, MetadataExamples.PROPERTY_DOUBLE); assertEquals(MetadataExamples.PROPERTY_INT_FILE, MetadataExamples.PROPERTY_INT); @@ -89,27 +88,27 @@ public void testProperty() throws SerializationException, JSONException, IOExcep @Test - public void testRange() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testRange() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.RANGE_DOUBLE_FILE, MetadataExamples.RANGE_DOUBLE); assertEquals(MetadataExamples.RANGE_INT_FILE, MetadataExamples.RANGE_INT); } @Test - public void testReferenceElement() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testReferenceElement() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.REFERENCE_ELEMENT_GLOBAL_FILE, MetadataExamples.REFERENCE_ELEMENT_GLOBAL); assertEquals(MetadataExamples.REFERENCE_ELEMENT_MODEL_FILE, MetadataExamples.REFERENCE_ELEMENT_MODEL); } @Test - public void testRelationshipElement() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testRelationshipElement() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.RELATIONSHIP_ELEMENT_FILE, MetadataExamples.RELATIONSHIP_ELEMENT); } @Test - public void testAnnotatedRelationshipElement() throws SerializationException, JSONException, IOException, ValueMappingException { + public void testAnnotatedRelationshipElement() throws SerializationException, JSONException, IOException { assertEquals(MetadataExamples.ANNOTATED_RELATIONSHIP_ELEMENT_FILE, MetadataExamples.ANNOTATED_RELATIONSHIP_ELEMENT); } @@ -119,7 +118,7 @@ private void assertEquals(File expectedFile, Object value) throws JSONException, } - private void assertEquals(String expected, Object value) throws JSONException, IOException, SerializationException { + private void assertEquals(String expected, Object value) throws JSONException, SerializationException { String actual = serializer.write(value); JSONAssert.assertEquals(expected, actual, JSONCompareMode.NON_EXTENSIBLE); } diff --git a/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java b/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java index bcb474d42..5cac02e43 100644 --- a/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java +++ b/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java @@ -312,7 +312,7 @@ private void validate(ServiceConfig config) { COMMAND_NO_VALIDATION)); } catch (Exception e) { - throw new InitializationException("Error loading model file. Ensure that the model is valid and conformant to v3 of the AAS specficiation.", e); + throw new InitializationException("Error loading model file. Ensure that the model is valid and conformant to v3 of the AAS specification.", e); } } From ccbdcbcedef0495ce37715fe8a5a148366eb411f Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 4 May 2026 15:20:23 +0200 Subject: [PATCH 03/25] fix: SML.orderRelevant default to false --- dataformat/json/src/test/resources/metadata/element-list.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dataformat/json/src/test/resources/metadata/element-list.json b/dataformat/json/src/test/resources/metadata/element-list.json index 69b38adfa..e2e7d0ec2 100644 --- a/dataformat/json/src/test/resources/metadata/element-list.json +++ b/dataformat/json/src/test/resources/metadata/element-list.json @@ -1,5 +1,5 @@ { "modelType": "SubmodelElementList", "idShort": "list1", - "orderRelevant": true -} \ No newline at end of file + "orderRelevant": false +} From 443d2ac89f52ab95ecd3ed01aa5d6795ab825196 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 4 May 2026 15:34:40 +0200 Subject: [PATCH 04/25] feat: update aas versions --- README.md | 4 +-- core/src/test/resources/AASFull.json | 4 +-- core/src/test/resources/AASFull.xml | 8 ++--- .../model/ServiceSpecificationProfile.java | 32 +++++++++---------- .../file/src/test/resources/model.json | 4 +-- persistence/file/src/test/resources/model.xml | 8 ++--- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index e288bc1e1..b60f3a06e 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ The features of FA³ST Service include > [!TIP] -> For more details on FA³ST Service see the [:blue_book: **full documenation**](https://faaast-service.readthedocs.io/). +> For more details on FA³ST Service see the [:blue_book: **full documentation**](https://faaast-service.readthedocs.io/). ## Implemented AAS Specifications -- AAS Part 1: Metamodel v3.0 [Specification](https://industrialdigitaltwin.org/wp-content/uploads/2023/06/IDTA-01001-3-0_SpecificationAssetAdministrationShell_Part1_Metamodel.pdf) +- AAS Part 1: Metamodel v3.1 [Specification](https://industrialdigitaltwin.org/wp-content/uploads/2025/11/IDTA-01001-3-1-2_AAS-Specification_Part1_Metamodel.pdf) - AAS Part 2: API v3.0.1 [Specification](https://industrialdigitaltwin.org/wp-content/uploads/2023/06/IDTA-01002-3-0_SpecificationAssetAdministrationShell_Part2_API_.pdf), [OpenAPI](https://app.swaggerhub.com/apis/Plattform_i40/Entire-API-Collection/V3.0.1) - AAS Part 3a: Data Specification – IEC 61360 v3.0 [Specification](https://industrialdigitaltwin.org/en/wp-content/uploads/sites/2/2024/07/IDTA-01003-a-3-0-2_SpecificationAssetAdministrationShell_Part3a_DataSpecification_IEC613601.pdf) - AAS Part 5: Package File Format (AASX) v3.0 [Specification](https://industrialdigitaltwin.org/en/wp-content/uploads/sites/2/2024/06/IDTA-01005-3-0-1_SpecificationAssetAdministrationShell_Part5_AASXPackageFileFormat.pdf) diff --git a/core/src/test/resources/AASFull.json b/core/src/test/resources/AASFull.json index 2101af43e..4f5528946 100644 --- a/core/src/test/resources/AASFull.json +++ b/core/src/test/resources/AASFull.json @@ -215,7 +215,7 @@ "keys": [ { "type": "GlobalReference", - "value": "https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360" + "value": "https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360" } ], "type": "ExternalReference" @@ -2547,4 +2547,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/core/src/test/resources/AASFull.xml b/core/src/test/resources/AASFull.xml index f84e94917..aed57921e 100644 --- a/core/src/test/resources/AASFull.xml +++ b/core/src/test/resources/AASFull.xml @@ -1,7 +1,7 @@ - + xsi:schemaLocation="https://admin-shell.io/aas/3/1 AAS.xsd"> TestAssetAdministrationShell @@ -2386,7 +2386,7 @@ GlobalReference - https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360 @@ -2482,4 +2482,4 @@ - \ No newline at end of file + diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/ServiceSpecificationProfile.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/ServiceSpecificationProfile.java index c175e7fcd..474cbb656 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/ServiceSpecificationProfile.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/ServiceSpecificationProfile.java @@ -89,7 +89,7 @@ */ public enum ServiceSpecificationProfile { AAS_FULL( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellServiceSpecification/SSP-001", List.of( Interface.AAS, Interface.SUBMODEL, @@ -134,7 +134,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), AAS_READ( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellServiceSpecification/SSP-002", List.of( Interface.AAS, Interface.SUBMODEL, @@ -156,7 +156,7 @@ public enum ServiceSpecificationProfile { GetSubmodelRequest.class, GetSelfDescriptionRequest.class)), SUBMODEL_FULL( - "https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/SubmodelServiceSpecification/SSP-001", List.of( Interface.SUBMODEL, Interface.SERIALIZATION, @@ -189,7 +189,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), SUBMODEL_READ( - "https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/SubmodelServiceSpecification/SSP-002", List.of( Interface.SUBMODEL, Interface.SERIALIZATION, @@ -207,7 +207,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), SUBMODEL_VALUE( - "https://admin-shell.io/aas/API/3/0/SubmodelServiceSpecification/SSP-003", + "https://admin-shell.io/aas/API/3/1/SubmodelServiceSpecification/SSP-003", List.of( Interface.SUBMODEL, Interface.DESCRIPTION), @@ -216,30 +216,30 @@ public enum ServiceSpecificationProfile { InvokeOperationSyncRequest.class, GetSelfDescriptionRequest.class)), AASX_FILE_SERVER_FULL( - "https://admin-shell.io/aas/API/3/0/AasxFileServerServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/AasxFileServerServiceSpecification/SSP-001", List.of( Interface.AASX_FILE_SERVER, Interface.DESCRIPTION), List.of( GetSelfDescriptionRequest.class)), AAS_REGISTRY_FULL( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-001", List.of(), List.of()), AAS_REGISTRY_READ( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellRegistryServiceSpecification/SSP-002", List.of(), List.of()), SUBMODEL_REGISTRY_FULL( - "https://admin-shell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-001", List.of(), List.of()), SUBMODEL_REGISTRY_READ( - "https://admin-shell.io/aas/API/3/0/SubmodelRegistryServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/SubmodelRegistryServiceSpecification/SSP-002", List.of(), List.of()), DISCOVERY_FULL( - "https://admin-shell.io/aas/API/3/0/DiscoveryServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/DiscoveryServiceSpecification/SSP-001", List.of( Interface.AAS_BASIC_DISCOVERY, Interface.DESCRIPTION), @@ -250,7 +250,7 @@ public enum ServiceSpecificationProfile { PostAllAssetLinksByIdRequest.class, GetSelfDescriptionRequest.class)), AAS_REPOSITORY_FULL( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRepositoryServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellRepositoryServiceSpecification/SSP-001", List.of( Interface.AAS_REPOSITORY, Interface.AAS, @@ -311,7 +311,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), AAS_REPOSITORY_READ( - "https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRepositoryServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/AssetAdministrationShellRepositoryServiceSpecification/SSP-002", List.of( Interface.AAS_REPOSITORY, Interface.AAS, @@ -347,7 +347,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), SUBMODEL_REPOSITORY_FULL( - "https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/SubmodelRepositoryServiceSpecification/SSP-001", List.of( Interface.SUBMODEL_REPOSITORY, Interface.SUBMODEL, @@ -387,7 +387,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), SUBMODEL_REPOSITORY_READ( - "https://admin-shell.io/aas/API/3/0/SubmodelRepositoryServiceSpecification/SSP-002", + "https://admin-shell.io/aas/API/3/1/SubmodelRepositoryServiceSpecification/SSP-002", List.of( Interface.SUBMODEL_REPOSITORY, Interface.SUBMODEL, @@ -410,7 +410,7 @@ public enum ServiceSpecificationProfile { GenerateSerializationByIdsRequest.class, GetSelfDescriptionRequest.class)), CONCEPT_DESCRIPTION_FULL( - "https://admin-shell.io/aas/API/3/0/ConceptDescriptionServiceSpecification/SSP-001", + "https://admin-shell.io/aas/API/3/1/ConceptDescriptionServiceSpecification/SSP-001", List.of( Interface.CONCEPT_DESCRIPTION_REPOSITORY, Interface.SERIALIZATION, diff --git a/persistence/file/src/test/resources/model.json b/persistence/file/src/test/resources/model.json index 2101af43e..4f5528946 100644 --- a/persistence/file/src/test/resources/model.json +++ b/persistence/file/src/test/resources/model.json @@ -215,7 +215,7 @@ "keys": [ { "type": "GlobalReference", - "value": "https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360" + "value": "https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360" } ], "type": "ExternalReference" @@ -2547,4 +2547,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/persistence/file/src/test/resources/model.xml b/persistence/file/src/test/resources/model.xml index f84e94917..aed57921e 100644 --- a/persistence/file/src/test/resources/model.xml +++ b/persistence/file/src/test/resources/model.xml @@ -1,7 +1,7 @@ - + xsi:schemaLocation="https://admin-shell.io/aas/3/1 AAS.xsd"> TestAssetAdministrationShell @@ -2386,7 +2386,7 @@ GlobalReference - https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360 @@ -2482,4 +2482,4 @@ - \ No newline at end of file + From 638a58db8ce07325ba3351f30dd8b72a418b3392 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 4 May 2026 15:38:36 +0200 Subject: [PATCH 05/25] feat: more aas versions --- .../fraunhofer/iosb/ilt/faaast/service/model/AASFull.java | 2 +- .../fraunhofer/iosb/ilt/faaast/service/model/AASSimple.java | 2 +- persistence/memory/src/test/resources/AASFull.json | 6 +++--- .../service/submodeltemplate/aimc/model/Constants.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASFull.java b/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASFull.java index 671151614..2064efbdd 100644 --- a/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASFull.java +++ b/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASFull.java @@ -85,7 +85,7 @@ public class AASFull { public final static ConceptDescription CONCEPT_DESCRIPTION_2 = createConceptDescription2(); public final static ConceptDescription CONCEPT_DESCRIPTION_3 = createConceptDescription3(); public final static ConceptDescription CONCEPT_DESCRIPTION_4 = createConceptDescription4(); - public static final String AAS_3_0_RC_02_DATA_SPECIFICATION_IEC_61360 = "https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360"; + public static final String AAS_3_0_RC_02_DATA_SPECIFICATION_IEC_61360 = "https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360"; public static AssetAdministrationShell createAAS1() { return new DefaultAssetAdministrationShell.Builder() diff --git a/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASSimple.java b/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASSimple.java index a0d18b459..fc6389a6b 100644 --- a/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASSimple.java +++ b/model/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/model/AASSimple.java @@ -133,7 +133,7 @@ public class AASSimple { private static final String SUBMODEL_OPERATIONAL_DATA_PROPERTY_ID_SHORT = ROTATION_SPEED; private static final String SUBMODEL_OPERATIONAL_DATA_PROPERTY_CATEGORY = "VARIABLE"; private static final String SUBMODEL_OPERATIONAL_DATA_PROPERTY_VALUE = "4370"; - public static final String AAS_3_0_RC_02_DATA_SPECIFICATION_IEC_61360 = "https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360"; + public static final String AAS_3_0_RC_02_DATA_SPECIFICATION_IEC_61360 = "https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360"; private static final String SUBMODEL_OPERATIONAL_DATA_ENTITY_PROPERTY_NAME = "ExampleProperty"; private static final String SUBMODEL_OPERATIONAL_DATA_ENTITY_NAME = "ExampleEntity"; diff --git a/persistence/memory/src/test/resources/AASFull.json b/persistence/memory/src/test/resources/AASFull.json index 2101af43e..8bee8fc82 100644 --- a/persistence/memory/src/test/resources/AASFull.json +++ b/persistence/memory/src/test/resources/AASFull.json @@ -93,7 +93,7 @@ { "modelType": "AssetAdministrationShell", "assetInformation": { - "assetKind": "Instance", + "assetKind": "Role", "globalAssetId": "https://acplt.org/Test_Asset_Mandatory" }, "id": "https://acplt.org/Test_AssetAdministrationShell2_Mandatory", @@ -215,7 +215,7 @@ "keys": [ { "type": "GlobalReference", - "value": "https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360" + "value": "https://admin-shell.io/aas/3/1/RC02/DataSpecificationIEC61360" } ], "type": "ExternalReference" @@ -2547,4 +2547,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/submodeltemplate/asset-interfaces-mapping-configuration/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/model/Constants.java b/submodeltemplate/asset-interfaces-mapping-configuration/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/model/Constants.java index 3c4cc11c3..819a853e6 100644 --- a/submodeltemplate/asset-interfaces-mapping-configuration/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/model/Constants.java +++ b/submodeltemplate/asset-interfaces-mapping-configuration/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/model/Constants.java @@ -58,7 +58,7 @@ public class Constants { public static final String SEMANTIC_ID_PROPERTY_DEFINITION_NAME = "https://www.w3.org/2019/wot/td#name"; public static final String SEMANTIC_ID_PROPERTY_TYPE = "https://www.w3.org/1999/02/22-rdf-syntax-ns#type"; public static final String SEMANTIC_ID_PROPERTY_OBSERVABLE = "https://www.w3.org/2019/wot/td#isObservable"; - public static final String SEMANTIC_ID_PROPERTY_UNIT = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; + public static final String SEMANTIC_ID_PROPERTY_UNIT = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/1"; public static final String SEMANTIC_ID_PROPERTY_FORMS = "https://www.w3.org/2019/wot/td#hasForm"; public static final String SEMANTIC_ID_PROPERTY_HREF = "https://www.w3.org/2019/wot/hypermedia#hasTarget"; } From 2a811fc037eee08ab31f6f7b6e9b52a5938703ff Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Tue, 5 May 2026 09:13:34 +0200 Subject: [PATCH 06/25] fix: sonar --- .../assetconnection/AssetConnectionManager.java | 5 ++--- .../service/registry/RegistrySynchronizationTest.java | 11 +++++------ .../request/handler/RequestHandlerManagerTest.java | 8 ++++---- .../iosb/ilt/faaast/service/starter/App.java | 2 +- .../aimc/AimcSubmodelTemplateProcessor.java | 2 -- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java index b8d50fae8..58eb412c6 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/assetconnection/AssetConnectionManager.java @@ -110,7 +110,7 @@ List getConnections() { */ public void cleanupDanglingConnectionsAfterModify(Reference modifiedElement) { Predicate condition = x -> ReferenceHelper.startsWith(x, modifiedElement) && !service.getPersistence().submodelElementExists(x); - connections.stream() + connections .forEach(LambdaExceptionHelper.rethrowConsumer(connection -> { for (var providerType: AssetProviderType.values()) { providerType.getProvidersFromConnectionAccessor().apply(connection).keySet().stream() @@ -360,8 +360,7 @@ public void syncValueProvidersOnWrite(Reference reference, Object oldElement, Ob else { Map oldChildren = findSynchronizableElements(reference, oldElement); Map newChildren = findSynchronizableElements(reference, newElement); - newChildren.entrySet().stream() - .forEach(x -> syncElementOnWrite(x.getKey(), Pair.of(oldChildren.get(x.getKey()), x.getValue()), publishOnMessageBus)); + newChildren.forEach((key, value) -> syncElementOnWrite(key, Pair.of(oldChildren.get(key), value), publishOnMessageBus)); } } diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java index 60e352b57..a741d2adc 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; import de.fraunhofer.iosb.ilt.faaast.service.config.CoreConfig; import de.fraunhofer.iosb.ilt.faaast.service.config.RegistrySynchronizationConfig; @@ -115,7 +114,7 @@ public void init() throws Exception { @Test - public void testAddsAuthHeaderWhenConfigured() throws Exception { + public void testAddsAuthHeaderWhenConfigured() { registrySynchronization.start(); registrySynchronization.stop(); @@ -148,7 +147,7 @@ public void testUnregistrationOnExit() { @Test - public void testAasCreation() throws MessageBusException, JsonProcessingException, SerializationException { + public void testAasCreation() throws MessageBusException, SerializationException { AssetAdministrationShell aas = environment.getAssetAdministrationShells().get(0); registrySynchronization.start(); messageBus.publish(ElementCreateEventMessage.builder() @@ -160,7 +159,7 @@ public void testAasCreation() throws MessageBusException, JsonProcessingExceptio @Test - public void testAasUpdate() throws MessageBusException, JsonProcessingException, SerializationException { + public void testAasUpdate() throws MessageBusException, SerializationException { AssetAdministrationShell aas = environment.getAssetAdministrationShells().get(0); aas.setIdShort("Changed Id Short"); registrySynchronization.start(); @@ -184,7 +183,7 @@ public void testAasDeletion() throws MessageBusException { @Test - public void testSubmodelCreation() throws MessageBusException, JsonProcessingException, SerializationException { + public void testSubmodelCreation() throws MessageBusException, SerializationException { Submodel submodel = environment.getSubmodels().get(0); registrySynchronization.start(); messageBus.publish(ElementCreateEventMessage.builder() @@ -196,7 +195,7 @@ public void testSubmodelCreation() throws MessageBusException, JsonProcessingExc @Test - public void testSubmodelUpdate() throws MessageBusException, JsonProcessingException, SerializationException { + public void testSubmodelUpdate() throws MessageBusException, SerializationException { Submodel submodel = environment.getSubmodels().get(0); String oldIdShort = submodel.getIdShort(); submodel.setIdShort("Changed Id Short"); diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java index 684977f37..bc249dd76 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/RequestHandlerManagerTest.java @@ -1904,7 +1904,7 @@ private void assertWriteWithAssetConnection(T originalData, Assert.assertTrue(ResponseHelper.equalsIgnoringTime(expected, actual)); assertValueProviderSetValueCalled(updatedProperties); if (Objects.nonNull(eventMatcherBuilder)) { - updatedProperties.entrySet().stream().forEach(LambdaExceptionHelper.rethrowConsumer( + updatedProperties.entrySet().forEach(LambdaExceptionHelper.rethrowConsumer( x -> verify(messageBus).publish(argThat(eventMatcherBuilder.apply(x.getKey(), x.getValue()))))); } } @@ -1940,13 +1940,13 @@ private void assertWriteWithAssetConnection(T originalData, private void assertPersistenceUpdateCalled(Map updatedProperties) throws Exception { - updatedProperties.entrySet().stream().forEach(LambdaExceptionHelper.rethrowConsumer( + updatedProperties.entrySet().forEach(LambdaExceptionHelper.rethrowConsumer( x -> verify(persistence).update(x.getKey(), x.getValue()))); } private void assertValueChangeEventsSent(Map updatedProperties) throws Exception { - updatedProperties.entrySet().stream().forEach(LambdaExceptionHelper.rethrowConsumer( + updatedProperties.entrySet().forEach(LambdaExceptionHelper.rethrowConsumer( x -> verify(messageBus).publish(argThat(msg -> { if (!(msg instanceof ValueChangeEventMessage)) { return false; @@ -1965,7 +1965,7 @@ private void assertValueChangeEventsSent(Map updatedPropert private void assertValueProviderSetValueCalled(Map updatedProperties) throws Exception { - updatedProperties.entrySet().stream().forEach(LambdaExceptionHelper.rethrowConsumer( + updatedProperties.entrySet().forEach(LambdaExceptionHelper.rethrowConsumer( x -> verify(assetConnectionManager).setValue(x.getKey(), ElementValueMapper.toValue(x.getValue())))); } diff --git a/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java b/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java index 5cac02e43..bf98fded5 100644 --- a/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java +++ b/starter/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/starter/App.java @@ -594,7 +594,7 @@ private void printConfig(ServiceConfig config) { private void printEndpointInfo(ServiceConfig config) { if (LOGGER.isInfoEnabled()) { - config.getEndpoints().stream().forEach(x -> { + config.getEndpoints().forEach(x -> { if (HttpEndpointConfig.class.isAssignableFrom(x.getClass())) { LOGGER.info("HTTP endpoint available on port {}", ((HttpEndpointConfig) x).getPort()); } diff --git a/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java b/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java index 187afc244..ba0ff604d 100644 --- a/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java +++ b/submodeltemplate/asset-interfaces-mapping-configuration/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/submodeltemplate/aimc/AimcSubmodelTemplateProcessor.java @@ -14,8 +14,6 @@ */ package de.fraunhofer.iosb.ilt.faaast.service.submodeltemplate.aimc; -import static org.eclipse.digitaltwin.aas4j.v3.model.MessageType.ERROR; - import de.fraunhofer.iosb.ilt.faaast.service.ServiceContext; import de.fraunhofer.iosb.ilt.faaast.service.assetconnection.AssetConnectionConfig; import de.fraunhofer.iosb.ilt.faaast.service.assetconnection.AssetConnectionException; From b8dc30a14973867d2a28eab5de89e9416c738b55 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Tue, 5 May 2026 15:37:00 +0200 Subject: [PATCH 07/25] docs: changelog + readme updates --- .../service/registry/RegistrySynchronizationTest.java | 8 ++++---- docs/source/basics/faq.md | 4 ++-- docs/source/index.md | 2 +- docs/source/other/release-notes.md | 1 + .../ilt/faaast/service/endpoint/http/HttpEndpoint.java | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java index a741d2adc..5c9f5224f 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java @@ -227,7 +227,7 @@ private void mockEndpoint() { String aasId = invocation.getArgument(0); return List.of( new org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultEndpoint.Builder() - ._interface("AAS-REPOSITORY-3.0") + ._interface("AAS-REPOSITORY-3.1") .protocolInformation(new DefaultProtocolInformation.Builder() .href(serviceUri.toASCIIString()) .endpointProtocol("HTTP") @@ -243,7 +243,7 @@ private void mockEndpoint() { .build()) .build(), new org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultEndpoint.Builder() - ._interface("AAS-3.0") + ._interface("AAS-3.1") .protocolInformation(new DefaultProtocolInformation.Builder() .href(serviceUri.toASCIIString() + "/shells/" + EncodingHelper.base64UrlEncode(aasId)) .endpointProtocol("HTTP") @@ -264,7 +264,7 @@ private void mockEndpoint() { String submodelId = invocation.getArgument(0); return List.of( new DefaultEndpoint.Builder() - ._interface("SUBMODEL-REPOSITORY-3.0") + ._interface("SUBMODEL-REPOSITORY-3.1") .protocolInformation(new DefaultProtocolInformation.Builder() .href(serviceUri.toASCIIString()) .endpointProtocol("HTTP") @@ -280,7 +280,7 @@ private void mockEndpoint() { .build()) .build(), new DefaultEndpoint.Builder() - ._interface("SUBMODEL-3.0") + ._interface("SUBMODEL-3.1") .protocolInformation(new DefaultProtocolInformation.Builder() .href(serviceUri.toASCIIString() + "/submodels/" + EncodingHelper.base64UrlEncode(submodelId)) .endpointProtocol("HTTP") diff --git a/docs/source/basics/faq.md b/docs/source/basics/faq.md index d8275f558..ca040b6cd 100644 --- a/docs/source/basics/faq.md +++ b/docs/source/basics/faq.md @@ -185,7 +185,7 @@ A registered shell descriptor could then look like this: "securityAttributes": { // ... }, - "interface": "AAS-REPOSITORY-3.0" + "interface": "AAS-REPOSITORY-3.1" }, { "protocolInformation": { @@ -196,7 +196,7 @@ A registered shell descriptor could then look like this: "securityAttributes": { // ... }, - "interface": "AAS-3.0" + "interface": "AAS-3.1" } ], "id": "example-aas-id", diff --git a/docs/source/index.md b/docs/source/index.md index 417cfb9a3..16d5b9a83 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -12,7 +12,7 @@ FA³ST Service: Non-Technical View. ``` ## Implemented AAS Specifications -- Details of the Asset Administration Shell - Part 1: Metamodel v3.0 ([specification](https://industrialdigitaltwin.org/en/content-hub/aasspecifications/specification-of-the-asset-administration-shell-part-1-metamodel-idta-number-01001-3-0)) +- Details of the Asset Administration Shell - Part 1: Metamodel v3.1 ([specification](https://industrialdigitaltwin.org/wp-content/uploads/2025/11/IDTA-01001-3-1-2_AAS-Specification_Part1_Metamodel.pdf)) - Details of the Asset Administration Shell - Part 2: Application Programming Interfaces v3.0.1 ([specification](https://industrialdigitaltwin.org/en/content-hub/aasspecifications/specification-of-the-asset-administration-shell-part-2-application-programming-interfaces-idta-number-01002-3-0)) ([OpenAPI](https://app.swaggerhub.com/apis/Plattform_i40/Entire-API-Collection/V3.0.1)) diff --git a/docs/source/other/release-notes.md b/docs/source/other/release-notes.md index 1feac71d3..fb6e03d87 100644 --- a/docs/source/other/release-notes.md +++ b/docs/source/other/release-notes.md @@ -7,6 +7,7 @@ - Added support for reading/writing operation arguments from/to referenced other AAS elements (by using Qualifiers) - Added CLI argument --show-stacktrace - Added new core config properties `operationTimeout` to set a global timeout for executing AAS operations + - Updated to AAS metamodel v3.1. - Persistence - MongoDB is now deprecated and will be remove in v2.0. - Asset Connection diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpoint.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpoint.java index 1bdbdf2b8..f0cdd29c5 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpoint.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpoint.java @@ -66,7 +66,7 @@ */ public class HttpEndpoint extends AbstractEndpoint { - public static final Version API_VERSION = Version.V3_0; + public static final Version API_VERSION = Version.V3_1; private static final Logger LOGGER = LoggerFactory.getLogger(HttpEndpoint.class); private static final CertificateInformation SELFSIGNED_CERTIFICATE_INFORMATION = CertificateInformation.builder() .applicationUri("urn:de:fraunhofer:iosb:ilt:faaast:service:endpoint:http") From e003f6725a408ac9c79155e04bfdd7e2d4aefa43 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:19:34 +0200 Subject: [PATCH 08/25] feat: update default api prefix --- .../ilt/faaast/service/endpoint/http/HttpEndpointConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpointConfig.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpointConfig.java index b380013ca..261b26d30 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpointConfig.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/HttpEndpointConfig.java @@ -32,7 +32,7 @@ public class HttpEndpointConfig extends EndpointConfig { public static final String DEFAULT_CORS_ALLOWED_ORIGIN = "*"; public static final String DEFAULT_CORS_EXPOSED_HEADERS = ""; public static final long DEFAULT_CORS_MAX_AGE = 3600; - public static final String DEFAULT_PATH_PREFIX = "/api/v3.0"; + public static final String DEFAULT_PATH_PREFIX = "/api/v3.1"; public static final boolean DEFAULT_INCLUDE_ERROR_DETAILS = false; public static final int DEFAULT_PORT = 443; public static final boolean DEFAULT_SNI_ENABLED = true; From bd7496b913ae8feef97049756346c54ba118f9a8 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:20:19 +0200 Subject: [PATCH 09/25] feat: SearchAllAssetAdministrationShellIdsByAssetLink --- ...ationShellIdsByAssetLinkRequestMapper.java | 57 ++++++++++ ...inistrationShellIdsByAssetLinkRequest.java | 101 ++++++++++++++++++ ...nistrationShellIdsByAssetLinkResponse.java | 43 ++++++++ 3 files changed, 201 insertions(+) create mode 100644 endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java create mode 100644 model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java create mode 100644 model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkResponse.java diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java new file mode 100644 index 000000000..bd80d6a1f --- /dev/null +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 Fraunhofer IOSB, eine rechtlich nicht selbstaendige + * Einrichtung der Fraunhofer-Gesellschaft zur Foerderung der angewandten + * Forschung e.V. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.fraunhofer.iosb.ilt.faaast.service.endpoint.http.request.mapper.aasbasicdiscovery; + +import de.fraunhofer.iosb.ilt.faaast.service.ServiceContext; +import de.fraunhofer.iosb.ilt.faaast.service.dataformat.DeserializationException; +import de.fraunhofer.iosb.ilt.faaast.service.endpoint.http.model.HttpRequest; +import de.fraunhofer.iosb.ilt.faaast.service.endpoint.http.request.mapper.AbstractRequestMapperWithPaging; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.paging.PagingInfo; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkRequest; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; +import de.fraunhofer.iosb.ilt.faaast.service.model.exception.InvalidRequestException; +import de.fraunhofer.iosb.ilt.faaast.service.model.http.HttpMethod; +import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; + +import java.util.Map; + + +/** + * class to map HTTP-GET-Request path: lookup/shellsByAssetLink. + */ +public class SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper + extends AbstractRequestMapperWithPaging { + + private static final String PATTERN = "lookup/shellsByAssetLink"; + + public SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper(ServiceContext serviceContext) { + super(serviceContext, HttpMethod.POST, PATTERN); + } + + + @Override + public SearchAllAssetAdministrationShellIdsByAssetLinkRequest doParse(HttpRequest httpRequest, Map urlParameters, PagingInfo pagingInfo) + throws InvalidRequestException { + try { + return SearchAllAssetAdministrationShellIdsByAssetLinkRequest.builder() + .assetIdentifierPairs(deserializer.readList(httpRequest.getBodyAsString(), SpecificAssetId.class)) + .build(); + } + catch (DeserializationException e) { + throw new InvalidRequestException( + String.format("error deserializing request body (value: %s)", httpRequest.getBodyAsString()), e); + } + } +} diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java new file mode 100644 index 000000000..71a89022c --- /dev/null +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 Fraunhofer IOSB, eine rechtlich nicht selbstaendige + * Einrichtung der Fraunhofer-Gesellschaft zur Foerderung der angewandten + * Forschung e.V. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery; + +import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.AbstractRequestWithPaging; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkResponse; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; +import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; +import org.eclipse.digitaltwin.aas4j.v3.model.builder.ExtendableBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + + +/** + * Request class for GetAllAssetAdministrationShellIdsByAssetLink requests. + */ +public class SearchAllAssetAdministrationShellIdsByAssetLinkRequest extends AbstractRequestWithPaging { + + private List assetIdentifierPairs; + + public SearchAllAssetAdministrationShellIdsByAssetLinkRequest() { + this.assetIdentifierPairs = new ArrayList<>(); + } + + + public List getAssetIdentifierPairs() { + return assetIdentifierPairs; + } + + + public void setAssetIdentifierPairs(List assetIdentifierPairs) { + this.assetIdentifierPairs = assetIdentifierPairs; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SearchAllAssetAdministrationShellIdsByAssetLinkRequest that = (SearchAllAssetAdministrationShellIdsByAssetLinkRequest) o; + return super.equals(that) + && Objects.equals(assetIdentifierPairs, that.assetIdentifierPairs); + } + + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), assetIdentifierPairs); + } + + + public static Builder builder() { + return new Builder(); + } + + public abstract static class AbstractBuilder> extends ExtendableBuilder { + + public B assetIdentifierPair(SpecificAssetId value) { + getBuildingInstance().getAssetIdentifierPairs().add(value); + return getSelf(); + } + + + public B assetIdentifierPairs(List value) { + getBuildingInstance().setAssetIdentifierPairs(value); + return getSelf(); + } + } + + public static class Builder extends AbstractBuilder { + + @Override + protected Builder getSelf() { + return this; + } + + + @Override + protected SearchAllAssetAdministrationShellIdsByAssetLinkRequest newBuildingInstance() { + return new SearchAllAssetAdministrationShellIdsByAssetLinkRequest(); + } + } +} diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkResponse.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkResponse.java new file mode 100644 index 000000000..acf5eeba4 --- /dev/null +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkResponse.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 Fraunhofer IOSB, eine rechtlich nicht selbstaendige + * Einrichtung der Fraunhofer-Gesellschaft zur Foerderung der angewandten + * Forschung e.V. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery; + +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.AbstractPagedResponse; + + +/** + * Response class for GetAllAssetAdministrationShellIdsByAssetLink requests. + */ +public class SearchAllAssetAdministrationShellIdsByAssetLinkResponse extends AbstractPagedResponse { + + public static Builder builder() { + return new Builder(); + } + + public static class Builder + extends AbstractBuilder { + + @Override + protected Builder getSelf() { + return this; + } + + + @Override + protected SearchAllAssetAdministrationShellIdsByAssetLinkResponse newBuildingInstance() { + return new SearchAllAssetAdministrationShellIdsByAssetLinkResponse(); + } + } +} From 4fb22e0a53b56d6282722a86635d0949559da18b Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:20:53 +0200 Subject: [PATCH 10/25] chore: mark APIv3.0 function as deprecated --- ...setAdministrationShellIdsByAssetLinkRequestHandler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java index dd348db7f..bc43a0f14 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java @@ -29,12 +29,13 @@ /** - * Not supported yet! Class to handle a - * {@link de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkRequest} + * Class to handle a + * {@link GetAllAssetAdministrationShellIdsByAssetLinkRequest} * in the service and to send the corresponding response - * {@link de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkResponse}. + * {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. * Is responsible for communication with the persistence and sends the corresponding events to the message bus. */ +@Deprecated(since = "1.4") public class GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler extends AbstractRequestHandler { From dac7a898779fee52c72357ceb70cdeb9d805b580 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:39:44 +0200 Subject: [PATCH 11/25] feat: add SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler --- ...tionShellIdsByAssetLinkRequestHandler.java | 63 +++++++++++++++++++ ...inistrationShellIdsByAssetLinkRequest.java | 9 ++- 2 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java new file mode 100644 index 000000000..8a9b4cf65 --- /dev/null +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 Fraunhofer IOSB, eine rechtlich nicht selbstaendige + * Einrichtung der Fraunhofer-Gesellschaft zur Foerderung der angewandten + * Forschung e.V. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package de.fraunhofer.iosb.ilt.faaast.service.request.handler.aasbasicdiscovery; + +import de.fraunhofer.iosb.ilt.faaast.service.model.api.modifier.QueryModifier; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.paging.Page; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkRequest; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; +import de.fraunhofer.iosb.ilt.faaast.service.model.exception.PersistenceException; +import de.fraunhofer.iosb.ilt.faaast.service.persistence.AssetAdministrationShellSearchCriteria; +import de.fraunhofer.iosb.ilt.faaast.service.request.handler.AbstractRequestHandler; +import de.fraunhofer.iosb.ilt.faaast.service.request.handler.RequestExecutionContext; +import java.util.List; +import java.util.stream.Collectors; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.Identifiable; + + +/** + * Class to handle a + * {@link SearchAllAssetAdministrationShellIdsByAssetLinkRequest} + * in the service and to send the corresponding response + * {@link SearchAllAssetAdministrationShellIdsByAssetLinkResponse}. + * Is responsible for communication with the persistence and sends the corresponding events to the message bus. + */ +public class SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler + extends AbstractRequestHandler { + + @Override + public SearchAllAssetAdministrationShellIdsByAssetLinkResponse process(SearchAllAssetAdministrationShellIdsByAssetLinkRequest request, RequestExecutionContext context) + throws PersistenceException { + Page aass = context.getPersistence().findAssetAdministrationShells( + AssetAdministrationShellSearchCriteria.builder() + .assetIds(parseSpecificAssetIds(request.getAssetIdentifierPairs())) + .build(), + QueryModifier.DEFAULT, + request.getPagingInfo()); + + List result = aass.getContent() + .stream() + .map(Identifiable::getId) + .collect(Collectors.toList()); + return SearchAllAssetAdministrationShellIdsByAssetLinkResponse.builder() + .payload(Page. builder() + .metadata(aass.getMetadata()) + .result(result) + .build()) + .success() + .build(); + } +} diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java index 71a89022c..46c5ba667 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequest.java @@ -15,14 +15,12 @@ package de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.AbstractRequestWithPaging; -import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkResponse; import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; -import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; -import org.eclipse.digitaltwin.aas4j.v3.model.builder.ExtendableBuilder; - import java.util.ArrayList; import java.util.List; import java.util.Objects; +import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; +import org.eclipse.digitaltwin.aas4j.v3.model.builder.ExtendableBuilder; /** @@ -71,7 +69,8 @@ public static Builder builder() { return new Builder(); } - public abstract static class AbstractBuilder> extends ExtendableBuilder { + public abstract static class AbstractBuilder> + extends ExtendableBuilder { public B assetIdentifierPair(SpecificAssetId value) { getBuildingInstance().getAssetIdentifierPairs().add(value); From 38fb2bddaf222eda852b87f780682b2384941cae Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:40:19 +0200 Subject: [PATCH 12/25] feat: remove duplicate request handling logic --- ...tionShellIdsByAssetLinkRequestHandler.java | 44 +++++++------------ ...inistrationShellIdsByAssetLinkRequest.java | 19 ++++++++ ...nistrationShellIdsByAssetLinkResponse.java | 15 +++++++ 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java index bc43a0f14..d25378bf8 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/request/handler/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler.java @@ -14,26 +14,20 @@ */ package de.fraunhofer.iosb.ilt.faaast.service.request.handler.aasbasicdiscovery; -import de.fraunhofer.iosb.ilt.faaast.service.model.api.modifier.QueryModifier; -import de.fraunhofer.iosb.ilt.faaast.service.model.api.paging.Page; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkRequest; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkResponse; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; import de.fraunhofer.iosb.ilt.faaast.service.model.exception.PersistenceException; -import de.fraunhofer.iosb.ilt.faaast.service.persistence.AssetAdministrationShellSearchCriteria; import de.fraunhofer.iosb.ilt.faaast.service.request.handler.AbstractRequestHandler; import de.fraunhofer.iosb.ilt.faaast.service.request.handler.RequestExecutionContext; -import java.util.List; -import java.util.stream.Collectors; -import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; -import org.eclipse.digitaltwin.aas4j.v3.model.Identifiable; /** - * Class to handle a - * {@link GetAllAssetAdministrationShellIdsByAssetLinkRequest} - * in the service and to send the corresponding response - * {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. - * Is responsible for communication with the persistence and sends the corresponding events to the message bus. + * Class to handle a {@link GetAllAssetAdministrationShellIdsByAssetLinkRequest} in the service and to send the + * corresponding response + * {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. Is responsible for communication with the persistence + * and sends the corresponding events to the message bus. */ @Deprecated(since = "1.4") public class GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler @@ -42,23 +36,15 @@ public class GetAllAssetAdministrationShellIdsByAssetLinkRequestHandler @Override public GetAllAssetAdministrationShellIdsByAssetLinkResponse process(GetAllAssetAdministrationShellIdsByAssetLinkRequest request, RequestExecutionContext context) throws PersistenceException { - Page aass = context.getPersistence().findAssetAdministrationShells( - AssetAdministrationShellSearchCriteria.builder() - .assetIds(parseSpecificAssetIds(request.getAssetIdentifierPairs())) - .build(), - QueryModifier.DEFAULT, - request.getPagingInfo()); + // Since this request is deprecated and has the same functionality as SearchAllAssetAdministrationShellIdsByAssetLink, use its handler + // If the functionality of SearchAllAssetAdministrationShellIdsByAssetLink changes, roll back + SearchAllAssetAdministrationShellIdsByAssetLinkRequest searchAllAssetAdministrationShellIdsByAssetLinkRequest = request + .asSearchAllAssetAdministrationShellIdsByAssetLinkRequest(); - List result = aass.getContent() - .stream() - .map(Identifiable::getId) - .collect(Collectors.toList()); - return GetAllAssetAdministrationShellIdsByAssetLinkResponse.builder() - .payload(Page. builder() - .metadata(aass.getMetadata()) - .result(result) - .build()) - .success() - .build(); + SearchAllAssetAdministrationShellIdsByAssetLinkResponse searchAllAssetAdministrationShellIdsByAssetLinkResponse = new SearchAllAssetAdministrationShellIdsByAssetLinkRequestHandler() + .process( + searchAllAssetAdministrationShellIdsByAssetLinkRequest, context); + + return GetAllAssetAdministrationShellIdsByAssetLinkResponse.from(searchAllAssetAdministrationShellIdsByAssetLinkResponse); } } diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequest.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequest.java index 2999cb071..691e4ee55 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequest.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/request/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkRequest.java @@ -65,6 +65,25 @@ public int hashCode() { } + /** + * Transform this {@link GetAllAssetAdministrationShellIdsByAssetLinkRequest} into a + * {@link SearchAllAssetAdministrationShellIdsByAssetLinkRequest}. + * + * @return An equal {@link SearchAllAssetAdministrationShellIdsByAssetLinkRequest}. + */ + public SearchAllAssetAdministrationShellIdsByAssetLinkRequest asSearchAllAssetAdministrationShellIdsByAssetLinkRequest() { + SearchAllAssetAdministrationShellIdsByAssetLinkRequest searchAllAssetAdministrationShellIdsByAssetLinkRequest = SearchAllAssetAdministrationShellIdsByAssetLinkRequest + .builder() + .assetIdentifierPairs(this.getAssetIdentifierPairs()) + .build(); + + searchAllAssetAdministrationShellIdsByAssetLinkRequest.setPagingInfo(this.getPagingInfo()); + searchAllAssetAdministrationShellIdsByAssetLinkRequest.setInternal(this.isInternal()); + + return searchAllAssetAdministrationShellIdsByAssetLinkRequest; + } + + public static Builder builder() { return new Builder(); } diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java index 66c478096..221f01925 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java @@ -22,6 +22,21 @@ */ public class GetAllAssetAdministrationShellIdsByAssetLinkResponse extends AbstractPagedResponse { + /** + * Transform a {@link SearchAllAssetAdministrationShellIdsByAssetLinkResponse} into a + * {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. + * + * @return An equal {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. + */ + public static GetAllAssetAdministrationShellIdsByAssetLinkResponse from(SearchAllAssetAdministrationShellIdsByAssetLinkResponse response) { + return GetAllAssetAdministrationShellIdsByAssetLinkResponse.builder() + .payload(response.getPayload()) + .result(response.getResult()) + .statusCode(response.getStatusCode()) + .build(); + } + + public static Builder builder() { return new Builder(); } From a4bd345e4eef6b55d36a608c0369c100de91831a Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Wed, 13 May 2026 15:40:26 +0200 Subject: [PATCH 13/25] fix: spotless --- ...AllAssetAdministrationShellIdsByAssetLinkRequestMapper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java index bd80d6a1f..e4ce976d7 100644 --- a/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java +++ b/endpoint/http/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/mapper/aasbasicdiscovery/SearchAllAssetAdministrationShellIdsByAssetLinkRequestMapper.java @@ -23,9 +23,8 @@ import de.fraunhofer.iosb.ilt.faaast.service.model.api.response.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkResponse; import de.fraunhofer.iosb.ilt.faaast.service.model.exception.InvalidRequestException; import de.fraunhofer.iosb.ilt.faaast.service.model.http.HttpMethod; -import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; - import java.util.Map; +import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId; /** From f40e8b6cd3337b4c3a47c0fc2871acfee2398508 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 18 May 2026 16:07:51 +0200 Subject: [PATCH 14/25] fix: small fixes --- .../endpoint/http/AbstractHttpEndpointTest.java | 2 +- .../http/request/RequestMappingManagerTest.java | 15 +++++++++++++++ ...AdministrationShellIdsByAssetLinkResponse.java | 4 +++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java index f5f648819..ef7976e1e 100644 --- a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java +++ b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/AbstractHttpEndpointTest.java @@ -122,7 +122,7 @@ public abstract class AbstractHttpEndpointTest { protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractHttpEndpointTest.class); protected static final String HOST = "localhost"; - private static final String API_PREFIX = "/api/v3.0"; + private static final String API_PREFIX = "/api/v3.1"; protected static String scheme; protected static int port; protected static HttpClient client; diff --git a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/RequestMappingManagerTest.java b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/RequestMappingManagerTest.java index a5a8381b8..b6ef236d9 100644 --- a/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/RequestMappingManagerTest.java +++ b/endpoint/http/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/endpoint/http/request/RequestMappingManagerTest.java @@ -50,6 +50,7 @@ import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.GetAllAssetAdministrationShellIdsByAssetLinkRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.GetAllAssetLinksByIdRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.PostAllAssetLinksByIdRequest; +import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasbasicdiscovery.SearchAllAssetAdministrationShellIdsByAssetLinkRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasrepository.DeleteAssetAdministrationShellByIdRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasrepository.GetAllAssetAdministrationShellsByAssetIdRequest; import de.fraunhofer.iosb.ilt.faaast.service.model.api.request.aasrepository.GetAllAssetAdministrationShellsByIdShortRequest; @@ -281,6 +282,20 @@ public void testGetAllAssetAdministrationShellIdsByAssetLink() throws Serializat } + @Test + public void testSearchAllAssetAdministrationShellIdsByAssetLink() throws SerializationException, InvalidRequestException { + Request expected = SearchAllAssetAdministrationShellIdsByAssetLinkRequest.builder() + .assetIdentifierPairs(ASSET_IDENTIFIERS) + .build(); + Request actual = mappingManager.map(HttpRequest.builder() + .method(HttpMethod.POST) + .path("lookup/shellsByAssetLink") + .body(serializer.write(ASSET_IDENTIFIERS)) + .build()); + Assert.assertEquals(expected, actual); + } + + @Test public void testGetAllAssetAdministrationShells() throws InvalidRequestException, MethodNotAllowedException { Request expected = GetAllAssetAdministrationShellsRequest.builder() diff --git a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java index 221f01925..7a8b76c07 100644 --- a/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java +++ b/model/src/main/java/de/fraunhofer/iosb/ilt/faaast/service/model/api/response/aasbasicdiscovery/GetAllAssetAdministrationShellIdsByAssetLinkResponse.java @@ -25,7 +25,9 @@ public class GetAllAssetAdministrationShellIdsByAssetLinkResponse extends Abstra /** * Transform a {@link SearchAllAssetAdministrationShellIdsByAssetLinkResponse} into a * {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. - * + * + * @param response The response to transform. + * * @return An equal {@link GetAllAssetAdministrationShellIdsByAssetLinkResponse}. */ public static GetAllAssetAdministrationShellIdsByAssetLinkResponse from(SearchAllAssetAdministrationShellIdsByAssetLinkResponse response) { From d74af4f51367bb9793b05c7a7ca2103927a65224 Mon Sep 17 00:00:00 2001 From: carlos-schmidt <18703981+carlos-schmidt@users.noreply.github.com> Date: Mon, 18 May 2026 16:36:01 +0200 Subject: [PATCH 15/25] fix: more updates to 3.1 --- .../service/registry/RegistrySynchronizationTest.java | 2 +- docs/source/basics/configuration.md | 4 ++-- docs/source/basics/faq.md | 6 +++--- docs/source/interfaces/endpoint.md | 4 ++-- .../cloudevents/mapper/AbstractCloudEventMapperTest.java | 2 +- .../iosb/ilt/faaast/service/test/AssetConnectionIT.java | 2 +- .../iosb/ilt/faaast/service/test/util/ApiPaths.java | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java index 5c9f5224f..f1746f037 100644 --- a/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java +++ b/core/src/test/java/de/fraunhofer/iosb/ilt/faaast/service/registry/RegistrySynchronizationTest.java @@ -75,7 +75,7 @@ public class RegistrySynchronizationTest { @Rule public WireMockClassRule instanceRule = wireMockRule; - private static final String API_PREFIX = "/api/v3.0"; + private static final String API_PREFIX = "/api/v3.1"; private static final String AAS_URL_PATH = "/shell-descriptors"; private static final String SUBMODEL_URL_PATH = "/submodel-descriptors"; private static final String AUTH_HEADER_NAME = "Authorization"; diff --git a/docs/source/basics/configuration.md b/docs/source/basics/configuration.md index 6ee675843..a0ef947a2 100644 --- a/docs/source/basics/configuration.md +++ b/docs/source/basics/configuration.md @@ -39,7 +39,7 @@ The `core` configuration block contains properties not related to the implementa :::{table} Configuration properties of `core` configuration section. | Name | Allowed Values | Description | Default Value | | ----------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | -| aasRegistries
*(optional)* | List | URLs of AAS registries to use (e.g., ). If not set, no synchronization of AASs with registry happens. | *empty* | +| aasRegistries
*(optional)* | List | URLs of AAS registries to use (e.g., ). If not set, no synchronization of AASs with registry happens. | *empty* | | assetConnectionReadMaxThreadPoolSize
*(optional)* | Integer | Size of thread pool used to read from asset connections | 1000 | | assetConnectionReadTimeout
*(optional)* | Long | Timeout in ms for reading all asset connections for a single AAS command | 5000 | | assetConnectionRetryInterval
*(optional)* | Long | Interval in ms in which to retry establishing asset connections | 1000 | @@ -49,7 +49,7 @@ The `core` configuration block contains properties not related to the implementa | operationTimeout
*(optional)* | Long | Timeout in ms for executing AAS operations. Set to 0 for no timeout. | 3600000 | | requestHandlerThreadPoolSize
*(optional)* | Integer | Number of concurrent thread that can execute API requests | 2 | | registrySynchronization
*(optional)* | Object | Registry synchronization settings. Use `auth.header.name` and `auth.header.value` to add a static HTTP header to outgoing synchronization requests (only applied if both are set). | null | -| submodelRegistries
*(optional)* | List | URLs of submodels registries to use (e.g., ). If not set, no synchronization of submodels with registry happens. | *empty* | +| submodelRegistries
*(optional)* | List | URLs of submodels registries to use (e.g., ). If not set, no synchronization of submodels with registry happens. | *empty* | | validationOnLoad
*(optional)* | Object | Validation rules to use when loading the AAS model at startup | all enabled | | validationOnCreate
*(optional)* | Object | Validation rules to use when creating new elements via API | constraints validation disabled | | validationOnUpdate
*(optional)* | Object | Validation rules to use when updating elements via API | constraints validation disabled | diff --git a/docs/source/basics/faq.md b/docs/source/basics/faq.md index ca040b6cd..8e8386cec 100644 --- a/docs/source/basics/faq.md +++ b/docs/source/basics/faq.md @@ -58,8 +58,8 @@ For testing purposes, we provide an example model here: