/******************************************************************************* * 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 v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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.size() > 0); } @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); } }