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"));