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());
+	}
+}