xml: bug 527644 Fix tooltip for XY viewer

This assigns a unique name to each series, so the name can be shown and
recognized in the tooltip.

Change-Id: I8c37dd71a85cbb530bd5dcab92950e241bc12197
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/112127
Reviewed-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
Tested-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
Reviewed-by: Hudson CI
(cherry picked from commit 75ebfbbc3d00bdea968fbab6ce87209bc50b3efd)
Reviewed-on: https://git.eclipse.org/r/112921
diff --git a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/module/XmlXYDataProvider.java b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/module/XmlXYDataProvider.java
index 9842df6..ac2352a 100644
--- a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/module/XmlXYDataProvider.java
+++ b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/module/XmlXYDataProvider.java
@@ -85,6 +85,7 @@
      * reused per every quark, and finds the quarks to query for the XY models.
      */
     private final BiMap<Long, Integer> fIdToQuark = HashBiMap.create();
+    private final BiMap<Integer, String> fQuarkToString = HashBiMap.create();
     private final long fTraceId = ENTRY_IDS.getAndIncrement();
     private @Nullable TmfModelResponse<List<TmfTreeDataModel>> fCached;
 
@@ -257,7 +258,7 @@
 
         ImmutableMap.Builder<String, IYModel> ySeries = ImmutableMap.builder();
         for (Entry<Integer, double[]> tempEntry : map.entrySet()) {
-            String name = String.valueOf(fIdToQuark.inverse().get(tempEntry.getKey()));
+            String name = String.valueOf(fQuarkToString.get(tempEntry.getKey()));
             ySeries.put(name, new YModel(name, tempEntry.getValue()));
         }
 
@@ -361,13 +362,11 @@
                 }
             }
             if (!seriesName.isEmpty()) {
+                String tempSeriesName = seriesName;
+                String uniqueName = fQuarkToString.computeIfAbsent(quark, q -> getUniqueNameFor(tempSeriesName));
                 // Check if an ID has already been created for this quark.
-                Long id = fIdToQuark.inverse().get(quark);
-                if (id == null) {
-                    id = ENTRY_IDS.getAndIncrement();
-                    fIdToQuark.put(id, quark);
-                }
-                builder.add(new TmfTreeDataModel(id, fTraceId, seriesName));
+                Long id = fIdToQuark.inverse().computeIfAbsent(quark, q -> ENTRY_IDS.getAndIncrement());
+                builder.add(new TmfTreeDataModel(id, fTraceId, uniqueName));
             }
         }
 
@@ -380,6 +379,18 @@
         return new TmfModelResponse<>(list, ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING);
     }
 
+    private String getUniqueNameFor(String seriesName) {
+        Integer quark = fQuarkToString.inverse().get(seriesName);
+        int index = 1;
+        String newName = seriesName;
+        while (quark != null) {
+            newName = seriesName + '(' + index + ')';
+            quark = fQuarkToString.inverse().get(newName);
+            index++;
+        }
+        return newName;
+    }
+
     /**
      * @since 2.4
      */
diff --git a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlTreeViewer.java b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlTreeViewer.java
index 0e3aa0f..5ea053c 100644
--- a/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlTreeViewer.java
+++ b/tmf/org.eclipse.tracecompass.tmf.analysis.xml.ui/src/org/eclipse/tracecompass/internal/tmf/analysis/xml/ui/views/xychart/XmlTreeViewer.java
@@ -46,7 +46,7 @@
                     // do not show the legend for the trace entries.
                     return null;
                 }
-                return getLegendImage(Long.toString(genericEntry.getModel().getId()));
+                return getLegendImage(String.valueOf(genericEntry.getModel().getName()));
             }
             return null;
         }