From ec832115cf39a85350a1d92574dbf7c455e6c727 Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Thu, 9 Oct 2025 16:12:42 +0200 Subject: [PATCH 1/2] tmf: Add generic object data provider Add IObjectDataProvider interface that returns an ObjectModel with a generic object, and optional next and previous navigation parameters. Add DATA provider type. Add selectionRange to IDataProviderCapabilities. Signed-off-by: Patrick Tasse --- .../META-INF/MANIFEST.MF | 1 + .../IDataProviderCapabilities.java | 19 +++- .../dataprovider/IDataProviderDescriptor.java | 7 +- .../core/model/DataProviderCapabilities.java | 22 +++++ .../model/object/IObjectDataProvider.java | 29 +++++++ .../tmf/core/model/object/ObjectModel.java | 87 +++++++++++++++++++ .../tmf/core/model/object/package-info.java | 13 +++ 7 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/IObjectDataProvider.java create mode 100644 tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/ObjectModel.java create mode 100644 tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/package-info.java diff --git a/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF b/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF index c5da23c203..276091daa4 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF +++ b/tmf/org.eclipse.tracecompass.tmf.core/META-INF/MANIFEST.MF @@ -109,6 +109,7 @@ Export-Package: org.eclipse.tracecompass.internal.provisional.tmf.core.model, org.eclipse.tracecompass.tmf.core.model.annotations, org.eclipse.tracecompass.tmf.core.model.filters, org.eclipse.tracecompass.tmf.core.model.genericxy, + org.eclipse.tracecompass.tmf.core.model.object, org.eclipse.tracecompass.tmf.core.model.timegraph, org.eclipse.tracecompass.tmf.core.model.tree, org.eclipse.tracecompass.tmf.core.model.xy, diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderCapabilities.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderCapabilities.java index 4919c50c35..7e108b07cb 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderCapabilities.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderCapabilities.java @@ -15,14 +15,18 @@ /** * Interface to implement to indicate capabilities of a data provider, such as * "canCreate" and "canDelete" capability. - * + *

* "canCreate" indicates that a given data provider can create a derived data * provider. "canDelete" indicates that a given data provider can be deleted. - * + *

* Call method {@link IDataProviderFactory#getAdapter(Class)} with class * {@link ITmfDataProviderConfigurator} to obtain an instance of * {@link ITmfDataProviderConfigurator}, which implements the "canCreate" and * "canDelete" capabilities. + *

+ * "selectionRange" indicates that a given data provider can use the selection + * range to compute its data. Clients should include the selection range in + * query parameters and refresh the data when the selection range changes. * * @since 9.6 * @author Bernd Hufmann @@ -43,4 +47,15 @@ public interface IDataProviderCapabilities { * {@code false} */ boolean canDelete(); + + /** + * Whether the data provider uses the selection range. + * + * @return {@code true} if this data provider uses the selection range, else + * {@code false} + * @since 10.2 + */ + default boolean selectionRange() { + return false; + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderDescriptor.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderDescriptor.java index 080f701989..64aa328b7c 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderDescriptor.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/dataprovider/IDataProviderDescriptor.java @@ -78,7 +78,12 @@ public enum ProviderType { * A provider for generic xy charts with a time-less x-axis * @since 10.1 */ - TREE_GENERIC_XY + TREE_GENERIC_XY, + /** + * A provider of generic data objects + * @since 10.2 + */ + DATA } /** diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/DataProviderCapabilities.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/DataProviderCapabilities.java index 80079b49e9..e332ed5857 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/DataProviderCapabilities.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/DataProviderCapabilities.java @@ -29,6 +29,7 @@ public class DataProviderCapabilities implements IDataProviderCapabilities { private final boolean canCreate; private final boolean canDelete; + private final boolean selectionRange; /** * Constructor @@ -39,6 +40,7 @@ public class DataProviderCapabilities implements IDataProviderCapabilities { public DataProviderCapabilities(Builder builder) { canCreate = builder.canCreate; canDelete = builder.canDelete; + selectionRange = builder.selectionRange; } @Override @@ -51,6 +53,11 @@ public boolean canDelete() { return canDelete; } + @Override + public boolean selectionRange() { + return selectionRange; + } + @Override @SuppressWarnings("nls") public String toString() { @@ -84,6 +91,7 @@ public boolean equals(@Nullable Object obj) { public static class Builder { private boolean canCreate = false; private boolean canDelete = false; + private boolean selectionRange = false; /** * Sets canCreate flag @@ -111,6 +119,20 @@ public Builder setCanDelete(boolean canDelete) { return this; } + /** + * Sets selectionRange flag + * + * @param selectionRange + * {@code true} if this data provider uses the selection + * range, else {@code false} + * @return the builder instance. + * @since 10.2 + */ + public Builder setSelectionRange(boolean selectionRange) { + this.selectionRange = selectionRange; + return this; + } + /** * The method to construct an instance of * {@link IDataProviderCapabilities} diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/IObjectDataProvider.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/IObjectDataProvider.java new file mode 100644 index 0000000000..adc26f1209 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/IObjectDataProvider.java @@ -0,0 +1,29 @@ +package org.eclipse.tracecompass.tmf.core.model.object; + +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.tmf.core.model.ITmfDataProvider; +import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; + +/** + * Interface for a data provider that returns a generic object as model + * + * @since 10.2 + */ +public interface IObjectDataProvider extends ITmfDataProvider { + + /** + * This method computes a generic object model. Then, it returns a + * {@link TmfModelResponse} that contains the model. + * + * @param fetchParameters + * Map of parameters that can be used to compute result object + * @param monitor + * A ProgressMonitor to cancel task + * @return A {@link TmfModelResponse} instance + */ + public TmfModelResponse fetchData(Map fetchParameters, @Nullable IProgressMonitor monitor); + +} diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/ObjectModel.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/ObjectModel.java new file mode 100644 index 0000000000..e6ef024742 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/ObjectModel.java @@ -0,0 +1,87 @@ +/********************************************************************** + * Copyright (c) 2025 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +package org.eclipse.tracecompass.tmf.core.model.object; + +import org.eclipse.jdt.annotation.Nullable; + +/** + * Represents a generic object with optional navigation parameters. + *

+ * If the object is a partial subdivision of the full object, then the optional + * next and previous navigation parameter objects can be set, and later returned + * as query parameters to get the following or preceding subdivision. + * + * @since 10.2 + */ +public class ObjectModel { + + private final Object fObject; + private @Nullable Object fNext; + private @Nullable Object fPrevious; + + /** + * Constructor + * + * @param object + * the generic object represented by this model + */ + public ObjectModel(Object object) { + fObject = object; + } + + /** + * Get the generic object represented by this model + * + * @return the object + */ + public Object getObject() { + return fObject; + } + + /** + * Get the next navigation parameter object + * + * @return the next navigation parameter object + */ + public @Nullable Object getNext() { + return fNext; + } + + /** + * Get the previous navigation parameter object + * + * @return the previous navigation parameter object + */ + public @Nullable Object getPrevious() { + return fPrevious; + } + + /** + * Set the next navigation parameter object + * + * @param next + * the next navigation parameter object + */ + public void setNext(Object next) { + fNext = next; + } + + /** + * Set the previous navigation parameter object + * + * @param previous + * the previous navigation parameter object + */ + public void setPrevious(Object previous) { + fPrevious = previous; + } +} diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/package-info.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/package-info.java new file mode 100644 index 0000000000..136938f044 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/model/object/package-info.java @@ -0,0 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2025 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ + +@org.eclipse.jdt.annotation.NonNullByDefault +package org.eclipse.tracecompass.tmf.core.model.object; From d3f0f92956ca02ec1ada0276291b71fd3ede9aed Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Thu, 9 Oct 2025 16:25:00 +0200 Subject: [PATCH 2/2] tmf: Add raw events data provider Add TmfRawEventsDataProvider and its factory. Add them to o.e.tc.tmf.core.dataprovider extension point. Signed-off-by: Patrick Tasse --- .../DataProviderManagerTest.java | 12 + .../plugin.xml | 4 + .../tmf/core/model/events/Messages.java | 12 +- .../events/TmfRawEventsDataProvider.java | 224 ++++++++++++++++++ .../TmfRawEventsDataProviderFactory.java | 53 +++++ .../tmf/core/model/events/messages.properties | 4 +- 6 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProvider.java create mode 100644 tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProviderFactory.java diff --git a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java index 87b0dc8699..3566c3ca41 100644 --- a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java +++ b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java @@ -211,6 +211,12 @@ public class DataProviderManagerTest { .setProviderType(ProviderType.TIME_GRAPH) .setId("org.eclipse.tracecompass.internal.tmf.core.statesystem.provider.StateSystemDataProvider"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("Raw Events Data") + .setDescription("Show the raw event data in object form for a given trace") + .setProviderType(ProviderType.DATA) + .setId("org.eclipse.tracecompass.tmf.core.model.events.data"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); // UST Trace builder = new DataProviderDescriptor.Builder(); @@ -292,6 +298,12 @@ public class DataProviderManagerTest { .setProviderType(ProviderType.TIME_GRAPH) .setId("org.eclipse.tracecompass.internal.tmf.core.statesystem.provider.StateSystemDataProvider"); EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("Raw Events Data") + .setDescription("Show the raw event data in object form for a given trace") + .setProviderType(ProviderType.DATA) + .setId("org.eclipse.tracecompass.tmf.core.model.events.data"); + EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); EXPECTED_EXPERIMENT_SET.addAll(EXPECTED_UST_DP_DESCRIPTORS); EXPECTED_EXPERIMENT_SET.addAll(EXPECTED_KERNEL_DP_DESCRIPTORS); diff --git a/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml b/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml index d9c4d1c28a..9020877fba 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml +++ b/tmf/org.eclipse.tracecompass.tmf.core/plugin.xml @@ -76,5 +76,9 @@ class="org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableDataProviderFactory" id="org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableDataProvider"> + + diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/Messages.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/Messages.java index 2f6ade17f7..946657f79e 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/Messages.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/Messages.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2019 Ericsson + * Copyright (c) 2019, 2025 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License 2.0 which @@ -14,7 +14,7 @@ import org.eclipse.osgi.util.NLS; /** - * Message bundle for the new events table messages. + * Message bundle for events data provider messages. */ public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.messages"; //$NON-NLS-1$ @@ -26,6 +26,14 @@ public class Messages extends NLS { * The events table data provider help text */ public static @Nullable String EventsTableDataProviderFactory_DescriptionText; + /** + * The raw event data title + */ + public static @Nullable String RawEventsDataProvider_Title; + /** + * The raw event data provider help text + */ + public static @Nullable String RawEventsDataProviderFactory_DescriptionText; static { // initialize resource bundle diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProvider.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProvider.java new file mode 100644 index 0000000000..55c1c28986 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProvider.java @@ -0,0 +1,224 @@ +/********************************************************************** + * Copyright (c) 2018, 2025 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +package org.eclipse.tracecompass.internal.provisional.tmf.core.model.events; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; +import org.eclipse.tracecompass.tmf.core.event.ITmfEventField; +import org.eclipse.tracecompass.tmf.core.event.aspect.TmfBaseAspects; +import org.eclipse.tracecompass.tmf.core.model.AbstractTmfTraceDataProvider; +import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; +import org.eclipse.tracecompass.tmf.core.model.object.IObjectDataProvider; +import org.eclipse.tracecompass.tmf.core.model.object.ObjectModel; +import org.eclipse.tracecompass.tmf.core.response.ITmfResponse; +import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse; +import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp; +import org.eclipse.tracecompass.tmf.core.trace.ITmfContext; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; + +/** + * This data provider will return an object representing an array of raw event + * data. + * + * @author Patrick Tasse + */ +public class TmfRawEventsDataProvider extends AbstractTmfTraceDataProvider implements IObjectDataProvider { + + /** + * Extension point ID. + */ + public static final String ID = "org.eclipse.tracecompass.tmf.core.model.events.data"; //$NON-NLS-1$ + + private static final String SELECTION_RANGE = "selection_range"; //$NON-NLS-1$ + private static final String START = "start"; //$NON-NLS-1$ + private static final String NEXT = "next"; //$NON-NLS-1$ + private static final String PREVIOUS = "previous"; //$NON-NLS-1$ + private static final String TYPE = "type"; //$NON-NLS-1$ + private static final String FIELD = "field"; //$NON-NLS-1$ + private static final String COUNT = "count"; //$NON-NLS-1$ + + /** + * Constructor + * + * @param trace + * A trace on which we are interested to fetch a raw event model + */ + public TmfRawEventsDataProvider(ITmfTrace trace) { + super(trace); + } + + @Override + public String getId() { + return ID; + } + + @Override + public TmfModelResponse fetchData(Map fetchParameters, @Nullable IProgressMonitor monitor) { + ITmfTrace trace = getTrace(); + long rank = 0L; + Long prev = null; + Long next = null; + Object selectionRangeObj = fetchParameters.get(SELECTION_RANGE); + Object nextObj = fetchParameters.get(NEXT); + Object previousObj = fetchParameters.get(PREVIOUS); + Object typeObj = fetchParameters.get(TYPE); + Object fieldObj = fetchParameters.get(FIELD); + Object countObj = fetchParameters.get(COUNT); + if (nextObj instanceof Number nextNum) { + rank = nextNum.longValue(); + prev = rank; + previousObj = null; + } else if (previousObj instanceof Number previousNum) { + rank = previousNum.longValue(); + next = rank; + nextObj = null; + } else if (selectionRangeObj instanceof Map selectionRange) { + if (selectionRange.get(START) instanceof Number start) { + rank = trace.seekEvent(TmfTimestamp.fromNanos(start.longValue())).getRank(); + } + nextObj = null; + previousObj = null; + } + Pattern eventTypePattern = (typeObj instanceof String type) ? Pattern.compile(type) : null; + Pattern fieldPattern = (fieldObj instanceof String field) ? Pattern.compile(field) : null; + Integer max = null; + if (countObj instanceof Number count) { + max = count.intValue(); + } + if (eventTypePattern == null && fieldPattern == null && previousObj instanceof Number) { + // optimize backward request when no filters specified + if (max == null) { + max = (int) rank; + rank = 0L; + } else if (rank >= max) { + rank = rank - max; + } else { + max = (int) rank; + rank = 0L; + } + // clear previousObj to read forwards + previousObj = null; + } + List object = new ArrayList<>(); + ObjectModel model; + if (previousObj instanceof Number) { + // read backward + while (rank > 0 && (max == null || object.size() < max)) { + rank--; + ITmfContext context = trace.seekEvent(rank); + long eventRank = context.getRank(); + ITmfEvent event = trace.getNext(context); + if (event == null) { + break; + } + if (eventTypePattern == null || eventTypePattern.matcher(event.getName()).find()) { + Object eventObj = convertEvent(event, eventRank, fieldPattern); + if (eventObj != null) { + object.add(0, eventObj); + } + } + } + model = new ObjectModel(object); + if (rank > 0L) { + model.setPrevious(rank); + } + if (next != null) { + model.setNext(next); + } + } else { + // read forward + ITmfContext context = trace.seekEvent(rank); + while (max == null || object.size() < max) { + long eventRank = context.getRank(); + ITmfEvent event = trace.getNext(context); + if (event == null) { + break; + } + if (eventTypePattern == null || eventTypePattern.matcher(event.getName()).find()) { + Object eventObj = convertEvent(event, eventRank, fieldPattern); + if (eventObj != null) { + object.add(eventObj); + } + } + } + model = new ObjectModel(object); + next = context.getRank(); + if (trace.getNext(context) != null) { + model.setNext(next); + } + if (prev != null && prev > 0L) { + model.setPrevious(prev); + } + } + return new TmfModelResponse<>(model, ITmfResponse.Status.COMPLETED, CommonStatusMessage.COMPLETED); + } + + private static @Nullable Object convertEvent(ITmfEvent event, long rank, @Nullable Pattern fieldPattern) { + Map data = new LinkedHashMap<>(); + + // Add basic event information + data.put("rank", rank); //$NON-NLS-1$ + data.put(TmfBaseAspects.getTimestampAspect().getName(), event.getTimestamp().toNanos()); + data.put(TmfBaseAspects.getEventTypeAspect().getName(), event.getType().getName()); + Object contents = convertEventField(event.getContent(), fieldPattern); + if (fieldPattern != null && contents instanceof Map map) { + if (map.isEmpty()) { + return null; + } + } + data.put(TmfBaseAspects.getContentsAspect().getName(), contents); + return data; + } + + private static @Nullable Object convertEventField(@Nullable ITmfEventField field, @Nullable Pattern fieldPattern) { + if (field == null) { + return null; + } + Builder builder = ImmutableMap.builder(); + for (ITmfEventField subField : field.getFields()) { + if (subField == null) { + continue; + } + String name = subField.getName(); + if (fieldPattern == null || fieldPattern.matcher(name).find()) { + Object value = subField.getValue(); + if (value instanceof ITmfEventField) { + builder.put(name, convertEventField((ITmfEventField) value, null)); + } else { + builder.put(name, value); + } + } + } + Object value = field.getValue(); + if (value instanceof ITmfEventField) { + value = convertEventField((ITmfEventField) value, null); + } + ImmutableMap fields = builder.build(); + if (value == null) { + return fields; + } else if (fields.isEmpty()) { + return value; + } else { + return Map.of("value", value, "fields", fields); //$NON-NLS-1$ //$NON-NLS-2$ + } + } +} diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProviderFactory.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProviderFactory.java new file mode 100644 index 0000000000..47c81142a7 --- /dev/null +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/TmfRawEventsDataProviderFactory.java @@ -0,0 +1,53 @@ +/********************************************************************** + * Copyright (c) 2025 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +package org.eclipse.tracecompass.internal.provisional.tmf.core.model.events; + +import java.util.Collection; +import java.util.Collections; + +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.tracecompass.common.core.NonNullUtils; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderFactory; +import org.eclipse.tracecompass.tmf.core.model.DataProviderCapabilities; +import org.eclipse.tracecompass.tmf.core.model.DataProviderDescriptor; +import org.eclipse.tracecompass.tmf.core.model.ITmfDataProvider; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; + +/** + * {@link TmfRawEventsDataProvider} factory, uses the data provider extension + * point. + * + * @author Patrick Tasse + */ +public class TmfRawEventsDataProviderFactory implements IDataProviderFactory { + + private static final IDataProviderDescriptor DESCRIPTOR = + new DataProviderDescriptor.Builder() + .setId(TmfRawEventsDataProvider.ID) + .setName(NonNullUtils.nullToEmptyString(Messages.RawEventsDataProvider_Title)) + .setDescription(NonNullUtils.nullToEmptyString(Messages.RawEventsDataProviderFactory_DescriptionText)) + .setProviderType(ProviderType.DATA) + .setCapabilities(new DataProviderCapabilities.Builder().setSelectionRange(true).build()) + .build(); + + @Override + public @Nullable ITmfDataProvider createDataProvider(ITmfTrace trace) { + return new TmfRawEventsDataProvider(trace); + } + + @Override + public Collection getDescriptors(ITmfTrace trace) { + return Collections.singleton(DESCRIPTOR); + } +} diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/messages.properties b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/messages.properties index 989afc2bb6..7c489a833d 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/messages.properties +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/internal/provisional/tmf/core/model/events/messages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2019 Ericsson +# Copyright (c) 2019, 2025 Ericsson # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License 2.0 @@ -11,3 +11,5 @@ EventsTableDataProvider_Title=Events Table EventsTableDataProviderFactory_DescriptionText=Show the raw events in table form for a given trace +RawEventsDataProvider_Title=Raw Events Data +RawEventsDataProviderFactory_DescriptionText=Show the raw event data in object form for a given trace