blob: 87896a739bca770254064e7e964845534916c70a [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed 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.
*/
package org.jetbrains.idea.svn.history;
import com.intellij.openapi.util.Pair;
import com.intellij.util.Consumer;
import com.intellij.util.ThrowableConsumer;
import org.jetbrains.annotations.NotNull;
import org.tmatesoft.svn.core.SVNException;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
public class MergeSourceHierarchyBuilder implements ThrowableConsumer<Pair<LogEntry, Integer>, SVNException> {
private LogHierarchyNode myCurrentHierarchy;
@NotNull private final Consumer<LogHierarchyNode> myConsumer;
public MergeSourceHierarchyBuilder(@NotNull Consumer<LogHierarchyNode> consumer) {
myConsumer = consumer;
}
public void consume(Pair<LogEntry, Integer> svnLogEntryIntegerPair) throws SVNException {
final LogEntry logEntry = svnLogEntryIntegerPair.getFirst();
final Integer mergeLevel = svnLogEntryIntegerPair.getSecond();
if (mergeLevel < 0) {
if (myCurrentHierarchy != null) {
myConsumer.consume(myCurrentHierarchy);
}
if (logEntry.hasChildren()) {
myCurrentHierarchy = new LogHierarchyNode(logEntry);
} else {
// just pass
myCurrentHierarchy = null;
myConsumer.consume(new LogHierarchyNode(logEntry));
}
} else {
addToLevel(myCurrentHierarchy, logEntry, mergeLevel);
}
}
public void finish() {
if (myCurrentHierarchy != null) {
myConsumer.consume(myCurrentHierarchy);
}
}
private static void addToLevel(final LogHierarchyNode tree, final LogEntry entry, final int left) {
assert tree != null;
if (left == 0) {
tree.add(entry);
} else {
final List<LogHierarchyNode> children = tree.getChildren();
assert ! children.isEmpty();
addToLevel(children.get(children.size() - 1), entry, left - 1);
}
}
}