Cache core jar's vfs children/parent. It'd better be done in normal jar vfs though
authorMaxim Shafirov <max@jetbrains.com>
Tue, 31 Jan 2012 16:50:14 +0000 (20:50 +0400)
committerMaxim Shafirov <max@jetbrains.com>
Tue, 31 Jan 2012 16:51:02 +0000 (20:51 +0400)
platform/core-impl/src/com/intellij/openapi/vfs/impl/jar/CoreJarVirtualFile.java

index c524c6e0992617acc22cf3e4fef4d8bd2769c74d..c2969d9edc098335303acfd3365f24c093deb63b 100644 (file)
@@ -32,11 +32,14 @@ public class CoreJarVirtualFile extends VirtualFile {
   private final CoreJarFileSystem myFileSystem;
   private final CoreJarHandler myHandler;
   private final String myPathInJar;
+  private final VirtualFile myParent;
+  private VirtualFile[] myChildren;
 
   public CoreJarVirtualFile(CoreJarFileSystem fileSystem, CoreJarHandler handler, String pathInJar) {
     myFileSystem = fileSystem;
     myHandler = handler;
     myPathInJar = pathInJar;
+    myParent = calcParent();
   }
 
   @NotNull
@@ -77,6 +80,10 @@ public class CoreJarVirtualFile extends VirtualFile {
 
   @Override
   public VirtualFile getParent() {
+    return myParent;
+  }
+
+  private VirtualFile calcParent() {
     if (myPathInJar.length() == 0) {
       return null;
     }
@@ -89,6 +96,15 @@ public class CoreJarVirtualFile extends VirtualFile {
 
   @Override
   public VirtualFile[] getChildren() {
+    VirtualFile[] answer = myChildren;
+    if (answer == null) {
+      answer = calcChildren();
+      myChildren = answer;
+    }
+    return answer;
+  }
+
+  private VirtualFile[] calcChildren() {
     List<VirtualFile> result = new ArrayList<VirtualFile>();
     final String[] children = myHandler.list(this);
     for (String child : children) {