blob: 399129e684c3d809b1aa28af93f9666481863443 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 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:
* Yuriy Vashchuk (yvashchuk@gmail.com) - Initial API and implementation
* Patrick Tasse - Refactoring
* Vincent Perot - Add subfield filtering
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.filter.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
/**
* The base class for the Filter tree nodes
*
* @version 1.0
* @author Yuriy Vashchuk
* @author Patrick Tasse
*/
public abstract class TmfFilterTreeNode implements ITmfFilterTreeNode, Cloneable {
private static final String[] VALID_CHILDREN = {
TmfFilterTraceTypeNode.NODE_NAME,
TmfFilterAndNode.NODE_NAME,
TmfFilterOrNode.NODE_NAME,
TmfFilterContainsNode.NODE_NAME,
TmfFilterEqualsNode.NODE_NAME,
TmfFilterMatchesNode.NODE_NAME,
TmfFilterCompareNode.NODE_NAME
};
private ITmfFilterTreeNode parent = null;
private ArrayList<ITmfFilterTreeNode> children = new ArrayList<>();
/**
* @param parent
* the parent node
*/
public TmfFilterTreeNode(final ITmfFilterTreeNode parent) {
if (parent != null) {
parent.addChild(this);
}
}
@Override
public ITmfFilterTreeNode getParent() {
return parent;
}
@Override
public abstract String getNodeName();
@Override
public boolean hasChildren() {
return (!children.isEmpty());
}
@Override
public int getChildrenCount() {
return children.size();
}
@Override
public @NonNull ITmfFilterTreeNode[] getChildren() {
return children.toArray(new @NonNull ITmfFilterTreeNode[0]);
}
@Override
public ITmfFilterTreeNode getChild(final int index) throws IndexOutOfBoundsException {
return children.get(index);
}
@Override
public ITmfFilterTreeNode remove() {
if (getParent() != null) {
getParent().removeChild(this);
}
return this;
}
@Override
public ITmfFilterTreeNode removeChild(ITmfFilterTreeNode node) {
children.remove(node);
node.setParent(null);
return node;
}
@Override
public int addChild(final ITmfFilterTreeNode node) {
node.setParent(this);
if (children.add(node)) {
return (children.size() - 1);
}
return -1;
}
@Override
public ITmfFilterTreeNode replaceChild(final int index, final ITmfFilterTreeNode node) throws IndexOutOfBoundsException {
node.setParent(this);
return children.set(index, node);
}
@Override
public void setParent(final ITmfFilterTreeNode parent) {
this.parent = parent;
}
@Override
public abstract boolean matches(ITmfEvent event);
@Override
public List<String> getValidChildren() {
return Arrays.asList(VALID_CHILDREN);
}
@Override
public ITmfFilterTreeNode clone() {
try {
TmfFilterTreeNode clone = (TmfFilterTreeNode) super.clone();
clone.parent = null;
clone.children = new ArrayList<>(children.size());
for (ITmfFilterTreeNode child : getChildren()) {
clone.addChild(child.clone());
}
return clone;
} catch (CloneNotSupportedException e) {
return null;
}
}
@Override
public String toString() {
return toString(false);
}
}