blob: 08b81ed75438ed0ad53d3d97e7ed8247d1762fcb [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
* Francis Lynch (Wind River) - [305718] Allow reading snapshot into renamed project
*******************************************************************************/
package org.eclipse.core.internal.watson;
import java.io.DataInput;
import java.io.IOException;
import org.eclipse.core.internal.dtree.DeltaDataTree;
/** <code>ElementTreeReader_1</code> is an implementation
* of the <code>ElementTreeReader</code> for format version 1.
*
* <p>Instances of this reader read only format 1
* of a saved element tree (they do not deal with
* compatibility issues).
*
* @see ElementTreeReader
*/
/* package */class ElementTreeReaderImpl_1 extends ElementTreeReader {
/**
* Constructs a new element tree reader that works for
* the given element info factory.
*/
ElementTreeReaderImpl_1(IElementInfoFlattener factory) {
super(factory);
}
/**
* Reads an element tree delta from the input stream, and
* reconstructs it as a delta on the given tree.
*/
@Override
public ElementTree readDelta(ElementTree parentTree, DataInput input) throws IOException {
DeltaDataTree complete = parentTree.getDataTree();
DeltaDataTree delta = dataTreeReader.readTree(complete, input, ""); //$NON-NLS-1$
//if the delta is empty, just return the parent
if (delta.isEmptyDelta())
return parentTree;
ElementTree tree = new ElementTree(delta);
//copy the user data forward
IElementTreeData data = parentTree.getTreeData();
if (data != null) {
tree.setTreeData((IElementTreeData) data.clone());
}
//make the underlying data tree immutable
//can't call immutable() on the ElementTree because
//this would attempt to reroot.
delta.immutable();
return tree;
}
@Override
public ElementTree[] readDeltaChain(DataInput input, String newProjectName) throws IOException {
/* read the number of trees */
int treeCount = readNumber(input);
ElementTree[] results = new ElementTree[treeCount];
if (treeCount <= 0) {
return results;
}
/* read the sort order */
int[] order = new int[treeCount];
for (int i = 0; i < treeCount; i++) {
order[i] = readNumber(input);
}
/* read the complete tree */
results[order[0]] = super.readTree(input, newProjectName);
/* reconstitute each of the remaining trees from their written deltas */
for (int i = 1; i < treeCount; i++) {
results[order[i]] = super.readDelta(results[order[i - 1]], input);
}
return results;
}
@Override
public ElementTree readTree(DataInput input, String newProjectName) throws IOException {
/* The format version number has already been consumed
* by ElementTreeReader#readFrom.
*/
ElementTree result = new ElementTree(dataTreeReader.readTree(null, input, newProjectName));
return result;
}
}