Adds AASXPackageExplorerConformantHelper
Signed-off-by: Jannik Fried <jannik.fried@iese.fraunhofer.de>
Change-Id: I770c2c514db9d7c69e2e95f5a45e3284aa099251
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/factory/aasx/AASXPackageExplorerConformantHelper.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/factory/aasx/AASXPackageExplorerConformantHelper.java
new file mode 100644
index 0000000..f6868b5
--- /dev/null
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/factory/aasx/AASXPackageExplorerConformantHelper.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+* Copyright (C) 2021 the Eclipse BaSyx Authors
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+******************************************************************************/
+package org.eclipse.basyx.aas.factory.aasx;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.api.parts.asset.IAsset;
+import org.eclipse.basyx.aas.metamodel.map.AasEnv;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.submodel.metamodel.api.ISubmodel;
+import org.eclipse.basyx.submodel.metamodel.api.parts.IConceptDescription;
+import org.eclipse.basyx.submodel.metamodel.api.reference.IKey;
+import org.eclipse.basyx.submodel.metamodel.api.reference.IReference;
+import org.eclipse.basyx.submodel.metamodel.map.reference.Reference;
+
+/**
+ * Helper class providing methods for handling inconsistencies in regard to
+ * BaSyx and AASXPackageExplorer
+ *
+ * @author fried
+ *
+ */
+public class AASXPackageExplorerConformantHelper {
+ /**
+ * Converts meta model elements so that the AASXPackageExplorer can load their
+ * serialized AASX
+ *
+ * @param aasList
+ * @param assetList
+ * @param conceptDescriptionList
+ * @param submodelList
+ * @return
+ */
+ public static AasEnv adapt(Collection<IAssetAdministrationShell> aasList, Collection<IAsset> assetList,
+ Collection<IConceptDescription> conceptDescriptionList, Collection<ISubmodel> submodelList) {
+
+ Collection<IAssetAdministrationShell> convertedAASs = aasList.stream()
+ .map(AASXPackageExplorerConformantHelper::removeFirstKeyFromSubmodelReferences)
+ .collect(Collectors.toList());
+
+ return new AasEnv(convertedAASs, assetList, conceptDescriptionList, submodelList);
+ }
+
+ /**
+ * Converts meta model elements so that the AASXPackageExplorer can load their
+ * serialized AASX
+ *
+ * @param env
+ * @return
+ */
+ public static AasEnv adapt(AasEnv env) {
+ return adapt(env.getAssetAdministrationShells(), env.getAssets(), env.getConceptDescriptions(),
+ env.getSubmodels());
+ }
+
+ private static IAssetAdministrationShell removeFirstKeyFromSubmodelReferences(IAssetAdministrationShell shell) {
+ Collection<IReference> convertedReferences = shell.getSubmodelReferences().stream()
+ .map(AASXPackageExplorerConformantHelper::removeFirstKeyElement).collect(Collectors.toList());
+
+ ((AssetAdministrationShell) shell).setSubmodelReferences(convertedReferences);
+
+ return shell;
+ }
+
+ private static IReference removeFirstKeyElement(IReference reference) {
+ List<IKey> keys = reference.getKeys();
+ keys.remove(0);
+
+ IReference ref = new Reference(keys);
+ return ref;
+ }
+
+}
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/metamodel/map/AasEnv.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/metamodel/map/AasEnv.java
index 3cf7b51..f865d26 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/metamodel/map/AasEnv.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/aas/metamodel/map/AasEnv.java
@@ -46,6 +46,14 @@
putAll(new ModelType(MODELTYPE));
}
+ public AasEnv(Collection<IAssetAdministrationShell> aasList, Collection<IAsset> assetList,
+ Collection<IConceptDescription> conceptDescriptionList, Collection<ISubmodel> submodelList) {
+ setAssetAdministrationShells(aasList);
+ setAssets(assetList);
+ setConceptDescriptions(conceptDescriptionList);
+ setSubmodels(submodelList);
+ }
+
/**
* Creates a AssetAdministrationShell object from a map
*
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/AASXPackageExplorerConformantHelperTest.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/AASXPackageExplorerConformantHelperTest.java
new file mode 100644
index 0000000..f5d8910
--- /dev/null
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/AASXPackageExplorerConformantHelperTest.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+* Copyright (C) 2021 the Eclipse BaSyx Authors
+*
+* This program and the accompanying materials are made
+* available under the terms of the Eclipse Public License 2.0
+* which is available at https://www.eclipse.org/legal/epl-2.0/
+*
+* SPDX-License-Identifier: EPL-2.0
+******************************************************************************/
+package org.eclipse.basyx.testsuite.regression.aas.factory.aasx;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.basyx.aas.factory.aasx.AASXPackageExplorerConformantHelper;
+import org.eclipse.basyx.aas.metamodel.api.IAssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.api.parts.asset.AssetKind;
+import org.eclipse.basyx.aas.metamodel.map.AasEnv;
+import org.eclipse.basyx.aas.metamodel.map.AssetAdministrationShell;
+import org.eclipse.basyx.aas.metamodel.map.descriptor.CustomId;
+import org.eclipse.basyx.aas.metamodel.map.parts.Asset;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
+import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
+import org.eclipse.basyx.submodel.metamodel.api.reference.IKey;
+import org.eclipse.basyx.submodel.metamodel.api.reference.IReference;
+import org.eclipse.basyx.submodel.metamodel.api.reference.enums.KeyElements;
+import org.eclipse.basyx.submodel.metamodel.map.reference.Key;
+import org.eclipse.basyx.submodel.metamodel.map.reference.Reference;
+import org.junit.Test;
+
+/**
+ *
+ * @author fried
+ *
+ */
+public class AASXPackageExplorerConformantHelperTest {
+ @Test
+ public void testRemoveAASRefInSubmodelRef() {
+ Key submodelKey = createDummySubmodelKey();
+ AssetAdministrationShell testAAS = createAASWithSingleSubmodelReferenceContainingAASKey(submodelKey);
+
+ AasEnv env = AASXPackageExplorerConformantHelper.adapt(Collections.singleton(testAAS), Collections.emptyList(),
+ Collections.emptyList(), Collections.emptyList());
+
+ assertAASKeyRemovedFromSubmodelReferences(submodelKey, env);
+ }
+
+ private Key createDummySubmodelKey() {
+ return new Key(KeyElements.SUBMODEL, false, "testSubmodel", IdentifierType.CUSTOM);
+ }
+
+ private void assertAASKeyRemovedFromSubmodelReferences(Key submodelKey, AasEnv env) {
+ Collection<IAssetAdministrationShell> convertedAASs = env.getAssetAdministrationShells();
+ assertEquals(1, convertedAASs.size());
+
+ IAssetAdministrationShell convertedAAS = convertedAASs.iterator().next();
+ Collection<IReference> convertedReferences = convertedAAS.getSubmodelReferences();
+ assertEquals(1, convertedReferences.size());
+
+ Reference expected = new Reference(submodelKey);
+ assertEquals(expected, convertedReferences.iterator().next());
+ }
+
+ private AssetAdministrationShell createAASWithSingleSubmodelReferenceContainingAASKey(Key submodelKey) {
+ AssetAdministrationShell testAAS = createDummyAAS("testAAS");
+
+ Reference submodelReference = createSubmodelReference(testAAS, submodelKey);
+
+ testAAS.addSubmodelReference(submodelReference);
+ return testAAS;
+ }
+
+ private Reference createSubmodelReference(IAssetAdministrationShell aas, Key submodelKey) {
+ Key aasKey = createDummyAASKey(aas);
+
+ List<IKey> keys = Arrays.asList(aasKey, submodelKey);
+
+ return new Reference(keys);
+ }
+
+ private AssetAdministrationShell createDummyAAS(final String aasId) {
+ return new AssetAdministrationShell("testAASIdShort", new CustomId(aasId),
+ new Asset("testAssetIdShort", new CustomId("testAsset"), AssetKind.INSTANCE));
+ }
+
+ private Key createDummyAASKey(IAssetAdministrationShell aas) {
+ IIdentifier identifier = aas.getIdentification();
+ return new Key(KeyElements.ASSETADMINISTRATIONSHELL, false, identifier.getId(), identifier.getIdType());
+ }
+}