From 965dcc2b3b1749bf83f714ae39d72f83cb17ea72 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 3 May 2011 16:44:32 +0400 Subject: [PATCH] VFS converted to extension points --- .../vfs/DeprecatedVirtualFileSystem.java | 2 +- .../intellij/openapi/vfs/JarFileSystem.java | 3 +- .../intellij/openapi/vfs/LocalFileSystem.java | 3 +- .../openapi/vfs/VirtualFileManager.java | 8 -- .../openapi/vfs/VirtualFileSystem.java | 1 + .../openapi/vfs/ex/http/HttpFileSystem.java | 6 +- .../openapi/vfs/ex/dummy/DummyFileSystem.java | 21 +--- .../vfs/impl/VirtualFileManagerImpl.java | 100 +++++++----------- .../vfs/impl/http/HttpsFileSystem.java | 4 +- .../src/META-INF/PlatformExtensionPoints.xml | 3 + .../src/META-INF/PlatformExtensions.xml | 4 + .../src/componentSets/Platform.xml | 11 -- .../intellij/mock/MockVirtualFileManager.java | 6 -- .../vfs/MavenPropertiesVirtualFileSystem.java | 12 +-- .../src/main/resources/META-INF/plugin.xml | 4 +- 15 files changed, 59 insertions(+), 129 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java index d62c43e91edc..04437fb3ddfa 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/DeprecatedVirtualFileSystem.java @@ -68,7 +68,7 @@ public abstract class DeprecatedVirtualFileSystem extends VirtualFileSystem { } } - protected void fireFileCreated(Object requestor, VirtualFile file) { + protected void fireFileCreated(@Nullable Object requestor, VirtualFile file) { assertWriteAccessAllowed(); if (!myFileListeners.isEmpty()) { diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java index b6951864d49f..29a4a79af77e 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java @@ -15,7 +15,6 @@ */ package com.intellij.openapi.vfs; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem; import com.intellij.util.StringBuilderSpinAllocator; @@ -32,7 +31,7 @@ public abstract class JarFileSystem extends NewVirtualFileSystem { @NonNls public static final String JAR_SEPARATOR = "!/"; public static JarFileSystem getInstance(){ - return ApplicationManager.getApplication().getComponent(JarFileSystem.class); + return (JarFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL); } @Nullable diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/LocalFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/LocalFileSystem.java index 75d6d682e521..d0f776c79195 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/LocalFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/LocalFileSystem.java @@ -15,7 +15,6 @@ */ package com.intellij.openapi.vfs; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem; import com.intellij.util.Processor; import com.intellij.util.io.fs.IFile; @@ -33,7 +32,7 @@ public abstract class LocalFileSystem extends NewVirtualFileSystem { @NonNls public static final String PROTOCOL_PREFIX = PROTOCOL + "://"; private static class LocalFileSystemHolder { - private static final LocalFileSystem ourInstance = ApplicationManager.getApplication().getComponent(LocalFileSystem.class); + private static final LocalFileSystem ourInstance = (LocalFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL); } public static LocalFileSystem getInstance() { diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileManager.java b/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileManager.java index 257e09840502..ca55c0e47493 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileManager.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileManager.java @@ -44,14 +44,6 @@ public abstract class VirtualFileManager implements ModificationTracker{ return ApplicationManager.getApplication().getComponent(VirtualFileManager.class); } - /** - * Gets the array of supported file systems. - * - * @return array of {@link VirtualFileSystem} objects - */ - @NotNull - public abstract VirtualFileSystem[] getFileSystems(); - /** * Gets VirtualFileSystem with the specified protocol. * diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileSystem.java index fe971424f6c1..02d18727ac3a 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/VirtualFileSystem.java @@ -34,6 +34,7 @@ public abstract class VirtualFileSystem { /** * Gets the protocol for this file system. Protocols should differ for all file systems. + * Should be the same as corresponding {@link com.intellij.util.KeyedLazyInstanceEP#key}. * * @return String representing the protocol * @see VirtualFile#getUrl diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/ex/http/HttpFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/ex/http/HttpFileSystem.java index 9297fd4c845b..d140fe3de328 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/ex/http/HttpFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/ex/http/HttpFileSystem.java @@ -15,11 +15,11 @@ */ package com.intellij.openapi.vfs.ex.http; -import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.vfs.DeprecatedVirtualFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.Disposable; +import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,7 @@ public abstract class HttpFileSystem extends DeprecatedVirtualFileSystem impleme @NonNls public static final String PROTOCOL = "http"; public static HttpFileSystem getInstance() { - return ApplicationManager.getApplication().getComponent(HttpFileSystem.class); + return (HttpFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL); } public abstract boolean isFileDownloaded(@NotNull VirtualFile file); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java index f2372e838158..19b55e639413 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/ex/dummy/DummyFileSystem.java @@ -15,11 +15,10 @@ */ package com.intellij.openapi.vfs.ex.dummy; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.vfs.DeprecatedVirtualFileSystem; import com.intellij.openapi.vfs.VfsBundle; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,21 +28,12 @@ import java.io.IOException; /** * */ -public class DummyFileSystem extends DeprecatedVirtualFileSystem implements ApplicationComponent { +public class DummyFileSystem extends DeprecatedVirtualFileSystem { @NonNls public static final String PROTOCOL = "dummy"; private VirtualFileDirectoryImpl myRoot; public static DummyFileSystem getInstance() { - return ApplicationManager.getApplication().getComponent(DummyFileSystem.class); - } - - public DummyFileSystem() { - } - - public void disposeComponent() { - } - - public void initComponent() { + return (DummyFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL); } public VirtualFile createRoot(String name) { @@ -92,11 +82,6 @@ public class DummyFileSystem extends DeprecatedVirtualFileSystem implements Appl return findFileByPath(path); } - @NotNull - public String getComponentName() { - return "DummyFileSystem"; - } - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { fireBeforeFileDeletion(requestor, vFile); final VirtualFileDirectoryImpl parent = (VirtualFileDirectoryImpl)vFile.getParent(); diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java index 3695b62fb25e..3aeb3f751d89 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java @@ -20,7 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.KeyedExtensionCollector; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.ex.VirtualFileManagerEx; import com.intellij.openapi.vfs.newvfs.ManagingFS; @@ -28,29 +28,31 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem; import com.intellij.openapi.vfs.newvfs.RefreshQueue; import com.intellij.util.EventDispatcher; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashMap; import com.intellij.util.messages.MessageBus; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class VirtualFileManagerImpl extends VirtualFileManagerEx implements ApplicationComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vfs.impl.VirtualFileManagerImpl"); - private final ArrayList myFileSystems = new ArrayList(); - private final Map myProtocolToSystemMap = new HashMap(); + private final KeyedExtensionCollector myCollector = + new KeyedExtensionCollector("com.intellij.virtualFileSystem") { + @Override + protected String keyToString(String key) { + return key; + } + }; + + private final List myPhysicalFileSystems = new ArrayList(); private final EventDispatcher myVirtualFileListenerMulticaster = EventDispatcher.create(VirtualFileListener.class); private final List myVirtualFileManagerListeners = ContainerUtil.createEmptyCOWList(); private final EventDispatcher myModificationAttemptListenerMulticaster = EventDispatcher.create(ModificationAttemptListener.class); - @NonNls private static final String USER_HOME = "user.home"; private int myRefreshCount = 0; private final ManagingFS myPersistence; @@ -79,26 +81,25 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx implements Appl } public void registerFileSystem(VirtualFileSystem fileSystem) { - myFileSystems.add(fileSystem); + myCollector.addExplicitExtension(fileSystem.getProtocol(), fileSystem); if (!(fileSystem instanceof NewVirtualFileSystem)) { fileSystem.addVirtualFileListener(myVirtualFileListenerMulticaster.getMulticaster()); } - myProtocolToSystemMap.put(fileSystem.getProtocol(), fileSystem); + myPhysicalFileSystems.add(fileSystem); } public void unregisterFileSystem(VirtualFileSystem fileSystem) { - myFileSystems.remove(fileSystem); + myCollector.removeExplicitExtension(fileSystem.getProtocol(), fileSystem); fileSystem.removeVirtualFileListener(myVirtualFileListenerMulticaster.getMulticaster()); - myProtocolToSystemMap.remove(fileSystem.getProtocol()); - } - - @NotNull - public VirtualFileSystem[] getFileSystems() { - return myFileSystems.toArray(new VirtualFileSystem[myFileSystems.size()]); + myPhysicalFileSystems.remove(fileSystem); } + @Nullable public VirtualFileSystem getFileSystem(String protocol) { - return myProtocolToSystemMap.get(protocol); + List systems = myCollector.forKey(protocol); + if (systems.isEmpty()) return null; + LOG.assertTrue(systems.size() == 1); + return systems.get(0); } public void refresh(boolean asynchronous) { @@ -110,7 +111,7 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx implements Appl ApplicationManager.getApplication().assertIsDispatchThread(); } - for (VirtualFileSystem fileSystem : myFileSystems) { + for (VirtualFileSystem fileSystem : getPhysicalFileSystems()) { if (fileSystem instanceof NewVirtualFileSystem) { ((NewVirtualFileSystem)fileSystem).refreshWithoutFileWatcher(asynchronous); } @@ -120,7 +121,7 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx implements Appl } } - public void refresh(boolean asynchronous, final Runnable postAction) { + public void refresh(boolean asynchronous, @Nullable final Runnable postAction) { if (!asynchronous) { ApplicationManager.getApplication().assertIsDispatchThread(); } @@ -134,28 +135,34 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx implements Appl // RefreshQueue.getInstance().refresh(asynchronous, true, last ? postAction : null, root); //} - for (VirtualFileSystem fileSystem : myFileSystems) { + for (VirtualFileSystem fileSystem : getPhysicalFileSystems()) { if (!(fileSystem instanceof NewVirtualFileSystem)) { fileSystem.refresh(asynchronous); } } } + private List getPhysicalFileSystems() { + return myPhysicalFileSystems; + } + public VirtualFile findFileByUrl(@NotNull String url) { - String protocol = extractProtocol(url); - if (protocol == null) return null; - VirtualFileSystem fileSystem = myProtocolToSystemMap.get(protocol); + VirtualFileSystem fileSystem = getFileSystemForUrl(url); if (fileSystem == null) return null; return fileSystem.findFileByPath(extractPath(url)); } public VirtualFile refreshAndFindFileByUrl(@NotNull String url) { + VirtualFileSystem fileSystem = getFileSystemForUrl(url); + if (fileSystem == null) return null; + return fileSystem.refreshAndFindFileByPath(extractPath(url)); + } + + @Nullable + private VirtualFileSystem getFileSystemForUrl(String url) { String protocol = extractProtocol(url); if (protocol == null) return null; - VirtualFileSystem fileSystem = myProtocolToSystemMap.get(protocol); - if (fileSystem == null) return null; - String path = extractPath(url); - return fileSystem.refreshAndFindFileByPath(path); + return getFileSystem(protocol); } public void addVirtualFileListener(@NotNull VirtualFileListener listener) { @@ -230,41 +237,6 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx implements Appl } } - private static String convertLocalPathToUrl(@NonNls @NotNull String path) { - if (path.startsWith("~")) { - path = System.getProperty(USER_HOME) + path.substring(1); - } - - if (SystemInfo.isWindows || SystemInfo.isOS2) { - if (path.endsWith(":/")) { // instead of getting canonical path - see below - path = Character.toUpperCase(path.charAt(0)) + path.substring(1); - } - } - - if (path.length() == 0) { - try { - path = new File("").getCanonicalPath(); - } - catch (IOException e) { - return null; - } - } - - if (SystemInfo.isWindows) { - if (path.charAt(0) == '/') path = path.substring(1); //hack over new File(path).toUrl().getFile() - if (path.contains("~")) { - try { - path = new File(path.replace('/', File.separatorChar)).getCanonicalPath().replace(File.separatorChar, '/'); - } - catch (IOException e) { - return null; - } - } - } - - return LocalFileSystem.PROTOCOL_PREFIX + path.replace(File.separatorChar, '/'); - } - private static class LoggingListener implements VirtualFileListener { public void propertyChanged(VirtualFilePropertyEvent event) { LOG.debug("propertyChanged: file = " + event.getFile().getUrl() + ", propertyName = " + event.getPropertyName() + ", oldValue = " + diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpsFileSystem.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpsFileSystem.java index 58f00a1b160e..8f1e517c0aad 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpsFileSystem.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/HttpsFileSystem.java @@ -15,7 +15,7 @@ */ package com.intellij.openapi.vfs.impl.http; -import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.vfs.VirtualFileManager; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -30,7 +30,7 @@ public class HttpsFileSystem extends HttpFileSystemBase { } public static HttpsFileSystem getHttpsInstance() { - return ApplicationManager.getApplication().getComponent(HttpsFileSystem.class); + return (HttpsFileSystem)VirtualFileManager.getInstance().getFileSystem(HTTPS_PROTOCOL); } @NotNull diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index 84a0e91e4ab8..88a0541bc5fc 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -25,6 +25,9 @@ + + diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index e9715e61c764..3aa7e19f8cc3 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -212,4 +212,8 @@ + + + + diff --git a/platform/platform-resources/src/componentSets/Platform.xml b/platform/platform-resources/src/componentSets/Platform.xml index 9605bc3a9c51..d3c8dd3fdf75 100644 --- a/platform/platform-resources/src/componentSets/Platform.xml +++ b/platform/platform-resources/src/componentSets/Platform.xml @@ -38,20 +38,9 @@ com.intellij.openapi.vfs.JarFileSystem com.intellij.openapi.vfs.impl.jar.JarFileSystemImpl - - com.intellij.openapi.vfs.ex.dummy.DummyFileSystem - com.intellij.openapi.vfs.ex.temp.TempFileSystem - - com.intellij.openapi.vfs.ex.http.HttpFileSystem - com.intellij.openapi.vfs.impl.http.HttpFileSystemImpl - - - com.intellij.openapi.vfs.impl.http.HttpsFileSystem - - com.intellij.openapi.fileEditor.FileDocumentManager diff --git a/platform/testFramework/src/com/intellij/mock/MockVirtualFileManager.java b/platform/testFramework/src/com/intellij/mock/MockVirtualFileManager.java index d72a0094aa5e..fce3922e45bc 100644 --- a/platform/testFramework/src/com/intellij/mock/MockVirtualFileManager.java +++ b/platform/testFramework/src/com/intellij/mock/MockVirtualFileManager.java @@ -28,12 +28,6 @@ public class MockVirtualFileManager extends VirtualFileManagerEx { super(); } - @NotNull - @Override - public VirtualFileSystem[] getFileSystems() { - return new VirtualFileSystem[0]; - } - @Override public VirtualFileSystem getFileSystem(String protocol) { return null; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenPropertiesVirtualFileSystem.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenPropertiesVirtualFileSystem.java index 7a76fbf80d7f..83d0da5856a2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenPropertiesVirtualFileSystem.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/vfs/MavenPropertiesVirtualFileSystem.java @@ -15,9 +15,8 @@ */ package org.jetbrains.idea.maven.vfs; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.ex.dummy.DummyFileSystem; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; @@ -27,7 +26,7 @@ import org.jetbrains.idea.maven.utils.MavenUtil; import java.util.Map; -public class MavenPropertiesVirtualFileSystem extends DummyFileSystem implements ApplicationComponent { +public class MavenPropertiesVirtualFileSystem extends DummyFileSystem { @NonNls public static final String PROTOCOL = "maven-properties"; @NonNls public static final String SYSTEM_PROPERTIES_FILE = "System.properties"; @@ -38,12 +37,7 @@ public class MavenPropertiesVirtualFileSystem extends DummyFileSystem implements private final Map myFiles = new THashMap(); public static MavenPropertiesVirtualFileSystem getInstance() { - return ApplicationManager.getApplication().getComponent(MavenPropertiesVirtualFileSystem.class); - } - - @NotNull - public String getComponentName() { - return MavenPropertiesVirtualFileSystem.class.getName(); + return (MavenPropertiesVirtualFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL); } @NotNull diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index b1ada2e25ba8..525d2c3f96ee 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -102,15 +102,13 @@ + org.jetbrains.idea.maven.utils.MavenEnvironmentRegistrar - - org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem -