diff options
author | Bernd Hufmann | 2019-06-05 14:28:17 +0000 |
---|---|---|
committer | Geneviève Bastien | 2019-06-06 02:08:19 +0000 |
commit | b914fe541f56fa884146f1566506dbd9a0412f5f (patch) | |
tree | a842ec02fab2f697681af45187ead792d0a9f732 | |
parent | fecc2baea29ed94242636c7165e5e754c3a161b1 (diff) | |
parent | 04a3681ac281092e31e202d796f583eed8d013dd (diff) | |
download | org.eclipse.tracecompass.incubator-b914fe541f56fa884146f1566506dbd9a0412f5f.tar.gz org.eclipse.tracecompass.incubator-b914fe541f56fa884146f1566506dbd9a0412f5f.tar.xz org.eclipse.tracecompass.incubator-b914fe541f56fa884146f1566506dbd9a0412f5f.zip |
Merge branch 'trace-server' into master
Update with current Trace Compass API:
* filter predicates as Multimap<String, Object> instead of
Multimap<String, String>)
* Update scripting data provider
Change-Id: Ie94252c21ee3530bd0b6dac559c949e5a487de84
Signed-off-by: Bernd Hufmann <Bernd.Hufmann@ericsson.com>
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
49 files changed, 1758 insertions, 570 deletions
diff --git a/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java b/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java index d2cf6e14a..1904e4467 100644 --- a/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java +++ b/analyses/org.eclipse.tracecompass.incubator.kernel.core/src/org/eclipse/tracecompass/incubator/internal/kernel/core/fileaccess/FileAccessDataProvider.java @@ -20,9 +20,9 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Set; -import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -37,12 +37,13 @@ import org.eclipse.tracecompass.incubator.internal.kernel.core.fileaccess.FileEn import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.FileDescriptorStateProvider; import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.ThreadEntryModel; import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.TidTimeQueryFilter; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -50,14 +51,16 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.common.collect.TreeMultimap; @@ -97,8 +100,15 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Override + public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -108,7 +118,11 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu } @Override - protected @Nullable List<ITimeGraphRowModel> getRowModel(ITmfStateSystem ss, SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); @@ -116,19 +130,19 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu /* Do the actual query */ for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -162,7 +176,7 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -170,9 +184,20 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu return false; } + @Deprecated @Override public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public TmfModelResponse<Map<String, String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { ITmfStateSystem ss = getAnalysisModule().getStateSystem(); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } Collection<@NonNull Integer> quarks = getSelectedEntries(filter).values(); Map<String, String> retMap = new LinkedHashMap<>(); @@ -183,8 +208,8 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu long start = filter.getStart(); if (ss == null || quarks.size() != 1 || !getAnalysisModule().isQueryable(start)) { /* - * We need the ss to query, we should only be querying one attribute and the - * query times should be valid. + * We need the ss to query, we should only be querying one attribute + * and the query times should be valid. */ return new TmfModelResponse<>(retMap, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -198,7 +223,8 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu } int parentQuark = ss.getParentAttributeQuark(quark); if (parentQuark == resQuark) { - // This is a file name, add the number of opened fd and full file name + // This is a file name, add the number of opened fd and full + // file name String fileName = ss.getAttributeName(quark); retMap.put("File Name", fileName); //$NON-NLS-1$ Object value = current.getValue(); @@ -230,8 +256,10 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu @Override - protected List<TimeGraphEntryModel> getTree(ITmfStateSystem ss, TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected TmfTreeModel<TimeGraphEntryModel> getTree(ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Collection<Integer> selectedTids = Collections.emptySet(); + // TODO Why not SelectionTimeQueryFilter ? + TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(parameters); if (filter instanceof TidTimeQueryFilter) { selectedTids = ((TidTimeQueryFilter) filter).getTids(); } @@ -245,7 +273,7 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu Activator.getInstance().logError(e.getMessage(), e); } - return builder.build(); + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addResources(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId, Collection<Integer> filter) { @@ -368,8 +396,8 @@ public class FileAccessDataProvider extends AbstractTimeGraphDataProvider<@NonNu } @Override - public @NonNull Multimap<@NonNull String, @NonNull String> getFilterData(long entryId, long time, @Nullable IProgressMonitor monitor) { - Multimap<@NonNull String, @NonNull String> data = HashMultimap.create(); + public @NonNull Multimap<@NonNull String, @NonNull Object> getFilterData(long entryId, long time, @Nullable IProgressMonitor monitor) { + Multimap<@NonNull String, @NonNull Object> data = HashMultimap.create(); data.putAll(super.getFilterData(entryId, time, monitor)); SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(Collections.singletonList(time), Collections.singleton(Objects.requireNonNull(entryId))); diff --git a/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java b/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java index 26e9034c9..2f20a373c 100644 --- a/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java +++ b/analyses/org.eclipse.tracecompass.incubator.kernel.ui/src/org/eclipse/tracecompass/incubator/internal/kernel/ui/views/fileaccess/FileAccessByFileView.java @@ -42,6 +42,7 @@ import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.Th import org.eclipse.tracecompass.incubator.internal.kernel.core.filedescriptor.TidTimeQueryFilter; import org.eclipse.tracecompass.incubator.internal.kernel.ui.Activator; import org.eclipse.tracecompass.internal.analysis.os.linux.ui.actions.FollowThreadAction; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -244,7 +245,8 @@ public class FileAccessByFileView extends BaseDataProviderTimeGraphView { TimeGraphEntry entry = (TimeGraphEntry) event.getEntry(); ITimeGraphDataProvider<? extends TimeGraphEntryModel> dataProvider = BaseDataProviderTimeGraphView.getProvider(entry); TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = dataProvider.fetchTooltip( - new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId())), null); + FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId()))), + null); Map<@NonNull String, @NonNull String> map = response.getModel(); if (map != null) { retMap.putAll(map); diff --git a/analyses/org.eclipse.tracecompass.incubator.scripting.core.tests/testfiles/scripts/dpWithArrow.js b/analyses/org.eclipse.tracecompass.incubator.scripting.core.tests/testfiles/scripts/dpWithArrow.js index f0138a105..1429ef369 100644 --- a/analyses/org.eclipse.tracecompass.incubator.scripting.core.tests/testfiles/scripts/dpWithArrow.js +++ b/analyses/org.eclipse.tracecompass.incubator.scripting.core.tests/testfiles/scripts/dpWithArrow.js @@ -177,13 +177,13 @@ function prepareTimeGraph() { prepareTimeGraph(); // A function used to return the entries to the data provider. It receives the filter in parameter, which contains the requested time range and any additional information -function getEntries(filter) { +function getEntries(parameters) { // The list is static once built, return all entries return tgEntries.getList(); } // A function used to return the arrows to the data provider. It receives the filter in parameter, which contains the requested time range and any additional information -function getArrows(filter) { +function getArrows(parameters) { // Just return all the arrows, the view will take those in the range return tgArrows.getList(); } diff --git a/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/provisional/scripting/core/data/provider/DataProviderScriptingModule.java b/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/provisional/scripting/core/data/provider/DataProviderScriptingModule.java index 5960ce167..cbba9e445 100644 --- a/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/provisional/scripting/core/data/provider/DataProviderScriptingModule.java +++ b/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/provisional/scripting/core/data/provider/DataProviderScriptingModule.java @@ -28,7 +28,6 @@ import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.output.DataDriven import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder; import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue; -import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; @@ -192,9 +191,9 @@ public class DataProviderScriptingModule { */ @WrapToScript public ITimeGraphDataProvider<ITimeGraphEntryModel> createScriptedTimeGraphProvider(ScriptedAnalysis analysis, - Function<TimeQueryFilter, @Nullable List<ITimeGraphEntryModel>> entryMethod, - @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphRowModel>> rowModelMethod, - @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphArrow>> arrowMethod) { + Function<Map<String, Object> , @Nullable List<ITimeGraphEntryModel>> entryMethod, + @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphRowModel>> rowModelMethod, + @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphArrow>> arrowMethod) { ITimeGraphDataProvider<ITimeGraphEntryModel> provider = new ScriptedTimeGraphDataProvider(analysis, entryMethod, rowModelMethod, arrowMethod); ScriptingDataProviderManager.getInstance().registerDataProvider(analysis.getTrace(), provider); return provider; diff --git a/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/scripting/core/data/provider/ScriptedTimeGraphDataProvider.java b/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/scripting/core/data/provider/ScriptedTimeGraphDataProvider.java index d7bba7039..cac48fa7c 100644 --- a/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/scripting/core/data/provider/ScriptedTimeGraphDataProvider.java +++ b/analyses/org.eclipse.tracecompass.incubator.scripting.core/src/org/eclipse/tracecompass/incubator/internal/scripting/core/data/provider/ScriptedTimeGraphDataProvider.java @@ -10,6 +10,7 @@ package org.eclipse.tracecompass.incubator.internal.scripting.core.data.provider; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -26,11 +27,12 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.provisional.scripting.core.analysis.ScriptedAnalysis; import org.eclipse.tracecompass.internal.tmf.core.model.AbstractTmfTraceDataProvider; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -39,8 +41,10 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; @@ -66,9 +70,9 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider private final Map<Long, Integer> fIDToDisplayQuark = new HashMap<>(); private final String fId; - private final Function<TimeQueryFilter, @Nullable List<ITimeGraphEntryModel>> fEntryMethod; - private final @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphArrow>> fArrowMethod; - private final @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphRowModel>> fRowModelMethod; + private final Function<Map<String, Object>, @Nullable List<ITimeGraphEntryModel>> fEntryMethod; + private final @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphArrow>> fArrowMethod; + private final @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphRowModel>> fRowModelMethod; /** * Constructor @@ -83,9 +87,9 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider * The method to get the arrows */ public ScriptedTimeGraphDataProvider(ScriptedAnalysis analysis, - Function<TimeQueryFilter, @Nullable List<ITimeGraphEntryModel>> entryMethod, - @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphRowModel>> rowModelMethod, - @Nullable Function<TimeQueryFilter, @Nullable List<ITimeGraphArrow>> arrowMethod) { + Function<Map<String, Object>, @Nullable List<ITimeGraphEntryModel>> entryMethod, + @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphRowModel>> rowModelMethod, + @Nullable Function<Map<String, Object>, @Nullable List<ITimeGraphArrow>> arrowMethod) { super(analysis.getTrace()); fSs = Objects.requireNonNull(analysis.getStateSystem(true)); fEntryMethod = entryMethod; @@ -95,10 +99,10 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider } @Override - public TmfModelResponse<@NonNull List<ITimeGraphEntryModel>> fetchTree(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public TmfModelResponse<TmfTreeModel<ITimeGraphEntryModel>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { boolean isComplete = fSs.waitUntilBuilt(0); - List<ITimeGraphEntryModel> entryList = fEntryMethod.apply(filter); + List<ITimeGraphEntryModel> entryList = fEntryMethod.apply(fetchParameters); if (entryList == null) { entryList = Collections.emptyList(); } @@ -109,7 +113,7 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider } Status status = isComplete ? Status.COMPLETED : Status.RUNNING; String msg = isComplete ? CommonStatusMessage.COMPLETED : CommonStatusMessage.RUNNING; - return new TmfModelResponse<>(entryList, status, msg); + return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), entryList), status, msg); } @Override @@ -118,36 +122,41 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider } @Override - public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> fetchRowModel(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - Function<TimeQueryFilter, @Nullable List<ITimeGraphRowModel>> rowModelMethod = fRowModelMethod; + public @NonNull TmfModelResponse<TimeGraphModel> fetchRowModel(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { + Function<Map<String, Object>, @Nullable List<ITimeGraphRowModel>> rowModelMethod = fRowModelMethod; try { - List<@NonNull ITimeGraphRowModel> rowModels = (rowModelMethod != null) ? rowModelMethod.apply(filter) : getDefaultRowModels(filter, monitor); + List<@NonNull ITimeGraphRowModel> rowModels = (rowModelMethod != null) ? rowModelMethod.apply(fetchParameters) : getDefaultRowModels(fetchParameters, monitor); if (rowModels == null) { rowModels = Collections.emptyList(); } - return new TmfModelResponse<>(rowModels, Status.COMPLETED, CommonStatusMessage.COMPLETED); + return new TmfModelResponse<>(new TimeGraphModel(rowModels), Status.COMPLETED, CommonStatusMessage.COMPLETED); } catch (IndexOutOfBoundsException | TimeRangeException | StateSystemDisposedException e) { return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.STATE_SYSTEM_FAILED); } } - private @Nullable List<ITimeGraphRowModel> getDefaultRowModels(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws IndexOutOfBoundsException, TimeRangeException, StateSystemDisposedException { + private @Nullable List<ITimeGraphRowModel> getDefaultRowModels(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) throws IndexOutOfBoundsException, TimeRangeException, StateSystemDisposedException { Map<Integer, ITimeGraphRowModel> quarkToRow = new HashMap<>(); // Get the quarks to display - for (Long id : filter.getSelectedItems()) { + Collection<Long> selectedItems = DataProviderParameterUtils.extractSelectedItems(fetchParameters); + if (selectedItems == null) { + // No selected items, take them all + selectedItems = fIDToDisplayQuark.keySet(); + } + for (Long id : selectedItems) { Integer quark = fIDToDisplayQuark.get(id); if (quark != null) { quarkToRow.put(quark, new TimeGraphRowModel(id, new ArrayList<>())); } } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(fetchParameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } long currentEndTime = fSs.getCurrentEndTime(); - for (ITmfStateInterval interval : fSs.query2D(quarkToRow.keySet(), getTimes(fSs, filter.getTimesRequested()))) { + for (ITmfStateInterval interval : fSs.query2D(quarkToRow.keySet(), getTimes(fSs, DataProviderParameterUtils.extractTimeRequested(fetchParameters)))) { if (monitor != null && monitor.isCanceled()) { return Collections.emptyList(); } @@ -182,9 +191,12 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider return new TimeGraphState(time, duration, Integer.MIN_VALUE); } - private static Set<Long> getTimes(ITmfStateSystem key, long[] timesRequested) { + private static Set<Long> getTimes(ITmfStateSystem key, @Nullable List<Long> list) { + if (list == null) { + return Collections.emptySet(); + } Set<@NonNull Long> times = new HashSet<>(); - for (long t : timesRequested) { + for (long t : list) { if (key.getStartTime() <= t && t <= key.getCurrentEndTime()) { times.add(t); } @@ -193,12 +205,12 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider } @Override - public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - Function<TimeQueryFilter, @Nullable List<ITimeGraphArrow>> arrowMethod = fArrowMethod; + public @NonNull TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { + Function<Map<String, Object>, @Nullable List<ITimeGraphArrow>> arrowMethod = fArrowMethod; if (arrowMethod == null) { return new TmfModelResponse<>(null, Status.COMPLETED, CommonStatusMessage.COMPLETED); } - List<ITimeGraphArrow> arrows = arrowMethod.apply(filter); + List<ITimeGraphArrow> arrows = arrowMethod.apply(fetchParameters); boolean completed = fSs.waitUntilBuilt(0); Status status = completed ? Status.COMPLETED : Status.RUNNING; String msg = completed ? CommonStatusMessage.COMPLETED : CommonStatusMessage.RUNNING; @@ -206,8 +218,40 @@ public class ScriptedTimeGraphDataProvider extends AbstractTmfTraceDataProvider } @Override - public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public @NonNull TmfModelResponse<Map<String, String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, Status.COMPLETED, CommonStatusMessage.COMPLETED); } + @Deprecated + @Override + public TmfModelResponse<List<ITimeGraphEntryModel>> fetchTree(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + TmfModelResponse<TmfTreeModel<ITimeGraphEntryModel>> modelResponse = fetchTree(parameters, monitor); + TmfTreeModel<ITimeGraphEntryModel> model = modelResponse.getModel(); + return new TmfModelResponse<>(model == null ? null : model.getEntries(), modelResponse.getStatus(), modelResponse.getStatusMessage()); + } + + @Deprecated + @Override + public TmfModelResponse<List<ITimeGraphRowModel>> fetchRowModel(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + TmfModelResponse<TimeGraphModel> modelResponse = fetchRowModel(parameters, monitor); + TimeGraphModel model = modelResponse.getModel(); + return new TmfModelResponse<>(model == null ? null : model.getRows(), modelResponse.getStatus(), modelResponse.getStatusMessage()); + } + + @Deprecated + @Override + public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Deprecated + @Override + public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + } diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java index 5b010b8a0..1dd236709 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core.tests/src/org/eclipse/tracecompass/incubator/callstack/core/tests/flamechart/FlameChartDataProviderTest.java @@ -32,11 +32,14 @@ import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.p import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartDataProviderFactory; import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel; import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.junit.Test; @@ -71,19 +74,20 @@ public class FlameChartDataProviderTest extends CallStackTestBase { public void testFetchTree() { FlameChartDataProvider dataProvider = getDataProvider(); - TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor()); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor()); assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED)); // Test the size of the tree - List<FlameChartEntryModel> model = responseTree.getModel(); + TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel(); assertNotNull(model); - assertEquals(18, model.size()); + List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries(); + assertEquals(18, modelEntries.size()); String traceName = getTrace().getName(); // Test the hierarchy of the tree - for (FlameChartEntryModel entry : model) { - FlameChartEntryModel parent = findEntryById(model, entry.getParentId()); + for (FlameChartEntryModel entry : modelEntries) { + FlameChartEntryModel parent = findEntryById(modelEntries, entry.getParentId()); switch (entry.getEntryType()) { case FUNCTION: assertNotNull(parent); @@ -161,63 +165,65 @@ public class FlameChartDataProviderTest extends CallStackTestBase { public void testFetchModel() { FlameChartDataProvider dataProvider = getDataProvider(); - TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor()); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor()); assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED)); - List<FlameChartEntryModel> model = responseTree.getModel(); - + TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel(); + assertNotNull(model); + List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries(); // Find the entries corresponding to threads 3 and 6 (along with pid 5) Set<@NonNull Long> selectedIds = new HashSet<>(); // Thread 3 - FlameChartEntryModel tid3 = findEntryByNameAndType(model, "3", EntryType.LEVEL); + FlameChartEntryModel tid3 = findEntryByNameAndType(modelEntries, "3", EntryType.LEVEL); assertNotNull(tid3); selectedIds.add(tid3.getId()); - List<FlameChartEntryModel> tid3Children = findEntriesByParent(model, tid3.getId()); + List<FlameChartEntryModel> tid3Children = findEntriesByParent(modelEntries, tid3.getId()); assertEquals(2, tid3Children.size()); tid3Children.forEach(child -> selectedIds.add(child.getId())); // Pid 5 - FlameChartEntryModel pid5 = findEntryByNameAndType(model, "5", EntryType.LEVEL); + FlameChartEntryModel pid5 = findEntryByNameAndType(modelEntries, "5", EntryType.LEVEL); assertNotNull(pid5); selectedIds.add(pid5.getId()); // Thread 6 - FlameChartEntryModel tid6 = findEntryByNameAndType(model, "6", EntryType.LEVEL); + FlameChartEntryModel tid6 = findEntryByNameAndType(modelEntries, "6", EntryType.LEVEL); assertNotNull(tid6); selectedIds.add(tid6.getId()); - List<FlameChartEntryModel> tid6Children = findEntriesByParent(model, tid6.getId()); + List<FlameChartEntryModel> tid6Children = findEntriesByParent(modelEntries, tid6.getId()); assertEquals(3, tid6Children.size()); tid6Children.forEach(child -> selectedIds.add(child.getId())); // Get the row model for those entries with high resolution - TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(3, 15, 50, selectedIds), new NullProgressMonitor()); - assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus()); + TmfModelResponse<@NonNull TimeGraphModel> rowResponse = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(3, 15, 50, selectedIds)), new NullProgressMonitor()); + assertEquals(ITmfResponse.Status.COMPLETED, rowResponse.getStatus()); - List<ITimeGraphRowModel> rowModels = rowModel.getModel(); - assertNotNull(rowModels); - assertEquals(8, rowModels.size()); + TimeGraphModel rowModel = rowResponse.getModel(); + assertNotNull(rowModel); + List<@NonNull ITimeGraphRowModel> rows = rowModel.getRows(); + assertEquals(8, rows.size()); // Verify the level entries - verifyStates(rowModels, tid3, Collections.emptyList()); - verifyStates(rowModels, pid5, Collections.emptyList()); - verifyStates(rowModels, tid6, Collections.emptyList()); + verifyStates(rows, tid3, Collections.emptyList()); + verifyStates(rows, pid5, Collections.emptyList()); + verifyStates(rows, tid6, Collections.emptyList()); // Verify function level 1 of tid 3 - verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2"))); + verifyStates(rows, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2"))); // Verify function level 2 of tid 3 - verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(1, 4, Integer.MIN_VALUE), new TimeGraphState(5, 1, Integer.MIN_VALUE, "op3"), new TimeGraphState(6, 1, Integer.MIN_VALUE), new TimeGraphState(7, 6, Integer.MIN_VALUE, "op2"), new TimeGraphState(13, 8, Integer.MIN_VALUE))); // Verify function level 1 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1"))); + verifyStates(rows, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1"))); // Verify function level 2 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(2, 5, Integer.MIN_VALUE, "op3"), new TimeGraphState(7, 1, Integer.MIN_VALUE), new TimeGraphState(8, 3, Integer.MIN_VALUE, "op2"), new TimeGraphState(11, 1, Integer.MIN_VALUE), new TimeGraphState(12, 8, Integer.MIN_VALUE, "op4"))); // Verify function level 3 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(1, 3, Integer.MIN_VALUE), new TimeGraphState(4, 2, Integer.MIN_VALUE, "op1"), new TimeGraphState(6, 3, Integer.MIN_VALUE), @@ -225,31 +231,32 @@ public class FlameChartDataProviderTest extends CallStackTestBase { new TimeGraphState(10, 11, Integer.MIN_VALUE))); // Get the row model for those entries with low resolution - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(3, 15, 2, selectedIds), new NullProgressMonitor()); - assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus()); + rowResponse = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(3, 15, 2, selectedIds)), new NullProgressMonitor()); + assertEquals(ITmfResponse.Status.COMPLETED, rowResponse.getStatus()); - rowModels = rowModel.getModel(); - assertNotNull(rowModels); - assertEquals(8, rowModels.size()); + rowModel = rowResponse.getModel(); + assertNotNull(rowModel); + rows = rowModel.getRows(); + assertEquals(8, rows.size()); // Verify the level entries - verifyStates(rowModels, tid3, Collections.emptyList()); - verifyStates(rowModels, pid5, Collections.emptyList()); - verifyStates(rowModels, tid6, Collections.emptyList()); + verifyStates(rows, tid3, Collections.emptyList()); + verifyStates(rows, pid5, Collections.emptyList()); + verifyStates(rows, tid6, Collections.emptyList()); // Verify function level 1 of tid 3 - verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2"))); + verifyStates(rows, findEntryByDepthAndType(tid3Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(3, 17, Integer.MIN_VALUE, "op2"))); // Verify function level 2 of tid 3 - verifyStates(rowModels, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid3Children, 2, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(1, 4, Integer.MIN_VALUE), new TimeGraphState(13, 8, Integer.MIN_VALUE))); // Verify function level 1 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1"))); + verifyStates(rows, findEntryByDepthAndType(tid6Children, 1, EntryType.FUNCTION), ImmutableList.of(new TimeGraphState(1, 19, Integer.MIN_VALUE, "op1"))); // Verify function level 2 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid6Children, 2, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(2, 5, Integer.MIN_VALUE, "op3"), new TimeGraphState(12, 8, Integer.MIN_VALUE, "op4"))); // Verify function level 3 of tid 6 - verifyStates(rowModels, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of( + verifyStates(rows, findEntryByDepthAndType(tid6Children, 3, EntryType.FUNCTION), ImmutableList.of( new TimeGraphState(1, 3, Integer.MIN_VALUE), new TimeGraphState(10, 11, Integer.MIN_VALUE))); } @@ -261,68 +268,71 @@ public class FlameChartDataProviderTest extends CallStackTestBase { public void testFollowEvents() { FlameChartDataProvider dataProvider = getDataProvider(); - TmfModelResponse<List<FlameChartEntryModel>> responseTree = dataProvider.fetchTree(new TimeQueryFilter(0, Long.MAX_VALUE, 2), new NullProgressMonitor()); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> responseTree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0, Long.MAX_VALUE, 2)), new NullProgressMonitor()); assertTrue(responseTree.getStatus().equals(ITmfResponse.Status.COMPLETED)); - List<FlameChartEntryModel> model = responseTree.getModel(); + TmfTreeModel<@NonNull FlameChartEntryModel> model = responseTree.getModel(); + assertNotNull(model); + List<@NonNull FlameChartEntryModel> modelEntries = model.getEntries(); // Thread 2 - FlameChartEntryModel tid2 = findEntryByNameAndType(model, "2", EntryType.LEVEL); + FlameChartEntryModel tid2 = findEntryByNameAndType(modelEntries, "2", EntryType.LEVEL); assertNotNull(tid2); - List<FlameChartEntryModel> tid2Children = findEntriesByParent(model, tid2.getId()); + List<FlameChartEntryModel> tid2Children = findEntriesByParent(modelEntries, tid2.getId()); assertEquals(3, tid2Children.size()); // For each child, make sure the response is always the same for (FlameChartEntryModel tid2Child : tid2Children) { - TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(6, Long.MAX_VALUE, 2, Collections.singleton(tid2Child.getId())), MONITOR); + TmfModelResponse<@NonNull TimeGraphModel> rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(6, Long.MAX_VALUE, 2, Collections.singleton(tid2Child.getId()))), MONITOR); verifyFollowResponse(rowModel, 1, 7); } // Go forward from time 7 till the end for one of the child element Set<@NonNull Long> selectedEntry = Objects.requireNonNull(Collections.singleton(tid2Children.get(1).getId())); - TmfModelResponse<List<ITimeGraphRowModel>> rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(7, Long.MAX_VALUE, 2, selectedEntry), MONITOR); + TmfModelResponse<@NonNull TimeGraphModel> rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(7, Long.MAX_VALUE, 2, selectedEntry)), MONITOR); verifyFollowResponse(rowModel, 0, 10); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(10, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(10, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 1, 12); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(12, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(12, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 0, 20); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(20, Long.MAX_VALUE, 2, selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(20, Long.MAX_VALUE, 2, selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, -1, -1); // Go backward from the back - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 20L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 20L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 1, 12); // Go backward from time 7 till the beginning - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 7L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 7L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 2, 5); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 5L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 5L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 3, 4); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 4L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 4L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 2, 3); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 3L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 3L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, 1, 1); - rowModel = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 1L), selectedEntry), new NullProgressMonitor()); + rowModel = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, 1L), selectedEntry)), new NullProgressMonitor()); verifyFollowResponse(rowModel, -1, -1); } - private static void verifyFollowResponse(TmfModelResponse<List<ITimeGraphRowModel>> rowModel, int expectedDepth, int expectedTime) { + private static void verifyFollowResponse(TmfModelResponse<@NonNull TimeGraphModel> rowModel, int expectedDepth, int expectedTime) { assertEquals(ITmfResponse.Status.COMPLETED, rowModel.getStatus()); - List<ITimeGraphRowModel> rowModels = rowModel.getModel(); + TimeGraphModel model = rowModel.getModel(); if (expectedDepth < 0) { - assertNull(rowModels); + assertNull(model); return; } - assertNotNull(rowModels); - assertEquals(1, rowModels.size()); - List<ITimeGraphState> row = rowModels.get(0).getStates(); + assertNotNull(model); + List<@NonNull ITimeGraphRowModel> rows = model.getRows(); + assertEquals(1, rows.size()); + List<ITimeGraphState> row = rows.get(0).getStates(); assertEquals(1, row.size()); ITimeGraphState stackInterval = row.get(0); long depth = stackInterval.getValue(); @@ -338,14 +348,15 @@ public class FlameChartDataProviderTest extends CallStackTestBase { assertNotNull(rowModel); List<ITimeGraphState> states = rowModel.getStates(); for (int i = 0; i < states.size(); i++) { + String entryName = entry.getName(); if (i > expectedStates.size() - 1) { - fail("Unexpected state at position " + i + " for entry " + entry.getName() + ": " + states.get(i)); + fail("Unexpected state at position " + i + " for entry " + entryName + ": " + states.get(i)); } ITimeGraphState actual = states.get(i); ITimeGraphState expected = expectedStates.get(i); - assertEquals("State start time at " + i + " for entry " + entry.getName(), expected.getStartTime(), actual.getStartTime()); - assertEquals("Duration at " + i + " for entry " + entry.getName(), expected.getDuration(), actual.getDuration()); - assertEquals("Label at " + i + " for entry " + entry.getName(), expected.getLabel(), actual.getLabel()); + assertEquals("State start time at " + i + " for entry " + entryName, expected.getStartTime(), actual.getStartTime()); + assertEquals("Duration at " + i + " for entry " + entryName, expected.getDuration(), actual.getDuration()); + assertEquals("Label at " + i + " for entry " + entryName, expected.getLabel(), actual.getLabel()); } } diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs b/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs index f8a2fe185..221a1f885 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/.settings/org.eclipse.jdt.core.prefs @@ -33,7 +33,7 @@ org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=error org.eclipse.jdt.core.compiler.problem.deadCode=error org.eclipse.jdt.core.compiler.problem.deprecation=error -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=error diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java index 6de9ee6d3..c5af35ad3 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartArrowProvider.java @@ -12,12 +12,14 @@ package org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented. import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.callstack.core.instrumented.statesystem.InstrumentedCallStackAnalysis; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; @@ -52,7 +54,11 @@ public class FlameChartArrowProvider { * the monitor * @return the corresponding state intervals */ - public List<ITmfStateInterval> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public List<ITmfStateInterval> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { + TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters); + if (filter == null) { + return Collections.emptyList(); + } long start = filter.getStart(); long end = filter.getEnd(); diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java index 7670fa845..a7debcafc 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartDataProvider.java @@ -47,6 +47,7 @@ import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.p import org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadEntryModel; import org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadStatusDataProvider; import org.eclipse.tracecompass.internal.tmf.core.model.AbstractTmfTraceDataProvider; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.segmentstore.core.ISegment; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException; @@ -60,8 +61,10 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphArrow; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; @@ -162,7 +165,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme public @Nullable Map<String, String> fetchTooltip(int threadId, long time, @Nullable IProgressMonitor monitor) { for (ThreadEntryModel entry : fThreadTree) { if (entry.getThreadId() == threadId && entry.getStartTime() <= time && entry.getEndTime() >= time) { - TmfModelResponse<Map<String, String>> tooltip = fThreadDataProvider.fetchTooltip(new SelectionTimeQueryFilter(Collections.singletonList(time), Collections.singleton(entry.getId())), monitor); + TmfModelResponse<Map<String, String>> tooltip = fThreadDataProvider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Collections.singletonList(time), Collections.singleton(entry.getId()))), monitor); return tooltip.getModel(); } } @@ -209,7 +212,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme private final String fAnalysisId; private final ReentrantReadWriteLock fLock = new ReentrantReadWriteLock(false); private final FlameChartArrowProvider fArrowProvider; - private @Nullable TmfModelResponse<List<FlameChartEntryModel>> fCached; + private @Nullable TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> fCached; private @Nullable ThreadData fThreadData = null; /** @@ -231,8 +234,8 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme } @Override - public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - List<ITmfStateInterval> arrows = fArrowProvider.fetchArrows(filter, monitor); + public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { + List<ITmfStateInterval> arrows = fArrowProvider.fetchArrows(fetchParameters, monitor); List<ITimeGraphArrow> tgArrows = new ArrayList<>(); // First, get the distinct callstacks fLock.readLock().lock(); @@ -290,9 +293,10 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme } @Override - public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public TmfModelResponse<Map<String, String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "FlameChartDataProvider#fetchTooltip") //$NON-NLS-1$ .setCategory(getClass().getSimpleName()).build()) { + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); Map<Long, FlameChartEntryModel> entries = getSelectedEntries(filter); if (entries.size() != 1) { // Not the expected size of tooltip, just return empty @@ -378,7 +382,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme } @Override - public TmfModelResponse<List<FlameChartEntryModel>> fetchTree(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> fetchTree(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { if (fCached != null) { return fCached; } @@ -397,7 +401,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme // Initialize the first element of the tree ImmutableList.Builder<FlameChartEntryModel> builder = ImmutableList.builder(); - FlameChartEntryModel traceEntry = new FlameChartEntryModel(fTraceId, -1, getTrace().getName(), start, end, FlameChartEntryModel.EntryType.TRACE); + FlameChartEntryModel traceEntry = new FlameChartEntryModel(fTraceId, -1, Collections.singletonList(getTrace().getName()), start, end, FlameChartEntryModel.EntryType.TRACE); builder.add(traceEntry); FlameChartEntryModel callStackRoot = traceEntry; @@ -417,12 +421,12 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme List<FlameChartEntryModel> tree = builder.build(); tree.forEach(entry -> fEntries.put(entry.getId(), entry)); if (complete) { - TmfModelResponse<List<FlameChartEntryModel>> response = new TmfModelResponse<>(tree, + TmfModelResponse<TmfTreeModel<FlameChartEntryModel>> response = new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), tree), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); fCached = response; return response; } - return new TmfModelResponse<>(tree, ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING); + return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), tree), ITmfResponse.Status.RUNNING, CommonStatusMessage.RUNNING); } finally { fLock.writeLock().unlock(); } @@ -440,10 +444,10 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme ThreadStatusDataProvider dataProvider = DataProviderManager.getInstance().getDataProvider(trace, ThreadStatusDataProvider.ID, ThreadStatusDataProvider.class); if (dataProvider != null) { // Get the tree for the trace's current range - TmfModelResponse<List<ThreadEntryModel>> threadTreeResp = dataProvider.fetchTree(new TimeQueryFilter(start, Long.MAX_VALUE, 2), monitor); - List<ThreadEntryModel> threadTree = threadTreeResp.getModel(); + TmfModelResponse<TmfTreeModel<ThreadEntryModel>> threadTreeResp = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(start, Long.MAX_VALUE, 2)), monitor); + TmfTreeModel<ThreadEntryModel> threadTree = threadTreeResp.getModel(); if (threadTree != null) { - fThreadData = new ThreadData(dataProvider, threadTree, threadTreeResp.getStatus()); + fThreadData = new ThreadData(dataProvider, threadTree.getEntries(), threadTreeResp.getStatus()); break; } } @@ -453,7 +457,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme private boolean processCallStackElement(ICallStackElement element, Builder<FlameChartEntryModel> builder, FlameChartEntryModel parentEntry) { long elementId = getEntryId(element); - FlameChartEntryModel entry = new FlameChartEntryModel(elementId, parentEntry.getId(), element.getName(), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.LEVEL); + FlameChartEntryModel entry = new FlameChartEntryModel(elementId, parentEntry.getId(), Collections.singletonList(element.getName()), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.LEVEL); builder.add(entry); boolean needsKernel = false; @@ -464,12 +468,12 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme InstrumentedCallStackElement finalElement = (InstrumentedCallStackElement) element; CallStack callStack = finalElement.getCallStack(); for (int depth = 0; depth < callStack.getMaxDepth(); depth++) { - FlameChartEntryModel flameChartEntry = new FlameChartEntryModel(getEntryId(new CallStackDepth(callStack, depth + 1)), entry.getId(), element.getName(), parentEntry.getStartTime(), parentEntry.getEndTime(), + FlameChartEntryModel flameChartEntry = new FlameChartEntryModel(getEntryId(new CallStackDepth(callStack, depth + 1)), entry.getId(), Collections.singletonList(element.getName()), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.FUNCTION, depth + 1); builder.add(flameChartEntry); if (depth == 0 && callStack.hasKernelStatuses()) { needsKernel = true; - builder.add(new FlameChartEntryModel(getKernelEntryId(flameChartEntry.getId()), entry.getId(), String.valueOf(Messages.FlameChartDataProvider_KernelStatusTitle), parentEntry.getStartTime(), parentEntry.getEndTime(), + builder.add(new FlameChartEntryModel(getKernelEntryId(flameChartEntry.getId()), entry.getId(), Collections.singletonList(String.valueOf(Messages.FlameChartDataProvider_KernelStatusTitle)), parentEntry.getStartTime(), parentEntry.getEndTime(), FlameChartEntryModel.EntryType.KERNEL)); } } @@ -501,18 +505,26 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme } @Override - public TmfModelResponse<List<ITimeGraphRowModel>> fetchRowModel(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public TmfModelResponse<TimeGraphModel> fetchRowModel(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "FlameChartDataProvider#fetchRowModel") //$NON-NLS-1$ .setCategory(getClass().getSimpleName()).build()) { + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } Map<Long, FlameChartEntryModel> entries = getSelectedEntries(filter); if (entries.size() == 1 && filter.getTimesRequested().length == 2) { // this is a request for a follow event. Entry<@NonNull Long, @NonNull FlameChartEntryModel> entry = entries.entrySet().iterator().next(); if (filter.getStart() == Long.MIN_VALUE) { - return new TmfModelResponse<>(getFollowEvent(entry, filter.getEnd(), false), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + List<ITimeGraphRowModel> followEvents = getFollowEvent(entry, filter.getEnd(), false); + TimeGraphModel model = followEvents == null ? null : new TimeGraphModel(followEvents); + return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } else if (filter.getEnd() == Long.MAX_VALUE) { - return new TmfModelResponse<>(getFollowEvent(entry, filter.getStart(), true), ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + List<ITimeGraphRowModel> followEvents = getFollowEvent(entry, filter.getStart(), true); + TimeGraphModel model = followEvents == null ? null : new TimeGraphModel(followEvents); + return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } } // For each kernel status entry, add the first row of the callstack @@ -528,7 +540,7 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme return new TmfModelResponse<>(null, ITmfResponse.Status.CANCELLED, CommonStatusMessage.TASK_CANCELLED); } List<ITimeGraphRowModel> collect = csRows.entrySet().stream().map(entry -> new TimeGraphRowModel(entry.getKey(), entry.getValue())).collect(Collectors.toList()); - return new TmfModelResponse<>(collect, complete ? Status.COMPLETED : Status.RUNNING, + return new TmfModelResponse<>(new TimeGraphModel(collect), complete ? Status.COMPLETED : Status.RUNNING, complete ? CommonStatusMessage.COMPLETED : CommonStatusMessage.RUNNING); } catch (IndexOutOfBoundsException | TimeRangeException | StateSystemDisposedException e) { return new TmfModelResponse<>(null, Status.FAILED, String.valueOf(e.getMessage())); @@ -627,12 +639,12 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme // and the trace filtered the right host. BiMap<Long, Integer> threadModelIds = filterThreads(tree, tids); SelectionTimeQueryFilter tidFilter = new SelectionTimeQueryFilter(times, threadModelIds.keySet()); - TmfModelResponse<List<ITimeGraphRowModel>> rowModel = threadData.fThreadDataProvider.fetchRowModel(tidFilter, monitor); - List<ITimeGraphRowModel> rowModels = rowModel.getModel(); + TmfModelResponse<TimeGraphModel> rowModel = threadData.fThreadDataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(tidFilter), monitor); + TimeGraphModel rowModels = rowModel.getModel(); if (rowModel.getStatus().equals(Status.CANCELLED) || rowModel.getStatus().equals(Status.FAILED) || rowModels == null) { return Collections.emptyMap(); } - return mapThreadStates(rowModels, threadModelIds, tids); + return mapThreadStates(rowModels.getRows(), threadModelIds, tids); } private static Map<Long, List<ITimeGraphState>> mapThreadStates(List<ITimeGraphRowModel> rowModels, BiMap<Long, Integer> threadModelIds, List<TidInformation> tids) { @@ -796,4 +808,45 @@ public class FlameChartDataProvider extends AbstractTmfTraceDataProvider impleme return null; } + @Deprecated + @Override + public TmfModelResponse<List<FlameChartEntryModel>> fetchTree(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull FlameChartEntryModel>> response = fetchTree(parameters, monitor); + TmfTreeModel<@NonNull FlameChartEntryModel> model = response.getModel(); + List<FlameChartEntryModel> treeModel = null; + if (model != null) { + treeModel = model.getEntries(); + } + return new TmfModelResponse<>(treeModel, response.getStatus(), + response.getStatusMessage()); + } + + @Deprecated + @Override + public TmfModelResponse<List<ITimeGraphRowModel>> fetchRowModel(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + TmfModelResponse<TimeGraphModel> response = fetchRowModel(parameters, monitor); + TimeGraphModel model = response.getModel(); + List<ITimeGraphRowModel> rows = null; + if (model != null) { + rows = model.getRows(); + } + return new TmfModelResponse<>(rows, response.getStatus(), response.getStatusMessage()); + } + + @Deprecated + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Deprecated + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + } diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java index 43e341f4a..39aec1695 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.core/src/org/eclipse/tracecompass/incubator/internal/callstack/core/instrumented/provider/FlameChartEntryModel.java @@ -9,6 +9,7 @@ package org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider; +import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.Nullable; @@ -63,7 +64,7 @@ public class FlameChartEntryModel extends TimeGraphEntryModel { * @param entryType * The type of this entry */ - public FlameChartEntryModel(long id, long parentId, String name, long startTime, long endTime, EntryType entryType) { + public FlameChartEntryModel(long id, long parentId, List<String> name, long startTime, long endTime, EntryType entryType) { super(id, parentId, name, startTime, endTime); fEntryType = entryType; fDepth = -1; @@ -87,7 +88,7 @@ public class FlameChartEntryModel extends TimeGraphEntryModel { * @param depth * entry's PID or TID if is a thread */ - public FlameChartEntryModel(long elementId, long parentId, String name, long startTime, long endTime, EntryType entryType, int depth) { + public FlameChartEntryModel(long elementId, long parentId, List<String> name, long startTime, long endTime, EntryType entryType, int depth) { super(elementId, parentId, name, startTime, endTime); fEntryType = entryType; fDepth = depth; diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java index 4fe29cdd4..54bc81cc2 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartPresentationProvider.java @@ -23,6 +23,7 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel; import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType; import org.eclipse.tracecompass.incubator.internal.callstack.ui.FlameViewPalette; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; @@ -164,7 +165,8 @@ public class FlameChartPresentationProvider extends TimeGraphPresentationProvide TimeGraphEntry entry = (TimeGraphEntry) event.getEntry(); ITimeGraphDataProvider<? extends TimeGraphEntryModel> dataProvider = BaseDataProviderTimeGraphView.getProvider(entry); TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = dataProvider.fetchTooltip( - new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId())), null); + FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(hoverTime, hoverTime, 1, Collections.singletonList(entry.getModel().getId()))), + null); Map<@NonNull String, @NonNull String> map = response.getModel(); if (map != null) { retMap.putAll(map); diff --git a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java index 28b5f0ca6..8ad4735ab 100644 --- a/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java +++ b/callstack/org.eclipse.tracecompass.incubator.callstack.ui/src/org/eclipse/tracecompass/incubator/internal/callstack/ui/views/flamechart/FlameChartView.java @@ -35,6 +35,7 @@ import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.p import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel; import org.eclipse.tracecompass.incubator.internal.callstack.core.instrumented.provider.FlameChartEntryModel.EntryType; import org.eclipse.tracecompass.incubator.internal.callstack.ui.Activator; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; @@ -42,6 +43,7 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler; @@ -437,10 +439,10 @@ public class FlameChartView extends BaseDataProviderTimeGraphView { Map<Long, TimeGraphEntry> map = Maps.uniqueIndex(filtered, e -> e.getModel().getId()); // use time -1 as a lower bound for the end of Time events to be included. SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(Math.max(traceEntry.getStartTime(), time - 1), time, 2, map.keySet()); - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = traceEntry.getProvider().fetchRowModel(filter, null); - List<@NonNull ITimeGraphRowModel> model = response.getModel(); + TmfModelResponse<@NonNull TimeGraphModel> response = traceEntry.getProvider().fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(filter), null); + TimeGraphModel model = response.getModel(); if (model != null) { - for (ITimeGraphRowModel row : model) { + for (ITimeGraphRowModel row : model.getRows()) { syncToRow(row, time, map); } } @@ -522,13 +524,13 @@ public class FlameChartView extends BaseDataProviderTimeGraphView { TimeGraphEntry callStackEntry = (TimeGraphEntry) entry; ITimeGraphDataProvider<? extends TimeGraphEntryModel> provider = getProvider(callStackEntry); long selectionBegin = viewer.getSelectionBegin(); - SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(selectionBegin, Long.MAX_VALUE, 2, Collections.singleton(callStackEntry.getModel().getId())); - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(filter, null); - List<@NonNull ITimeGraphRowModel> model = response.getModel(); - if (model == null || model.size() != 1) { + Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(selectionBegin, Long.MAX_VALUE, 2, Collections.singleton(callStackEntry.getModel().getId()))); + TmfModelResponse<@NonNull TimeGraphModel> response = provider.fetchRowModel(parameters, null); + TimeGraphModel model = response.getModel(); + if (model == null || model.getRows().size() != 1) { return; } - List<@NonNull ITimeGraphState> row = model.get(0).getStates(); + List<@NonNull ITimeGraphState> row = model.getRows().get(0).getStates(); if (row.size() != 1) { return; } @@ -572,13 +574,13 @@ public class FlameChartView extends BaseDataProviderTimeGraphView { TimeGraphEntry callStackEntry = (TimeGraphEntry) entry; ITimeGraphDataProvider<? extends TimeGraphEntryModel> provider = getProvider(callStackEntry); long selectionBegin = viewer.getSelectionBegin(); - SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, selectionBegin), Collections.singleton(callStackEntry.getModel().getId())); - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(filter, null); - List<@NonNull ITimeGraphRowModel> model = response.getModel(); - if (model == null || model.size() != 1) { + Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(Lists.newArrayList(Long.MIN_VALUE, selectionBegin), Collections.singleton(callStackEntry.getModel().getId()))); + TmfModelResponse<@NonNull TimeGraphModel> response = provider.fetchRowModel(parameters, null); + TimeGraphModel model = response.getModel(); + if (model == null || model.getRows().size() != 1) { return; } - List<@NonNull ITimeGraphState> row = model.get(0).getStates(); + List<@NonNull ITimeGraphState> row = model.getRows().get(0).getStates(); if (row.size() != 1) { return; } diff --git a/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target b/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target index bbaf9ddaf..e8ec0ee84 100644 --- a/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target +++ b/common/org.eclipse.tracecompass.incubator.target/tracecompass-incubator-master.target @@ -160,4 +160,4 @@ -Xmx512M</vmArgs> <programArgs>-consolelog</programArgs> </launcherArgs> -</target>
\ No newline at end of file +</target> diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF index f492aaca3..e0c583ec3 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/META-INF/MANIFEST.MF @@ -26,6 +26,7 @@ Export-Package: org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core Import-Package: com.fasterxml.jackson.annotation, com.fasterxml.jackson.jaxrs.base, com.fasterxml.jackson.jaxrs.json, + com.google.common.base, com.google.common.collect, javax.ws.rs.client, javax.ws.rs.core, diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java index ac282d601..f2f7e84f1 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/DataProviderServiceTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Ericsson + * Copyright (c) 2018, 2019 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -10,13 +10,24 @@ package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.services; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService; +import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.DataProviderDescriptorStub; import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; +import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.junit.Test; /** @@ -25,9 +36,26 @@ import org.junit.Test; * @author Loic Prieur-Drevon */ public class DataProviderServiceTest extends RestServerTest { - static final String PROVIDERS_PATH = "providers"; private static final String CALL_STACK_DATAPROVIDER_ID = "org.eclipse.tracecompass.internal.analysis.profiling.callstack.provider.CallStackDataProvider"; - static final String TREE_PATH = "tree"; + + /** + * Test getting the data provider descriptors + */ + @Test + public void testProviders() { + + WebTarget traces = getApplicationEndpoint().path(TRACES); + RestServerTest.assertPost(traces, CONTEXT_SWITCHES_UST_STUB); + + WebTarget experiments = getApplicationEndpoint().path(EXPERIMENTS); + WebTarget providers = experiments.path(CONTEXT_SWITCHES_UST_UUID.toString()) + .path(OUTPUTS_PATH); + + Set<DataProviderDescriptorStub> descriptors = getDataProviderDescriptors(providers); + for (DataProviderDescriptorStub desc : EXPECTED_DATA_PROVIDER_DESCRIPTOR) { + assertTrue(desc.getName(), descriptors.contains(desc)); + } + } /** * Ensure that the Call Stack data provider exists for the trace. @@ -37,20 +65,15 @@ public class DataProviderServiceTest extends RestServerTest { WebTarget traces = getApplicationEndpoint().path(TRACES); RestServerTest.assertPost(traces, CONTEXT_SWITCHES_UST_STUB); - WebTarget callstackTree = traces.path(CONTEXT_SWITCHES_UST_UUID.toString()) - .path(PROVIDERS_PATH) - .path(CALL_STACK_DATAPROVIDER_ID) - .path(TREE_PATH); + WebTarget callstackTree = getTimeGraphTreeEndpoint(CONTEXT_SWITCHES_UST_UUID.toString(), CALL_STACK_DATAPROVIDER_ID); - Response tree = callstackTree - .queryParam("start", 0L) - .queryParam("end", Long.MAX_VALUE) - .queryParam("nb", 2) - .request(MediaType.APPLICATION_JSON).get(); + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(0L, Long.MAX_VALUE, 2)); + Response tree = callstackTree.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList()))); assertEquals("There should be a positive response for the data provider", 200, tree.getStatus()); - Response defaults = callstackTree - .request(MediaType.APPLICATION_JSON).get(); + parameters = new HashMap<>(); + parameters.put(DataProviderParameterUtils.REQUESTED_TIME_KEY, Collections.emptyList()); + Response defaults = callstackTree.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList()))); assertEquals("Default values should return OK code", 200, defaults.getStatus()); } diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java index 2720c70c2..9022f912a 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/ExperimentManagerServiceTest.java @@ -38,7 +38,7 @@ public class ExperimentManagerServiceTest extends RestServerTest { private static final @NonNull String EXPERIMENT_UUID = "bb12687f-9866-3a9f-bf55-b4d9da0137ed"; private static final @NonNull ImmutableSet<TraceModelStub> CONTEXT_SWITCH_SET = ImmutableSet.of(CONTEXT_SWITCHES_KERNEL_STUB, CONTEXT_SWITCHES_UST_STUB); private static final ExperimentModelStub EXPECTED = new ExperimentModelStub(TEST, - UUID.fromString(EXPERIMENT_UUID), 0L, 0L, 0L, CONTEXT_SWITCH_SET); + UUID.fromString(EXPERIMENT_UUID), 0L, 0L, 0L, "RUNNING", CONTEXT_SWITCH_SET); /** * Basic test for the {@link ExperimentManagerService} diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java index b078cd267..d29cca0ae 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/services/XmlManagerServiceTest.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import javax.ws.rs.client.Entity; @@ -29,8 +30,10 @@ import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.XmlManagerService; import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.utils.RestServerTest; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.junit.Test; import org.osgi.framework.Bundle; @@ -40,6 +43,7 @@ import org.osgi.framework.Bundle; * @author Loic Prieur-Drevon */ public class XmlManagerServiceTest extends RestServerTest { + private static final String PATH = "path"; private static final Bundle XML_CORE_TESTS = Platform.getBundle("org.eclipse.tracecompass.tmf.analysis.xml.core.tests"); private static final GenericType<Map<String, String>> MAP_STRING_STRING_TYPE = new GenericType<Map<String, String>>() { }; @@ -77,12 +81,10 @@ public class XmlManagerServiceTest extends RestServerTest { WebTarget traces = application.path("traces"); assertPost(traces, CONTEXT_SWITCHES_KERNEL_STUB); - WebTarget xmlProviderPath = traces.path(CONTEXT_SWITCHES_KERNEL_UUID.toString()) - .path(DataProviderServiceTest.PROVIDERS_PATH) - // path to the tree XY data provider from the valid XML file - .path("org.eclipse.linuxtools.tmf.analysis.xml.core.tests.xy") - .path(DataProviderServiceTest.TREE_PATH); - Response xmlTree = xmlProviderPath.request(MediaType.APPLICATION_JSON).get(); + WebTarget xmlProviderPath = getXYTreeEndpoint(CONTEXT_SWITCHES_KERNEL_UUID.toString(), "org.eclipse.linuxtools.tmf.analysis.xml.core.tests.xy"); + Map<String, Object> parameters = new HashMap<>(); + parameters.put(DataProviderParameterUtils.REQUESTED_TIME_KEY, Collections.emptyList()); + Response xmlTree = xmlProviderPath.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList()))); assertEquals("The end point for the XML data provider should be available.", 200, xmlTree.getStatus()); assertEquals(200, xmlEndpoint.path("test_valid.xml").request().delete().getStatus()); diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java index 0b299ad6d..4860f1b84 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/AbstractModelStub.java @@ -28,6 +28,7 @@ public abstract class AbstractModelStub implements Serializable { private final long fNbEvents; private final long fStart; private final long fEnd; + private final String fIndexingStatus; /** * Constructor @@ -43,12 +44,13 @@ public abstract class AbstractModelStub implements Serializable { * @param end * the current end time */ - public AbstractModelStub(String name, UUID uuid, long nbEvents, long start, long end) { + public AbstractModelStub(String name, UUID uuid, long nbEvents, long start, long end, String indexingStatus) { fName = name; fUUID = uuid; fNbEvents = nbEvents; fStart = start; fEnd = end; + fIndexingStatus = indexingStatus; } /** @@ -96,6 +98,10 @@ public abstract class AbstractModelStub implements Serializable { return fEnd; } + public String getIndexingStatus() { + return fIndexingStatus; + } + @Override public int hashCode() { return Objects.hash(fName, fUUID); diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java new file mode 100644 index 000000000..98f785eb9 --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/DataProviderDescriptorStub.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs; + +import java.io.Serializable; +import java.util.Objects; +import java.util.UUID; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Basic Implementation of the serialized data descriptor model used by clients. + * + * TODO Equality of two stubs is determined by equality of names, paths and + * {@link UUID}, as the start time, end time and number of events may be unknown + * due to incomplete indexing. + * + * @author Bernd Hufmann + */ +public class DataProviderDescriptorStub implements Serializable { + + /** + * Generated Serial Version UID + */ + private static final long serialVersionUID = -6380168132081665386L; + private final String fId; + private final String fName; + private final String fDescription; + private final String fTypeId; + + /** + * {@link JsonCreator} Constructor for final fields + * + * @param id + * the id + * @param name + * the name + * @param description + * the help text + * @param type + * the type id + * + */ + @JsonCreator + public DataProviderDescriptorStub(@JsonProperty("id") String id, + @JsonProperty("name") String name, + @JsonProperty("description") String description, + @JsonProperty("type") String type) { + fId = id; + fName = name; + fDescription = description; + fTypeId = type; + } + + /** + * Gets the ID + * + * @return the ID + */ + public String getId() { + return fId; + } + + /** + * Gets the name + * + * @return the name + */ + public String getName() { + return fName; + } + + /** + * Gets the help text + * + * @return the help text + */ + public String getDescription() { + return fDescription; + } + + /** + * Gets the type ID + * + * @return the type ID + */ + public String getTypeId() { + return fTypeId; + } + + @Override + public String toString() { + return "DataProviderDescriptorStub[fId=" + getId() + ", fName=" + fName + ", fDescription=" + fDescription + + ", fTypeId=" + fTypeId+ "]"; + } + + @Override + public int hashCode() { + return Objects.hash(fId, fName, fDescription, fTypeId); + } + + @Override + public boolean equals(Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + + if (obj instanceof DataProviderDescriptorStub) { + DataProviderDescriptorStub other = (DataProviderDescriptorStub) obj; + if (!Objects.equals(fId, other.fId)) { + return false; + } + if (!Objects.equals(fName, other.fName)) { + return false; + } + if (!Objects.equals(fDescription, other.fDescription)) { + return false; + } + if (Objects.equals(fTypeId, other.fTypeId)) { + return true; + } + } + return false; + } +} diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java index 02fa2ca29..113e9547a 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/ExperimentModelStub.java @@ -53,8 +53,9 @@ public class ExperimentModelStub extends AbstractModelStub { @JsonProperty("nbEvents") long nbEvents, @JsonProperty("start") long start, @JsonProperty("end") long end, + @JsonProperty("indexingStatus") String indexingStatus, @JsonProperty("traces") Set<TraceModelStub> traces) { - super(name, uuid, nbEvents, start, end); + super(name, uuid, nbEvents, start, end, indexingStatus); fTraces = traces; } diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java index 491e15fbf..e227e5739 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/stubs/TraceModelStub.java @@ -54,8 +54,9 @@ public class TraceModelStub extends AbstractModelStub { @JsonProperty("UUID") UUID uuid, @JsonProperty("nbEvents") long nbEvents, @JsonProperty("start") long start, - @JsonProperty("end") long end) { - super(name, uuid, nbEvents, start, end); + @JsonProperty("end") long end, + @JsonProperty("indexingStatus") String indexingStatus) { + super(name, uuid, nbEvents, start, end, indexingStatus); fPath = path; } @@ -70,7 +71,7 @@ public class TraceModelStub extends AbstractModelStub { * the stub's UUID */ public TraceModelStub(String name, String path, UUID uuid) { - this(name, path, uuid, 0, 0L, 0L); + this(name, path, uuid, 0, 0L, 0L, "RUNNING"); } /** diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java index 7763671c0..f7e34592d 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests/src/org/eclipse/tracecompass/incubator/trace/server/jersey/rest/core/tests/utils/RestServerTest.java @@ -13,6 +13,9 @@ import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -20,21 +23,24 @@ import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Form; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.eclipse.core.runtime.FileLocator; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp.WebApplication; +import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.DataProviderDescriptorStub; import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.ExperimentModelStub; import org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests.stubs.TraceModelStub; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; +import com.google.common.collect.ImmutableList; /** * Rest server test abstract class, handles starting the server in test mode, @@ -44,7 +50,7 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; * @author Loic Prieur-Drevon */ public abstract class RestServerTest { - private static final String SERVER = "http://localhost:8378/tracecompass"; //$NON-NLS-1$ + private static final String SERVER = "http://localhost:8378/tsp/api"; //$NON-NLS-1$ private static final WebApplication fWebApp = new WebApplication(WebApplication.TEST_PORT); /** * Traces endpoint path (relative to application). @@ -54,6 +60,27 @@ public abstract class RestServerTest { * Experiments endpoint path (relative to application). */ public static final String EXPERIMENTS = "experiments"; + + /** + * Outputs path segment + */ + public static final String OUTPUTS_PATH = "outputs"; + + /** + * Tree path segment + */ + public static final String TREE_PATH = "tree"; + + /** + * Time Graph path segment + */ + public static final String TIMEGRAPH_PATH = "timeGraph"; + + /** + * XY path segment + */ + public static final String XY_PATH = "XY"; + /** * <b>name</b> constant */ @@ -61,12 +88,14 @@ public abstract class RestServerTest { /** * <b>path</b> constant */ - public static final String PATH = "path"; + public static final String URI = "uri"; private static final GenericType<Set<TraceModelStub>> TRACE_MODEL_SET_TYPE = new GenericType<Set<TraceModelStub>>() { }; private static final GenericType<Set<ExperimentModelStub>> EXPERIMENT_MODEL_SET_TYPE = new GenericType<Set<ExperimentModelStub>>() { }; + private static final GenericType<Set<DataProviderDescriptorStub>> DATAPROVIDER_DESCR_MODEL_SET_TYPE = new GenericType<Set<DataProviderDescriptorStub>>() { + }; /** * {@link UUID} for {@link CtfTestTrace#CONTEXT_SWITCHES_UST}. @@ -89,6 +118,11 @@ public abstract class RestServerTest { protected static TraceModelStub CONTEXT_SWITCHES_KERNEL_STUB; /** + * Expected toString() of all data providers for this experiment + */ + protected static List<DataProviderDescriptorStub> EXPECTED_DATA_PROVIDER_DESCRIPTOR = null; + + /** * Create the {@link TraceModelStub}s before running the tests * * @throws IOException @@ -101,6 +135,20 @@ public abstract class RestServerTest { String contextSwitchesKernelPath = FileLocator.toFileURL(CtfTestTrace.CONTEXT_SWITCHES_KERNEL.getTraceURL()).getPath(); CONTEXT_SWITCHES_KERNEL_STUB = new TraceModelStub("kernel", contextSwitchesKernelPath, CONTEXT_SWITCHES_KERNEL_UUID); + ImmutableList.Builder<DataProviderDescriptorStub> b = ImmutableList.builder(); + b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack", + "LTTng-UST CallStack - Latency vs Time", + "Show latencies provided by Analysis module: LTTng-UST CallStack", + ProviderType.TREE_TIME_XY.name())); + b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.analysis.profiling.callstack.provider.CallStackDataProvider", + "Flame Chart", + "Show a call stack over time", + ProviderType.TIME_GRAPH.name())); + b.add(new DataProviderDescriptorStub("org.eclipse.tracecompass.internal.tmf.core.histogram.HistogramDataProvider", + "Histogram", + "Show a histogram of number of events to time for a trace", + ProviderType.TREE_TIME_XY.name())); + EXPECTED_DATA_PROVIDER_DESCRIPTOR = b.build(); } /** @@ -145,6 +193,42 @@ public abstract class RestServerTest { } /** + * Get the {@link WebTarget} for the time graph tree endpoint. + * + * @param UUID + * Trace or experiment UUID + * @param dataProviderId + * Data provider ID + * @return The time graph tree endpoint + */ + public static WebTarget getTimeGraphTreeEndpoint(String UUID, String dataProviderId) { + return getApplicationEndpoint().path(EXPERIMENTS) + .path(UUID) + .path(OUTPUTS_PATH) + .path(TIMEGRAPH_PATH) + .path(dataProviderId) + .path(TREE_PATH); + } + + /** + * Get the {@link WebTarget} for the XY tree endpoint. + * + * @param UUID + * Trace or experiment UUID + * @param dataProviderId + * Data provider ID + * @return The XY tree endpoint + */ + public static WebTarget getXYTreeEndpoint(String UUID, String dataProviderId) { + return getApplicationEndpoint().path(EXPERIMENTS) + .path(UUID) + .path(OUTPUTS_PATH) + .path(XY_PATH) + .path(dataProviderId) + .path(TREE_PATH); + } + + /** * Get the traces currently open on the server. * * @param traces @@ -167,6 +251,17 @@ public abstract class RestServerTest { } /** + * Get a set of {@link DataProviderDescriptorStub} + * + * @param outputs + * {@link WebTarget} for the outputs endpoint + * @return Set of {@link DataProviderDescriptorStub} given by the server + */ + public static Set<DataProviderDescriptorStub> getDataProviderDescriptors(WebTarget outputs) { + return outputs.request(MediaType.APPLICATION_JSON).get(DATAPROVIDER_DESCR_MODEL_SET_TYPE); + } + + /** * Post the trace from an expected {@link TraceModelStub}, ensure that the post * returned correctly and that the returned model was that of the expected stub. * @@ -176,9 +271,10 @@ public abstract class RestServerTest { * expected trace stub */ public static void assertPost(WebTarget traces, TraceModelStub stub) { - Form form = new Form(PATH, stub.getPath()); - form.param(NAME, stub.getName()); - Response response = traces.request().post(Entity.form(form)); + Map<String, Object> parameters = new HashMap<>(); + parameters.put(NAME, stub.getName()); + parameters.put(URI, stub.getPath()); + Response response = traces.request().post(Entity.json(new QueryParameters(parameters , Collections.emptyList()))); int code = response.getStatus(); assertEquals("Failed to POST " + stub.getName() + ", error code=" + code, 200, code); assertEquals(stub, response.readEntity(TraceModelStub.class)); 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/model/views/Filter.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/Filter.java new file mode 100644 index 000000000..fcdc42bf9 --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/Filter.java @@ -0,0 +1,104 @@ +/********************************************************************** + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + **********************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views; + +/** + * Filter that is received by the server to be applied on the response. + * + * @author Simon Delisle + */ +public class Filter { + private long fId; + private String fName; + private long fStartTime; + private long fEndTime; + private String fExpression; + private int fTags; + + /** + * Constructor. + * + * @param id + * Filter ID + * @param name + * Human readable name + * @param startTime + * Filter start time + * @param endTime + * Filter end time + * @param expression + * Filter expression (eg. regex) + * @param tags + * Tags to be apply on responses (with the filter does) + */ + public Filter(long id, String name, long startTime, long endTime, String expression, int tags) { + super(); + fId = id; + fName = name; + fStartTime = startTime; + fEndTime = endTime; + fExpression = expression; + fTags = tags; + } + + /** + * Getter for filter ID + * + * @return Filter ID + */ + public long getId() { + return fId; + } + + /** + * Getter for filter name + * + * @return Human readable name + */ + public String getName() { + return fName; + } + + /** + * Getter for filter start time + * + * @return Filter start time + */ + public long getStartTime() { + return fStartTime; + } + + /** + * Getter for filter end time + * + * @return Filter end time + */ + public long getEndTime() { + return fEndTime; + } + + /** + * Getter for filter expression + * + * @return Filter expression + */ + public String getExpression() { + return fExpression; + } + + /** + * Getter for filter tags + * + * @return Tags to apply + */ + public int getTags() { + return fTags; + } +} 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/model/views/QueryParameters.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/QueryParameters.java new file mode 100644 index 000000000..7ca61990a --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/model/views/QueryParameters.java @@ -0,0 +1,57 @@ +/********************************************************************** + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + **********************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views; + +import java.util.List; +import java.util.Map; + +/** + * Definition of a parameters object received by the server from a client. + * + * @author Simon Delisle + */ +public class QueryParameters { + private Map<String, Object> parameters; + private List<Filter> filters; + + /** + * Constructor for Jackson + */ + public QueryParameters() { + // Default constructor for Jackson + } + + /** + * Constructor. + * + * @param parameters + * Map of parameters + * @param filters + * List of filters + */ + public QueryParameters(Map<String, Object> parameters, List<Filter> filters) { + this.parameters = parameters; + this.filters = filters; + } + + /** + * @return Map of parameters + */ + public Map<String, Object> getParameters() { + return parameters; + } + + /** + * @return List of filters + */ + public List<Filter> getFilters() { + return filters; + } +} 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 ce10932be..1d547c067 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Ericsson + * Copyright (c) 2017, 2019 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which @@ -9,53 +9,44 @@ package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services; +import java.util.Arrays; import java.util.EnumSet; -import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import java.util.UUID; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import javax.ws.rs.Consumes; -import javax.ws.rs.DefaultValue; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; -import javax.ws.rs.PUT; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.GenericView; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableDataProvider; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableFilterModel; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.EventTableQueryFilter; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters; import org.eclipse.tracecompass.internal.provisional.tmf.core.model.filters.VirtualTableQueryFilter; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.EventTableLine; import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.ITmfVirtualTableDataProvider; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.ITmfVirtualTableModel; import org.eclipse.tracecompass.internal.provisional.tmf.core.model.table.IVirtualTableLine; import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.module.XmlOutputElement; 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.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlUtils; import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.output.XmlDataProviderManager; import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphEntryModel; -import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel; import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataProvider; import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider; @@ -65,7 +56,6 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.w3c.dom.Element; import com.google.common.collect.Iterables; -import com.google.common.primitives.Longs; /** * Service to query the {@link ITmfTreeDataProvider}s @@ -73,56 +63,52 @@ import com.google.common.primitives.Longs; * @author Loic Prieur-Drevon */ @SuppressWarnings("restriction") -@Path("/traces/{uuid}/providers/{providerId}") +@Path("/experiments/{uuid}/outputs") public class DataProviderService { + private static final String WRONG_PARAMETERS = "Wrong query parameters"; //$NON-NLS-1$ private static final String NO_PROVIDER = "Analysis cannot run"; //$NON-NLS-1$ private static final String NO_SUCH_TRACE = "No Such Trace"; //$NON-NLS-1$ private final DataProviderManager manager = DataProviderManager.getInstance(); /** - * Query the provider for the entry tree + * Getter for the list of data provider descriptions * * @param uuid - * desired trace UUID - * @param providerId - * Eclipse extension point ID for the data provider to query - * @param start - * lower bound for the query - * @param end - * upper bound for the query - * @param nb - * nanoseconds between two data points - * @return an {@link GenericView} with the results + * UUID of the trace to search for + * @return the data provider descriptions with the queried {@link UUID} if it exists. */ @GET - @Path("/tree") @Produces(MediaType.APPLICATION_JSON) - public Response getTree(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("start") long start, - @QueryParam("end") @DefaultValue("1") long end, - @QueryParam("nb") @DefaultValue("2") int nb) { + public Response getProviders(@PathParam("uuid") UUID uuid) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { - return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); - } - - ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace, - providerId, ITmfTreeDataProvider.class); - - if (provider == null && providerId != null) { - // try and find the XML provider for the ID. - provider = getXmlProvider(trace, providerId, EnumSet.allOf(OutputType.class)); + return Response.status(Status.NOT_FOUND).build(); } + List<IDataProviderDescriptor> list = DataProviderManager.getInstance().getAvailableProviders(trace); - if (provider == null) { - // The analysis cannot be run on this trace - return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); - } + return Response.ok(list).build(); + } - TmfModelResponse<?> treeResponse = provider.fetchTree(new TimeQueryFilter(start, end, nb), null); - return Response.ok(new GenericView<>(trace, treeResponse)).build(); + /** + * Query the provider for the XY tree + * + * @param uuid + * desired trace UUID + * @param outputId + * Eclipse extension point ID for the data provider to query + * @param queryParameters + * Parameters to fetch an XY tree as described by + * {@link QueryParameters} + * @return an {@link GenericView} with the results + */ + @POST + @Path("/XY/{outputId}/tree") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response getXYTree(@PathParam("uuid") UUID uuid, + @PathParam("outputId") String outputId, QueryParameters queryParameters) { + return getTree(uuid, outputId, queryParameters); } /** @@ -130,38 +116,29 @@ public class DataProviderService { * * @param uuid * {@link UUID} of the trace to query - * @param providerId + * @param outputId * Eclipse extension point ID for the data provider to query - * @param start - * lower bound for the query - * @param end - * upper bound for the query - * @param nb - * nanoseconds between two data points - * @param ids - * ids of the entries to query + * @param queryParameters + * Parameters to fetch XY as described by {@link QueryParameters} * @return an {@link GenericView} with the results */ - @GET - @Path("/xy") + @POST + @Path("/XY/{outputId}/xy") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getXY(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("start") long start, - @QueryParam("end") long end, - @QueryParam("nb") @Min(1) int nb, - @QueryParam("ids") @NotNull Set<Long> ids) { + @PathParam("outputId") String outputId, QueryParameters queryParameters) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); } ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace, - providerId, ITmfTreeXYDataProvider.class); + outputId, ITmfTreeXYDataProvider.class); - if (provider == null && providerId != null) { + if (provider == null && outputId != null) { // try and find the XML provider for the ID. - provider = getXmlProvider(trace, providerId, EnumSet.of(OutputType.XY)); + provider = getXmlProvider(trace, outputId, EnumSet.of(OutputType.XY)); } if (provider == null) { @@ -169,8 +146,62 @@ public class DataProviderService { return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); } - TmfModelResponse<@NonNull ITmfXyModel> response = provider.fetchXY(new SelectionTimeQueryFilter(start, end, nb, ids), null); - return Response.ok(new GenericView<>(trace, response)).build(); + SelectionTimeQueryFilter selectionTimeQueryFilter = FetchParametersUtils.createSelectionTimeQuery(queryParameters.getParameters()); + if (selectionTimeQueryFilter == null) { + return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build(); + } + + TmfModelResponse<@NonNull ITmfXyModel> response = provider.fetchXY(queryParameters.getParameters(), null); + return Response.ok(response).build(); + } + + /** + * Query the provider for XY tooltip, currently not implemented + * + * @param uuid + * {@link UUID} of the trace to query + * @param outputId + * Eclipse extension point ID for the data provider to query + * @param xValue + * Given X value to fetch the tooltip + * @param yValue + * Given Y value to help fetch the tooltip, used to get the right + * point if two points have the same X value + * @param entryId + * Entry Id or series Id + * @return {@link GenericView} with the results + */ + @GET + @Path("/XY/{outputId}/tooltip") + @Produces(MediaType.APPLICATION_JSON) + public Response getXYTooltip(@PathParam("uuid") UUID uuid, + @PathParam("outputId") String outputId, + @QueryParam("xValue") long xValue, + @QueryParam("yValue") long yValue, + @QueryParam("entryId") long entryId) { + return Response.status(Status.NOT_IMPLEMENTED).entity("XY tooltip are not implemented yet").build(); //$NON-NLS-1$ + } + + /** + * Query the provider for the time graph tree + * + * @param uuid + * {@link UUID} of the trace to query + * @param outputId + * Eclipse extension point ID for the data provider to query + * @param queryParameters + * Parameters to fetch time graph tree as described by + * {@link QueryParameters} + * @return {@link GenericView} with the results + */ + @POST + @Path("/timeGraph/{outputId}/tree") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response getTimeGraphTree(@PathParam("uuid") UUID uuid, + @PathParam("outputId") String outputId, + QueryParameters queryParameters) { + return getTree(uuid, outputId, queryParameters); } /** @@ -178,41 +209,39 @@ public class DataProviderService { * * @param uuid * desired trace UUID - * @param providerId + * @param outputId * Eclipse extension point ID for the data provider to query - * @param start - * lower bound for the query - * @param end - * upper bound for the query - * @param nb - * nanoseconds between two data points - * @param ids - * ids of the entries to query - * @return an {@link GenericView} with the results + * @param queryParameters + * Parameters to fetch time graph states as described by + * {@link QueryParameters} + * @return {@link GenericView} with the results */ - @GET - @Path("/states") + @POST + @Path("/timeGraph/{outputId}/states") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getStates(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("start") long start, - @QueryParam("end") long end, - @QueryParam("nb") int nb, - @QueryParam("ids") @NotNull Set<Long> ids) { + @PathParam("outputId") String outputId, + QueryParameters queryParameters) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); } - ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId); + ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId); if (provider == null) { // The analysis cannot be run on this trace return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); } - TmfModelResponse<List<@NonNull ITimeGraphRowModel>> response = provider.fetchRowModel(new SelectionTimeQueryFilter(start, end, nb, ids), null); - return Response.ok(new GenericView<>(trace, response)).build(); + SelectionTimeQueryFilter selectionTimeQueryFilter = FetchParametersUtils.createSelectionTimeQuery(queryParameters.getParameters()); + if (selectionTimeQueryFilter == null) { + return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build(); + } + + TmfModelResponse<TimeGraphModel> response = provider.fetchRowModel(queryParameters.getParameters(), null); + return Response.ok(response).build(); } /** @@ -220,38 +249,39 @@ public class DataProviderService { * * @param uuid * desired trace UUID - * @param providerId + * @param outputId * Eclipse extension point ID for the data provider to query - * @param start - * lower bound for the query - * @param end - * upper bound for the query - * @param nb - * nanoseconds between two data points - * @return an {@link GenericView} with the results + * @param queryParameters + * Parameters to fetch time graph arrows as described by + * {@link QueryParameters} + * @return {@link GenericView} with the results */ - @GET - @Path("/arrows") + @POST + @Path("/timeGraph/{outputId}/arrows") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getArrows(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("start") long start, - @QueryParam("end") long end, - @QueryParam("nb") int nb) { + @PathParam("outputId") String outputId, + QueryParameters queryParameters) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); } - ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId); + ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId); if (provider == null) { // The analysis cannot be run on this trace return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); } - TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> response = provider.fetchArrows(new TimeQueryFilter(start, end, nb), null); - return Response.ok(new GenericView<>(trace, response)).build(); + TimeQueryFilter timeQueryFilter = FetchParametersUtils.createTimeQuery(queryParameters.getParameters()); + if (timeQueryFilter == null) { + return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build(); + } + + TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> response = provider.fetchArrows(queryParameters.getParameters(), null); + return Response.ok(response).build(); } /** @@ -259,165 +289,112 @@ public class DataProviderService { * * @param uuid * desired trace UUID - * @param providerId + * @param outputId * Eclipse extension point ID for the data provider to query - * @param start - * lower bound for the query - * @param end - * upper bound for the query - * @param nb - * nanoseconds between two data points - * @param ids - * ids of the entries to query - * @return an {@link GenericView} with the results + * @param time + * Time where to fetch the tooltip + * @param entryId + * Entry Id to identify the state for the tooltip + * @param targetId + * Target Id if the tooltip is for an arrow + * @return {@link GenericView} with the results */ @GET - @Path("/tooltip") + @Path("/timeGraph/{outputId}/tooltip") @Produces(MediaType.APPLICATION_JSON) - public Response getTooltip(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("start") long start, - @QueryParam("end") long end, - @QueryParam("nb") int nb, - @QueryParam("ids") @NotNull Set<Long> ids) { + public Response getTimeGraphTooltip(@PathParam("uuid") UUID uuid, + @PathParam("outputId") String outputId, + @QueryParam("time") long time, + @QueryParam("entryId") long entryId, + @QueryParam("targetId") long targetId) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); } - ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, providerId); + ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = getTimeGraphProvider(trace, outputId); if (provider == null) { // The analysis cannot be run on this trace return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); } - - TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = provider.fetchTooltip(new SelectionTimeQueryFilter(start, end, nb, ids), null); - return Response.ok(new GenericView<>(trace, response)).build(); + TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> response = provider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(time, time, 1, Arrays.asList(entryId, targetId))), null); + return Response.ok(response).build(); } - private ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> getTimeGraphProvider(@NonNull ITmfTrace trace, String providerId) { + private ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> getTimeGraphProvider(@NonNull ITmfTrace trace, String outputId) { ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = manager.getDataProvider(trace, - providerId, ITimeGraphDataProvider.class); + outputId, ITimeGraphDataProvider.class); - if (provider == null && providerId != null) { + if (provider == null && outputId != null) { // try and find the XML provider for the ID. - provider = getXmlProvider(trace, providerId, EnumSet.of(OutputType.TIME_GRAPH)); + provider = getXmlProvider(trace, outputId, EnumSet.of(OutputType.TIME_GRAPH)); } return provider; } /** - * Query the provider for table lines + * Query the provider for table columns * * @param uuid - * Trace UUID - * @param providerId + * desired trace UUID + * @param outputId * Eclipse extension point ID for the data provider to query - * @param low - * Low index - * @param size - * Number of lines to return - * @param columnIds - * Desired column IDs - * @return A {@link GenericView} with the results + * @param queryParameters + * Parameters to fetch table columns as described by + * {@link QueryParameters} + * @return {@link GenericView} with the results */ - @GET - @Path("/lines") + @POST + @Path("/table/{outputId}/columns") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response getLines(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("low") @Min(0) long low, - @QueryParam("size") @Min(0) int size, - @QueryParam("columnId") List<@NonNull Long> columnIds) { - - ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); - if (trace == null) { - return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); - } - - ITmfVirtualTableDataProvider<? extends IVirtualTableLine, ? extends ITmfTreeDataModel> provider = manager.getDataProvider(trace, providerId, ITmfVirtualTableDataProvider.class); - if (provider == null) { - return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); - } - - VirtualTableQueryFilter queryFilter = new VirtualTableQueryFilter(columnIds, low, size); - TmfModelResponse<?> response = provider.fetchLines(queryFilter, null); - return Response.ok(new GenericView<>(trace, response)).build(); + public Response getColumns(@PathParam("uuid") UUID uuid, + @PathParam("outputId") String outputId, + QueryParameters queryParameters) { + return getTree(uuid, outputId, queryParameters); } /** - * Query the provider for event table lines with filters + * Query the provider for table lines * * @param uuid - * Trace UUID - * @param providerId + * desired trace UUID + * @param outputId * Eclipse extension point ID for the data provider to query - * @param low - * Low index - * @param size - * Number of lines to return - * @param columnIds - * Desired column IDs - * @param presetFilter - * List of preset filter IDs to apply - * @param isCollapseFilterEnabled - * True if a collapse filter should be applied - * @param multivaluedMap - * Map that contains the table filter (column ID with the associated - * regex) - * @return A {@link GenericView} with the results + * @param queryParameters + * Parameters to fetch table lines as described by + * {@link QueryParameters} + * @return {@link GenericView} with the results */ - @PUT - @Path("/lines") - @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + @POST + @Path("/table/{outputId}/lines") + @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getLines(@PathParam("uuid") UUID uuid, - @PathParam("providerId") String providerId, - @QueryParam("low") @Min(0) long low, - @QueryParam("size") @Min(0) int size, - @QueryParam("columnId") List<@NonNull Long> columnIds, - @FormParam("presetFilterId") List<@NonNull String> presetFilter, - @FormParam("collapseFilter") boolean isCollapseFilterEnabled, - MultivaluedMap<@NonNull String, @NonNull String> multivaluedMap) { - + @PathParam("outputId") String outputId, + QueryParameters queryParameters) { ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); if (trace == null) { return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); } - TmfEventTableDataProvider provider = manager.getDataProvider(trace, providerId, TmfEventTableDataProvider.class); + ITmfVirtualTableDataProvider<? extends IVirtualTableLine, ? extends ITmfTreeDataModel> provider = manager.getDataProvider(trace, outputId, ITmfVirtualTableDataProvider.class); if (provider == null) { return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); } - /* - * The multivaluedMap contains all the entry from the form, including the - * presetFilter list and the collapse boolean. In order to extract the table - * filters (mapping between column ID and regex) the tryParse is use to capture - * just the keys that are longs (column IDs) - */ - Map<@NonNull Long, @NonNull String> tableFilter = null; - for (Entry<String, List<String>> paramEntry : multivaluedMap.entrySet()) { - Long columnId = Longs.tryParse(paramEntry.getKey()); - if (columnId == null) { - continue; - } - - if (tableFilter == null) { - tableFilter = new HashMap<>(); - } - tableFilter.put(columnId, paramEntry.getValue().get(0)); + VirtualTableQueryFilter tableQueryFilter = FetchParametersUtils.createVirtualTableQueryFilter(queryParameters.getParameters()); + if (tableQueryFilter == null) { + return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build(); } - - TmfEventTableFilterModel filters = new TmfEventTableFilterModel(tableFilter, null, presetFilter, null, isCollapseFilterEnabled); - EventTableQueryFilter queryFilter = new EventTableQueryFilter(columnIds, low, size, filters); - TmfModelResponse<@NonNull ITmfVirtualTableModel<@NonNull EventTableLine>> response = provider.fetchLines(queryFilter, null); - return Response.ok(new GenericView<>(trace, response)).build(); + TmfModelResponse<?> response = provider.fetchLines(queryParameters.getParameters(), null); + return Response.ok(response).build(); } /** - * Get the XML data provider for a trace, provider id and XML {@link OutputType} + * Get the XML data provider for a trace, provider id and XML + * {@link OutputType} * * @param trace * the queried trace @@ -425,11 +402,10 @@ public class DataProviderService { * the queried ID * @param types * the data provider type - * @return the provider if an XML containing the ID exists and applies to the - * trace, else null + * @return the provider if an XML containing the ID exists and applies to + * the trace, else null */ - private static <@Nullable P extends ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel>> P - getXmlProvider(@NonNull ITmfTrace trace, @NonNull String id, EnumSet<OutputType> types) { + private static <@Nullable P extends ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel>> P getXmlProvider(@NonNull ITmfTrace trace, @NonNull String id, EnumSet<OutputType> types) { for (OutputType viewType : types) { for (XmlOutputElement element : Iterables.filter(XmlUtils.getXmlOutputElements().values(), element -> element.getXmlElem().equals(viewType.getXmlElem()) && id.equals(element.getId()))) { @@ -444,4 +420,31 @@ public class DataProviderService { return null; } + private Response getTree(UUID uuid, String outputId, QueryParameters queryParameters) { + ITmfTrace trace = TraceManagerService.getTraceByUUID(uuid); + if (trace == null) { + return Response.status(Status.NOT_FOUND).entity(NO_SUCH_TRACE).build(); + } + + ITmfTreeDataProvider<? extends @NonNull ITmfTreeDataModel> provider = manager.getDataProvider(trace, + outputId, ITmfTreeDataProvider.class); + + if (provider == null && outputId != null) { + // try and find the XML provider for the ID. + provider = getXmlProvider(trace, outputId, EnumSet.allOf(OutputType.class)); + } + + if (provider == null) { + // The analysis cannot be run on this trace + return Response.status(Status.METHOD_NOT_ALLOWED).entity(NO_PROVIDER).build(); + } + + TimeQueryFilter timeQueryFilter = FetchParametersUtils.createTimeQuery(queryParameters.getParameters()); + if (timeQueryFilter == null) { + return Response.status(Status.UNAUTHORIZED).entity(WRONG_PARAMETERS).build(); + } + + TmfModelResponse<?> treeResponse = provider.fetchTree(queryParameters.getParameters(), null); + return Response.ok(treeResponse).build(); + } } 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/ExperimentManagerService.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/ExperimentManagerService.java index 12913dcf3..ea1038ec6 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/ExperimentManagerService.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/ExperimentManagerService.java @@ -80,6 +80,14 @@ public class ExperimentManagerService { return Response.status(Status.NOT_FOUND).build(); } + @GET + @Path("/{uuid}/outputs") + @Produces(MediaType.APPLICATION_JSON) + public Response getOutputs(@PathParam("uuid") UUID uuid) { + return Response.status(Status.NOT_IMPLEMENTED).entity("Not implemented for " + uuid).build(); + } + + /** * Delete an experiment by {@link UUID}. * 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/FilterService.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/FilterService.java new file mode 100644 index 000000000..511867261 --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/services/FilterService.java @@ -0,0 +1,102 @@ +/********************************************************************** + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + **********************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +/** + * Service to manage filters + * + * @author Simon Delisle + */ +@Path("/filters") +public class FilterService { + + /** + * Get a list of all the filters available on the server + * + * @return List of filters + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getFilters() { + return Response.status(Status.NOT_IMPLEMENTED).build(); + } + + /** + * Create a new filter on the server + * + * @param filter + * Filter to create + * @return Created filter + */ + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response createFilter(Object filter) { + return Response.status(Status.NOT_IMPLEMENTED).build(); + } + + /** + * Get a specific filter + * + * @param filterId + * Filter Id + * @return Filter + */ + @GET + @Path("/{filterId}") + @Produces(MediaType.APPLICATION_JSON) + public Response getFilter(@PathParam("filterId") String filterId) { + return Response.status(Status.NOT_IMPLEMENTED).build(); + } + + /** + * Update a specific filter + * + * @param filterId + * Filter Id + * @param filter + * Filter used to update the given filter + * @return Updated filter + */ + @PUT + @Path("/{filterId}") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response updateFilter(@PathParam("filterId") String filterId, + Object filter) { + return Response.status(Status.NOT_IMPLEMENTED).build(); + } + + /** + * Delete a specific filter + * + * @param filterId + * Id of the filter to delete + * @return Deleted filter + */ + @DELETE + @Path("/{filterId}") + @Produces(MediaType.APPLICATION_JSON) + public Response deleteFilter(@PathParam("filterId") String filterId) { + return Response.status(Status.NOT_IMPLEMENTED).build(); + } +} 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/TraceManagerService.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/TraceManagerService.java index 7472064d9..e24eda007 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/TraceManagerService.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/TraceManagerService.java @@ -12,13 +12,12 @@ package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.cor import java.io.File; import java.nio.file.Paths; import java.util.List; +import java.util.Map; import java.util.UUID; import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; -import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -40,6 +39,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.Activator; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views.QueryParameters; import org.eclipse.tracecompass.tmf.core.TmfCommonConstants; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; @@ -83,20 +83,20 @@ public class TraceManagerService { * Method to open the trace, initialize it, index it and add it to the trace * manager. * - * @param name - * the name to assign to the trace files - * @param path - * the path to the trace - * @param typeID - * the ID of a trace (like "o.e.l.specifictrace" ) + * @param queryParameters + * Parameters to post a trace as described by + * {@link QueryParameters} * @return the new trace model object or the exception if it failed to load. */ @POST - @Consumes({ MediaType.APPLICATION_FORM_URLENCODED }) - @Produces({ MediaType.APPLICATION_JSON }) - public Response putTrace(@FormParam("name") @NotNull @Size(min = 1) String name, - @FormParam("path") String path, - @FormParam("typeID") String typeID) { + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response putTrace(QueryParameters queryParameters) { + Map<String, Object> parameters = queryParameters.getParameters(); + String name = (String) parameters.get("name"); + String path = (String) parameters.get("uri"); + Object typeIDObject = parameters.get("typeID"); + String typeID = typeIDObject != null ? (String) typeIDObject : ""; Optional<@NonNull ITmfTrace> optional = Iterables.tryFind(TmfTraceManager.getInstance().getOpenedTraces(), t -> t.getPath().equals(path)); if (optional.isPresent()) { return Response.status(Status.CONFLICT).entity(optional.get()).build(); 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/webapp/DataProviderDescriptorSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/DataProviderDescriptorSerializer.java new file mode 100644 index 000000000..cf72a3f73 --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/DataProviderDescriptorSerializer.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2018 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp; + +import java.io.IOException; + +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * {@link StdSerializer} for {@link IDataProviderDescriptor} to avoid building intermediate + * representations. + * + * @author Bernd Hufmann + */ +public class DataProviderDescriptorSerializer extends StdSerializer<IDataProviderDescriptor> { + + /** + * Generated serialVersionUID + */ + private static final long serialVersionUID = 9170252203750031947L; + + /** + * Public constructor + */ + public DataProviderDescriptorSerializer() { + super(IDataProviderDescriptor.class); + } + + @Override + public void serialize(IDataProviderDescriptor value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + gen.writeStringField("id", value.getId()); //$NON-NLS-1$ + gen.writeStringField("name", value.getName()); //$NON-NLS-1$ + gen.writeStringField("description", value.getDescription()); //$NON-NLS-1$ + gen.writeStringField("type", value.getType().name()); //$NON-NLS-1$ + gen.writeEndObject(); + } + +} 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/webapp/SeriesModelSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/SeriesModelSerializer.java new file mode 100644 index 000000000..aca4e8dee --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/SeriesModelSerializer.java @@ -0,0 +1,50 @@ +/********************************************************************** + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + **********************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp; + +import java.io.IOException; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.tracecompass.tmf.core.model.xy.ISeriesModel; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Serializer for XY series model {@link ISeriesModel} + * + * @author Simon Delisle + */ +public class SeriesModelSerializer extends StdSerializer<@NonNull ISeriesModel> { + + /** + * Generated serialVersionUID + */ + private static final long serialVersionUID = -4359431726167157401L; + + /** + * Constructor. + */ + protected SeriesModelSerializer() { + super(ISeriesModel.class); + } + + @Override + public void serialize(ISeriesModel value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + gen.writeNumberField("id", value.getId()); //$NON-NLS-1$ + gen.writeStringField("name", value.getName()); //$NON-NLS-1$ + gen.writeObjectField("xValues", value.getXAxis()); //$NON-NLS-1$ + gen.writeObjectField("yValues", value.getData()); //$NON-NLS-1$ + gen.writeEndObject(); + } + +} 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/webapp/TraceSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java index 06547a38e..165d419a8 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/TraceSerializer.java @@ -48,6 +48,9 @@ public class TraceSerializer extends StdSerializer<@NonNull ITmfTrace> { gen.writeNumberField("nbEvents", value.getNbEvents()); //$NON-NLS-1$ gen.writeNumberField("start", value.getStartTime().toNanos()); //$NON-NLS-1$ gen.writeNumberField("end", value.getEndTime().toNanos()); //$NON-NLS-1$ + // TODO Find a better way, no support for cancel + String indexingStatus = value.isIndexing() ? "RUNNING" : "COMPLETED"; //$NON-NLS-1$ //$NON-NLS-2$ + gen.writeStringField("indexingStatus", indexingStatus); //$NON-NLS-1$ gen.writeEndObject(); } 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/webapp/WebApplication.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java index 09378c9ff..59c490a5d 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/WebApplication.java @@ -15,9 +15,13 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.DataProviderService; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.ExperimentManagerService; +import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.FilterService; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.TraceManagerService; import org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.services.XmlManagerService; +import org.eclipse.tracecompass.internal.tmf.core.model.DataProviderDescriptor; import org.eclipse.tracecompass.tmf.core.TmfCommonConstants; +import org.eclipse.tracecompass.tmf.core.model.xy.ISeriesModel; +import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment; import org.glassfish.jersey.server.ResourceConfig; @@ -37,7 +41,7 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; */ public class WebApplication { - private static final String CONTEXT_PATH = "/tracecompass"; //$NON-NLS-1$ + private static final String CONTEXT_PATH = "/tsp/api"; //$NON-NLS-1$ private static final String PATH_SPEC = "/*"; //$NON-NLS-1$ /** * Port value which boots the server in testing mode. @@ -80,6 +84,7 @@ public class WebApplication { rc.register(TraceManagerService.class); rc.register(ExperimentManagerService.class); rc.register(DataProviderService.class); + rc.register(FilterService.class); rc.register(XmlManagerService.class); rc.register(CORSFilter.class); rc.register(registerCustomMappers()); @@ -116,6 +121,9 @@ public class WebApplication { SimpleModule module = new SimpleModule(); module.addSerializer(ITmfTrace.class, new TraceSerializer()); module.addSerializer(TmfExperiment.class, new ExperimentSerializer()); + module.addSerializer(DataProviderDescriptor.class, new DataProviderDescriptorSerializer()); + module.addSerializer(ITmfXyModel.class, new XYModelSerializer()); + module.addSerializer(ISeriesModel.class, new SeriesModelSerializer()); mapper.registerModule(module); return provider; } 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/webapp/XYModelSerializer.java b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/XYModelSerializer.java new file mode 100644 index 000000000..3684ad1ed --- /dev/null +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core/src/org/eclipse/tracecompass/incubator/internal/trace/server/jersey/rest/core/webapp/XYModelSerializer.java @@ -0,0 +1,48 @@ +/********************************************************************** + * Copyright (c) 2019 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + **********************************************************************/ + +package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.webapp; + +import java.io.IOException; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXyModel; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +/** + * Serializer for XY model {@link ITmfXyModel} + * + * @author Simon Delisle + */ +public class XYModelSerializer extends StdSerializer<@NonNull ITmfXyModel> { + + /** + * Generated serialVersionUID + */ + private static final long serialVersionUID = -7271194941789981571L; + + /** + * Constructor. + */ + protected XYModelSerializer() { + super(ITmfXyModel.class); + } + + @Override + public void serialize(@NonNull ITmfXyModel value, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + gen.writeStringField("title", value.getTitle()); //$NON-NLS-1$ + gen.writeObjectField("series", value.getData()); //$NON-NLS-1$ + gen.writeEndObject(); + } + +} diff --git a/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml b/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml index 78789db42..91b7784c7 100644 --- a/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml +++ b/trace-server/org.eclipse.tracecompass.incubator.trace.server.product/pom.xml @@ -71,6 +71,126 @@ <profiles> <profile> + <id>sign-update-site</id> + <build> + <plugins> + <plugin> + <groupId>org.eclipse.tycho</groupId> + <artifactId>tycho-p2-director-plugin</artifactId> + <version>${tycho-version}</version> + <executions> + <execution> + <id>materialize-products</id> + <goals> + <goal>materialize-products</goal> + </goals> + </execution> + <execution> + <id>archive-products</id> + <phase>pre-integration-test</phase> + <goals> + <goal>archive-products</goal> + </goals> + <configuration> + <formats> + <linux>tar.gz</linux> + <macosx>tar.gz</macosx> + <solaris>zip</solaris> + <win32>zip</win32> + </formats> + </configuration> + </execution> + </executions> + <configuration> + <products> + <product> + <archiveFileName>${archiveFileName}</archiveFileName> + <id>${productId}</id> + <rootFolder>${rootFolder}</rootFolder> + <rootFolders> + <macosx>${rootFolderMac}</macosx> + </rootFolders> + </product> + </products> + <source>repository</source> + </configuration> + </plugin> +<!-- + <plugin> + <groupId>org.eclipse.cbi.maven.plugins</groupId> + <artifactId>eclipse-macsigner-plugin</artifactId> + <version>${cbi-plugins.version}</version> + <executions> + <execution> + <goals> + <goal>sign</goal> + </goals> + <configuration> + <signFiles> + <signFile>${project.build.directory}/products/${productId}/macosx/cocoa/x86_64/${rootFolderMac}</signFile> + </signFiles> + </configuration> + </execution> + </executions> + </plugin> + --> + </plugins> + </build> + </profile> + <!-- Deploy RCP builds and update site to the downloads area --> + <profile> + <id>deploy-rcp</id> + <properties> + <rcpDestination>/home/data/httpd/download.eclipse.org/tracecompass.incubator/trace-server/rcp/</rcpDestination> + <rcpSiteDestination>/home/data/httpd/download.eclipse.org/tracecompass.incubator/trace-server/rcp-repository</rcpSiteDestination> + </properties> + <build> + <plugins> + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + <execution> + <id>deploy</id> + <phase>install</phase> + <goals> + <goal>run</goal> + </goals> + <configuration> + <target> + <!-- Cleanup the "rcp" destination, and copy over the new archives --> + <delete includeemptydirs="false"> + <fileset dir="${rcpDestination}"> + <include name="*.tar.gz" /> + <include name="*.zip" /> + </fileset> + </delete> + <copy includeemptydirs="false" todir="${rcpDestination}"> + <fileset dir="target/products"> + <include name="trace-compass-*" /> + </fileset> + </copy> + + <!-- Cleanup the "rcp-repository" update site, and copy over the new one --> + <delete includeemptydirs="false"> + <fileset + dir="${rcpSiteDestination}"> + <include name="**" /> + </fileset> + </delete> + <copy includeemptydirs="false" todir="${rcpSiteDestination}"> + <fileset dir="target/repository"> + <include name="**" /> + </fileset> + </copy> + </target> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> <id>build-one-rcp</id> <build> <plugins> diff --git a/trace-server/pom.xml b/trace-server/pom.xml index 1030c9745..49e5abd20 100644 --- a/trace-server/pom.xml +++ b/trace-server/pom.xml @@ -28,7 +28,7 @@ <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest</module> <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core</module> <module>org.eclipse.tracecompass.incubator.trace.server.jersey.rest.core.tests</module> - <!--module>org.eclipse.tracecompass.incubator.trace.server.product</module--> + <module>org.eclipse.tracecompass.incubator.trace.server.product</module> <!-- insert modules here --> </modules> diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java index caa88aaa1..3385fcdf0 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeDataProvider.java @@ -23,13 +23,14 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.opentracing.core.analysis.spanlife.SpanLifeEntryModel.LogEvent; import org.eclipse.tracecompass.incubator.internal.opentracing.core.event.IOpenTracingConstants; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -37,8 +38,10 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; @@ -83,13 +86,17 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @Override - public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { ITmfStateSystem ss = getAnalysisModule().getStateSystem(); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<@NonNull Integer> quarks = entries.values(); long startTime = filter.getStart(); @@ -143,27 +150,28 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); /* Do the actual query */ for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -177,7 +185,7 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -186,16 +194,16 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long rootId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); - builder.add(new TimeGraphEntryModel(rootId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); + builder.add(new TimeGraphEntryModel(rootId, -1, Collections.singletonList(String.valueOf(getTrace().getName())), ss.getStartTime(), ss.getCurrentEndTime())); for (int traceQuark : ss.getSubAttributes(ITmfStateSystem.ROOT_ATTRIBUTE, false)) { addTrace(ss, builder, traceQuark, rootId); } - return builder.build(); + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addTrace(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { @@ -215,7 +223,7 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull } long traceQuarkId = getId(quark); - builder.add(new TimeGraphEntryModel(traceQuarkId, parentId, ss.getAttributeName(quark), ss.getStartTime(), ss.getCurrentEndTime())); + builder.add(new TimeGraphEntryModel(traceQuarkId, parentId, Collections.singletonList(ss.getAttributeName(quark)), ss.getStartTime(), ss.getCurrentEndTime())); int ustSpansQuark; try { @@ -242,7 +250,7 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull } } catch (IndexOutOfBoundsException | TimeRangeException | StateSystemDisposedException e) { } - builder.add(new SpanLifeEntryModel(childId, parentId, getSpanName(childName), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName))); + builder.add(new SpanLifeEntryModel(childId, parentId, Collections.singletonList(getSpanName(childName)), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName))); addChildren(ss, builder, child, childId, logsQuarks); } } @@ -272,7 +280,7 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull return; } long childId = getId(ustSpan); - builder.add(new SpanLifeEntryModel(childId, parentId, getSpanName(childName), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName))); + builder.add(new SpanLifeEntryModel(childId, parentId, Collections.singletonList(getSpanName(childName)), ss.getStartTime(), ss.getCurrentEndTime(), logs, getErrorTag(childName), getProcessName(childName))); addUstChildren(ss, builder, child, ustQuark, childId, logsQuarks); } } @@ -327,4 +335,18 @@ public class SpanLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNull return OTHER; } } + + @Deprecated + @Override + public TmfModelResponse<List<ITimeGraphArrow>> fetchArrows(TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Deprecated + @Override + public TmfModelResponse<Map<String, String>> fetchTooltip(SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } } diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java index 3e901715c..b16b9d7a6 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.core/src/org/eclipse/tracecompass/incubator/internal/opentracing/core/analysis/spanlife/SpanLifeEntryModel.java @@ -86,7 +86,7 @@ public class SpanLifeEntryModel extends TimeGraphEntryModel { * @param processName * process name */ - public SpanLifeEntryModel(long id, long parentId, String name, long startTime, long endTime, List<LogEvent> logs, boolean errorTag, String processName) { + public SpanLifeEntryModel(long id, long parentId, List<String> name, long startTime, long endTime, List<LogEvent> logs, boolean errorTag, String processName) { super(id, parentId, name, startTime, endTime); fLogs = logs; fErrorTag = errorTag; diff --git a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java index a0ea65949..a26a917aa 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.opentracing.ui/src/org/eclipse/tracecompass/incubator/internal/opentracing/ui/view/spanlife/SpanLifePresentationProvider.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGBA; import org.eclipse.tracecompass.incubator.internal.opentracing.core.analysis.spanlife.SpanLifeEntryModel; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; @@ -113,7 +114,7 @@ public class SpanLifePresentationProvider extends TimeGraphPresentationProvider times.add(windowEndTime); SelectionTimeQueryFilter filter = new SelectionTimeQueryFilter(times, Collections.singleton(id)); - TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> tooltipResponse = provider.fetchTooltip(filter, new NullProgressMonitor()); + TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> tooltipResponse = provider.fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(filter), new NullProgressMonitor()); Map<@NonNull String, @NonNull String> tooltipModel = tooltipResponse.getModel(); if (tooltipModel != null) { eventHoverToolTipInfo.putAll(tooltipModel); diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java index 002fc0797..02859f345 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/connections/RosConnectionsDataProvider.java @@ -22,11 +22,12 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -34,15 +35,16 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; import com.google.common.collect.ImmutableList.Builder; +import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; /** @@ -72,13 +74,27 @@ public class RosConnectionsDataProvider extends AbstractTimeGraphDataProvider<@N // fModule = analysisModule; } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -88,30 +104,34 @@ public class RosConnectionsDataProvider extends AbstractTimeGraphDataProvider<@N } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); // Query for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -127,7 +147,7 @@ public class RosConnectionsDataProvider extends AbstractTimeGraphDataProvider<@N } rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -136,13 +156,12 @@ public class RosConnectionsDataProvider extends AbstractTimeGraphDataProvider<@N } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build(); - return models; + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java index bbb40de7c..c6aaaa4c1 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/messageflow/RosMessageFlowDataProvider.java @@ -11,6 +11,7 @@ package org.eclipse.tracecompass.incubator.internal.ros.core.analysis.messageflo import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,7 +25,8 @@ import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messa import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messageflow.RosMessageFlowSegment; import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.model.messageflow.RosMessageFlowSegment.SegmentType; import org.eclipse.tracecompass.internal.tmf.core.model.AbstractTmfTraceDataProvider; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -34,8 +36,10 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; @@ -87,9 +91,25 @@ public class RosMessageFlowDataProvider extends AbstractTmfTraceDataProvider imp return fSegmentToId.computeIfAbsent(segment, i -> ATOMIC_LONG.getAndIncrement()); } + @Deprecated @Override - public @NonNull TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> fetchTree( - @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public @NonNull TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> fetchTree(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> response = fetchTree(FetchParametersUtils.timeQueryToMap(filter), monitor); + TmfTreeModel<@NonNull TimeGraphEntryModel> model = response.getModel(); + List<@NonNull TimeGraphEntryModel> treeModel = null; + if (model != null) { + treeModel = model.getEntries(); + } + return new TmfModelResponse<>(treeModel, response.getStatus(), response.getStatusMessage()); + } + + @Override + public @NonNull TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> fetchTree(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } + if (!fModel.isModelDone()) { return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING); } @@ -99,7 +119,7 @@ public class RosMessageFlowDataProvider extends AbstractTmfTraceDataProvider imp entries.add(new TimeGraphEntryModel(rootId, -1, String.valueOf(getTrace().getName()), filter.getStart(), filter.getEnd())); RosMessageFlowSegment firstSegment = fModel.getFirstSegment(); addTreeChildren(entries, firstSegment, rootId); - return new TmfModelResponse<>(entries, Status.COMPLETED, CommonStatusMessage.COMPLETED); + return new TmfModelResponse<>(new TmfTreeModel<>(Collections.emptyList(), entries), Status.COMPLETED, CommonStatusMessage.COMPLETED); } private void addTreeChildren(List<@NonNull TimeGraphEntryModel> entries, RosMessageFlowSegment segment, long parentId) { @@ -114,29 +134,46 @@ public class RosMessageFlowDataProvider extends AbstractTmfTraceDataProvider imp } } + @Deprecated + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> fetchRowModel(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + @NonNull Map<@NonNull String, @NonNull Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + TmfModelResponse<@NonNull TimeGraphModel> response = fetchRowModel(parameters, monitor); + TimeGraphModel model = response.getModel(); + List<@NonNull ITimeGraphRowModel> rows = null; + if (model != null) { + rows = model.getRows(); + } + return new TmfModelResponse<>(rows, response.getStatus(), response.getStatusMessage()); + } + @Override - public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> fetchRowModel( - @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + public @NonNull TmfModelResponse<@NonNull TimeGraphModel> fetchRowModel(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } + if (!fModel.isModelDone()) { return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING); } - @NonNull Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + @NonNull Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(fetchParameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); RosMessageFlowSegment firstSegment = fModel.getFirstSegment(); addRowModels(rows, firstSegment, predicates, monitor); - return new TmfModelResponse<>(rows, Status.COMPLETED, CommonStatusMessage.COMPLETED); + return new TmfModelResponse<>(new TimeGraphModel(rows), Status.COMPLETED, CommonStatusMessage.COMPLETED); } private void addRowModels( List<@NonNull ITimeGraphRowModel> rows, RosMessageFlowSegment segment, - @NonNull Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates, + @NonNull Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates, @Nullable IProgressMonitor monitor) { @NonNull List<@NonNull ITimeGraphState> eventList = new ArrayList<>(); @@ -171,8 +208,19 @@ public class RosMessageFlowDataProvider extends AbstractTmfTraceDataProvider imp return 4; } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + return fetchArrows(FetchParametersUtils.timeQueryToMap(filter), monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + TimeQueryFilter filter = FetchParametersUtils.createTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } + if (!fModel.isModelDone()) { return new TmfModelResponse<>(null, Status.RUNNING, CommonStatusMessage.RUNNING); } @@ -217,8 +265,14 @@ public class RosMessageFlowDataProvider extends AbstractTmfTraceDataProvider imp return 7; } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + return fetchTooltip(FetchParametersUtils.selectionTimeQueryToMap(filter), monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { // TODO return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java index b7502765b..5c9e4d46c 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/nodes/RosNodesDataProvider.java @@ -22,11 +22,12 @@ import java.util.function.Predicate; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -34,13 +35,14 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; @@ -68,13 +70,27 @@ public class RosNodesDataProvider extends AbstractTimeGraphDataProvider<@NonNull super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -84,30 +100,34 @@ public class RosNodesDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); // Query for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -123,7 +143,7 @@ public class RosNodesDataProvider extends AbstractTimeGraphDataProvider<@NonNull } rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -132,13 +152,12 @@ public class RosNodesDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build(); - return models; + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java index 1b78870fc..170842497 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/queues/RosQueuesDataProvider.java @@ -23,11 +23,12 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.AbstractRosStateProvider; import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.ElementReferenceState; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -35,13 +36,14 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; @@ -69,13 +71,27 @@ public class RosQueuesDataProvider extends AbstractTimeGraphDataProvider<@NonNul super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -85,30 +101,34 @@ public class RosQueuesDataProvider extends AbstractTimeGraphDataProvider<@NonNul } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); // Query for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -131,7 +151,7 @@ public class RosQueuesDataProvider extends AbstractTimeGraphDataProvider<@NonNul rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -140,13 +160,12 @@ public class RosQueuesDataProvider extends AbstractTimeGraphDataProvider<@NonNul } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build(); - return models; + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java index b57d3896d..a171b0acf 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/tasks/RosTasksDataProvider.java @@ -21,11 +21,12 @@ import java.util.function.Predicate; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -33,13 +34,14 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; @@ -67,13 +69,27 @@ public class RosTasksDataProvider extends AbstractTimeGraphDataProvider<@NonNull super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -83,30 +99,34 @@ public class RosTasksDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); // Query for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -123,7 +143,7 @@ public class RosTasksDataProvider extends AbstractTimeGraphDataProvider<@NonNull rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -132,13 +152,12 @@ public class RosTasksDataProvider extends AbstractTimeGraphDataProvider<@NonNull } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build(); - return models; + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java index ca57108fb..3ec78e068 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.ros.core/src/org/eclipse/tracecompass/incubator/internal/ros/core/analysis/timers/RosTimersDataProvider.java @@ -23,11 +23,12 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.ElementReferenceState; import org.eclipse.tracecompass.incubator.internal.ros.core.analysis.PeriodState; -import org.eclipse.tracecompass.internal.tmf.core.model.filters.TimeGraphStateQueryFilter; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; @@ -35,13 +36,14 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; import com.google.common.collect.TreeMultimap; @@ -69,13 +71,27 @@ public class RosTimersDataProvider extends AbstractTimeGraphDataProvider<@NonNul super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { - return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { + return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull Map<@NonNull String, @NonNull Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } @@ -85,30 +101,34 @@ public class RosTimersDataProvider extends AbstractTimeGraphDataProvider<@NonNul } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); + if (filter == null) { + return null; + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); // Query for (ITmfStateInterval interval : ss.query2D(entries.values(), times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } intervals.put(interval.getAttribute(), interval); } - Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull String>>> predicates = new HashMap<>(); - if (filter instanceof TimeGraphStateQueryFilter) { - TimeGraphStateQueryFilter timeEventFilter = (TimeGraphStateQueryFilter) filter; - predicates.putAll(computeRegexPredicate(timeEventFilter)); + Map<@NonNull Integer, @NonNull Predicate<@NonNull Multimap<@NonNull String, @NonNull Object>>> predicates = new HashMap<>(); + Multimap<@NonNull Integer, @NonNull String> regexesMap = DataProviderParameterUtils.extractRegexFilter(parameters); + if (regexesMap != null) { + predicates.putAll(computeRegexPredicate(regexesMap)); } List<@NonNull ITimeGraphRowModel> rows = new ArrayList<>(); for (Map.Entry<@NonNull Long, @NonNull Integer> entry : entries.entrySet()) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } List<ITimeGraphState> eventList = new ArrayList<>(); @@ -139,7 +159,7 @@ public class RosTimersDataProvider extends AbstractTimeGraphDataProvider<@NonNul rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -148,13 +168,12 @@ public class RosTimersDataProvider extends AbstractTimeGraphDataProvider<@NonNul } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull Map<@NonNull String, @NonNull Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); builder.add(new TimeGraphEntryModel(parentId, -1, String.valueOf(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - ImmutableList<@NonNull TimeGraphEntryModel> models = builder.build(); - return models; + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java index a68bb0097..74566888c 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ContextTest.java @@ -22,15 +22,17 @@ import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.cont import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider; import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProviderFactory; import org.eclipse.tracecompass.incubator.internal.traceevent.core.trace.TraceEventTrace; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; -import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; @@ -80,25 +82,25 @@ public class ContextTest { */ assertNotNull(provider); TimeQueryFilter filter = new TimeQueryFilter(trace.getStartTime().toNanos(), trace.getEndTime().toNanos(), 1000); - TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = provider.fetchTree(filter, new NullProgressMonitor()); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = provider.fetchTree(FetchParametersUtils.timeQueryToMap(filter), new NullProgressMonitor()); assertEquals(tree.getStatus(), TmfModelResponse.Status.COMPLETED); - List<@NonNull TimeGraphEntryModel> model = tree.getModel(); + TmfTreeModel<@NonNull TimeGraphEntryModel> model = tree.getModel(); /* * Does the query have the right data? */ assertNotNull(model); - TimeGraphEntryModel rootEntry = model.get(0); + TimeGraphEntryModel rootEntry = model.getEntries().get(0); assertEquals("blink", rootEntry.getName()); SelectionTimeQueryFilter selectionFilter = new SelectionTimeQueryFilter(trace.getStartTime().toNanos(), trace.getEndTime().toNanos(), 1000, Collections.singleton(rootEntry.getId())); - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> rowModel = provider.fetchRowModel(selectionFilter, new NullProgressMonitor()); + TmfModelResponse<@NonNull TimeGraphModel> rowModel = provider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(selectionFilter), new NullProgressMonitor()); /* * Does the second query have the bookmarks? */ assertNotNull(rowModel); - List<@NonNull ITimeGraphRowModel> markerList = rowModel.getModel(); + TimeGraphModel markerList = rowModel.getModel(); assertNotNull(markerList); - assertFalse(markerList.isEmpty()); - List<@NonNull ITimeGraphState> bookmarks = markerList.get(0).getStates(); + assertFalse(markerList.getRows().isEmpty()); + List<@NonNull ITimeGraphState> bookmarks = markerList.getRows().get(0).getStates(); assertEquals(3, bookmarks.size()); assertEquals(Collections.singleton("FrameBlameContext"), Sets.newHashSet(Lists.transform(bookmarks, bookmark -> bookmark.getLabel()))); } finally { diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java index b0be4a97f..ba283fd70 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core.tests/src/org/eclipse/tracecompass/incubator/traceevent/core/tests/ObjectLifeAnalysisTest.java @@ -21,12 +21,15 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeAnalysis; import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeDataProvider; import org.eclipse.tracecompass.incubator.internal.traceevent.core.trace.TraceEventTrace; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; @@ -102,15 +105,15 @@ public class ObjectLifeAnalysisTest { @Test @SuppressWarnings("restriction") public void test() { - TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = fDataProvider.fetchTree(new TimeQueryFilter(fStart, fEnd, 1000), new NullProgressMonitor()); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = fDataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(fStart, fEnd, 1000)), new NullProgressMonitor()); assertEquals(Status.COMPLETED, tree.getStatus()); - List<@NonNull TimeGraphEntryModel> treeModel = tree.getModel(); + TmfTreeModel<@NonNull TimeGraphEntryModel> treeModel = tree.getModel(); assertNotNull(treeModel); - TimeGraphEntryModel mufasaEntry = getValueEntry(treeModel, "Mufasa"); - TimeGraphEntryModel sarabiEntry = getValueEntry(treeModel, "Sarabi"); - TimeGraphEntryModel scarEntry = getValueEntry(treeModel, "Scar"); - TimeGraphEntryModel simbaEntry = getValueEntry(treeModel, "Simba"); + TimeGraphEntryModel mufasaEntry = getValueEntry(treeModel.getEntries(), "Mufasa"); + TimeGraphEntryModel sarabiEntry = getValueEntry(treeModel.getEntries(), "Sarabi"); + TimeGraphEntryModel scarEntry = getValueEntry(treeModel.getEntries(), "Scar"); + TimeGraphEntryModel simbaEntry = getValueEntry(treeModel.getEntries(), "Simba"); assertNotNull(mufasaEntry); assertNotNull(sarabiEntry); assertNotNull(scarEntry); @@ -120,25 +123,26 @@ public class ObjectLifeAnalysisTest { * Remember, state system is in nanos, time range is known since we know the * trace */ - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> resp = fDataProvider.fetchRowModel(new SelectionTimeQueryFilter(100000L, 300000L, 200, items), new NullProgressMonitor()); + TmfModelResponse<@NonNull TimeGraphModel> resp = fDataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(100000L, 300000L, 200, items)), new NullProgressMonitor()); assertEquals(Status.COMPLETED, resp.getStatus()); - List<@NonNull ITimeGraphRowModel> models = resp.getModel(); - assertNotNull(models); - ImmutableMap<Long, @NonNull ITimeGraphRowModel> groupRowsById = Maps.uniqueIndex(models, ITimeGraphRowModel::getEntryID); + TimeGraphModel model = resp.getModel(); + assertNotNull(model); + List<@NonNull ITimeGraphRowModel> modelRows = model.getRows(); + ImmutableMap<Long, @NonNull ITimeGraphRowModel> groupRowsById = Maps.uniqueIndex(modelRows, ITimeGraphRowModel::getEntryID); ITimeGraphRowModel mufasaRow = groupRowsById.get(mufasaEntry.getId()); assertNotNull(mufasaRow); assertEquals("", mufasaRow.getStates().get(0).getLabel()); assertEquals(null, mufasaRow.getStates().get(1).getLabel()); - ITimeGraphRowModel sarabiRow = models.get(1); + ITimeGraphRowModel sarabiRow = modelRows.get(1); assertNotNull(sarabiRow); assertEquals(null, sarabiRow.getStates().get(0).getLabel()); assertEquals("", sarabiRow.getStates().get(1).getLabel()); assertEquals(null, sarabiRow.getStates().get(2).getLabel()); - ITimeGraphRowModel scarRow = models.get(2); + ITimeGraphRowModel scarRow = modelRows.get(2); assertNotNull(scarRow); // The bad guy assertEquals(null, scarRow.getStates().get(0).getLabel()); assertEquals("", scarRow.getStates().get(1).getLabel()); - ITimeGraphRowModel simbaRow = models.get(3); + ITimeGraphRowModel simbaRow = modelRows.get(3); assertNotNull(simbaRow); assertEquals(null, simbaRow.getStates().get(0).getLabel()); assertEquals("", simbaRow.getStates().get(1).getLabel()); diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java index d961fa22d..0abc21782 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/context/ContextDataProvider.java @@ -21,6 +21,7 @@ import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; @@ -28,11 +29,12 @@ import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; -import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; @@ -119,24 +121,39 @@ public class ContextDataProvider extends AbstractTimeGraphDataProvider<@NonNull return true; } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, Status.COMPLETED, "Not supported"); //$NON-NLS-1$ } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, Status.COMPLETED, "Not supported"); //$NON-NLS-1$ } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { /* * Order is not important here */ Map<Integer, String[]> paths = new HashMap<>(); List<ITimeGraphState> markerList = new ArrayList<>(); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); Set<Integer> quarks = new HashSet<>(); Map<@NonNull Long, @NonNull Integer> selectedEntries = getSelectedEntries(filter); @@ -150,7 +167,7 @@ public class ContextDataProvider extends AbstractTimeGraphDataProvider<@NonNull /* Do the actual query */ for (ITmfStateInterval interval : ss.query2D(quarks, times)) { if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } if (interval.getValue() instanceof Integer) { long startTime = interval.getStartTime(); @@ -161,21 +178,21 @@ public class ContextDataProvider extends AbstractTimeGraphDataProvider<@NonNull } if (monitor != null && monitor.isCanceled()) { - return Collections.emptyList(); + return new TimeGraphModel(Collections.emptyList()); } - return Collections.singletonList(new TimeGraphRowModel(getId(ITmfStateSystem.ROOT_ATTRIBUTE), markerList)); + return new TimeGraphModel(Collections.singletonList(new TimeGraphRowModel(getId(ITmfStateSystem.ROOT_ATTRIBUTE), markerList))); } @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { long rootId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); List<@NonNull Integer> attribs = ss.getSubAttributes(ITmfStateSystem.ROOT_ATTRIBUTE, false); List<@NonNull TimeGraphEntryModel> retVal = new ArrayList<>(); for (Integer attrib : attribs) { String[] strings = ss.getFullAttributePathArray(attrib); - retVal.add(new TimeGraphEntryModel(getId(attrib), rootId, strings[0], ss.getStartTime(), ss.getCurrentEndTime())); + retVal.add(new TimeGraphEntryModel(getId(attrib), rootId, Collections.singletonList(strings[0]), ss.getStartTime(), ss.getCurrentEndTime())); } - return retVal; + return new TmfTreeModel<>(Collections.emptyList(), retVal); } } diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java index e46ee2ab4..cd0a07e81 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.core/src/org/eclipse/tracecompass/incubator/internal/traceevent/core/analysis/objectlife/ObjectLifeDataProvider.java @@ -19,6 +19,7 @@ import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.internal.tmf.core.model.timegraph.AbstractTimeGraphDataProvider; import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException; @@ -30,8 +31,10 @@ import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphArrow; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphState; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; @@ -64,14 +67,32 @@ public class ObjectLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNu super(trace, analysisModule); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(@NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.timeQueryToMap(filter); + return fetchArrows(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull List<@NonNull ITimeGraphArrow>> fetchArrows(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { return new TmfModelResponse<>(null, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); } + @Deprecated @Override public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(@NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) { + Map<String, Object> parameters = FetchParametersUtils.selectionTimeQueryToMap(filter); + return fetchTooltip(parameters, monitor); + } + + @Override + public @NonNull TmfModelResponse<@NonNull Map<@NonNull String, @NonNull String>> fetchTooltip(Map<String, Object> fetchParameters, @Nullable IProgressMonitor monitor) { ITmfStateSystem ss = getAnalysisModule().getStateSystem(); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(fetchParameters); + if (filter == null) { + return new TmfModelResponse<>(null, ITmfResponse.Status.FAILED, CommonStatusMessage.INCORRECT_QUERY_PARAMETERS); + } Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<@NonNull Integer> quarks = entries.values(); long start = filter.getStart(); @@ -105,9 +126,10 @@ public class ObjectLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNu } @Override - protected @Nullable List<@NonNull ITimeGraphRowModel> getRowModel(@NonNull ITmfStateSystem ss, @NonNull SelectionTimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @Nullable TimeGraphModel getRowModel(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { TreeMultimap<Integer, ITmfStateInterval> intervals = TreeMultimap.create(Comparator.naturalOrder(), Comparator.comparing(ITmfStateInterval::getStartTime)); + SelectionTimeQueryFilter filter = FetchParametersUtils.createSelectionTimeQuery(parameters); Map<@NonNull Long, @NonNull Integer> entries = getSelectedEntries(filter); Collection<Long> times = getTimes(filter, ss.getStartTime(), ss.getCurrentEndTime()); /* Do the actual query */ @@ -134,7 +156,7 @@ public class ObjectLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNu rows.add(new TimeGraphRowModel(entry.getKey(), eventList)); } - return rows; + return new TimeGraphModel(rows); } @Override @@ -144,18 +166,18 @@ public class ObjectLifeDataProvider extends AbstractTimeGraphDataProvider<@NonNu @SuppressWarnings("restriction") @Override - protected @NonNull List<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, @NonNull TimeQueryFilter filter, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { + protected @NonNull TmfTreeModel<@NonNull TimeGraphEntryModel> getTree(@NonNull ITmfStateSystem ss, Map<String, Object> parameters, @Nullable IProgressMonitor monitor) throws StateSystemDisposedException { Builder<@NonNull TimeGraphEntryModel> builder = new Builder<>(); long parentId = getId(ITmfStateSystem.ROOT_ATTRIBUTE); - builder.add(new TimeGraphEntryModel(parentId, -1, getTrace().getName(), ss.getStartTime(), ss.getCurrentEndTime())); + builder.add(new TimeGraphEntryModel(parentId, -1, Collections.singletonList(getTrace().getName()), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, ITmfStateSystem.ROOT_ATTRIBUTE, parentId); - return builder.build(); + return new TmfTreeModel<>(Collections.emptyList(), builder.build()); } private void addChildren(ITmfStateSystem ss, Builder<@NonNull TimeGraphEntryModel> builder, int quark, long parentId) { for (Integer child : ss.getSubAttributes(quark, false)) { long childId = getId(child); - builder.add(new TimeGraphEntryModel(childId, parentId, ss.getAttributeName(child), ss.getStartTime(), ss.getCurrentEndTime())); + builder.add(new TimeGraphEntryModel(childId, parentId, Collections.singletonList(ss.getAttributeName(child)), ss.getStartTime(), ss.getCurrentEndTime())); addChildren(ss, builder, child, childId); } } diff --git a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java index e3f7938e0..e7cd5b911 100644 --- a/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java +++ b/tracetypes/org.eclipse.tracecompass.incubator.traceevent.ui/src/org/eclipse/tracecompass/incubator/internal/traceevent/ui/markers/ContextMarkers.java @@ -21,13 +21,16 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.swt.graphics.RGBA; import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider; import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.context.ContextDataProvider.MarkerModel; +import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils; import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel; import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphState; import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel; +import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel; import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeDataModel; +import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel; import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; @@ -68,14 +71,14 @@ public class ContextMarkers implements IMarkerEventSource { if (dataProvider == null) { return Collections.emptyList(); } - TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(new TimeQueryFilter(Collections.emptyList()), new NullProgressMonitor()); - List<@NonNull TimeGraphEntryModel> model = tree.getModel(); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(Collections.emptyList())), new NullProgressMonitor()); + TmfTreeModel<@NonNull TimeGraphEntryModel> model = tree.getModel(); if (model == null) { return Collections.emptyList(); } Set<String> data = new HashSet<>(); - for (TmfTreeDataModel elem : model) { + for (TmfTreeDataModel elem : model.getEntries()) { data.add(elem.getName()); } List<String> dataList = Lists.newArrayList(data); @@ -93,25 +96,25 @@ public class ContextMarkers implements IMarkerEventSource { if (dataProvider == null) { return Collections.emptyList(); } - TmfModelResponse<@NonNull List<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(new TimeQueryFilter(Collections.emptyList()), monitor); - List<@NonNull TimeGraphEntryModel> treeModels = tree.getModel(); + TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = dataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(Collections.emptyList())), monitor); + TmfTreeModel<@NonNull TimeGraphEntryModel> treeModels = tree.getModel(); if (treeModels == null) { return Collections.emptyList(); } List<Long> ids = new ArrayList<>(); - for (TmfTreeDataModel treeModel : treeModels) { + for (TmfTreeDataModel treeModel : treeModels.getEntries()) { if (treeModel.getName().startsWith(category)) { ids.add(treeModel.getId()); } } - TmfModelResponse<@NonNull List<@NonNull ITimeGraphRowModel>> res = dataProvider.fetchRowModel(new SelectionTimeQueryFilter(startTime, endTime, (int) Math.max(2, (((double) endTime - startTime) / resolution)), ids), monitor); - List<@NonNull ITimeGraphRowModel> rowModels = res.getModel(); - if (rowModels == null || rowModels.isEmpty()) { + TmfModelResponse<@NonNull TimeGraphModel> res = dataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(startTime, endTime, (int) Math.max(2, (((double) endTime - startTime) / resolution)), ids)), monitor); + TimeGraphModel rowModels = res.getModel(); + if (rowModels == null || rowModels.getRows().isEmpty()) { return Collections.emptyList(); } List<IMarkerEvent> events = new ArrayList<>(); - for (ITimeGraphRowModel rowModel : rowModels) { + for (ITimeGraphRowModel rowModel : rowModels.getRows()) { for (ITimeGraphState model : rowModel.getStates()) { if (model instanceof MarkerModel) { events.add(new MarkerEvent(null, model.getStartTime(), model.getDuration(), ((MarkerModel) model).getCategory(), ONE_TRUE_COLOUR, model.getLabel(), true)); |