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/TableColumnHeader.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/TableColumnHeader.java index 780a64988..77bbb83dd 100644 --- 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/TableColumnHeader.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/TableColumnHeader.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2020, 2025 École Polytechnique de Montréal + * Copyright (c) 2020, 2025 École Polytechnique de Montréal and others * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License 2.0 which @@ -11,13 +11,9 @@ package org.eclipse.tracecompass.incubator.internal.trace.server.jersey.rest.core.model.views; -import java.util.List; - -import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.tracecompass.internal.provisional.tmf.core.model.events.TmfEventTableColumnDataModel; import org.eclipse.tracecompass.tmf.core.dataprovider.DataType; -import org.eclipse.tracecompass.tmf.core.model.tree.ITmfTreeDataModel; +import org.eclipse.tracecompass.tmf.core.model.ITableColumnDescriptor; /** * An object that describes a table column header for table column queries @@ -34,26 +30,20 @@ public class TableColumnHeader { /** * Constructor * - * @param dataModel - * The tree model that serves as base for this column + * @param descriptor + * the column descriptor */ - @SuppressWarnings("restriction") - public TableColumnHeader(ITmfTreeDataModel dataModel) { - fId = dataModel.getId(); - List<@NonNull String> labels = dataModel.getLabels(); - fName = dataModel.getLabels().get(0); - if (dataModel instanceof TmfEventTableColumnDataModel) { - fDescription = ((TmfEventTableColumnDataModel) dataModel).getHeaderTooltip(); - } else { - fDescription = labels.size() >= 2 ? dataModel.getLabels().get(1) : null; - } - fType = dataModel.getDataType(); + public TableColumnHeader(ITableColumnDescriptor descriptor) { + fId = descriptor.getId(); + fName = descriptor.getText(); + fDescription = descriptor.getTooltip(); + fType = descriptor.getDataType(); } /** - * Get the ID of this column header + * Get the ID of this column * - * @return The ID of the column header + * @return The ID of the column */ public long getId() { return fId; 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 cf0877726..5e7d69935 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 @@ -154,6 +154,7 @@ import org.eclipse.tracecompass.tmf.core.exceptions.TmfConfigurationException; import org.eclipse.tracecompass.tmf.core.model.CommonStatusMessage; import org.eclipse.tracecompass.tmf.core.model.IOutputStyleProvider; +import org.eclipse.tracecompass.tmf.core.model.ITableColumnDescriptor; import org.eclipse.tracecompass.tmf.core.model.OutputStyleModel; import org.eclipse.tracecompass.tmf.core.model.annotations.Annotation; import org.eclipse.tracecompass.tmf.core.model.annotations.AnnotationCategoriesModel; @@ -400,7 +401,7 @@ public Response getXY( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeXYDataProvider.class); if (provider == null) { @@ -502,7 +503,7 @@ public Response getGenericXY( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeXYDataProvider<@NonNull ITmfTreeDataModel> provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeXYDataProvider.class); if (provider == null) { @@ -775,7 +776,7 @@ public Response getAnnotationCategories( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeDataProvider provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeDataProvider provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeDataProvider.class); if (provider == null) { @@ -860,7 +861,7 @@ public Response getAnnotations( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeDataProvider provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeDataProvider provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeDataProvider.class); if (provider == null) { @@ -973,7 +974,7 @@ public Response getTimeGraphTooltip( } private ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> getTimeGraphProvider(@NonNull ITmfTrace trace, String outputId) { - ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = manager.getOrCreateDataProvider(trace, + ITimeGraphDataProvider<@NonNull ITimeGraphEntryModel> provider = manager.fetchOrCreateDataProvider(trace, outputId, ITimeGraphDataProvider.class); if (provider == null && outputId != null) { @@ -1015,21 +1016,36 @@ public Response getColumns( @Content(examples = @ExampleObject("{\"parameters\":{}}"), schema = @Schema(implementation = OptionalQueryParameters.class)) }, required = true) QueryParameters queryParameters) { - Response response = getTree(expUUID, outputId, queryParameters); - Object entity = response.getEntity(); - if (!(entity instanceof TmfModelResponse)) { - return response; - } - Object model = ((TmfModelResponse) entity).getModel(); - if (!(model instanceof TreeModelWrapper)) { - return response; + Response errorResponse = validateParameters(outputId, queryParameters); + if (errorResponse != null) { + return errorResponse; } - List<@NonNull ITmfTreeDataModel> entries = ((TreeModelWrapper) model).getEntries(); - List columns = new ArrayList<>(); - for (ITmfTreeDataModel dataModel : entries) { - columns.add(new TableColumnHeader(dataModel)); + Map params = queryParameters.getParameters(); + try (FlowScopeLog scope = new FlowScopeLogBuilder(LOGGER, Level.FINE, "DataProviderService#getColumns") //$NON-NLS-1$ + .setCategory(outputId).build()) { + TmfExperiment experiment = ExperimentManagerService.getExperimentByUUID(expUUID); + if (experiment == null) { + return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); + } + + ITmfVirtualTableDataProvider provider = manager.fetchOrCreateDataProvider(experiment, + outputId, ITmfVirtualTableDataProvider.class); + if (provider == null) { + return ErrorResponseUtil.newErrorResponse(Status.METHOD_NOT_ALLOWED, NO_PROVIDER); + } + + TmfModelResponse response = provider.fetchColumns(params, null); + if (response.getStatus() == ITmfResponse.Status.FAILED) { + return ErrorResponseUtil.newErrorResponse(Status.BAD_REQUEST, response.getStatusMessage()); + } + List model = (List) response.getModel(); + if (model == null) { + return Response.ok(response).build(); + } + List<@NonNull TableColumnHeader> columns = new ArrayList<>(); + model.forEach(descriptor -> columns.add(new TableColumnHeader(descriptor))); + return Response.ok(new TmfModelResponse<>(columns, response.getStatus(), response.getStatusMessage())).build(); } - return Response.ok(new TmfModelResponse<>(columns, ((TmfModelResponse) entity).getStatus(), ((TmfModelResponse) entity).getStatusMessage())).build(); } /** @@ -1078,7 +1094,7 @@ public Response getLines( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfVirtualTableDataProvider provider = manager.getOrCreateDataProvider(experiment, outputId, ITmfVirtualTableDataProvider.class); + ITmfVirtualTableDataProvider provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfVirtualTableDataProvider.class); if (provider == null) { return ErrorResponseUtil.newErrorResponse(Status.METHOD_NOT_ALLOWED, NO_PROVIDER); } @@ -1114,7 +1130,7 @@ private Response getTree(UUID expUUID, String outputId, QueryParameters queryPar return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeDataProvider provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeDataProvider provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeDataProvider.class); if (provider == null) { @@ -1182,7 +1198,7 @@ public Response getStyles( return ErrorResponseUtil.newErrorResponse(Status.NOT_FOUND, NO_SUCH_TRACE); } - ITmfTreeDataProvider provider = manager.getOrCreateDataProvider(experiment, + ITmfTreeDataProvider provider = manager.fetchOrCreateDataProvider(experiment, outputId, ITmfTreeDataProvider.class); if (provider == null) {