blob: 7af1c703524fa6d147af4e82d1f7ea97c2dda520 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017, 2018 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.ui.project.model;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
/**
* Class for project elements of type compound analysis modules.
*
* This element aggregates analyses with the same type that come from various
* traces contained in an experiment. This allows to show trace analyses and
* their views under the experiment's view element.
*
* @author Bernd Hufmann
* @since 3.0
*/
public class TmfAggregateAnalysisElement extends TmfAnalysisElement {
private final @NonNull Set<TmfAnalysisElement> fContainedAnalyses = new HashSet<>();
private final @NonNull TmfCommonProjectElement fExperimentParent;
/**
* Constructor
*
* @param experiment
* The element to use for experiment activation.
*
* @param module
* The analysis module helper.
* This helper is used in super and acts as a delegate
* helper representing all contained analyses elements.
*/
protected TmfAggregateAnalysisElement(@NonNull TmfCommonProjectElement experiment, @NonNull TmfAnalysisElement module) {
super (module.getName(), module.getResource(), module.getParent(), module.getAnalysisHelper());
fExperimentParent = experiment;
fContainedAnalyses.add(module);
}
@Override
public void dispose() {
/* Nothing to do */
}
@Override
protected synchronized void refreshChildren() {
// refresh all children analysis as well
for (TmfAnalysisElement analysis : fContainedAnalyses) {
analysis.refreshChildren();
}
super.refreshChildren();
}
@Override
public boolean canExecute() {
for (TmfAnalysisElement analysis : fContainedAnalyses) {
if (analysis.canExecute()) {
return true;
}
}
return false;
}
/**
* Add an analysis element that is combined in the compound element.
*
* @param element
* analysis element to add
*/
public void addAnalyses(@NonNull TmfAnalysisElement element) {
fContainedAnalyses.add(element);
}
/**
* Remove an analysis element that is combined in the compound element.
*
* @param element
* analysis element to remove
*/
public void removeAnalyses(@NonNull TmfAnalysisElement element) {
fContainedAnalyses.remove(element);
}
/**
* Checks if aggregated list is empty or not
*
* @return <code>true<code> if empty else <code>false</code>
*/
public boolean isEmpty() {
return fContainedAnalyses.isEmpty();
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* Gets the help message for this analysis
*
* @return The help message
*/
@Override
public String getHelpMessage() {
Set<String> messages = new HashSet<>();
for (TmfAnalysisElement analysis : fContainedAnalyses) {
messages.add(analysis.getHelpMessage());
}
if (!messages.isEmpty()) {
return String.join(",", messages); //$NON-NLS-1$
}
return super.getHelpMessage();
}
/**
* Make sure the trace this analysis is associated to is the currently
* selected one
*/
@Override
public void activateParentTrace() {
TmfOpenTraceHelper.openTraceFromElement(fExperimentParent);
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
Set<TmfAnalysisElement> analyses = fContainedAnalyses;
List<IPropertyDescriptor> descs = new ArrayList<>();
for (TmfAnalysisElement analysis : analyses) {
if (analysis.canExecute()) {
descs.add(new ReadOnlyTextPropertyDescriptor(analysis.getResource(), analysis.getParent().getParent().getLabelText()));
}
}
return descs.toArray(new IPropertyDescriptor[0]);
}
@Override
public Object getPropertyValue(Object id) {
if (id instanceof IResource) {
Set<TmfAnalysisElement> analyses = fContainedAnalyses;
for (TmfAnalysisElement tmfAnalysisElement : analyses) {
if (id.equals(tmfAnalysisElement.getResource())) {
return tmfAnalysisElement;
}
}
}
return null;
}
@Override
public boolean hasChildren() {
for (TmfAnalysisElement analysis : fContainedAnalyses) {
if (analysis.hasChildren()) {
return true;
}
}
return false;
}
@Override
public List<ITmfProjectModelElement> getChildren() {
List<ITmfProjectModelElement> children = new ArrayList<>();
for (TmfAnalysisElement analysis : fContainedAnalyses) {
if (analysis.hasChildren()) {
for (ITmfProjectModelElement output : analysis.getChildren()) {
if (output instanceof TmfAnalysisOutputElement) {
TmfAnalysisOutputElement newOutput = new TmfAnalysisOutputElement(output.getName(), output.getResource(), this, ((TmfAnalysisOutputElement) output).getOutput());
children.add(newOutput);
}
}
return children;
}
}
return children;
}
@Override
public TmfViewsElement getParent() {
return fExperimentParent.getChildElementViews();
}
}