/*
 * Copyright 2017 The Bazel Authors. All rights reserved.
 *
 * 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.google.idea.blaze.base.io;

import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import java.io.File;
import javax.annotation.Nullable;

/** Provides indirection for virtual file systems. */
public interface VirtualFileSystemProvider {

  static VirtualFileSystemProvider getInstance() {
    return ServiceManager.getService(VirtualFileSystemProvider.class);
  }

  LocalFileSystem getSystem();

  /**
   * Like {@link com.intellij.openapi.vfs.VfsUtil#findFileByIoFile} with refresh set to true.
   *
   * <p>Note: there are restrictions on the calling context. See comments for
   * refreshAndFindFileByIoFile.
   */
  @Nullable
  static VirtualFile findFileByIoFileRefreshIfNeeded(File file) {
    LocalFileSystem fileSystem = getInstance().getSystem();
    VirtualFile virtualFile = fileSystem.findFileByIoFile(file);
    if (virtualFile == null || !virtualFile.isValid()) {
      virtualFile = fileSystem.refreshAndFindFileByIoFile(file);
    }
    return virtualFile;
  }
}
