blob: 2e0745c3c890eea86918ecd4bfed442ff6696d24 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 EfficiOS Inc., Alexandre Montplaisir
*
* 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.analysis.lami.core.module;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.aspect.LamiEmptyAspect;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.aspect.LamiTableEntryAspect;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.types.LamiTimeRange;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.descriptor.DataChartNumericalDescriptor;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.descriptor.DataChartStringDescriptor;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.descriptor.DataChartTimestampDescriptor;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.descriptor.IDataChartDescriptor;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.resolver.AbstractDoubleResolver;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.resolver.AbstractLongResolver;
import org.eclipse.tracecompass.internal.provisional.tmf.chart.core.resolver.IStringResolver;
import org.eclipse.tracecompass.tmf.chart.core.model.IDataChartProvider;
import com.google.common.collect.ImmutableList;
/**
* Class holding the results contained in one table outputted by a LAMI
* analysis.
*
* @author Alexandre Montplaisir
* @author Gabriel-Andrew Pollo-Guilbert
*/
public class LamiResultTable implements IDataChartProvider<LamiTableEntry> {
// ------------------------------------------------------------------------
// Members
// ------------------------------------------------------------------------
private final LamiTimeRange fTimeRange;
private final LamiTableClass fTableClass;
private final List<LamiTableEntry> fEntries;
private final List<IDataChartDescriptor<LamiTableEntry, ?>> fDescriptors;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Construct a new table from its components.
*
* @param timeRange
* The time range represented by this table. Some analyses
* separate tables by time range "buckets".
* @param tableClass
* The class of this table
* @param entries
* The list of entries, or rows, contained in this table
*/
public LamiResultTable(LamiTimeRange timeRange, LamiTableClass tableClass,
Iterable<LamiTableEntry> entries) {
fTimeRange = timeRange;
fTableClass = tableClass;
fEntries = ImmutableList.copyOf(entries);
fDescriptors = new ArrayList<>();
for (LamiTableEntryAspect aspect : getTableClass().getAspects()) {
if (aspect instanceof LamiEmptyAspect) {
continue;
}
/**
* Differenciation of lami aspect types for use by the custom charts
* is made by continuity or timestamp. There is no special treatment
* for time durations, or at least there was none in the original
* lami charts.
*/
if (aspect.isContinuous()) {
if (aspect.isTimeStamp()) {
/* Create descriptors for timestamps */
fDescriptors.add(new DataChartTimestampDescriptor<>(aspect.getName(), new LamiDataLongResolver(aspect)));
} else if (aspect.isTimeDuration()) {
/*
* Create descriptors for numbers with units. We do not use
* duration descriptor since in the case of lami charts, we
* want the durations and numerical data to be compatible
*/
fDescriptors.add(new DataChartNumericalDescriptor<>(aspect.getName(), new LamiDataDoubleResolver(aspect), aspect.getUnits()));
} else {
/* Create descriptors for general numbers */
fDescriptors.add(new DataChartNumericalDescriptor<>(aspect.getName(), new LamiDataDoubleResolver(aspect)));
}
} else {
/* Create descriptors for general strings */
fDescriptors.add(new DataChartStringDescriptor<>(aspect.getName(), new LamiDataStringResolver(aspect)));
}
}
}
// ------------------------------------------------------------------------
// Overriden methods
// ------------------------------------------------------------------------
@Override
public String getName() {
return getTableClass().getTableTitle();
}
@Override
public Stream<@NonNull LamiTableEntry> getSource() {
return checkNotNull(fEntries.stream());
}
@Override
public List<IDataChartDescriptor<LamiTableEntry, ?>> getDataDescriptors() {
return ImmutableList.copyOf(fDescriptors);
}
// ------------------------------------------------------------------------
// Accessors
// ------------------------------------------------------------------------
/**
* Get the time range of this table.
*
* @return The time range
*/
public LamiTimeRange getTimeRange() {
return fTimeRange;
}
/**
* Get the class of this table.
*
* @return The table class
*/
public LamiTableClass getTableClass() {
return fTableClass;
}
/**
* Get the list of entries contained in this table.
*
* @return The table entries
*/
public List<LamiTableEntry> getEntries() {
return fEntries;
}
// ------------------------------------------------------------------------
// Data resolvers
// ------------------------------------------------------------------------
private final class LamiDataLongResolver extends AbstractLongResolver<LamiTableEntry> {
LamiTableEntryAspect fAspect;
public LamiDataLongResolver(LamiTableEntryAspect aspect) {
fAspect = aspect;
}
@Override
public Function<LamiTableEntry, @Nullable Long> getMapper() {
return o -> {
Number res = fAspect.resolveNumber(o);
if (res == null) {
return null;
}
return res.longValue();
};
}
}
private final class LamiDataDoubleResolver extends AbstractDoubleResolver<LamiTableEntry> {
LamiTableEntryAspect fAspect;
public LamiDataDoubleResolver(LamiTableEntryAspect aspect) {
fAspect = aspect;
}
@Override
public Function<LamiTableEntry, @Nullable Double> getMapper() {
return o -> {
Number res = fAspect.resolveNumber(o);
if (res == null) {
return null;
}
return res.doubleValue();
};
}
}
private final class LamiDataStringResolver implements IStringResolver<LamiTableEntry> {
LamiTableEntryAspect fAspect;
public LamiDataStringResolver(LamiTableEntryAspect aspect) {
fAspect = aspect;
}
@Override
public Function<@NonNull LamiTableEntry, @Nullable String> getMapper() {
return o -> fAspect.resolveString(o);
}
}
}