blob: b751bdaf8507a717383bf8382f0b24bf1b54f4b3 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.vfs;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.util.io.URLUtil;
import com.intellij.util.messages.Topic;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Manages virtual file systems.
*
* @see VirtualFileSystem
*/
public abstract class VirtualFileManager implements ModificationTracker {
public static final Topic<BulkFileListener> VFS_CHANGES =
new Topic<BulkFileListener>("NewVirtualFileSystem changes", BulkFileListener.class);
/**
* Gets the instance of <code>VirtualFileManager</code>.
*
* @return <code>VirtualFileManager</code>
*/
@NotNull
public static VirtualFileManager getInstance() {
return ApplicationManager.getApplication().getComponent(VirtualFileManager.class);
}
/**
* Gets VirtualFileSystem with the specified protocol.
*
* @param protocol String representing the protocol
* @return {@link VirtualFileSystem}
* @see VirtualFileSystem#getProtocol
*/
public abstract VirtualFileSystem getFileSystem(String protocol);
/**
* <p>Refreshes the cached file systems information from the physical file systems synchronously.<p/>
*
* <p><strong>Note</strong>: this method should be only called within a write-action
* (see {@linkplain com.intellij.openapi.application.Application#runWriteAction})</p>
*
* @return refresh session ID.
*/
public abstract long syncRefresh();
/**
* Refreshes the cached file systems information from the physical file systems asynchronously.
* Launches specified action when refresh is finished.
*
* @return refresh session ID.
*/
public abstract long asyncRefresh(@Nullable Runnable postAction);
public abstract void refreshWithoutFileWatcher(boolean asynchronous);
/**
* Searches for the file specified by given URL. URL is a string which uniquely identifies file in all
* file systems.
*
* @param url the URL to find file by
* @return <code>{@link VirtualFile}</code> if the file was found, <code>null</code> otherwise
* @see VirtualFile#getUrl
* @see VirtualFileSystem#findFileByPath
* @see #refreshAndFindFileByUrl
*/
@Nullable
public abstract VirtualFile findFileByUrl(@NonNls @NotNull String url);
/**
* Refreshes only the part of the file system needed for searching the file by the given URL and finds file
* by the given URL.<br>
* <p/>
* This method is useful when the file was created externally and you need to find <code>{@link VirtualFile}</code>
* corresponding to it.<p>
* <p/>
* This method should be only called within write-action.
* See {@link com.intellij.openapi.application.Application#runWriteAction}.
*
* @param url the URL
* @return <code>{@link VirtualFile}</code> if the file was found, <code>null</code> otherwise
* @see VirtualFileSystem#findFileByPath
* @see VirtualFileSystem#refreshAndFindFileByPath
*/
@Nullable
public abstract VirtualFile refreshAndFindFileByUrl(@NotNull String url);
/**
* Adds listener to the file system.
*
* @param listener the listener
* @see VirtualFileListener
*/
public abstract void addVirtualFileListener(@NotNull VirtualFileListener listener);
public abstract void addVirtualFileListener(@NotNull VirtualFileListener listener, @NotNull Disposable parentDisposable);
/**
* Removes listener form the file system.
*
* @param listener the listener
*/
public abstract void removeVirtualFileListener(@NotNull VirtualFileListener listener);
/**
* Constructs URL by specified protocol and path. URL is a string which uniquely identifies file in all
* file systems.
*
* @param protocol the protocol
* @param path the path
* @return URL
*/
@NotNull
public static String constructUrl(@NotNull String protocol, @NotNull String path) {
return protocol + URLUtil.SCHEME_SEPARATOR + path;
}
/**
* Extracts protocol from the given URL. Protocol is a substring from the beginning of the URL till "://".
*
* @param url the URL
* @return protocol or <code>null</code> if there is no "://" in the URL
* @see VirtualFileSystem#getProtocol
*/
@Nullable
public static String extractProtocol(@NotNull String url) {
int index = url.indexOf(URLUtil.SCHEME_SEPARATOR);
if (index < 0) return null;
return url.substring(0, index);
}
/**
* Extracts path from the given URL. Path is a substring from "://" till the end of URL. If there is no "://" URL
* itself is returned.
*
* @param url the URL
* @return path
*/
@NotNull
public static String extractPath(@NotNull String url) {
int index = url.indexOf(URLUtil.SCHEME_SEPARATOR);
if (index < 0) return url;
return url.substring(index + URLUtil.SCHEME_SEPARATOR.length());
}
public abstract void addVirtualFileManagerListener(@NotNull VirtualFileManagerListener listener);
public abstract void addVirtualFileManagerListener(@NotNull VirtualFileManagerListener listener, @NotNull Disposable parentDisposable);
public abstract void removeVirtualFileManagerListener(@NotNull VirtualFileManagerListener listener);
public abstract void notifyPropertyChanged(@NotNull VirtualFile virtualFile, @NotNull String property, Object oldValue, Object newValue);
}