summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/vfs/impl
diff options
context:
space:
mode:
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.java4
-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.java22
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/vfs/impl/jar/JarHandler.java20
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) {