blob: 0019aff3131f104685669788314e2b5a01032a7c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 École Polytechnique de Montréal
*
* 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.analysis.os.linux.core.trace;
import java.util.Set;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisEventRequirement;
import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAbstractAnalysisRequirement;
import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAbstractAnalysisRequirement.PriorityLevel;
import com.google.common.collect.ImmutableList.Builder;
/**
* This class is a pre-requirement class who will instanciate at runtime the
* actual requirements depending on a trace's event layout
*
* @author Geneviève Bastien
* @since 2.0
*/
public class KernelEventLayoutRequirement {
/**
* Functional interface that maps a layout to an event name
*/
@FunctionalInterface
public interface ILayoutToEventName {
/**
* This method will return the event name mapped by this requirement
* from the layout. The returned event name may be <code>null</code> in
* some layouts.
*
* @param layout
* The event layout of the trace
* @return The event name
*/
@Nullable String getEventName(IKernelAnalysisEventLayout layout);
}
private final Set<ILayoutToEventName> fEventNames;
private final PriorityLevel fLevel;
/**
* Constructor
*
* @param layoutReqs
* The layout mappings this requirement represents
* @param level
* Whether the requirement represented by these mapping is
* mandatory or optional
*/
public KernelEventLayoutRequirement(Set<ILayoutToEventName> layoutReqs, PriorityLevel level) {
fEventNames = layoutReqs;
fLevel = level;
}
/**
* Build a real requirement from the layout mapping to be matched with a
* real trace's layout
*
* @param layout
* The event layout from which to build the requirements.
* @return The real requirement
*/
public TmfAbstractAnalysisRequirement instanciateRequirements(IKernelAnalysisEventLayout layout) {
Builder<String> events = new Builder<>();
for (ILayoutToEventName eventNameLayout : fEventNames) {
String eventName = eventNameLayout.getEventName(layout);
if (eventName != null) {
events.add(eventName);
}
}
return new TmfAnalysisEventRequirement(events.build(), fLevel);
}
}