From 42469b0cbff3fd91cb29d4a504838ae49d606006 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 16:45:53 +0100 Subject: [PATCH 01/10] feature(irs-edc-client): #412 temp changes shared --- .../configuration/RegistryConfiguration.java | 5 +- .../ProtocolInformation.java | 4 + .../registryclient/DefaultConfiguration.java | 4 +- .../DigitalTwinRegistryService.java | 9 +++ .../DecentralDigitalTwinRegistryClient.java | 11 +++ .../DecentralDigitalTwinRegistryService.java | 29 ++++--- ...ecentralDigitalTwinRegistryClientTest.java | 80 ++++++++++++++++++- ...igitalTwinRegistryServiceWiremockTest.java | 3 +- .../testing/wiremock/DtrWiremockSupport.java | 2 + 9 files changed, 130 insertions(+), 17 deletions(-) diff --git a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java index db7de31bb7..73a532687a 100644 --- a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java +++ b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java @@ -70,6 +70,7 @@ public DigitalTwinRegistryClient digitalTwinRegistryClientImpl( public DecentralDigitalTwinRegistryService decentralDigitalTwinRegistryService( @Qualifier(RestTemplateConfig.EDC_REST_TEMPLATE) final RestTemplate edcRestTemplate, final ConnectorEndpointsService connectorEndpointsService, final EdcSubmodelFacade facade, + @Value("${digitalTwinRegistry.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistry.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistry.lookupShellsTemplate:}") final String lookupShellsTemplate) { return new DecentralDigitalTwinRegistryService(connectorEndpointsService, @@ -79,8 +80,8 @@ public DecentralDigitalTwinRegistryService decentralDigitalTwinRegistryService( } catch (EdcClientException e) { throw new EdcRetrieverException(e); } - }), - new DecentralDigitalTwinRegistryClient(edcRestTemplate, shellDescriptorTemplate, lookupShellsTemplate)); + }), new DecentralDigitalTwinRegistryClient(edcRestTemplate, createShellDescriptorTemplate, + shellDescriptorTemplate, lookupShellsTemplate)); } @Bean diff --git a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java index e1c204c142..2885265ef4 100644 --- a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java +++ b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java @@ -66,5 +66,9 @@ public class ProtocolInformation { * subprotocolBodyEncoding */ private String subprotocolBodyEncoding; + /** + * securityAttributes + */ + private List securityAttributes; } diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java index 613c12db3c..37256fcb1d 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java @@ -146,9 +146,11 @@ public EdcSubmodelClient edcSubmodelClient(final EdcConfiguration edcConfigurati @ConditionalOnProperty(prefix = CONFIG_PREFIX, name = CONFIG_FIELD_TYPE, havingValue = CONFIG_VALUE_DECENTRAL) public DecentralDigitalTwinRegistryClient decentralDigitalTwinRegistryClient( @Qualifier(EDC_REST_TEMPLATE) final RestTemplate edcRestTemplate, + @Value("${digitalTwinRegistryClient.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistryClient.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistryClient.lookupShellsTemplate:}") final String lookupShellsTemplate) { - return new DecentralDigitalTwinRegistryClient(edcRestTemplate, shellDescriptorTemplate, lookupShellsTemplate); + return new DecentralDigitalTwinRegistryClient(edcRestTemplate, createShellDescriptorTemplate, + shellDescriptorTemplate, lookupShellsTemplate); } @Bean diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java index 153acd3140..4e71b5d5e2 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java @@ -26,6 +26,7 @@ import java.util.Collection; import org.eclipse.tractusx.irs.component.Shell; +import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; import org.eclipse.tractusx.irs.registryclient.exceptions.RegistryServiceException; /** @@ -71,4 +72,12 @@ default Collection lookupShells(final String bpn) throws */ Collection fetchShells(Collection identifiers) throws RegistryServiceException; + + /** + * Created Shell. + * + * @param assetAdministrationShellDescriptor the shell to create + * @return the shell descriptors + */ + AssetAdministrationShellDescriptor createShell(final AssetAdministrationShellDescriptor assetAdministrationShellDescriptor); } diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java index 1c7a7ed5b3..78a49d31e3 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java @@ -23,6 +23,7 @@ ********************************************************************************/ package org.eclipse.tractusx.irs.registryclient.decentral; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.List; @@ -54,6 +55,7 @@ public class DecentralDigitalTwinRegistryClient { private final String lookupShellsTemplate; public DecentralDigitalTwinRegistryClient(final RestTemplate edcRestTemplate, + @Value("${digitalTwinRegistry.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistry.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistry.lookupShellsTemplate:}") final String lookupShellsTemplate) { this.edcRestTemplate = edcRestTemplate; @@ -65,6 +67,15 @@ private static String encodeWithBase64(final String aasIdentifier) { return Base64.getEncoder().encodeToString(aasIdentifier.getBytes(StandardCharsets.UTF_8)); } + public AssetAdministrationShellDescriptor createShell( + AssetAdministrationShellDescriptor assetAdministrationShellDescriptor, + EndpointDataReference endpointDataReference) { + final String descriptorEndpoint = endpointDataReference.getEndpoint() + shellDescriptorTemplate; + return edcRestTemplate.exchange(URI.create(descriptorEndpoint), HttpMethod.POST, + new HttpEntity<>(assetAdministrationShellDescriptor, headers(endpointDataReference)), + AssetAdministrationShellDescriptor.class).getBody(); + } + @Retry(name = "registry") public AssetAdministrationShellDescriptor getAssetAdministrationShellDescriptor( final EndpointDataReference endpointDataReference, final String aasIdentifier) { diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java index 9fb4065879..3e5f7aea3e 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java @@ -121,8 +121,14 @@ public Collection fetchShells(final Collection ke } } - private Stream fetchShellDescriptors( - final Map.Entry> entry, final Set calledEndpoints) { + @Override + public AssetAdministrationShellDescriptor createShell( + final AssetAdministrationShellDescriptor assetAdministrationShellDescriptor) { + + } + + private Stream fetchShellDescriptors(final Map.Entry> entry, + final Set calledEndpoints) { try { @@ -140,8 +146,8 @@ private Stream fetchShellDescriptors( } } - private CompletableFuture> fetchShellDescriptors( - final Set calledEndpoints, final String bpn, final List keys) { + private CompletableFuture> fetchShellDescriptors(final Set calledEndpoints, final String bpn, + final List keys) { final var watch = new StopWatch(); final String msg = "Fetching %s shells for bpn '%s'".formatted(keys.size(), bpn); @@ -177,8 +183,8 @@ private CompletableFuture> fetchShellDescriptorsForConnectorEndpoint return resultFinder.getFastestResult(futures); } - private List fetchShellDescriptorsForKey( - final List keys, final EndpointDataReference endpointDataReference) { + private List fetchShellDescriptorsForKey(final List keys, + final EndpointDataReference endpointDataReference) { final var watch = new StopWatch(); final String msg = "Fetching shell descriptors for keys %s from endpoint '%s'".formatted(keys, @@ -186,8 +192,10 @@ private List fetchShellDescriptorsForKey( watch.start(msg); log.info(msg); try { - return keys.stream().map(key -> new Shell(contractNegotiationId(endpointDataReference.getAuthCode()), - fetchShellDescriptor(endpointDataReference, key))).toList(); + return keys.stream() + .map(key -> new Shell(contractNegotiationId(endpointDataReference.getAuthCode()), + fetchShellDescriptor(endpointDataReference, key))) + .toList(); } finally { watch.stop(); log.info(TOOK_MS, watch.getLastTaskName(), watch.getLastTaskTimeMillis()); @@ -212,10 +220,7 @@ private AssetAdministrationShellDescriptor fetchShellDescriptor(final EndpointDa } private String contractNegotiationId(final String token) { - return Optional.ofNullable(token) - .map(EDRAuthCode::fromAuthCodeToken) - .map(EDRAuthCode::getCid) - .orElse(""); + return Optional.ofNullable(token).map(EDRAuthCode::fromAuthCodeToken).map(EDRAuthCode::getCid).orElse(""); } /** diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java index 823fa5a175..aa7115c138 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java @@ -1,5 +1,6 @@ package org.eclipse.tractusx.irs.registryclient.decentral; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -9,18 +10,29 @@ import java.net.URI; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Optional; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; +import org.eclipse.tractusx.irs.component.assetadministrationshell.Endpoint; +import org.eclipse.tractusx.irs.component.assetadministrationshell.IdentifierKeyValuePair; +import org.eclipse.tractusx.irs.component.assetadministrationshell.ProtocolInformation; +import org.eclipse.tractusx.irs.component.assetadministrationshell.Reference; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SecurityAttribute; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SemanticId; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SubmodelDescriptor; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; +import org.testcontainers.shaded.com.fasterxml.jackson.core.JsonProcessingException; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; class DecentralDigitalTwinRegistryClientTest { + public static final String CREATE_SHELL_DESCRIPTORS = "/shell-descriptors"; public static final String SHELL_DESCRIPTORS = "/shell-descriptors/{aasIdentifier}"; public static final String LOOKUP_SHELLS = "/lookup/shells"; RestTemplate restTemplate = mock(RestTemplate.class); @@ -28,7 +40,7 @@ class DecentralDigitalTwinRegistryClientTest { @BeforeEach void setUp() { - client = new DecentralDigitalTwinRegistryClient(restTemplate, SHELL_DESCRIPTORS, LOOKUP_SHELLS); + client = new DecentralDigitalTwinRegistryClient(restTemplate, CREATE_SHELL_DESCRIPTORS, SHELL_DESCRIPTORS, LOOKUP_SHELLS); } @Test @@ -65,4 +77,70 @@ void shouldCallForAllAssetAdministrationShellIdsByAssetLink() { verify(restTemplate).exchange(any(), eq(HttpMethod.GET), any(), eq(LookupShellsResponse.class)); } + @Test + void test() throws JsonProcessingException { + AssetAdministrationShellDescriptor test = AssetAdministrationShellDescriptor.builder() + .globalAssetId( + "urn:uuid:254604ab-2153-45fb-8cad-54ef09f4080f") + .idShort("test") + .id("urn:uuid:25300562-aa66-4840-8952-5cef4ed667c2") + .specificAssetIds( + List.of(IdentifierKeyValuePair.builder() + .name("manufacturerId") + .value("BPNL00000003CNKC") + .subjectId( + Reference.builder() + .keys(List.of( + SemanticId.builder() + .type("GlobalReference") + .value("PUBLIC_READABLE") + .build())) + .build()) + .build())) + .submodelDescriptors( + List.of(SubmodelDescriptor.builder() + .idShort( + "SingleLevelUsageAsBuilt") + .id("urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") + .semanticId( + Reference.builder() + .type("ExternalReference") + .keys(List.of( + SemanticId.builder() + .type("GlobalReference") + .value("urn:bamm:io.catenax.single_level_usage_as_built:2.0.0#SingleLevelUsageAsBuilt") + .build())) + .build() + + ) + .endpoints( + List.of(Endpoint.builder() + .interfaceInformation( + "SUBMODEL-3.0") + .protocolInformation( + ProtocolInformation.builder() + .href("https://trace-x-edc-dataplane.dev.demo.catena-x.net/api/public/data/urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") + .endpointProtocol( + "HTTP") + .endpointProtocolVersion( + List.of("1.1")) + .subprotocol( + "DSP") + .subprotocolBody( + "id=urn:uuid:cb6d86b5-b8ea-4fc0-b10b-ff2dd62f793d;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net") + .subprotocolBodyEncoding( + "plain") + .securityAttributes( + List.of(SecurityAttribute.none())) + + .build()) + .build())) + .build())) + .build(); + + ObjectMapper m = new ObjectMapper(); + + assertThat(m.writeValueAsString(test)).isNotBlank(); + } + } \ No newline at end of file diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java index 36ce0ff1b6..9b4ca73f74 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java @@ -36,6 +36,7 @@ import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postDiscoveryFinder404; import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postEdcDiscovery200; import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postEdcDiscovery404; +import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.CREATE_SHELL_DESCRIPTOR_PATH; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.DATAPLANE_URL; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.LOOKUP_SHELLS_PATH; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.LOOKUP_SHELLS_TEMPLATE; @@ -87,7 +88,7 @@ void setUp(WireMockRuntimeInfo wireMockRuntimeInfo) throws EdcRetrieverException final var connectorEndpointsService = new ConnectorEndpointsService(discoveryFinderClient); final var endpointDataForConnectorsService = new EndpointDataForConnectorsService(edcSubmodelFacadeMock); final var decentralDigitalTwinRegistryClient = new DecentralDigitalTwinRegistryClient(restTemplate, - SHELL_DESCRIPTORS_TEMPLATE, LOOKUP_SHELLS_TEMPLATE); + CREATE_SHELL_DESCRIPTOR_PATH, SHELL_DESCRIPTORS_TEMPLATE, LOOKUP_SHELLS_TEMPLATE); decentralDigitalTwinRegistryService = new DecentralDigitalTwinRegistryService(connectorEndpointsService, endpointDataForConnectorsService, decentralDigitalTwinRegistryClient); final var endpointDataReference = endpointDataReference("assetId"); diff --git a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java index f269e1713b..2b340e813e 100644 --- a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java +++ b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java @@ -35,6 +35,8 @@ public final class DtrWiremockSupport { public static final String DATAPLANE_URL = "http://dataplane.test"; public static final String DATAPLANE_PUBLIC_PATH = "/api/public"; public static final String DATAPLANE_PUBLIC_URL = DATAPLANE_URL + DATAPLANE_PUBLIC_PATH; + + public static final String CREATE_SHELL_DESCRIPTOR_PATH = "/shell-descriptors"; public static final String SHELL_DESCRIPTORS_PATH = "/shell-descriptors/"; public static final String PUBLIC_SHELL_DESCRIPTORS_PATH = DATAPLANE_PUBLIC_PATH + SHELL_DESCRIPTORS_PATH; public static final String SHELL_DESCRIPTORS_TEMPLATE = SHELL_DESCRIPTORS_PATH + "{aasIdentifier}"; From 476fb0847cb70febd8b03bdea88ee883d28ec0c9 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 16:52:48 +0100 Subject: [PATCH 02/10] feature(irs-edc-client): #412 temp changes shared --- .../SecurityAttribute.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java diff --git a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java new file mode 100644 index 0000000000..40dd0726c8 --- /dev/null +++ b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java @@ -0,0 +1,48 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://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. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.irs.component.assetadministrationshell; + +import lombok.Builder; +import lombok.Data; +import lombok.extern.jackson.Jacksonized; + +@Data +@Builder +@Jacksonized +public class SecurityAttribute { + + /** + * type + */ + private String type; + /** + * key + */ + private String key; + /** + * value + */ + private String value; + + public static SecurityAttribute none() { + return SecurityAttribute.builder().type("NONE").key("NONE").value("NONE").build(); + } +} From c8cbab35c17c28bd6d9b2ea7b815157f74af4797 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 21:50:51 +0100 Subject: [PATCH 03/10] feature(irs-edc-client): #412 refactor a bit for better usability --- .../configuration/RegistryConfiguration.java | 5 +- .../registryclient/DefaultConfiguration.java | 4 +- .../DigitalTwinRegistryService.java | 12 +- .../DecentralDigitalTwinRegistryClient.java | 10 -- .../DecentralDigitalTwinRegistryService.java | 6 - .../decentral/DigitalTwinRegistryService.java | 68 +++++++ .../exception/CreateDtrShellException.java | 34 ++++ ...ecentralDigitalTwinRegistryClientTest.java | 69 +------ ...igitalTwinRegistryServiceWiremockTest.java | 3 +- .../DigitalTwinRegistryServiceTest.java | 169 ++++++++++++++++++ .../testing/wiremock/DtrWiremockSupport.java | 23 +-- 11 files changed, 290 insertions(+), 113 deletions(-) create mode 100644 irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java create mode 100644 irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/exception/CreateDtrShellException.java create mode 100644 irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java diff --git a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java index 73a532687a..db7de31bb7 100644 --- a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java +++ b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/RegistryConfiguration.java @@ -70,7 +70,6 @@ public DigitalTwinRegistryClient digitalTwinRegistryClientImpl( public DecentralDigitalTwinRegistryService decentralDigitalTwinRegistryService( @Qualifier(RestTemplateConfig.EDC_REST_TEMPLATE) final RestTemplate edcRestTemplate, final ConnectorEndpointsService connectorEndpointsService, final EdcSubmodelFacade facade, - @Value("${digitalTwinRegistry.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistry.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistry.lookupShellsTemplate:}") final String lookupShellsTemplate) { return new DecentralDigitalTwinRegistryService(connectorEndpointsService, @@ -80,8 +79,8 @@ public DecentralDigitalTwinRegistryService decentralDigitalTwinRegistryService( } catch (EdcClientException e) { throw new EdcRetrieverException(e); } - }), new DecentralDigitalTwinRegistryClient(edcRestTemplate, createShellDescriptorTemplate, - shellDescriptorTemplate, lookupShellsTemplate)); + }), + new DecentralDigitalTwinRegistryClient(edcRestTemplate, shellDescriptorTemplate, lookupShellsTemplate)); } @Bean diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java index 37256fcb1d..613c12db3c 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DefaultConfiguration.java @@ -146,11 +146,9 @@ public EdcSubmodelClient edcSubmodelClient(final EdcConfiguration edcConfigurati @ConditionalOnProperty(prefix = CONFIG_PREFIX, name = CONFIG_FIELD_TYPE, havingValue = CONFIG_VALUE_DECENTRAL) public DecentralDigitalTwinRegistryClient decentralDigitalTwinRegistryClient( @Qualifier(EDC_REST_TEMPLATE) final RestTemplate edcRestTemplate, - @Value("${digitalTwinRegistryClient.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistryClient.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistryClient.lookupShellsTemplate:}") final String lookupShellsTemplate) { - return new DecentralDigitalTwinRegistryClient(edcRestTemplate, createShellDescriptorTemplate, - shellDescriptorTemplate, lookupShellsTemplate); + return new DecentralDigitalTwinRegistryClient(edcRestTemplate, shellDescriptorTemplate, lookupShellsTemplate); } @Bean diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java index 4e71b5d5e2..2c844c4029 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java @@ -26,7 +26,6 @@ import java.util.Collection; import org.eclipse.tractusx.irs.component.Shell; -import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; import org.eclipse.tractusx.irs.registryclient.exceptions.RegistryServiceException; /** @@ -70,14 +69,5 @@ default Collection lookupShells(final String bpn) throws * @param identifiers the shell identifiers * @return the shell descriptors */ - Collection fetchShells(Collection identifiers) - throws RegistryServiceException; - - /** - * Created Shell. - * - * @param assetAdministrationShellDescriptor the shell to create - * @return the shell descriptors - */ - AssetAdministrationShellDescriptor createShell(final AssetAdministrationShellDescriptor assetAdministrationShellDescriptor); + Collection fetchShells(Collection identifiers) throws RegistryServiceException; } diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java index 78a49d31e3..fe976aa72e 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java @@ -55,7 +55,6 @@ public class DecentralDigitalTwinRegistryClient { private final String lookupShellsTemplate; public DecentralDigitalTwinRegistryClient(final RestTemplate edcRestTemplate, - @Value("${digitalTwinRegistry.createShellDescriptorTemplate:}") final String createShellDescriptorTemplate, @Value("${digitalTwinRegistry.shellDescriptorTemplate:}") final String shellDescriptorTemplate, @Value("${digitalTwinRegistry.lookupShellsTemplate:}") final String lookupShellsTemplate) { this.edcRestTemplate = edcRestTemplate; @@ -67,15 +66,6 @@ private static String encodeWithBase64(final String aasIdentifier) { return Base64.getEncoder().encodeToString(aasIdentifier.getBytes(StandardCharsets.UTF_8)); } - public AssetAdministrationShellDescriptor createShell( - AssetAdministrationShellDescriptor assetAdministrationShellDescriptor, - EndpointDataReference endpointDataReference) { - final String descriptorEndpoint = endpointDataReference.getEndpoint() + shellDescriptorTemplate; - return edcRestTemplate.exchange(URI.create(descriptorEndpoint), HttpMethod.POST, - new HttpEntity<>(assetAdministrationShellDescriptor, headers(endpointDataReference)), - AssetAdministrationShellDescriptor.class).getBody(); - } - @Retry(name = "registry") public AssetAdministrationShellDescriptor getAssetAdministrationShellDescriptor( final EndpointDataReference endpointDataReference, final String aasIdentifier) { diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java index 3e5f7aea3e..c7258869eb 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java @@ -121,12 +121,6 @@ public Collection fetchShells(final Collection ke } } - @Override - public AssetAdministrationShellDescriptor createShell( - final AssetAdministrationShellDescriptor assetAdministrationShellDescriptor) { - - } - private Stream fetchShellDescriptors(final Map.Entry> entry, final Set calledEndpoints) { diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java new file mode 100644 index 0000000000..333129298e --- /dev/null +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java @@ -0,0 +1,68 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://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. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.irs.registryclient.decentral; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; +import org.eclipse.tractusx.irs.registryclient.decentral.exception.CreateDtrShellException; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@Slf4j +@RequiredArgsConstructor +public class DigitalTwinRegistryService { + + private final RestTemplate restTemplate; + private final String createShellUrl; + + public AssetAdministrationShellDescriptor createShell( + final AssetAdministrationShellDescriptor assetAdministrationShellDescriptor) + throws CreateDtrShellException { + final ResponseEntity createdShellResponse; + try { + createdShellResponse = restTemplate.postForEntity(createShellUrl, + new HttpEntity<>(assetAdministrationShellDescriptor, headers()), + AssetAdministrationShellDescriptor.class); + final HttpStatusCode responseCode = createdShellResponse.getStatusCode(); + + if (responseCode.value() == HttpStatus.CREATED.value()) { + return createdShellResponse.getBody(); + } + } catch (RestClientException e) { + throw new CreateDtrShellException(e); + } + throw new CreateDtrShellException( + "Failed to create shell %s".formatted(assetAdministrationShellDescriptor.getGlobalAssetId())); + } + + private HttpHeaders headers() { + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + return headers; + } +} diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/exception/CreateDtrShellException.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/exception/CreateDtrShellException.java new file mode 100644 index 0000000000..15862e15fc --- /dev/null +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/exception/CreateDtrShellException.java @@ -0,0 +1,34 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://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. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +package org.eclipse.tractusx.irs.registryclient.decentral.exception; + +/** + * CreateDtrShellException used for create asset failure + */ +public class CreateDtrShellException extends Exception { + public CreateDtrShellException(final String message) { + super(message); + } + + public CreateDtrShellException(final Throwable cause) { + super(cause); + } +} diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java index aa7115c138..70d905e572 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java @@ -32,7 +32,6 @@ class DecentralDigitalTwinRegistryClientTest { - public static final String CREATE_SHELL_DESCRIPTORS = "/shell-descriptors"; public static final String SHELL_DESCRIPTORS = "/shell-descriptors/{aasIdentifier}"; public static final String LOOKUP_SHELLS = "/lookup/shells"; RestTemplate restTemplate = mock(RestTemplate.class); @@ -40,7 +39,7 @@ class DecentralDigitalTwinRegistryClientTest { @BeforeEach void setUp() { - client = new DecentralDigitalTwinRegistryClient(restTemplate, CREATE_SHELL_DESCRIPTORS, SHELL_DESCRIPTORS, LOOKUP_SHELLS); + client = new DecentralDigitalTwinRegistryClient(restTemplate, SHELL_DESCRIPTORS, LOOKUP_SHELLS); } @Test @@ -77,70 +76,4 @@ void shouldCallForAllAssetAdministrationShellIdsByAssetLink() { verify(restTemplate).exchange(any(), eq(HttpMethod.GET), any(), eq(LookupShellsResponse.class)); } - @Test - void test() throws JsonProcessingException { - AssetAdministrationShellDescriptor test = AssetAdministrationShellDescriptor.builder() - .globalAssetId( - "urn:uuid:254604ab-2153-45fb-8cad-54ef09f4080f") - .idShort("test") - .id("urn:uuid:25300562-aa66-4840-8952-5cef4ed667c2") - .specificAssetIds( - List.of(IdentifierKeyValuePair.builder() - .name("manufacturerId") - .value("BPNL00000003CNKC") - .subjectId( - Reference.builder() - .keys(List.of( - SemanticId.builder() - .type("GlobalReference") - .value("PUBLIC_READABLE") - .build())) - .build()) - .build())) - .submodelDescriptors( - List.of(SubmodelDescriptor.builder() - .idShort( - "SingleLevelUsageAsBuilt") - .id("urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") - .semanticId( - Reference.builder() - .type("ExternalReference") - .keys(List.of( - SemanticId.builder() - .type("GlobalReference") - .value("urn:bamm:io.catenax.single_level_usage_as_built:2.0.0#SingleLevelUsageAsBuilt") - .build())) - .build() - - ) - .endpoints( - List.of(Endpoint.builder() - .interfaceInformation( - "SUBMODEL-3.0") - .protocolInformation( - ProtocolInformation.builder() - .href("https://trace-x-edc-dataplane.dev.demo.catena-x.net/api/public/data/urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") - .endpointProtocol( - "HTTP") - .endpointProtocolVersion( - List.of("1.1")) - .subprotocol( - "DSP") - .subprotocolBody( - "id=urn:uuid:cb6d86b5-b8ea-4fc0-b10b-ff2dd62f793d;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net") - .subprotocolBodyEncoding( - "plain") - .securityAttributes( - List.of(SecurityAttribute.none())) - - .build()) - .build())) - .build())) - .build(); - - ObjectMapper m = new ObjectMapper(); - - assertThat(m.writeValueAsString(test)).isNotBlank(); - } - } \ No newline at end of file diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java index 9b4ca73f74..36ce0ff1b6 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryServiceWiremockTest.java @@ -36,7 +36,6 @@ import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postDiscoveryFinder404; import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postEdcDiscovery200; import static org.eclipse.tractusx.irs.testing.wiremock.DiscoveryServiceWiremockSupport.postEdcDiscovery404; -import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.CREATE_SHELL_DESCRIPTOR_PATH; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.DATAPLANE_URL; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.LOOKUP_SHELLS_PATH; import static org.eclipse.tractusx.irs.testing.wiremock.DtrWiremockSupport.LOOKUP_SHELLS_TEMPLATE; @@ -88,7 +87,7 @@ void setUp(WireMockRuntimeInfo wireMockRuntimeInfo) throws EdcRetrieverException final var connectorEndpointsService = new ConnectorEndpointsService(discoveryFinderClient); final var endpointDataForConnectorsService = new EndpointDataForConnectorsService(edcSubmodelFacadeMock); final var decentralDigitalTwinRegistryClient = new DecentralDigitalTwinRegistryClient(restTemplate, - CREATE_SHELL_DESCRIPTOR_PATH, SHELL_DESCRIPTORS_TEMPLATE, LOOKUP_SHELLS_TEMPLATE); + SHELL_DESCRIPTORS_TEMPLATE, LOOKUP_SHELLS_TEMPLATE); decentralDigitalTwinRegistryService = new DecentralDigitalTwinRegistryService(connectorEndpointsService, endpointDataForConnectorsService, decentralDigitalTwinRegistryClient); final var endpointDataReference = endpointDataReference("assetId"); diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java new file mode 100644 index 0000000000..4c413edf4d --- /dev/null +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java @@ -0,0 +1,169 @@ +/******************************************************************************** + * Copyright (c) 2022,2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) + * Copyright (c) 2021,2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://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. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.irs.registryclient.decentral; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import java.util.List; + +import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; +import org.eclipse.tractusx.irs.component.assetadministrationshell.Endpoint; +import org.eclipse.tractusx.irs.component.assetadministrationshell.IdentifierKeyValuePair; +import org.eclipse.tractusx.irs.component.assetadministrationshell.ProtocolInformation; +import org.eclipse.tractusx.irs.component.assetadministrationshell.Reference; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SecurityAttribute; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SemanticId; +import org.eclipse.tractusx.irs.component.assetadministrationshell.SubmodelDescriptor; +import org.eclipse.tractusx.irs.registryclient.decentral.exception.CreateDtrShellException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +@ExtendWith(MockitoExtension.class) +class DigitalTwinRegistryServiceTest { + + private static final String CREATE_SHELL_URL = "/shell-descriptors"; + @Mock + private RestTemplate restTemplate; + private DigitalTwinRegistryService service; + + @BeforeEach + void setUp() { + service = new DigitalTwinRegistryService(restTemplate, CREATE_SHELL_URL); + } + + @Test + void givenShell_whenCreateShell_thenCreteIt() throws CreateDtrShellException { + // given + AssetAdministrationShellDescriptor shell = testShell(); + when(restTemplate.postForEntity(any(String.class), any(HttpEntity.class), any())).thenReturn( + ResponseEntity.status(HttpStatus.CREATED).body(shell)); + + // when + AssetAdministrationShellDescriptor result = service.createShell(shell); + + // then + assertThat(result).isNotNull(); + } + + @Test + void givenShell_whenTemplateException_thenThrowException() { + // given + AssetAdministrationShellDescriptor shell = testShell(); + doThrow(new RestClientException("Surprise")).when(restTemplate) + .postForEntity(any(String.class), any(HttpEntity.class), any()); + + // when/then + assertThrows(CreateDtrShellException.class, () -> service.createShell(shell)); + } + + @Test + void givenShell_whenConflict_thenThrowException() { + // given + AssetAdministrationShellDescriptor shell = testShell(); + when(restTemplate.postForEntity(any(String.class), any(HttpEntity.class), any())).thenReturn( + ResponseEntity.status(HttpStatus.CONFLICT).body(shell)); + + // when/then + assertThrows(CreateDtrShellException.class, () -> service.createShell(shell)); + } + + @Test + void testCreateShell() throws CreateDtrShellException { + AssetAdministrationShellDescriptor shell = testShell(); + when(restTemplate.postForEntity(any(String.class), any(HttpEntity.class), any())).thenReturn( + ResponseEntity.status(HttpStatus.CREATED).body(shell)); + + // when + AssetAdministrationShellDescriptor result = service.createShell(shell); + + // then + assertThat(result).isNotNull(); + } + + private AssetAdministrationShellDescriptor testShell() { + return AssetAdministrationShellDescriptor.builder() + .globalAssetId("urn:uuid:254604ab-2153-45fb-8cad-54ef09f4080f") + .idShort("test") + .id("urn:uuid:25300562-aa66-4840-8952-5cef4ed667c2") + .specificAssetIds(List.of(IdentifierKeyValuePair.builder() + .name("manufacturerId") + .value("BPNL00000003CNKC") + .subjectId( + Reference.builder() + .keys(List.of( + SemanticId.builder() + .type("GlobalReference") + .value("PUBLIC_READABLE") + .build())) + .build()) + .build())) + .submodelDescriptors(List.of(SubmodelDescriptor.builder() + .idShort( + "SingleLevelUsageAsBuilt") + .id("urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") + .semanticId( + Reference.builder() + .type("ExternalReference") + .keys(List.of( + SemanticId.builder() + .type("GlobalReference") + .value("urn:bamm:io.catenax.single_level_usage_as_built:2.0.0#SingleLevelUsageAsBuilt") + .build())) + .build() + + ) + .endpoints( + List.of(Endpoint.builder() + .interfaceInformation( + "SUBMODEL-3.0") + .protocolInformation( + ProtocolInformation.builder() + .href("https://trace-x-edc-dataplane.dev.demo.catena-x.net/api/public/data/urn:uuid:e401ccb7-a8f5-499a-9340-93746822d775") + .endpointProtocol( + "HTTP") + .endpointProtocolVersion( + List.of("1.1")) + .subprotocol( + "DSP") + .subprotocolBody( + "id=urn:uuid:cb6d86b5-b8ea-4fc0-b10b-ff2dd62f793d;dspEndpoint=https://trace-x-edc.dev.demo.catena-x.net") + .subprotocolBodyEncoding( + "plain") + .securityAttributes( + List.of(SecurityAttribute.none())) + + .build()) + .build())) + .build())) + .build(); + } +} \ No newline at end of file diff --git a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java index 2b340e813e..3212d33cb1 100644 --- a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java +++ b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java @@ -36,7 +36,6 @@ public final class DtrWiremockSupport { public static final String DATAPLANE_PUBLIC_PATH = "/api/public"; public static final String DATAPLANE_PUBLIC_URL = DATAPLANE_URL + DATAPLANE_PUBLIC_PATH; - public static final String CREATE_SHELL_DESCRIPTOR_PATH = "/shell-descriptors"; public static final String SHELL_DESCRIPTORS_PATH = "/shell-descriptors/"; public static final String PUBLIC_SHELL_DESCRIPTORS_PATH = DATAPLANE_PUBLIC_PATH + SHELL_DESCRIPTORS_PATH; public static final String SHELL_DESCRIPTORS_TEMPLATE = SHELL_DESCRIPTORS_PATH + "{aasIdentifier}"; @@ -55,8 +54,9 @@ public static MappingBuilder getShellDescriptor200() { public static MappingBuilder getShellDescriptor200(final String urlRegex) { final String materialForRecycling = submodelDescriptor(DATAPLANE_PUBLIC_URL, - "urn:uuid:19b0338f-6d03-4198-b3b8-5c43f8958d60", DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, - "MaterialForRecycling", "urn:uuid:cf06d5d5-e3f8-4bd4-bfcf-81815310701f", + "urn:uuid:19b0338f-6d03-4198-b3b8-5c43f8958d60", + DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, "MaterialForRecycling", + "urn:uuid:cf06d5d5-e3f8-4bd4-bfcf-81815310701f", "urn:bamm:io.catenax.material_for_recycling:1.1.0#MaterialForRecycling"); final String batch = submodelDescriptor(DATAPLANE_PUBLIC_URL, "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", @@ -64,8 +64,9 @@ public static MappingBuilder getShellDescriptor200(final String urlRegex) { "urn:uuid:f53db6ef-7a58-4326-9169-0ae198b85dbf", "urn:samm:io.catenax.batch:2.0.0#Batch"); final String singleLevelBomAsBuilt = submodelDescriptor(DATAPLANE_PUBLIC_URL, - "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, - "SingleLevelBomAsBuilt", "urn:uuid:0e413809-966b-4107-aae5-aeb28bcdaadf", + "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", + DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, "SingleLevelBomAsBuilt", + "urn:uuid:0e413809-966b-4107-aae5-aeb28bcdaadf", "urn:bamm:io.catenax.single_level_bom_as_built:2.0.0#SingleLevelBomAsBuilt"); final List submodelDescriptors = List.of(batch, singleLevelBomAsBuilt, materialForRecycling); @@ -77,11 +78,13 @@ public static MappingBuilder getShellDescriptor200(final String urlRegex) { } @SuppressWarnings("PMD.UseObjectForClearerAPI") // used only for testing - public static MappingBuilder getShellDescriptor200(final String urlRegex, final String bpn, final List submodelDescriptors, - final String globalAssetId, final String shellId, final String idShort) { + public static MappingBuilder getShellDescriptor200(final String urlRegex, final String bpn, + final List submodelDescriptors, final String globalAssetId, final String shellId, + final String idShort) { final List specificAssetIds = List.of(specificAssetId("manufacturerId", bpn)); return get(urlPathMatching(urlRegex)).willReturn(responseWithStatus(STATUS_CODE_OK).withBody( - assetAdministrationShellResponse(submodelDescriptors, globalAssetId, idShort, shellId, specificAssetIds))); + assetAdministrationShellResponse(submodelDescriptors, globalAssetId, idShort, shellId, + specificAssetIds))); } public static String assetAdministrationShellResponse(final List submodelDescriptors, @@ -180,8 +183,8 @@ public static MappingBuilder getLookupShells200(final String lookupShellsPath) { } public static MappingBuilder getLookupShells200(final String lookupShellsPath, final List shellIds) { - return get(urlPathEqualTo(lookupShellsPath)).willReturn(responseWithStatus(STATUS_CODE_OK).withBody( - lookupShellsResponse(shellIds))); + return get(urlPathEqualTo(lookupShellsPath)).willReturn( + responseWithStatus(STATUS_CODE_OK).withBody(lookupShellsResponse(shellIds))); } public static MappingBuilder getLookupShells200Empty() { From 87acaf767946d6ce533dc6a0a7a13064863d8493 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 22:09:49 +0100 Subject: [PATCH 04/10] feature(irs-edc-client): #412 refactor a bit for better usability --- .../component/assetadministrationshell/SecurityAttribute.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java index 40dd0726c8..4065b514a6 100644 --- a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java +++ b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/SecurityAttribute.java @@ -24,6 +24,9 @@ import lombok.Data; import lombok.extern.jackson.Jacksonized; +/** + * SecurityAttribute + */ @Data @Builder @Jacksonized From b455ce9ee4b4af349e05783685ff56f3732be8cf Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 22:16:16 +0100 Subject: [PATCH 05/10] feature(irs-edc-client): #412 refactor a bit for better usability --- .../decentral/DecentralDigitalTwinRegistryClient.java | 1 - .../registryclient/decentral/DigitalTwinRegistryService.java | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java index fe976aa72e..1c7a7ed5b3 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClient.java @@ -23,7 +23,6 @@ ********************************************************************************/ package org.eclipse.tractusx.irs.registryclient.decentral; -import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.List; diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java index 333129298e..195f557d1c 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java @@ -33,6 +33,9 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +/** + * implementation of DigitalTwinRegistryService used to create shells in DTR + */ @Slf4j @RequiredArgsConstructor public class DigitalTwinRegistryService { From 3bc2481e0f8fab90bd3e54062b026935f6da1b9b Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Mon, 12 Feb 2024 22:33:50 +0100 Subject: [PATCH 06/10] feature(irs-edc-client): #412 refactor a bit for better usability --- .../DigitalTwinRegistryService.java | 3 ++- .../DecentralDigitalTwinRegistryService.java | 23 ++++++++++--------- ...ecentralDigitalTwinRegistryClientTest.java | 11 --------- .../testing/wiremock/DtrWiremockSupport.java | 23 ++++++++----------- 4 files changed, 23 insertions(+), 37 deletions(-) diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java index 2c844c4029..153acd3140 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/DigitalTwinRegistryService.java @@ -69,5 +69,6 @@ default Collection lookupShells(final String bpn) throws * @param identifiers the shell identifiers * @return the shell descriptors */ - Collection fetchShells(Collection identifiers) throws RegistryServiceException; + Collection fetchShells(Collection identifiers) + throws RegistryServiceException; } diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java index c7258869eb..9fb4065879 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryService.java @@ -121,8 +121,8 @@ public Collection fetchShells(final Collection ke } } - private Stream fetchShellDescriptors(final Map.Entry> entry, - final Set calledEndpoints) { + private Stream fetchShellDescriptors( + final Map.Entry> entry, final Set calledEndpoints) { try { @@ -140,8 +140,8 @@ private Stream fetchShellDescriptors(final Map.Entry> fetchShellDescriptors(final Set calledEndpoints, final String bpn, - final List keys) { + private CompletableFuture> fetchShellDescriptors( + final Set calledEndpoints, final String bpn, final List keys) { final var watch = new StopWatch(); final String msg = "Fetching %s shells for bpn '%s'".formatted(keys.size(), bpn); @@ -177,8 +177,8 @@ private CompletableFuture> fetchShellDescriptorsForConnectorEndpoint return resultFinder.getFastestResult(futures); } - private List fetchShellDescriptorsForKey(final List keys, - final EndpointDataReference endpointDataReference) { + private List fetchShellDescriptorsForKey( + final List keys, final EndpointDataReference endpointDataReference) { final var watch = new StopWatch(); final String msg = "Fetching shell descriptors for keys %s from endpoint '%s'".formatted(keys, @@ -186,10 +186,8 @@ private List fetchShellDescriptorsForKey(final List new Shell(contractNegotiationId(endpointDataReference.getAuthCode()), - fetchShellDescriptor(endpointDataReference, key))) - .toList(); + return keys.stream().map(key -> new Shell(contractNegotiationId(endpointDataReference.getAuthCode()), + fetchShellDescriptor(endpointDataReference, key))).toList(); } finally { watch.stop(); log.info(TOOK_MS, watch.getLastTaskName(), watch.getLastTaskTimeMillis()); @@ -214,7 +212,10 @@ private AssetAdministrationShellDescriptor fetchShellDescriptor(final EndpointDa } private String contractNegotiationId(final String token) { - return Optional.ofNullable(token).map(EDRAuthCode::fromAuthCodeToken).map(EDRAuthCode::getCid).orElse(""); + return Optional.ofNullable(token) + .map(EDRAuthCode::fromAuthCodeToken) + .map(EDRAuthCode::getCid) + .orElse(""); } /** diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java index 70d905e572..823fa5a175 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DecentralDigitalTwinRegistryClientTest.java @@ -1,6 +1,5 @@ package org.eclipse.tractusx.irs.registryclient.decentral; -import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -10,25 +9,15 @@ import java.net.URI; import java.util.ArrayList; import java.util.Collections; -import java.util.List; import java.util.Optional; import org.eclipse.edc.spi.types.domain.edr.EndpointDataReference; import org.eclipse.tractusx.irs.component.assetadministrationshell.AssetAdministrationShellDescriptor; -import org.eclipse.tractusx.irs.component.assetadministrationshell.Endpoint; -import org.eclipse.tractusx.irs.component.assetadministrationshell.IdentifierKeyValuePair; -import org.eclipse.tractusx.irs.component.assetadministrationshell.ProtocolInformation; -import org.eclipse.tractusx.irs.component.assetadministrationshell.Reference; -import org.eclipse.tractusx.irs.component.assetadministrationshell.SecurityAttribute; -import org.eclipse.tractusx.irs.component.assetadministrationshell.SemanticId; -import org.eclipse.tractusx.irs.component.assetadministrationshell.SubmodelDescriptor; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; -import org.testcontainers.shaded.com.fasterxml.jackson.core.JsonProcessingException; -import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; class DecentralDigitalTwinRegistryClientTest { diff --git a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java index 3212d33cb1..f269e1713b 100644 --- a/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java +++ b/irs-testing/src/main/java/org/eclipse/tractusx/irs/testing/wiremock/DtrWiremockSupport.java @@ -35,7 +35,6 @@ public final class DtrWiremockSupport { public static final String DATAPLANE_URL = "http://dataplane.test"; public static final String DATAPLANE_PUBLIC_PATH = "/api/public"; public static final String DATAPLANE_PUBLIC_URL = DATAPLANE_URL + DATAPLANE_PUBLIC_PATH; - public static final String SHELL_DESCRIPTORS_PATH = "/shell-descriptors/"; public static final String PUBLIC_SHELL_DESCRIPTORS_PATH = DATAPLANE_PUBLIC_PATH + SHELL_DESCRIPTORS_PATH; public static final String SHELL_DESCRIPTORS_TEMPLATE = SHELL_DESCRIPTORS_PATH + "{aasIdentifier}"; @@ -54,9 +53,8 @@ public static MappingBuilder getShellDescriptor200() { public static MappingBuilder getShellDescriptor200(final String urlRegex) { final String materialForRecycling = submodelDescriptor(DATAPLANE_PUBLIC_URL, - "urn:uuid:19b0338f-6d03-4198-b3b8-5c43f8958d60", - DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, "MaterialForRecycling", - "urn:uuid:cf06d5d5-e3f8-4bd4-bfcf-81815310701f", + "urn:uuid:19b0338f-6d03-4198-b3b8-5c43f8958d60", DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, + "MaterialForRecycling", "urn:uuid:cf06d5d5-e3f8-4bd4-bfcf-81815310701f", "urn:bamm:io.catenax.material_for_recycling:1.1.0#MaterialForRecycling"); final String batch = submodelDescriptor(DATAPLANE_PUBLIC_URL, "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", @@ -64,9 +62,8 @@ public static MappingBuilder getShellDescriptor200(final String urlRegex) { "urn:uuid:f53db6ef-7a58-4326-9169-0ae198b85dbf", "urn:samm:io.catenax.batch:2.0.0#Batch"); final String singleLevelBomAsBuilt = submodelDescriptor(DATAPLANE_PUBLIC_URL, - "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", - DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, "SingleLevelBomAsBuilt", - "urn:uuid:0e413809-966b-4107-aae5-aeb28bcdaadf", + "urn:uuid:234edd2f-0223-47c7-9fe4-3984ab14c4f9", DiscoveryServiceWiremockSupport.CONTROLPLANE_PUBLIC_URL, + "SingleLevelBomAsBuilt", "urn:uuid:0e413809-966b-4107-aae5-aeb28bcdaadf", "urn:bamm:io.catenax.single_level_bom_as_built:2.0.0#SingleLevelBomAsBuilt"); final List submodelDescriptors = List.of(batch, singleLevelBomAsBuilt, materialForRecycling); @@ -78,13 +75,11 @@ public static MappingBuilder getShellDescriptor200(final String urlRegex) { } @SuppressWarnings("PMD.UseObjectForClearerAPI") // used only for testing - public static MappingBuilder getShellDescriptor200(final String urlRegex, final String bpn, - final List submodelDescriptors, final String globalAssetId, final String shellId, - final String idShort) { + public static MappingBuilder getShellDescriptor200(final String urlRegex, final String bpn, final List submodelDescriptors, + final String globalAssetId, final String shellId, final String idShort) { final List specificAssetIds = List.of(specificAssetId("manufacturerId", bpn)); return get(urlPathMatching(urlRegex)).willReturn(responseWithStatus(STATUS_CODE_OK).withBody( - assetAdministrationShellResponse(submodelDescriptors, globalAssetId, idShort, shellId, - specificAssetIds))); + assetAdministrationShellResponse(submodelDescriptors, globalAssetId, idShort, shellId, specificAssetIds))); } public static String assetAdministrationShellResponse(final List submodelDescriptors, @@ -183,8 +178,8 @@ public static MappingBuilder getLookupShells200(final String lookupShellsPath) { } public static MappingBuilder getLookupShells200(final String lookupShellsPath, final List shellIds) { - return get(urlPathEqualTo(lookupShellsPath)).willReturn( - responseWithStatus(STATUS_CODE_OK).withBody(lookupShellsResponse(shellIds))); + return get(urlPathEqualTo(lookupShellsPath)).willReturn(responseWithStatus(STATUS_CODE_OK).withBody( + lookupShellsResponse(shellIds))); } public static MappingBuilder getLookupShells200Empty() { From 42812805b99d12e6d592b68c85c2eb962b0ebbab Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Tue, 13 Feb 2024 12:36:20 +0100 Subject: [PATCH 07/10] feature(irs-edc-client): #412 fix test --- docs/src/api/irs-api.yaml | 15 +++++++++++++++ .../ProtocolInformation.java | 1 + 2 files changed, 16 insertions(+) diff --git a/docs/src/api/irs-api.yaml b/docs/src/api/irs-api.yaml index f7c25939dc..76f8a18765 100644 --- a/docs/src/api/irs-api.yaml +++ b/docs/src/api/irs-api.yaml @@ -2326,6 +2326,11 @@ components: type: string subprotocolBodyEncoding: type: string + securityAttributes: + type: array + items: + $ref: '#/components/schemas/SecurityAttribute' + maxItems: 2147483647 Quantity: type: object additionalProperties: false @@ -2622,6 +2627,16 @@ components: value: type: string example: Submodel + SecurityAttribute: + type: object + additionalProperties: false + properties: + type: + type: string + key: + type: string + value: + type: string Shell: type: object additionalProperties: false diff --git a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java index 2885265ef4..93e0650d87 100644 --- a/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java +++ b/irs-models/src/main/java/org/eclipse/tractusx/irs/component/assetadministrationshell/ProtocolInformation.java @@ -69,6 +69,7 @@ public class ProtocolInformation { /** * securityAttributes */ + @ArraySchema(arraySchema = @Schema(implementation = SecurityAttribute.class), maxItems = Integer.MAX_VALUE) private List securityAttributes; } From 58ae8e20e5ce76fb37156dc526159246373887a6 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Tue, 20 Feb 2024 11:33:59 +0100 Subject: [PATCH 08/10] feature(irs-edc-client): #412 rename service --- ...vice.java => DigitalTwinRegistryCreateShellService.java} | 2 +- ....java => DigitalTwinRegistryCreateShellServiceTest.java} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/{DigitalTwinRegistryService.java => DigitalTwinRegistryCreateShellService.java} (98%) rename irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/{DigitalTwinRegistryServiceTest.java => DigitalTwinRegistryCreateShellServiceTest.java} (98%) diff --git a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellService.java similarity index 98% rename from irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java rename to irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellService.java index 195f557d1c..88b900558d 100644 --- a/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryService.java +++ b/irs-registry-client/src/main/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellService.java @@ -38,7 +38,7 @@ */ @Slf4j @RequiredArgsConstructor -public class DigitalTwinRegistryService { +public class DigitalTwinRegistryCreateShellService { private final RestTemplate restTemplate; private final String createShellUrl; diff --git a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellServiceTest.java similarity index 98% rename from irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java rename to irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellServiceTest.java index 4c413edf4d..89ae49c5fd 100644 --- a/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryServiceTest.java +++ b/irs-registry-client/src/test/java/org/eclipse/tractusx/irs/registryclient/decentral/DigitalTwinRegistryCreateShellServiceTest.java @@ -48,16 +48,16 @@ import org.springframework.web.client.RestTemplate; @ExtendWith(MockitoExtension.class) -class DigitalTwinRegistryServiceTest { +class DigitalTwinRegistryCreateShellServiceTest { private static final String CREATE_SHELL_URL = "/shell-descriptors"; @Mock private RestTemplate restTemplate; - private DigitalTwinRegistryService service; + private DigitalTwinRegistryCreateShellService service; @BeforeEach void setUp() { - service = new DigitalTwinRegistryService(restTemplate, CREATE_SHELL_URL); + service = new DigitalTwinRegistryCreateShellService(restTemplate, CREATE_SHELL_URL); } @Test From ef03765481e4a1d444961d204115d7e02f580898 Mon Sep 17 00:00:00 2001 From: "Krzysztof Massalski (Extern)" Date: Tue, 20 Feb 2024 12:58:50 +0100 Subject: [PATCH 09/10] feat(fix):[#XXX] adjust submodel api examples --- docs/src/api/irs-api.yaml | 9 ++++++--- .../tractusx/irs/configuration/OpenApiExamples.java | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/src/api/irs-api.yaml b/docs/src/api/irs-api.yaml index f7c25939dc..085b640c8b 100644 --- a/docs/src/api/irs-api.yaml +++ b/docs/src/api/irs-api.yaml @@ -1077,7 +1077,7 @@ components: lexicalValue: piece quantityNumber: 1.0 shells: - - contractAgreementId: a787aa13-2bd7-488f-9e25-40682003901b + - contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 payload: description: - language: en @@ -1131,6 +1131,7 @@ components: type: ModelReference submodels: - aspectType: supply_chain_impacted + contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 identification: urn:uuid:fc784d2a-5506-4e61-8e34-21600f8cdeff payload: supplyChainImpacted: "YES" @@ -1199,7 +1200,7 @@ components: lexicalValue: piece quantityNumber: 1.0 shells: - - contractAgreementId: a787aa13-2bd7-488f-9e25-40682003901b + - contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 payload: description: - language: en @@ -1253,6 +1254,7 @@ components: type: ModelReference submodels: - aspectType: urn:bamm:io.catenax.single_level_bom_as_built:1.0.0 + contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 identification: urn:uuid:fc784d2a-5506-4e61-8e34-21600f8cdeff payload: catenaXId: urn:uuid:d9bec1c6-e47c-4d18-ba41-0a5fe8b7f447 @@ -1390,7 +1392,7 @@ components: lexicalValue: piece quantityNumber: 1.0 shells: - - contractAgreementId: a787aa13-2bd7-488f-9e25-40682003901b + - contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 payload: description: - language: en @@ -1442,6 +1444,7 @@ components: value: urn:bamm:com.catenax.vehicle:0.1.1#PartDetails submodels: - aspectType: urn:bamm:io.catenax.single_level_bom_as_built:1.0.0 + contractAgreementId: f253718e-a270-4367-901b-9d50d9bd8462 identification: urn:uuid:fc784d2a-5506-4e61-8e34-21600f8cdeff payload: catenaXId: urn:uuid:d9bec1c6-e47c-4d18-ba41-0a5fe8b7f447 diff --git a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/OpenApiExamples.java b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/OpenApiExamples.java index 7365543464..2e04d95ba3 100644 --- a/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/OpenApiExamples.java +++ b/irs-api/src/main/java/org/eclipse/tractusx/irs/configuration/OpenApiExamples.java @@ -284,6 +284,7 @@ private Example createCompleteEssJobResult() { private Submodel createEssSubmodel() { return Submodel.builder() + .contractAgreementId(EXAMPLE_ID) .aspectType(SUPPLY_CHAIN_IMPACTED_ASPECT_TYPE) .identification(SUBMODEL_IDENTIFICATION) .payload(Map.of(SUPPLY_CHAIN_IMPACTED_KEY, SUPPLY_CHAIN_IMPACTER_RESULT)) @@ -343,6 +344,7 @@ private Example createCanceledJobResponse() { private Submodel createSubmodel() { return Submodel.builder() + .contractAgreementId(EXAMPLE_ID) .aspectType("urn:bamm:io.catenax.single_level_bom_as_built:1.0.0") .identification(SUBMODEL_IDENTIFICATION) .payload(createAssemblyPartRelationshipPayloadMap()) @@ -373,7 +375,7 @@ private Tombstone createTombstone() { } private Shell createShell() { - return new Shell("a787aa13-2bd7-488f-9e25-40682003901b", + return new Shell(EXAMPLE_ID, AssetAdministrationShellDescriptor.builder() .description(List.of(LangString.builder() .language("en") From 7359fc4e10609fdb718edbfdc753bd3fdd2e4122 Mon Sep 17 00:00:00 2001 From: ds-ext-sceronik Date: Wed, 21 Feb 2024 10:13:50 +0100 Subject: [PATCH 10/10] feature(irs-edc-client): #412 merge main --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c027771541..671abfac4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - +### Added +- DigitalTwinRegistryCreateShellService in irs-registry-client for creating shells in DTR directly ## [4.6.0] - 2024-02-20 @@ -15,7 +16,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - EdcAssetService capable to create assets inside EDC - EdcPolicyDefinitionService capable to create polices inside EDC - EdcContractDefinitionService capable to create contracts inside EDC -- DigitalTwinRegistryCreateShellService in irs-registry-client for creating shells in DTR directly ### Changed - Updated AUTHORS.md