trace-server: Support XML analysis in available data providers

Change-Id: I9553db5f95825aa3e5a7567f6c25368ca5f1364e
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/158541
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
index ea8307c..0126fd6 100644
--- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
+++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/DataProviderService.java
@@ -11,6 +11,7 @@
 
 package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -45,10 +46,14 @@
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlUtils.OutputType;
 import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.output.XmlDataProviderManager;
+import org.eclipse.tracecompass.internal.tmf.core.model.DataProviderDescriptor;
 import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlUtils;
+import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
+import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager;
 import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor;
+import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType;
 import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage;
 import org.eclipse.tracecompass.tmf.core.model.IOutputStyleProvider;
 import org.eclipse.tracecompass.tmf.core.model.OutputStyleModel;
@@ -100,6 +105,8 @@
             return Response.status(Status.NOT_FOUND).build();
         }
         List<IDataProviderDescriptor> list = DataProviderManager.getInstance().getAvailableProviders(trace);
+        list.addAll(getXmlDataProviderDescriptors(trace, EnumSet.of(OutputType.TIME_GRAPH)));
+        list.addAll(getXmlDataProviderDescriptors(trace, EnumSet.of(OutputType.XY)));
 
         return Response.ok(list).build();
     }
@@ -466,6 +473,39 @@
         return null;
     }
 
+    private static @NonNull List<IDataProviderDescriptor> getXmlDataProviderDescriptors(@NonNull ITmfTrace trace, EnumSet<OutputType> types) {
+        /*
+         *  TODO: find a better way to create the data provider descriptors.
+         *  This should be part of the XmlDataProviderManager.
+         */
+        List<IDataProviderDescriptor> descriptors = new ArrayList<>();
+        Map<String, IAnalysisModuleHelper> modules = TmfAnalysisManager.getAnalysisModules(trace.getClass());
+        for (OutputType viewType : types) {
+            for (XmlOutputElement element : Iterables.filter(XmlUtils.getXmlOutputElements().values(), element -> element.getXmlElem().equals(viewType.getXmlElem()))) {
+                DataProviderDescriptor.Builder builder = new DataProviderDescriptor.Builder();
+                String label = String.valueOf(element.getLabel());
+                String elemId = element.getId();
+                if (elemId == null) {
+                    // Ignore element
+                    continue;
+                }
+                builder.setId(elemId).setName(label).setDescription(label);
+                if (viewType == OutputType.XY) {
+                    builder.setProviderType(ProviderType.TREE_TIME_XY);
+                } else if (viewType == OutputType.TIME_GRAPH) {
+                    builder.setProviderType(ProviderType.TIME_GRAPH);
+                }
+                for (String id : element.getAnalyses()) {
+                    if (modules.containsKey(id)) {
+                        descriptors.add(builder.build());
+                        break;
+                    }
+                }
+            }
+        }
+        return descriptors;
+    }
+
     private Response getTree(UUID uuid, String outputId, QueryParameters queryParameters) {
         if (outputId == null) {
             return Response.status(Status.PRECONDITION_FAILED).entity(MISSING_OUTPUTID).build();