HDFS-4738. Changes AbstractINodeDiff to implement Comparable<Integer>, and fix javadoc and other warnings.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1471228 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
65752c09ab
commit
3a812e9f3a
|
@ -1,3 +1,21 @@
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
Branch-2802 Snapshot (Unreleased)
|
Branch-2802 Snapshot (Unreleased)
|
||||||
|
|
||||||
HDFS-4076. Support snapshot of single files. (szetszwo)
|
HDFS-4076. Support snapshot of single files. (szetszwo)
|
||||||
|
@ -272,3 +290,6 @@ Branch-2802 Snapshot (Unreleased)
|
||||||
|
|
||||||
HDFS-4735. DisallowSnapshot throws IllegalStateException for nested
|
HDFS-4735. DisallowSnapshot throws IllegalStateException for nested
|
||||||
snapshottable directories. (Jing Zhao via szetszwo)
|
snapshottable directories. (Jing Zhao via szetszwo)
|
||||||
|
|
||||||
|
HDFS-4738. Changes AbstractINodeDiff to implement Comparable<Integer>, and
|
||||||
|
fix javadoc and other warnings. (szetszwo)
|
||||||
|
|
|
@ -108,7 +108,7 @@ public class HdfsAdmin {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow snapshot on a directory.
|
* Allow snapshot on a directory.
|
||||||
* @param the path of the directory where snapshots will be taken
|
* @param path The path of the directory where snapshots will be taken.
|
||||||
*/
|
*/
|
||||||
public void allowSnapshot(Path path) throws IOException {
|
public void allowSnapshot(Path path) throws IOException {
|
||||||
dfs.allowSnapshot(path);
|
dfs.allowSnapshot(path);
|
||||||
|
@ -116,7 +116,7 @@ public class HdfsAdmin {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disallow snapshot on a directory.
|
* Disallow snapshot on a directory.
|
||||||
* @param path of the snapshottable directory.
|
* @param path The path of the snapshottable directory.
|
||||||
*/
|
*/
|
||||||
public void disallowSnapshot(Path path) throws IOException {
|
public void disallowSnapshot(Path path) throws IOException {
|
||||||
dfs.disallowSnapshot(path);
|
dfs.disallowSnapshot(path);
|
||||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.hadoop.hdfs.protocol;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
|
@ -28,8 +29,20 @@ import org.apache.hadoop.hdfs.DFSUtil;
|
||||||
/**
|
/**
|
||||||
* Metadata about a snapshottable directory
|
* Metadata about a snapshottable directory
|
||||||
*/
|
*/
|
||||||
public class SnapshottableDirectoryStatus
|
public class SnapshottableDirectoryStatus {
|
||||||
implements Comparable<SnapshottableDirectoryStatus> {
|
/** Compare the statuses by full paths. */
|
||||||
|
public static final Comparator<SnapshottableDirectoryStatus> COMPARATOR
|
||||||
|
= new Comparator<SnapshottableDirectoryStatus>() {
|
||||||
|
@Override
|
||||||
|
public int compare(SnapshottableDirectoryStatus left,
|
||||||
|
SnapshottableDirectoryStatus right) {
|
||||||
|
int d = DFSUtil.compareBytes(left.parentFullPath, right.parentFullPath);
|
||||||
|
return d != 0? d
|
||||||
|
: DFSUtil.compareBytes(left.dirStatus.getLocalNameInBytes(),
|
||||||
|
right.dirStatus.getLocalNameInBytes());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/** Basic information of the snapshottable directory */
|
/** Basic information of the snapshottable directory */
|
||||||
private HdfsFileStatus dirStatus;
|
private HdfsFileStatus dirStatus;
|
||||||
|
|
||||||
|
@ -145,12 +158,4 @@ public class SnapshottableDirectoryStatus
|
||||||
private static int maxLength(int n, Object value) {
|
private static int maxLength(int n, Object value) {
|
||||||
return Math.max(n, String.valueOf(value).length());
|
return Math.max(n, String.valueOf(value).length());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(SnapshottableDirectoryStatus that) {
|
|
||||||
int d = DFSUtil.compareBytes(this.parentFullPath, that.parentFullPath);
|
|
||||||
return d != 0? d
|
|
||||||
: DFSUtil.compareBytes(this.dirStatus.getLocalNameInBytes(),
|
|
||||||
that.dirStatus.getLocalNameInBytes());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,7 @@ package org.apache.hadoop.hdfs.server.namenode;
|
||||||
import org.apache.hadoop.hdfs.util.EnumCounters;
|
import org.apache.hadoop.hdfs.util.EnumCounters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The content types such as file, directory and symlink to be computed
|
* The content types such as file, directory and symlink to be computed.
|
||||||
* in {@link INode#computeContentSummary(CountsMap)}.
|
|
||||||
*/
|
*/
|
||||||
public enum Content {
|
public enum Content {
|
||||||
/** The number of files. */
|
/** The number of files. */
|
||||||
|
|
|
@ -474,10 +474,7 @@ public class INodeDirectory extends INodeWithAdditionalFields {
|
||||||
clearChildren();
|
clearChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Call cleanSubtree(..) recursively down the subtree. */
|
||||||
* Call {@link INode#cleanSubtree(SnapshotDeletionInfo, BlocksMapUpdateInfo)}
|
|
||||||
* recursively down the subtree.
|
|
||||||
*/
|
|
||||||
public Quota.Counts cleanSubtreeRecursively(final Snapshot snapshot,
|
public Quota.Counts cleanSubtreeRecursively(final Snapshot snapshot,
|
||||||
Snapshot prior, final BlocksMapUpdateInfo collectedBlocks,
|
Snapshot prior, final BlocksMapUpdateInfo collectedBlocks,
|
||||||
final List<INode> removedINodes) throws QuotaExceededException {
|
final List<INode> removedINodes) throws QuotaExceededException {
|
||||||
|
|
|
@ -48,7 +48,7 @@ import com.google.common.base.Preconditions;
|
||||||
*/
|
*/
|
||||||
abstract class AbstractINodeDiff<N extends INode,
|
abstract class AbstractINodeDiff<N extends INode,
|
||||||
D extends AbstractINodeDiff<N, D>>
|
D extends AbstractINodeDiff<N, D>>
|
||||||
implements Comparable<Snapshot> {
|
implements Comparable<Integer> {
|
||||||
|
|
||||||
/** The snapshot will be obtained after this diff is applied. */
|
/** The snapshot will be obtained after this diff is applied. */
|
||||||
Snapshot snapshot;
|
Snapshot snapshot;
|
||||||
|
@ -72,8 +72,8 @@ abstract class AbstractINodeDiff<N extends INode,
|
||||||
|
|
||||||
/** Compare diffs with snapshot ID. */
|
/** Compare diffs with snapshot ID. */
|
||||||
@Override
|
@Override
|
||||||
public final int compareTo(final Snapshot that) {
|
public final int compareTo(final Integer that) {
|
||||||
return Snapshot.ID_COMPARATOR.compare(this.snapshot, that);
|
return Snapshot.ID_INTEGER_COMPARATOR.compare(this.snapshot.getId(), that);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return the snapshot object of this diff. */
|
/** @return the snapshot object of this diff. */
|
||||||
|
|
|
@ -69,7 +69,7 @@ abstract class AbstractINodeDiffList<N extends INode,
|
||||||
final Quota.Counts deleteSnapshotDiff(final Snapshot snapshot,
|
final Quota.Counts deleteSnapshotDiff(final Snapshot snapshot,
|
||||||
Snapshot prior, final N currentINode,
|
Snapshot prior, final N currentINode,
|
||||||
final BlocksMapUpdateInfo collectedBlocks, final List<INode> removedINodes) {
|
final BlocksMapUpdateInfo collectedBlocks, final List<INode> removedINodes) {
|
||||||
int snapshotIndex = Collections.binarySearch(diffs, snapshot);
|
int snapshotIndex = Collections.binarySearch(diffs, snapshot.getId());
|
||||||
|
|
||||||
Quota.Counts counts = Quota.Counts.newInstance();
|
Quota.Counts counts = Quota.Counts.newInstance();
|
||||||
D removed = null;
|
D removed = null;
|
||||||
|
@ -151,7 +151,7 @@ abstract class AbstractINodeDiffList<N extends INode,
|
||||||
if (anchor == null) {
|
if (anchor == null) {
|
||||||
return getLastSnapshot();
|
return getLastSnapshot();
|
||||||
}
|
}
|
||||||
final int i = Collections.binarySearch(diffs, anchor);
|
final int i = Collections.binarySearch(diffs, anchor.getId());
|
||||||
if (i == -1 || i == 0) {
|
if (i == -1 || i == 0) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
|
@ -182,7 +182,7 @@ abstract class AbstractINodeDiffList<N extends INode,
|
||||||
// snapshot == null means the current state, therefore, return null.
|
// snapshot == null means the current state, therefore, return null.
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final int i = Collections.binarySearch(diffs, snapshot);
|
final int i = Collections.binarySearch(diffs, snapshot.getId());
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
// exact match
|
// exact match
|
||||||
return diffs.get(i);
|
return diffs.get(i);
|
||||||
|
@ -197,23 +197,22 @@ abstract class AbstractINodeDiffList<N extends INode,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if changes have happened between two snapshots.
|
* Check if changes have happened between two snapshots.
|
||||||
* @param earlierSnapshot The snapshot taken earlier
|
* @param earlier The snapshot taken earlier
|
||||||
* @param laterSnapshot The snapshot taken later
|
* @param later The snapshot taken later
|
||||||
* @return Whether or not modifications (including diretory/file metadata
|
* @return Whether or not modifications (including diretory/file metadata
|
||||||
* change, file creation/deletion under the directory) have happened
|
* change, file creation/deletion under the directory) have happened
|
||||||
* between snapshots.
|
* between snapshots.
|
||||||
*/
|
*/
|
||||||
final boolean changedBetweenSnapshots(Snapshot earlierSnapshot,
|
final boolean changedBetweenSnapshots(Snapshot earlier, Snapshot later) {
|
||||||
Snapshot laterSnapshot) {
|
|
||||||
final int size = diffs.size();
|
final int size = diffs.size();
|
||||||
int earlierDiffIndex = Collections.binarySearch(diffs, earlierSnapshot);
|
int earlierDiffIndex = Collections.binarySearch(diffs, earlier.getId());
|
||||||
if (-earlierDiffIndex - 1 == size) {
|
if (-earlierDiffIndex - 1 == size) {
|
||||||
// if the earlierSnapshot is after the latest SnapshotDiff stored in
|
// if the earlierSnapshot is after the latest SnapshotDiff stored in
|
||||||
// diffs, no modification happened after the earlierSnapshot
|
// diffs, no modification happened after the earlierSnapshot
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (laterSnapshot != null) {
|
if (later != null) {
|
||||||
int laterDiffIndex = Collections.binarySearch(diffs, laterSnapshot);
|
int laterDiffIndex = Collections.binarySearch(diffs, later.getId());
|
||||||
if (laterDiffIndex == -1 || laterDiffIndex == 0) {
|
if (laterDiffIndex == -1 || laterDiffIndex == 0) {
|
||||||
// if the laterSnapshot is the earliest SnapshotDiff stored in diffs, or
|
// if the laterSnapshot is the earliest SnapshotDiff stored in diffs, or
|
||||||
// before it, no modification happened before the laterSnapshot
|
// before it, no modification happened before the laterSnapshot
|
||||||
|
|
|
@ -476,24 +476,24 @@ public class INodeDirectoryWithSnapshot extends INodeDirectoryWithQuota {
|
||||||
*/
|
*/
|
||||||
boolean computeDiffBetweenSnapshots(Snapshot fromSnapshot,
|
boolean computeDiffBetweenSnapshots(Snapshot fromSnapshot,
|
||||||
Snapshot toSnapshot, ChildrenDiff diff) {
|
Snapshot toSnapshot, ChildrenDiff diff) {
|
||||||
Snapshot earlierSnapshot = fromSnapshot;
|
Snapshot earlier = fromSnapshot;
|
||||||
Snapshot laterSnapshot = toSnapshot;
|
Snapshot later = toSnapshot;
|
||||||
if (Snapshot.ID_COMPARATOR.compare(fromSnapshot, toSnapshot) > 0) {
|
if (Snapshot.ID_COMPARATOR.compare(fromSnapshot, toSnapshot) > 0) {
|
||||||
earlierSnapshot = toSnapshot;
|
earlier = toSnapshot;
|
||||||
laterSnapshot = fromSnapshot;
|
later = fromSnapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean modified = diffs.changedBetweenSnapshots(earlierSnapshot,
|
boolean modified = diffs.changedBetweenSnapshots(earlier,
|
||||||
laterSnapshot);
|
later);
|
||||||
if (!modified) {
|
if (!modified) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<DirectoryDiff> difflist = diffs.asList();
|
final List<DirectoryDiff> difflist = diffs.asList();
|
||||||
final int size = difflist.size();
|
final int size = difflist.size();
|
||||||
int earlierDiffIndex = Collections.binarySearch(difflist, earlierSnapshot);
|
int earlierDiffIndex = Collections.binarySearch(difflist, earlier.getId());
|
||||||
int laterDiffIndex = laterSnapshot == null ? size : Collections
|
int laterDiffIndex = later == null ? size : Collections
|
||||||
.binarySearch(difflist, laterSnapshot);
|
.binarySearch(difflist, later.getId());
|
||||||
earlierDiffIndex = earlierDiffIndex < 0 ? (-earlierDiffIndex - 1)
|
earlierDiffIndex = earlierDiffIndex < 0 ? (-earlierDiffIndex - 1)
|
||||||
: earlierDiffIndex;
|
: earlierDiffIndex;
|
||||||
laterDiffIndex = laterDiffIndex < 0 ? (-laterDiffIndex - 1)
|
laterDiffIndex = laterDiffIndex < 0 ? (-laterDiffIndex - 1)
|
||||||
|
@ -507,10 +507,8 @@ public class INodeDirectoryWithSnapshot extends INodeDirectoryWithQuota {
|
||||||
if (dirMetadataChanged == false && sdiff.snapshotINode != null) {
|
if (dirMetadataChanged == false && sdiff.snapshotINode != null) {
|
||||||
if (dirCopy == null) {
|
if (dirCopy == null) {
|
||||||
dirCopy = sdiff.snapshotINode;
|
dirCopy = sdiff.snapshotINode;
|
||||||
} else {
|
} else if (!dirCopy.metadataEquals(sdiff.snapshotINode)) {
|
||||||
if (!dirCopy.metadataEquals(sdiff.snapshotINode)) {
|
dirMetadataChanged = true;
|
||||||
dirMetadataChanged = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -524,8 +522,9 @@ public class INodeDirectoryWithSnapshot extends INodeDirectoryWithQuota {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return !dirCopy.metadataEquals(this);
|
return !dirCopy.metadataEquals(this);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Diff list sorted by snapshot IDs, i.e. in chronological order. */
|
/** Diff list sorted by snapshot IDs, i.e. in chronological order. */
|
||||||
|
|
|
@ -71,18 +71,32 @@ public class Snapshot implements Comparable<byte[]> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare snapshot IDs. Null indicates the current status thus is greater
|
* Compare snapshot with IDs, where null indicates the current status thus
|
||||||
* than non-null snapshots.
|
* is greater than any non-null snapshot.
|
||||||
*/
|
*/
|
||||||
public static final Comparator<Snapshot> ID_COMPARATOR
|
public static final Comparator<Snapshot> ID_COMPARATOR
|
||||||
= new Comparator<Snapshot>() {
|
= new Comparator<Snapshot>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(Snapshot left, Snapshot right) {
|
public int compare(Snapshot left, Snapshot right) {
|
||||||
|
return ID_INTEGER_COMPARATOR.compare(
|
||||||
|
left == null? null: left.getId(),
|
||||||
|
right == null? null: right.getId());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare snapshot with IDs, where null indicates the current status thus
|
||||||
|
* is greater than any non-null ID.
|
||||||
|
*/
|
||||||
|
public static final Comparator<Integer> ID_INTEGER_COMPARATOR
|
||||||
|
= new Comparator<Integer>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Integer left, Integer right) {
|
||||||
// null means the current state, thus should be the largest
|
// null means the current state, thus should be the largest
|
||||||
if (left == null) {
|
if (left == null) {
|
||||||
return right == null? 0: 1;
|
return right == null? 0: 1;
|
||||||
} else {
|
} else {
|
||||||
return right == null? -1: left.id - right.id;
|
return right == null? -1: left - right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -229,8 +229,6 @@ public class SnapshotFSImageFormat {
|
||||||
* Load the {@link SnapshotDiff} list for the INodeDirectoryWithSnapshot
|
* Load the {@link SnapshotDiff} list for the INodeDirectoryWithSnapshot
|
||||||
* directory.
|
* directory.
|
||||||
* @param dir The snapshottable directory for loading.
|
* @param dir The snapshottable directory for loading.
|
||||||
* @param numSnapshotDiffs The number of {@link SnapshotDiff} that the
|
|
||||||
* directory has.
|
|
||||||
* @param in The {@link DataInput} instance to read.
|
* @param in The {@link DataInput} instance to read.
|
||||||
* @param loader The {@link Loader} instance that this loading procedure is
|
* @param loader The {@link Loader} instance that this loading procedure is
|
||||||
* using.
|
* using.
|
||||||
|
|
|
@ -214,7 +214,7 @@ public class SnapshotManager implements SnapshotStats {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write {@link #snapshotCounter}, {@link #numSnapshots},
|
* Write {@link #snapshotCounter}, {@link #numSnapshots},
|
||||||
* {@link #numSnapshottableDirs} and all snapshots to the DataOutput.
|
* and all snapshots to the DataOutput.
|
||||||
*/
|
*/
|
||||||
public void write(DataOutput out) throws IOException {
|
public void write(DataOutput out) throws IOException {
|
||||||
out.writeInt(snapshotCounter);
|
out.writeInt(snapshotCounter);
|
||||||
|
@ -230,7 +230,7 @@ public class SnapshotManager implements SnapshotStats {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read values of {@link #snapshotCounter}, {@link #numSnapshots}, and
|
* Read values of {@link #snapshotCounter}, {@link #numSnapshots}, and
|
||||||
* {@link #numSnapshottableDirs} and all snapshots from the DataInput
|
* all snapshots from the DataInput
|
||||||
*/
|
*/
|
||||||
public Map<Integer, Snapshot> read(DataInput in, FSImageFormat.Loader loader
|
public Map<Integer, Snapshot> read(DataInput in, FSImageFormat.Loader loader
|
||||||
) throws IOException {
|
) throws IOException {
|
||||||
|
@ -273,7 +273,7 @@ public class SnapshotManager implements SnapshotStats {
|
||||||
statusList.add(status);
|
statusList.add(status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(statusList);
|
Collections.sort(statusList, SnapshottableDirectoryStatus.COMPARATOR);
|
||||||
return statusList.toArray(
|
return statusList.toArray(
|
||||||
new SnapshottableDirectoryStatus[statusList.size()]);
|
new SnapshottableDirectoryStatus[statusList.size()]);
|
||||||
}
|
}
|
||||||
|
@ -302,5 +302,4 @@ public class SnapshotManager implements SnapshotStats {
|
||||||
|
|
||||||
return snapshotRoot.computeDiff(from, to);
|
return snapshotRoot.computeDiff(from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -104,7 +104,7 @@ public class Diff<K, E extends Diff.Element<K>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undo information for some operations such as {@link Diff#delete(E)}
|
* Undo information for some operations such as delete(E)
|
||||||
* and {@link Diff#modify(Element, Element)}.
|
* and {@link Diff#modify(Element, Element)}.
|
||||||
*/
|
*/
|
||||||
public static class UndoInfo<E> {
|
public static class UndoInfo<E> {
|
||||||
|
@ -215,8 +215,8 @@ public class Diff<K, E extends Diff.Element<K>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undo the previous {@link #create(E)} operation. Note that the behavior is
|
* Undo the previous create(E) operation. Note that the behavior is
|
||||||
* undefined if the previous operation is not {@link #create(E)}.
|
* undefined if the previous operation is not create(E).
|
||||||
*/
|
*/
|
||||||
public void undoCreate(final E element, final int insertionPoint) {
|
public void undoCreate(final E element, final int insertionPoint) {
|
||||||
remove(created, insertionPoint, element);
|
remove(created, insertionPoint, element);
|
||||||
|
@ -242,8 +242,8 @@ public class Diff<K, E extends Diff.Element<K>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undo the previous {@link #delete(E)} operation. Note that the behavior is
|
* Undo the previous delete(E) operation. Note that the behavior is
|
||||||
* undefined if the previous operation is not {@link #delete(E)}.
|
* undefined if the previous operation is not delete(E).
|
||||||
*/
|
*/
|
||||||
public void undoDelete(final E element, final UndoInfo<E> undoInfo) {
|
public void undoDelete(final E element, final UndoInfo<E> undoInfo) {
|
||||||
final int c = undoInfo.createdInsertionPoint;
|
final int c = undoInfo.createdInsertionPoint;
|
||||||
|
@ -285,8 +285,8 @@ public class Diff<K, E extends Diff.Element<K>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undo the previous {@link #modify(E, E)} operation. Note that the behavior
|
* Undo the previous modify(E, E) operation. Note that the behavior
|
||||||
* is undefined if the previous operation is not {@link #modify(E, E)}.
|
* is undefined if the previous operation is not modify(E, E).
|
||||||
*/
|
*/
|
||||||
public void undoModify(final E oldElement, final E newElement,
|
public void undoModify(final E oldElement, final E newElement,
|
||||||
final UndoInfo<E> undoInfo) {
|
final UndoInfo<E> undoInfo) {
|
||||||
|
@ -383,24 +383,24 @@ public class Diff<K, E extends Diff.Element<K>> {
|
||||||
* 1.2 (0, d') in this diff: put in c-list --> (c, d')
|
* 1.2 (0, d') in this diff: put in c-list --> (c, d')
|
||||||
* 1.3 (c', d') in this diff: impossible
|
* 1.3 (c', d') in this diff: impossible
|
||||||
* 1.4 (0, 0) in this diff: put in c-list --> (c, 0)
|
* 1.4 (0, 0) in this diff: put in c-list --> (c, 0)
|
||||||
* This is the same logic as {@link #create(E)}.
|
* This is the same logic as create(E).
|
||||||
*
|
*
|
||||||
* 2. For (0, d) in the posterior diff,
|
* 2. For (0, d) in the posterior diff,
|
||||||
* 2.1 (c', 0) in this diff: remove from c-list --> (0, 0)
|
* 2.1 (c', 0) in this diff: remove from c-list --> (0, 0)
|
||||||
* 2.2 (0, d') in this diff: impossible
|
* 2.2 (0, d') in this diff: impossible
|
||||||
* 2.3 (c', d') in this diff: remove from c-list --> (0, d')
|
* 2.3 (c', d') in this diff: remove from c-list --> (0, d')
|
||||||
* 2.4 (0, 0) in this diff: put in d-list --> (0, d)
|
* 2.4 (0, 0) in this diff: put in d-list --> (0, d)
|
||||||
* This is the same logic as {@link #delete(E)}.
|
* This is the same logic as delete(E).
|
||||||
*
|
*
|
||||||
* 3. For (c, d) in the posterior diff,
|
* 3. For (c, d) in the posterior diff,
|
||||||
* 3.1 (c', 0) in this diff: replace the element in c-list --> (c, 0)
|
* 3.1 (c', 0) in this diff: replace the element in c-list --> (c, 0)
|
||||||
* 3.2 (0, d') in this diff: impossible
|
* 3.2 (0, d') in this diff: impossible
|
||||||
* 3.3 (c', d') in this diff: replace the element in c-list --> (c, d')
|
* 3.3 (c', d') in this diff: replace the element in c-list --> (c, d')
|
||||||
* 3.4 (0, 0) in this diff: put in c-list and d-list --> (c, d)
|
* 3.4 (0, 0) in this diff: put in c-list and d-list --> (c, d)
|
||||||
* This is the same logic as {@link #modify(E, E)}.
|
* This is the same logic as modify(E, E).
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @param the posterior diff to combine with.
|
* @param posterior The posterior diff to combine with.
|
||||||
* @param deletedProcesser
|
* @param deletedProcesser
|
||||||
* process the deleted/overwritten elements in case 2.1, 2.3, 3.1 and 3.3.
|
* process the deleted/overwritten elements in case 2.1, 2.3, 3.1 and 3.3.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue