/*
* Copyright 2000-2016 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.vfs.newvfs.NewVirtualFileSystem;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import static java.util.Collections.singleton;
public abstract class LocalFileSystem extends NewVirtualFileSystem {
@NonNls public static final String PROTOCOL = StandardFileSystems.FILE_PROTOCOL;
@NonNls public static final String PROTOCOL_PREFIX = StandardFileSystems.FILE_PROTOCOL_PREFIX;
@SuppressWarnings("UtilityClassWithoutPrivateConstructor")
private static class LocalFileSystemHolder {
private static final LocalFileSystem ourInstance = (LocalFileSystem)VirtualFileManager.getInstance().getFileSystem(PROTOCOL);
}
public static LocalFileSystem getInstance() {
return LocalFileSystemHolder.ourInstance;
}
@Nullable
public abstract VirtualFile findFileByIoFile(@NotNull File file);
@Nullable
public abstract VirtualFile refreshAndFindFileByIoFile(@NotNull File file);
/**
* Performs a non-recursive synchronous refresh of specified files.
*
* @param files files to refresh.
* @since 6.0
*/
public abstract void refreshIoFiles(@NotNull Iterable<File> files);
public abstract void refreshIoFiles(@NotNull Iterable<File> files, boolean async, boolean recursive, @Nullable Runnable onFinish);
/**
* Performs a non-recursive synchronous refresh of specified files.
*
* @param files files to refresh.
* @since 6.0
*/
public abstract void refreshFiles(@NotNull Iterable<VirtualFile> files);
public abstract void refreshFiles(@NotNull Iterable<VirtualFile> files, boolean async, boolean recursive, @Nullable Runnable onFinish);
public interface WatchRequest {
@NotNull
String getRootPath();
boolean isToWatchRecursively();
}
@Nullable
public WatchRequest addRootToWatch(@NotNull String rootPath, boolean watchRecursively) {
Set<WatchRequest> result = addRootsToWatch(singleton(rootPath), watchRecursively);
return result.size() == 1 ? result.iterator().next() : null;
}
@NotNull
public Set<WatchRequest> addRootsToWatch(@NotNull Collection<String> rootPaths, boolean watchRecursively) {
if (rootPaths.isEmpty()) {
return Collections.emptySet();
}
else if (watchRecursively) {
return replaceWatchedRoots(Collections.emptySet(), rootPaths, null);
}
else {
return replaceWatchedRoots(Collections.emptySet(), null, rootPaths);
}
}
public void removeWatchedRoot(@Nullable WatchRequest watchRequest) {
if (watchRequest != null) {
removeWatchedRoots(singleton(watchRequest));
}
}
public void removeWatchedRoots(@NotNull Collection<WatchRequest> watchRequests) {
if (!watchRequests.isEmpty()) {
replaceWatchedRoots(watchRequests, null, null);
}
}
@Nullable
public WatchRequest replaceWatchedRoot(@Nullable WatchRequest watchRequest, @NotNull String rootPath, boolean watchRecursively) {
Set<WatchRequest> requests = watchRequest != null ? singleton(watchRequest) : Collections.emptySet();
Set<String> roots = singleton(rootPath);
Set<WatchRequest> result = watchRecursively ? replaceWatchedRoots(requests, roots, null) : replaceWatchedRoots(requests, null, roots);
return result.size() == 1 ? result.iterator().next() : null;
}
@NotNull
public abstract Set<WatchRequest> replaceWatchedRoots(@NotNull Collection<WatchRequest> watchRequests,
@Nullable Collection<String> recursiveRoots,
@Nullable Collection<String> flatRoots);
/**
* Registers a handler that allows a version control system plugin to intercept file operations in the local file system
* and to perform them through the VCS tool.
*
* @param handler the handler instance.
*/
public abstract void registerAuxiliaryFileOperationsHandler(@NotNull LocalFileOperationsHandler handler);
/**
* Unregisters a handler that allows a version control system plugin to intercept file operations in the local file system
* and to perform them through the VCS tool.
*
* @param handler the handler instance.
*/
public abstract void unregisterAuxiliaryFileOperationsHandler(@NotNull LocalFileOperationsHandler handler);
public abstract boolean processCachedFilesInSubtree(@NotNull VirtualFile file, @NotNull Processor<VirtualFile> processor);
}