From dc3fb031d261ad360f9a317133ffc37c726c4455 Mon Sep 17 00:00:00 2001 From: mateusmolina Date: Mon, 28 Oct 2024 09:06:01 +0100 Subject: [PATCH 1/2] fix: AssetKind mapping failing during Registry Integration --- .../main/client/mapper/AttributeMapper.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/basyx.aasregistry/basyx.aasregistry-client-native/src/main/java/org/eclipse/digitaltwin/basyx/aasregistry/main/client/mapper/AttributeMapper.java b/basyx.aasregistry/basyx.aasregistry-client-native/src/main/java/org/eclipse/digitaltwin/basyx/aasregistry/main/client/mapper/AttributeMapper.java index 2a9a46b7d..eb0a28140 100644 --- a/basyx.aasregistry/basyx.aasregistry-client-native/src/main/java/org/eclipse/digitaltwin/basyx/aasregistry/main/client/mapper/AttributeMapper.java +++ b/basyx.aasregistry/basyx.aasregistry-client-native/src/main/java/org/eclipse/digitaltwin/basyx/aasregistry/main/client/mapper/AttributeMapper.java @@ -134,8 +134,16 @@ public AdministrativeInformation mapAdministration(org.eclipse.digitaltwin.aas4j * @return the mapped assetKind */ public AssetKind mapAssetKind(org.eclipse.digitaltwin.aas4j.v3.model.AssetKind assetKind) { - - return AssetKind.valueOf(AssetKind.class, assetKind.name()); + switch (assetKind) { + case INSTANCE: + return AssetKind.INSTANCE; + case NOT_APPLICABLE: + return AssetKind.NOTAPPLICABLE; + case TYPE: + return AssetKind.TYPE; + default: + throw new IllegalArgumentException("Unknown AssetKind: " + assetKind); + } } } From f4cf1f1bb346da1c57fc0de587f7b81b9d3be4a5 Mon Sep 17 00:00:00 2001 From: mateusmolina Date: Mon, 28 Oct 2024 13:56:07 +0100 Subject: [PATCH 2/2] test: fix invalid test due to bugfix --- ...estEnvironmentWithRegistryIntegration.java | 20 ++++++++++++++---- .../test/resources/faulty_aas_reginteg.aasx | Bin 10897 -> 0 bytes 2 files changed, 16 insertions(+), 4 deletions(-) delete mode 100644 basyx.aasenvironment/basyx.aasenvironment.component/src/test/resources/faulty_aas_reginteg.aasx diff --git a/basyx.aasenvironment/basyx.aasenvironment.component/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/component/TestEnvironmentWithRegistryIntegration.java b/basyx.aasenvironment/basyx.aasenvironment.component/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/component/TestEnvironmentWithRegistryIntegration.java index a3fee1c54..ca223dbeb 100644 --- a/basyx.aasenvironment/basyx.aasenvironment.component/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/component/TestEnvironmentWithRegistryIntegration.java +++ b/basyx.aasenvironment/basyx.aasenvironment.component/src/test/java/org/eclipse/digitaltwin/basyx/aasenvironment/component/TestEnvironmentWithRegistryIntegration.java @@ -36,8 +36,11 @@ import org.eclipse.digitaltwin.basyx.aasenvironment.AasEnvironment; import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment; import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment.EnvironmentType; +import org.eclipse.digitaltwin.basyx.aasregistry.client.ApiException; +import org.eclipse.digitaltwin.basyx.aasregistry.client.model.AssetAdministrationShellDescriptor; import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository; import org.eclipse.digitaltwin.basyx.aasrepository.feature.registry.integration.AasRepositoryRegistryLink; +import org.eclipse.digitaltwin.basyx.core.exceptions.RepositoryRegistryLinkException; import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo; import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository; import org.eclipse.digitaltwin.basyx.submodelrepository.feature.registry.integration.SubmodelRepositoryRegistryLink; @@ -57,7 +60,7 @@ */ public class TestEnvironmentWithRegistryIntegration { - static final String FAULTY_AAS_PATH = "faulty_aas_reginteg.aasx"; + static final String ENV_PATH = "testEnvironment.json"; static ConfigurableApplicationContext appContext; @@ -92,14 +95,23 @@ public static void clearRegistries() throws Exception { } @Test - public void whenUploadDescriptorToRegistryFails_thenNoAasOrSmAreAddedToRepository() throws InvalidFormatException, DeserializationException, IOException { - CompleteEnvironment completeEnvironment = CompleteEnvironment.fromInputStream(getIsFromClasspath(FAULTY_AAS_PATH), EnvironmentType.AASX); + public void whenUploadDescriptorToRegistryFails_thenNoAasOrSmAreAddedToRepository() throws InvalidFormatException, DeserializationException, IOException, ApiException { + // simulate descriptor already being in registry + aasRepositoryRegistryLink.getRegistryApi().postAssetAdministrationShellDescriptor(buildTestAasDescriptor()); - assertThrows(IllegalArgumentException.class, () -> aasEnvironment.loadEnvironment(completeEnvironment)); + CompleteEnvironment completeEnvironment = CompleteEnvironment.fromInputStream(getIsFromClasspath(ENV_PATH), EnvironmentType.JSON); + + assertThrows(RepositoryRegistryLinkException.class, () -> aasEnvironment.loadEnvironment(completeEnvironment)); assertRepositoriesAreEmpty(); } + private static AssetAdministrationShellDescriptor buildTestAasDescriptor() { + AssetAdministrationShellDescriptor descriptor = new AssetAdministrationShellDescriptor(); + descriptor.setId("https://acplt.test/Test_AssetAdministrationShell"); + return descriptor; + } + private static InputStream getIsFromClasspath(String fileName) throws IOException { return new ClassPathResource(fileName).getInputStream(); } diff --git a/basyx.aasenvironment/basyx.aasenvironment.component/src/test/resources/faulty_aas_reginteg.aasx b/basyx.aasenvironment/basyx.aasenvironment.component/src/test/resources/faulty_aas_reginteg.aasx deleted file mode 100644 index 55fe434d329e10bac59de9de6ae852c4872827ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10897 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 H|C9S4UD6oo