diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/vfs/impl')
-rw-r--r-- | platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java | 4 | ||||
-rw-r--r-- | platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpVirtualFileImpl.java (renamed from platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java) | 9 | ||||
-rw-r--r-- | platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileManagerImpl.java | 22 | ||||
-rw-r--r-- | platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java | 20 |
4 files changed, 38 insertions, 17 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java index 7177138d1d9a..a2d32fd1307f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpFileSystemBase.java @@ -67,7 +67,9 @@ public abstract class HttpFileSystemBase extends HttpFileSystem { @Override @NotNull public VirtualFile createChild(@NotNull VirtualFile parent, @NotNull String name, boolean isDirectory) { - return getRemoteFileManager().getOrCreateFile((VirtualFileImpl)parent, Urls.newFromIdea(parent.getUrl() + '/' + name), parent.getPath() + '/' + name, isDirectory); + String parentPath = parent.getPath(); + boolean hasEndSlash = parentPath.charAt(parentPath.length() - 1) == '/'; + return getRemoteFileManager().getOrCreateFile((HttpVirtualFileImpl)parent, Urls.newFromIdea(parent.getUrl() + (hasEndSlash ? "" : '/') + name), parentPath + (hasEndSlash ? "" : '/') + name, isDirectory); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpVirtualFileImpl.java index ba49cfb5a690..a8a1a447d66c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpVirtualFileImpl.java @@ -35,7 +35,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.List; -class VirtualFileImpl extends HttpVirtualFile { +class HttpVirtualFileImpl extends HttpVirtualFile { private final HttpFileSystemBase myFileSystem; @Nullable private final RemoteFileInfoImpl myFileInfo; private FileType myInitialFileType; @@ -45,7 +45,7 @@ class VirtualFileImpl extends HttpVirtualFile { private List<VirtualFile> myChildren; - VirtualFileImpl(@NotNull HttpFileSystemBase fileSystem, @Nullable VirtualFileImpl parent, String path, @Nullable RemoteFileInfoImpl fileInfo) { + HttpVirtualFileImpl(@NotNull HttpFileSystemBase fileSystem, @Nullable HttpVirtualFileImpl parent, String path, @Nullable RemoteFileInfoImpl fileInfo) { if (parent != null) { if (parent.myChildren == null) { parent.myChildren = new SmartList<VirtualFile>(); @@ -63,7 +63,7 @@ class VirtualFileImpl extends HttpVirtualFile { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - VirtualFileImpl file = VirtualFileImpl.this; + HttpVirtualFileImpl file = HttpVirtualFileImpl.this; FileDocumentManager.getInstance().reloadFiles(file); if (!localFile.getFileType().equals(myInitialFileType)) { FileContentUtilCore.reparseFiles(file); @@ -135,8 +135,7 @@ class VirtualFileImpl extends HttpVirtualFile { @Override public VirtualFile getParent() { - if (myParentPath == null) return null; - return myFileSystem.findFileByPath(myParentPath, true); + return myParentPath == null ? null : myFileSystem.findFileByPath(myParentPath, true); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileManagerImpl.java index b69c0befd376..904233a35cdf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/RemoteFileManagerImpl.java @@ -17,7 +17,6 @@ package com.intellij.openapi.vfs.impl.http; import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.ex.http.HttpVirtualFileListener; import com.intellij.util.EventDispatcher; @@ -35,7 +34,10 @@ import java.util.Map; */ public class RemoteFileManagerImpl extends RemoteFileManager implements Disposable { private final LocalFileStorage myStorage; - private final Map<Pair<Boolean, Url>, VirtualFileImpl> myRemoteFiles = new THashMap<Pair<Boolean, Url>, VirtualFileImpl>(); + + private final Map<Url, HttpVirtualFileImpl> remoteFiles = new THashMap<Url, HttpVirtualFileImpl>(); + private final Map<Url, HttpVirtualFileImpl> remoteDirectories = new THashMap<Url, HttpVirtualFileImpl>(); + private final EventDispatcher<HttpVirtualFileListener> myDispatcher = EventDispatcher.create(HttpVirtualFileListener.class); private final List<RemoteContentProvider> myProviders = new ArrayList<RemoteContentProvider>(); private final DefaultRemoteContentProvider myDefaultRemoteContentProvider; @@ -55,19 +57,19 @@ public class RemoteFileManagerImpl extends RemoteFileManager implements Disposab return myDefaultRemoteContentProvider; } - public synchronized VirtualFileImpl getOrCreateFile(@Nullable VirtualFileImpl parent, @NotNull Url url, @NotNull String path, final boolean directory) { - Pair<Boolean, Url> key = Pair.create(directory, url); - VirtualFileImpl file = myRemoteFiles.get(key); + public synchronized HttpVirtualFileImpl getOrCreateFile(@Nullable HttpVirtualFileImpl parent, @NotNull Url url, @NotNull String path, final boolean directory) { + Map<Url, HttpVirtualFileImpl> cache = directory ? remoteDirectories : remoteFiles; + HttpVirtualFileImpl file = cache.get(url); if (file == null) { if (directory) { - file = new VirtualFileImpl(getHttpFileSystem(url), parent, path, null); + file = new HttpVirtualFileImpl(getHttpFileSystem(url), parent, path, null); } else { RemoteFileInfoImpl fileInfo = new RemoteFileInfoImpl(url, this); - file = new VirtualFileImpl(getHttpFileSystem(url), parent, path, fileInfo); + file = new HttpVirtualFileImpl(getHttpFileSystem(url), parent, path, fileInfo); fileInfo.addDownloadingListener(new MyDownloadingListener(file)); } - myRemoteFiles.put(key, file); + cache.put(url, file); } return file; } @@ -133,9 +135,9 @@ public class RemoteFileManagerImpl extends RemoteFileManager implements Disposab } private class MyDownloadingListener extends FileDownloadingAdapter { - private final VirtualFileImpl myFile; + private final HttpVirtualFileImpl myFile; - public MyDownloadingListener(final VirtualFileImpl file) { + public MyDownloadingListener(final HttpVirtualFileImpl file) { myFile = file; } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java index efaf84d08b8e..98c3884cc993 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java @@ -22,6 +22,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.NotNullLazyValue; +import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileAttributes; import com.intellij.openapi.util.io.FileSystemUtil; import com.intellij.openapi.util.io.FileUtil; @@ -30,6 +31,7 @@ import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsBundle; import com.intellij.openapi.vfs.impl.ZipHandler; import com.intellij.openapi.vfs.newvfs.persistent.FSRecords; +import com.intellij.openapi.vfs.newvfs.persistent.FlushingDaemon; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.IOUtil; @@ -169,7 +171,6 @@ public class JarHandler extends ZipHandler { info = new CacheLibraryInfo(mirrorFile.getName(), originalAttributes.lastModified, originalAttributes.length); CacheLibraryInfo.ourCachedLibraryInfo.put(path, info); - CacheLibraryInfo.ourCachedLibraryInfo.force(); return mirrorFile; } catch (IOException ex) { @@ -260,6 +261,23 @@ public class JarHandler extends ZipHandler { } assert info != null; ourCachedLibraryInfo = info; + FlushingDaemon.everyFiveSeconds(new Runnable() { + @Override + public void run() { + flushCachedLibraryInfos(); + } + }); + + ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { + @Override + public void run() { + flushCachedLibraryInfos(); + } + }); + } + + private static void flushCachedLibraryInfos() { + if (ourCachedLibraryInfo.isDirty()) ourCachedLibraryInfo.force(); } private CacheLibraryInfo(@NotNull String path, long time, long length) { |