553369 - ATFX Import fails if multiple version of a Quantity exist

Signed-off-by: Matthias Koller <m.koller@peak-solution.de>
diff --git a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
index 2864f78..87f0bc8 100644
--- a/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
+++ b/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/control/ImportTask.java
@@ -15,6 +15,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -52,6 +53,7 @@
 import org.eclipse.mdm.api.dflt.model.TemplateRoot;
 import org.eclipse.mdm.api.dflt.model.TemplateTest;
 import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.Versionable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -621,19 +623,23 @@
 				throw new ApiCopyException("No relation to MeaResult found at MeaQuantity!");
 			}
 
-			List<Quantity> listQuantities = entityManagerDst.loadAll(Quantity.class,
-					channelSrc.getQuantity().getName());
-
-			if (listQuantities.size() != 1) {
-				throw new ApiCopyException(
-						String.format("Cannot find Quantity %s in destination!", channelSrc.getQuantity().getName()));
-			}
+			// Find a valid quantity with the highest version
+			/*
+			 * TODO Quantity should actually implement Versionable, then we could just use
+			 * org.eclipse.mdm.api.dflt.EntityManager.loadLatestValid(Class<T>, String) Bug:
+			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=553368
+			 */
+			Quantity quantity = entityManagerDst.loadAll(Quantity.class, channelSrc.getQuantity().getName()).stream()
+					.filter(q -> q.getValue(Versionable.ATTR_VERSION_STATE).extract() == VersionState.VALID)
+					.sorted(Comparator.comparing(q -> Integer.valueOf(q.getValue(Versionable.ATTR_VERSION).extract())))
+					.findFirst().orElseThrow(() -> new ApiCopyException(String
+							.format("Cannot find Quantity %s in destination!", channelSrc.getQuantity().getName())));
 
 			Filter filter = Filter.nameOnly(etChannel, channelSrc.getName()).id(relMeasurement,
 					measurementParentDst.getID());
 
-			Channel channelDst = fetchOne(searchServiceDst, Channel.class, filter).orElseGet(() -> entityFactoryDst
-					.createChannel(channelSrc.getName(), measurementParentDst, listQuantities.get(0)));
+			Channel channelDst = fetchOne(searchServiceDst, Channel.class, filter).orElseGet(
+					() -> entityFactoryDst.createChannel(channelSrc.getName(), measurementParentDst, quantity));
 
 			copyValues(channelSrc, channelDst, Arrays.asList("Id"));