+/*******************************************************************************
+ * Copyright (c) 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 v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.tmf.ui.project.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
+import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
+import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
+import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+
+/**
+ * Project model element for the "Views" node.
+ *
+ * For now it contains the list of the standard analyses, with their outputs
+ * (views) under each. The plan is to eventually only show the views under this
+ * node, since the user cannot really interact with the analyses themselves.
+ *
+ * @author Alexandre Montplaisir
+ * @since 2.0
+ */
+public class TmfViewsElement extends TmfProjectModelElement {
+
+ /**
+ * Element of the resource path
+ */
+ public static final String PATH_ELEMENT = ".views"; //$NON-NLS-1$
+
+ private static final String ELEMENT_NAME = Messages.TmfViewsElement_Name;
+
+ /**
+ * Constructor
+ *
+ * @param resource
+ * The resource to be associated with this element
+ * @param parent
+ * The parent element
+ */
+ protected TmfViewsElement(IResource resource, TmfCommonProjectElement parent) {
+ super(ELEMENT_NAME, resource, parent);
+ }
+
+ // ------------------------------------------------------------------------
+ // TmfProjectModelElement
+ // ------------------------------------------------------------------------
+
+ @Override
+ public TmfCommonProjectElement getParent() {
+ /* Type enforced at constructor */
+ return (TmfCommonProjectElement) super.getParent();
+ }
+
+ @Override
+ protected void refreshChildren() {
+ /* Refreshes the analysis under this trace */
+ Map<String, TmfAnalysisElement> childrenMap = new HashMap<>();
+ for (TmfAnalysisElement analysis : getParent().getAvailableAnalysis()) {
+ childrenMap.put(analysis.getAnalysisId(), analysis);
+ }
+
+ TraceTypeHelper helper = TmfTraceType.getTraceType(getParent().getTraceType());
+
+ Class<@NonNull ? extends ITmfTrace> traceClass = null;
+
+ if (helper != null) {
+ traceClass = helper.getTraceClass();
+ }
+
+ /* Remove all analysis and return */
+ if (traceClass == null) {
+ for (TmfAnalysisElement analysis : childrenMap.values()) {
+ removeChild(analysis);
+ }
+ return;
+ }
+
+ IPath nodePath = getResource().getFullPath();
+
+ /* Add all new analysis modules or refresh outputs of existing ones */
+ for (IAnalysisModuleHelper module : TmfAnalysisManager.getAnalysisModules(traceClass).values()) {
+
+ /* If the analysis is not a child of the trace, create it */
+ TmfAnalysisElement analysis = childrenMap.remove(module.getId());
+ if (analysis == null) {
+ IFolder analysisRes = ResourcesPlugin.getWorkspace().getRoot().getFolder(nodePath.append(module.getId()));
+ analysis = new TmfAnalysisElement(module.getName(), analysisRes, this, module);
+ addChild(analysis);
+ }
+ analysis.refreshChildren();
+ }
+
+ /* Remove analysis that are not children of this trace anymore */
+ for (TmfAnalysisElement analysis : childrenMap.values()) {
+ removeChild(analysis);
+ }
+ }
+
+ @Override
+ public Image getIcon() {
+ return TmfProjectModelIcons.VIEWS_ICON;
+ }
+}