code: package com.beijunyi.parallelgit.filesystem;
  
  import java.io.IOException;
  import java.nio.file.FileStore;
  import java.nio.file.attribute.FileAttributeView;
  import java.nio.file.attribute.FileStoreAttributeView;
  import javax.annotation.Nonnull;
  import javax.annotation.Nullable;
  
  import com.beijunyi.parallelgit.filesystem.io.GfsFileAttributeView;
  import com.beijunyi.parallelgit.filesystem.io.RootNode;
  import org.eclipse.jgit.revwalk.RevCommit;
  
  import static com.beijunyi.parallelgit.filesystem.GitFileSystemProvider.GFS;
  import static com.beijunyi.parallelgit.filesystem.io.RootNode.*;
  
  public class GfsFileStore extends FileStore {
  
    private final RootNode root;
  
    public GfsFileStore(@Nullable RevCommit commit, GfsObjectService objService) throws IOException {
      root = commit != null ? fromCommit(commit, objService) : newRoot(objService);
    }
  
    @Nonnull
    @Override
    public String name() {
      return GFS;
    }
  
    @Nonnull
    @Override
    public String type() {
      return GFS;
    }
  
    @Override
    public boolean isReadOnly() {
      return false;
    }
  
    @Override
    public long getTotalSpace() {
      return 0;
    }
  
    @Override
    public long getUsableSpace() {
      return 0;
    }
  
    @Override
    public long getUnallocatedSpace() {
      return 0;
    }
  
    @Override
    public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type) {
      return
        type.isAssignableFrom(GfsFileAttributeView.Basic.class)
          || type.isAssignableFrom(GfsFileAttributeView.Posix.class)
          || type.isAssignableFrom(GfsFileAttributeView.Git.class);
    }
  
    @Override
    public boolean supportsFileAttributeView(String name) {
      switch(name) {
        case GfsFileAttributeView.Basic.BASIC_VIEW:
        case GfsFileAttributeView.Posix.POSIX_VIEW:
        case GfsFileAttributeView.Git.GIT_VIEW:
          return true;
        default:
          return false;
      }
    }
  
    @Nullable
    @Override
    public <V extends FileStoreAttributeView> V getFileStoreAttributeView(Class<V> type) {
      return null;
    }
  
    @Override
    public Object getAttribute(String attribute) throws IOException {
      if(attribute.equals("totalSpace"))
        return getTotalSpace();
      if(attribute.equals("usableSpace"))
        return getUsableSpace();
      if(attribute.equals("unallocatedSpace"))
        return getUnallocatedSpace();
      throw new UnsupportedOperationException("'" + attribute + "' not recognized");
    }
  
    @Nonnull
    public RootNode getRoot() {
      return root;
    }
  
  }
  