VFS converted to extension points

This commit is contained in:
Dmitry Avdeev
2011-05-03 16:47:55 +04:00
parent 06b9625d50
commit 965dcc2b3b
15 changed files with 59 additions and 129 deletions
@@ -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()) {
@@ -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
@@ -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() {
@@ -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.
*
@@ -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
@@ -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);
@@ -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();
@@ -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<VirtualFileSystem> myFileSystems = new ArrayList<VirtualFileSystem>();
private final Map<String, VirtualFileSystem> myProtocolToSystemMap = new HashMap<String, VirtualFileSystem>();
private final KeyedExtensionCollector<VirtualFileSystem, String> myCollector =
new KeyedExtensionCollector<VirtualFileSystem, String>("com.intellij.virtualFileSystem") {
@Override
protected String keyToString(String key) {
return key;
}
};
private final List<VirtualFileSystem> myPhysicalFileSystems = new ArrayList<VirtualFileSystem>();
private final EventDispatcher<VirtualFileListener> myVirtualFileListenerMulticaster = EventDispatcher.create(VirtualFileListener.class);
private final List<VirtualFileManagerListener> myVirtualFileManagerListeners = ContainerUtil.createEmptyCOWList();
private final EventDispatcher<ModificationAttemptListener> 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<VirtualFileSystem> 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<VirtualFileSystem> 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 = " +
@@ -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
@@ -25,6 +25,9 @@
<extensionPoint name="fileTypeFactory"
interface="com.intellij.openapi.fileTypes.FileTypeFactory"/>
<extensionPoint name="virtualFileSystem"
beanClass="com.intellij.util.KeyedLazyInstanceEP"/>
<extensionPoint name="keymapExtension"
interface="com.intellij.openapi.keymap.KeymapExtension"/>
@@ -212,4 +212,8 @@
<statistics.usagesCollector implementation="com.intellij.openapi.vcs.statistics.VcsUsagesCollector"/>
<applicationConfigurable instance="com.intellij.internal.statistic.configurable.StatisticsConfigurable"/>
<virtualFileSystem key="dummy" implementationClass="com.intellij.openapi.vfs.ex.dummy.DummyFileSystem"/>
<virtualFileSystem key="http" implementationClass="com.intellij.openapi.vfs.impl.http.HttpFileSystemImpl"/>
<virtualFileSystem key="https" implementationClass="com.intellij.openapi.vfs.impl.http.HttpsFileSystem"/>
</extensions>
@@ -38,20 +38,9 @@
<interface-class>com.intellij.openapi.vfs.JarFileSystem</interface-class>
<implementation-class>com.intellij.openapi.vfs.impl.jar.JarFileSystemImpl</implementation-class>
</component>
<component>
<implementation-class>com.intellij.openapi.vfs.ex.dummy.DummyFileSystem</implementation-class>
</component>
<component>
<implementation-class>com.intellij.openapi.vfs.ex.temp.TempFileSystem</implementation-class>
</component>
<component>
<interface-class>com.intellij.openapi.vfs.ex.http.HttpFileSystem</interface-class>
<implementation-class>com.intellij.openapi.vfs.impl.http.HttpFileSystemImpl</implementation-class>
</component>
<component>
<implementation-class>com.intellij.openapi.vfs.impl.http.HttpsFileSystem</implementation-class>
</component>
<component>
<interface-class>com.intellij.openapi.fileEditor.FileDocumentManager</interface-class>
@@ -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;
@@ -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<String, VirtualFile> myFiles = new THashMap<String, VirtualFile>();
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
@@ -102,15 +102,13 @@
<fileTemplateGroup implementation="org.jetbrains.idea.maven.utils.MavenFileTemplateGroupFactory"/>
<annotator language="XML" implementationClass="org.jetbrains.idea.maven.dom.annotator.MavenDomGutterAnnotator"/>
<virtualFileSystem key="maven-properties" implementationClass="org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem"/>
</extensions>
<application-components>
<component>
<implementation-class>org.jetbrains.idea.maven.utils.MavenEnvironmentRegistrar</implementation-class>
</component>
<component>
<implementation-class>org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem</implementation-class>
</component>
</application-components>
<project-components>