blob: 8ac8d776b1ededcdae634f85a931bd746cba2220 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 IBM Corporation and others.
*
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.dtree;
import org.eclipse.core.runtime.IPath;
/**
* A <code>DataDeltaNode</code> contains information that represents the differences
* between itself and a node in another tree. Refer to the <code>DeltaDataTree</code>
* API and comments for details.
*
* @see DeltaDataTree
*/
public class DataDeltaNode extends DataTreeNode {
/**
* Creates a node with the given name and data, but with no children.
*/
DataDeltaNode(String name, Object data) {
super(name, data);
}
/**
* Creates a node with the given name, data and children.
*/
DataDeltaNode(String name, Object data, AbstractDataTreeNode[] children) {
super(name, data, children);
}
/**
* @see AbstractDataTreeNode#asBackwardDelta(DeltaDataTree, DeltaDataTree, IPath)
*/
@Override
AbstractDataTreeNode asBackwardDelta(DeltaDataTree myTree, DeltaDataTree parentTree, IPath key) {
AbstractDataTreeNode[] newChildren;
if (children.length == 0) {
newChildren = NO_CHILDREN;
} else {
newChildren = new AbstractDataTreeNode[children.length];
for (int i = children.length; --i >= 0;) {
newChildren[i] = children[i].asBackwardDelta(myTree, parentTree, key.append(children[i].getName()));
}
}
return new DataDeltaNode(name, parentTree.getData(key), newChildren);
}
@Override
AbstractDataTreeNode compareWithParent(IPath key, DeltaDataTree parent, IComparator comparator) {
AbstractDataTreeNode[] comparedChildren = compareWithParent(children, key, parent, comparator);
Object oldData = parent.getData(key);
Object newData = data;
/* don't compare data of root */
int userComparison = 0;
if (key != parent.rootKey()) {
/* allow client to specify user comparison bits */
userComparison = comparator.compare(oldData, newData);
}
return new DataTreeNode(key.lastSegment(), new NodeComparison(oldData, newData, NodeComparison.K_CHANGED, userComparison), comparedChildren);
}
/**
* Creates and returns a new copy of the receiver. Makes a deep copy of
* children, but a shallow copy of name and data.
*/
@Override
AbstractDataTreeNode copy() {
AbstractDataTreeNode[] childrenCopy;
if (children.length == 0) {
childrenCopy = NO_CHILDREN;
} else {
childrenCopy = new AbstractDataTreeNode[children.length];
System.arraycopy(children, 0, childrenCopy, 0, children.length);
}
return new DataDeltaNode(name, data, childrenCopy);
}
/**
* Returns true if the receiver represents delta information,
* false if it represents the complete information.
*/
@Override
boolean isDelta() {
return true;
}
/**
* Simplifies the given node, and answers its replacement.
*/
@Override
AbstractDataTreeNode simplifyWithParent(IPath key, DeltaDataTree parent, IComparator comparer) {
AbstractDataTreeNode[] simplifiedChildren = simplifyWithParent(children, key, parent, comparer);
/* don't compare root nodes */
if (!key.isRoot() && comparer.compare(parent.getData(key), data) == 0)
return new NoDataDeltaNode(name, simplifiedChildren);
return new DataDeltaNode(name, data, simplifiedChildren);
}
/**
* Returns a unicode representation of the node. This method is used
* for debugging purposes only (no NLS support needed)
*/
@Override
public String toString() {
return "a DataDeltaNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
/**
* Returns a constant describing the type of node.
*/
@Override
int type() {
return T_DELTA_NODE;
}
}