blob: 9da56eb1a5e0768b17b29575ee516c56cda77fc5 [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 org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* Represents a virtual file system.
*
* @see VirtualFile
* @see VirtualFileManager
*/
public abstract class VirtualFileSystem {
protected 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
* @see VirtualFileManager#getFileSystem
*/
@NonNls
@NotNull
public abstract String getProtocol();
/**
* Searches for the file specified by given path. Path is a string which uniquely identifies file within given
* <code>{@link VirtualFileSystem}</code>. Format of the path depends on the concrete file system.
* For <code>LocalFileSystem</code> it is an absolute file path with file separator characters (File.separatorChar)
* replaced to the forward slash ('/').<p>
* <p/>
* Example: to find a <code>{@link VirtualFile}</code> corresponding to the physical file with the specified path one
* can use the following code: <code>LocalFileSystem.getInstance().findFileByPath(path.replace(File.separatorChar, '/'));</code>
*
* @param path the path to find file by
* @return <code>{@link VirtualFile}</code> if the file was found, <code>null</code> otherwise
*/
@Nullable
public abstract VirtualFile findFileByPath(@NotNull @NonNls String path);
/**
* Fetches presentable URL of file with the given path in this file system.
*
* @param path the path to get presentable URL for
* @return presentable URL
* @see VirtualFile#getPresentableUrl
*/
@NotNull
public String extractPresentableUrl(@NotNull String path) {
return path.replace('/', File.separatorChar);
}
/**
* Refreshes the cached information for all files in this file system from the physical file system.<p>
* <p/>
* If <code>asynchronous</code> is <code>false</code> this method should be only called within write-action.
* See {@link com.intellij.openapi.application.Application#runWriteAction}.
*
* @param asynchronous if <code>true</code> then the operation will be performed in a separate thread,
* otherwise will be performed immediately
* @see VirtualFile#refresh
* @see VirtualFileManager#syncRefresh
* @see VirtualFileManager#asyncRefresh
*/
public abstract void refresh(boolean asynchronous);
/**
* Refreshes only the part of the file system needed for searching the file by the given path and finds file
* by the given path.<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 path the path
* @return <code>{@link VirtualFile}</code> if the file was found, <code>null</code> otherwise
*/
@Nullable
public abstract VirtualFile refreshAndFindFileByPath(@NotNull String path);
/**
* Adds listener to the file system. Normally one should use {@link VirtualFileManager#addVirtualFileListener}.
*
* @param listener the listener
* @see VirtualFileListener
* @see VirtualFileManager#addVirtualFileListener
*/
public abstract void addVirtualFileListener(@NotNull VirtualFileListener listener);
/**
* Removes listener form the file system.
*
* @param listener the listener
*/
public abstract void removeVirtualFileListener(@NotNull VirtualFileListener listener);
@Deprecated
/**
* Deprecated. Current implementation blindly calls plain refresh against the file passed
*/
public void forceRefreshFile(final boolean asynchronous, @NotNull VirtualFile file) {
file.refresh(asynchronous, false);
}
/**
* Implementation of deleting files in this file system
*
* @see VirtualFile#delete(Object)
*/
protected abstract void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException;
/**
* Implementation of moving files in this file system
*
* @see VirtualFile#move(Object,VirtualFile)
*/
protected abstract void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException;
/**
* Implementation of renaming files in this file system
*
* @see VirtualFile#rename(Object,String)
*/
protected abstract void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException;
/**
* Implementation of adding files in this file system
*
* @see VirtualFile#createChildData(Object,String)
*/
@NotNull
protected abstract VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException;
/**
* Implementation of adding directories in this file system
*
* @see VirtualFile#createChildDirectory(Object,String)
*/
@NotNull
protected abstract VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException;
/**
* Implementation of copying files in this file system
*
* @see VirtualFile#copy(Object,VirtualFile,String)
*/
@NotNull
protected abstract VirtualFile copyFile(final Object requestor,
@NotNull VirtualFile virtualFile,
@NotNull VirtualFile newParent,
@NotNull String copyName) throws IOException;
public abstract boolean isReadOnly();
public boolean isCaseSensitive() {
return true;
}
}