blob: a18830b568d822a7c66202d26af0507d9cb70a59 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 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
*
* Contributors:
* Francois Chouinard - Initial API and implementation
* Patrick Tasse - Add support for folder elements
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.project.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swt.graphics.Image;
import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
import org.eclipse.ui.IActionFilter;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource2;
/**
* Implementation of trace folder model element representing a trace folder in
* the project.
* <p>
* @version 1.0
* @author Francois Chouinard
*/
public class TmfTraceFolder extends TmfProjectModelElement implements IActionFilter, IPropertySource2 {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
private static final String INFO_CATEGORY = "Info"; //$NON-NLS-1$
private static final String NAME = "name"; //$NON-NLS-1$
private static final String PATH = "path"; //$NON-NLS-1$
private static final String LOCATION = "location"; //$NON-NLS-1$
/** IsLinked attribute name. */
private static final String IS_LINKED = "isLinked"; //$NON-NLS-1$
private static final String IS_LINKED_PROPERTY = Messages.TmfTraceElement_IsLinked;
private static final ReadOnlyTextPropertyDescriptor NAME_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(NAME, NAME);
private static final ReadOnlyTextPropertyDescriptor PATH_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(PATH, PATH);
private static final ReadOnlyTextPropertyDescriptor LOCATION_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(LOCATION, LOCATION);
private static final ReadOnlyTextPropertyDescriptor IS_LINKED_DESCRIPTOR = new ReadOnlyTextPropertyDescriptor(IS_LINKED_PROPERTY, IS_LINKED_PROPERTY);
private static final IPropertyDescriptor[] DESCRIPTORS = { NAME_DESCRIPTOR, PATH_DESCRIPTOR, LOCATION_DESCRIPTOR, IS_LINKED_DESCRIPTOR };
static {
NAME_DESCRIPTOR.setCategory(INFO_CATEGORY);
PATH_DESCRIPTOR.setCategory(INFO_CATEGORY);
LOCATION_DESCRIPTOR.setCategory(INFO_CATEGORY);
IS_LINKED_DESCRIPTOR.setCategory(INFO_CATEGORY);
}
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
/**
* Constructor. Creates folder model element under the project.
*
* @param name
* The name of trace folder.
* @param resource
* The folder resource.
* @param parent
* The parent element (project).
*/
public TmfTraceFolder(String name, IFolder resource, TmfProjectElement parent) {
super(name, resource, parent);
}
/**
* Constructor. Creates folder model element under another folder.
*
* @param name
* The name of trace folder.
* @param resource
* The folder resource.
* @param parent
* The parent element (folder).
*/
public TmfTraceFolder(String name, IFolder resource, TmfTraceFolder parent) {
super(name, resource, parent);
}
// ------------------------------------------------------------------------
// TmfProjectModelElement
// ------------------------------------------------------------------------
@Override
public IFolder getResource() {
return (IFolder) super.getResource();
}
/**
* @since 2.0
*/
@Override
protected synchronized void refreshChildren() {
IFolder folder = getResource();
// Get the children from the model
Map<String, ITmfProjectModelElement> childrenMap = new HashMap<>();
for (ITmfProjectModelElement element : getChildren()) {
childrenMap.put(element.getResource().getName(), element);
}
try {
IResource[] members = folder.members();
for (IResource resource : members) {
String name = resource.getName();
boolean isFolder = resource instanceof IFolder &&
(TmfTraceType.getTraceTypeId(resource) == null);
ITmfProjectModelElement element = childrenMap.get(name);
if (isFolder && !(element instanceof TmfTraceFolder) && !(element instanceof TmfTraceElement)) {
if (TmfTraceType.isDirectoryTrace(resource.getLocationURI().getPath())) {
element = new TmfTraceElement(name, resource, this);
} else {
element = new TmfTraceFolder(name, (IFolder) resource, this);
}
addChild(element);
} else if (!isFolder && !(element instanceof TmfTraceElement)) {
element = new TmfTraceElement(name, resource, this);
addChild(element);
} else {
childrenMap.remove(name);
}
if (element != null) {
((TmfProjectModelElement) element).refreshChildren();
}
}
} catch (CoreException e) {
}
// Cleanup dangling children from the model
for (ITmfProjectModelElement danglingChild : childrenMap.values()) {
removeChild(danglingChild);
}
}
/**
* @since 2.0
*/
@Override
public Image getIcon() {
return TmfProjectModelIcons.FOLDER_ICON;
}
/**
* @since 2.0
*/
@Override
public String getLabelText() {
int nbTraces = getTraces().size();
if (nbTraces > 0) {
return (getName() + " [" + nbTraces + ']'); //$NON-NLS-1$
}
return getName();
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* Returns a list of trace elements under the folder element, recursively.
* @return list of trace model elements
*/
public List<@NonNull TmfTraceElement> getTraces() {
List<ITmfProjectModelElement> children = getChildren();
List<@NonNull TmfTraceElement> traces = new ArrayList<>();
for (ITmfProjectModelElement child : children) {
if (child instanceof TmfTraceElement) {
traces.add((TmfTraceElement) child);
} else if (child instanceof TmfTraceFolder) {
traces.addAll(((TmfTraceFolder) child).getTraces());
}
}
return traces;
}
/**
* Gets the traces elements under this folder containing the given resources
*
* @param resources
* resources to search for
* @return list of trace elements
* @since 2.0
*/
public @NonNull List<TmfTraceElement> getTraceElements(@NonNull List<IResource> resources) {
return resources.stream()
.flatMap(resource -> getTraces().stream()
.filter(traceElement -> traceElement.getResource().equals(resource)))
.distinct()
.collect(Collectors.toList());
}
// ------------------------------------------------------------------------
// IActionFilter
// ------------------------------------------------------------------------
@Override
public boolean testAttribute(Object target, String name, String value) {
if (name.equals(IS_LINKED)) {
boolean isLinked = getResource().isLinked();
return Boolean.toString(isLinked).equals(value);
}
return false;
}
// ------------------------------------------------------------------------
// IPropertySource2
// ------------------------------------------------------------------------
@Override
public Object getEditableValue() {
return null;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
return Arrays.copyOf(DESCRIPTORS, DESCRIPTORS.length);
}
@Override
public Object getPropertyValue(Object id) {
if (NAME.equals(id)) {
return getName();
}
if (PATH.equals(id)) {
return getPath().toString();
}
if (LOCATION.equals(id)) {
return getLocation().toString();
}
if (IS_LINKED_PROPERTY.equals(id)) {
return Boolean.toString(getResource().isLinked());
}
return null;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
@Override
public boolean isPropertyResettable(Object id) {
return false;
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
}