LocalHistory: small optimization

This commit is contained in:
Anton Makeev
2011-11-24 12:56:41 +01:00
parent f804c29e56
commit fcf9052f3a
3 changed files with 31 additions and 15 deletions
@@ -24,6 +24,7 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class DirectoryEntry extends Entry {
@@ -64,21 +65,30 @@ public class DirectoryEntry extends Entry {
@Override
public void addChild(Entry child) {
checkDoesNotExist(child, child.getName());
if (!checkDoesNotExist(child, child.getName())) return;
unsafeAddChild(child);
}
public void addChildren(Collection<Entry> children) {
myChildren.ensureCapacity(myChildren.size() + children.size());
for (Entry each : children) {
unsafeAddChild(each);
}
}
private void unsafeAddChild(Entry child) {
myChildren.add(child);
child.setParent(this);
}
protected void checkDoesNotExist(Entry e, String name) {
protected boolean checkDoesNotExist(Entry e, String name) {
Entry found = findChild(name);
if (found == null || found == e) return;
if (found == null) return true;
if (found == e) return false;
removeChild(found);
LocalHistoryLog.LOG.warn(String.format("entry '%s' already exists in '%s'", name, getPath()));
return true;
}
@Override
@@ -171,7 +181,7 @@ public class DirectoryEntry extends Entry {
@Override
protected void collectDeletedDifferences(List<Difference> result) {
result.add(new Difference(false, this, null));
for (Entry child : myChildren) {
child.collectDeletedDifferences(result);
}
@@ -26,6 +26,7 @@ import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -114,6 +115,10 @@ public abstract class Entry {
throw new UnsupportedOperationException(formatAddRemove(child));
}
public void addChildren(Collection<Entry> children) {
throw new UnsupportedOperationException();
}
public void removeChild(Entry child) {
throw new UnsupportedOperationException(formatAddRemove(child));
}
@@ -37,16 +37,14 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.*;
import com.intellij.openapi.vfs.newvfs.ManagingFS;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import com.intellij.util.NullableFunction;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.*;
public class IdeaGateway {
private static final Key<ContentAndTimestamps> SAVED_DOCUMENT_CONTENT_AND_STAMP_KEY
@@ -137,8 +135,8 @@ public class IdeaGateway {
return result;
}
public static Iterable<VirtualFile> iterateDBChildren(VirtualFile f) {
if (!(f instanceof NewVirtualFile)) return ContainerUtil.emptyIterable();
public static Collection<VirtualFile> iterateDBChildren(VirtualFile f) {
if (!(f instanceof NewVirtualFile)) return Collections.emptyList();
NewVirtualFile nf = (NewVirtualFile)f;
return nf.getCachedChildren();
}
@@ -184,11 +182,14 @@ public class IdeaGateway {
return newDir;
}
private void doCreateChildren(DirectoryEntry parent, Iterable<VirtualFile> children, boolean forDeletion) {
for (VirtualFile each : children) {
Entry child = doCreateEntry(each, forDeletion);
if (child != null) parent.addChild(child);
}
private void doCreateChildren(DirectoryEntry parent, Collection<VirtualFile> children, final boolean forDeletion) {
List<Entry> entries = ContainerUtil.mapNotNull(children, new NullableFunction<VirtualFile, Entry>() {
@Override
public Entry fun(VirtualFile each) {
return doCreateEntry(each, forDeletion);
}
});
parent.addChildren(entries);
}
public void registerUnsavedDocuments(final LocalHistoryFacade vcs) {