예제 #1
0
  @Override
  public boolean rename(final Path src, final Path dst) throws IOException {
    // passing resolveLastComponet as false to catch renaming a mount point to
    // itself. We need to catch this as an internal operation and fail.
    InodeTree.ResolveResult<FileSystem> resSrc = fsState.resolve(getUriPath(src), false);

    if (resSrc.isInternalDir()) {
      throw readOnlyMountTable("rename", src);
    }

    InodeTree.ResolveResult<FileSystem> resDst = fsState.resolve(getUriPath(dst), false);
    if (resDst.isInternalDir()) {
      throw readOnlyMountTable("rename", dst);
    }
    /**
     * // Alternate 1: renames within same file system - valid but we disallow // Alternate 2: (as
     * described in next para - valid but we have disallowed it // // Note we compare the URIs. the
     * URIs include the link targets. // hence we allow renames across mount links as long as the
     * mount links // point to the same target. if (!resSrc.targetFileSystem.getUri().equals(
     * resDst.targetFileSystem.getUri())) { throw new IOException("Renames across Mount points not
     * supported"); }
     */

    //
    // Alternate 3 : renames ONLY within the the same mount links.
    //
    if (resSrc.targetFileSystem != resDst.targetFileSystem) {
      throw new IOException("Renames across Mount points not supported");
    }
    return resSrc.targetFileSystem.rename(resSrc.remainingPath, resDst.remainingPath);
  }
예제 #2
0
 @Override
 public BlockLocation[] getFileBlockLocations(FileStatus fs, long start, long len)
     throws IOException {
   final InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(fs.getPath()), true);
   return res.targetFileSystem.getFileBlockLocations(
       new ViewFsFileStatus(fs, res.remainingPath), start, len);
 }
예제 #3
0
 @Override
 public Path resolvePath(final Path f) throws IOException {
   final InodeTree.ResolveResult<FileSystem> res;
   res = fsState.resolve(getUriPath(f), true);
   if (res.isInternalDir()) {
     return f;
   }
   return res.targetFileSystem.resolvePath(res.remainingPath);
 }
예제 #4
0
 @Override
 public short getDefaultReplication(Path f) {
   try {
     InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
     return res.targetFileSystem.getDefaultReplication(res.remainingPath);
   } catch (FileNotFoundException e) {
     throw new NotInMountpointException(f, "getDefaultReplication");
   }
 }
예제 #5
0
 @Override
 public boolean delete(final Path f, final boolean recursive)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   // If internal dir or target is a mount link (ie remainingPath is Slash)
   if (res.isInternalDir() || res.remainingPath == InodeTree.SlashPath) {
     throw readOnlyMountTable("delete", f);
   }
   return res.targetFileSystem.delete(res.remainingPath, recursive);
 }
예제 #6
0
  @Override
  public FileStatus getFileStatus(final Path f)
      throws AccessControlException, FileNotFoundException, IOException {
    InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);

    // FileStatus#getPath is a fully qualified path relative to the root of
    // target file system.
    // We need to change it to viewfs URI - relative to root of mount table.

    // The implementors of RawLocalFileSystem were trying to be very smart.
    // They implement FileStatus#getOwener lazily -- the object
    // returned is really a RawLocalFileSystem that expect the
    // FileStatus#getPath to be unchanged so that it can get owner when needed.
    // Hence we need to interpose a new ViewFileSystemFileStatus that
    // works around.
    FileStatus status = res.targetFileSystem.getFileStatus(res.remainingPath);
    return new ViewFsFileStatus(status, this.makeQualified(f));
  }
예제 #7
0
 @Override
 public FSDataOutputStream create(
     final Path f,
     final FsPermission permission,
     final boolean overwrite,
     final int bufferSize,
     final short replication,
     final long blockSize,
     final Progressable progress)
     throws IOException {
   InodeTree.ResolveResult<FileSystem> res;
   try {
     res = fsState.resolve(getUriPath(f), false);
   } catch (FileNotFoundException e) {
     throw readOnlyMountTable("create", f);
   }
   assert (res.remainingPath != null);
   return res.targetFileSystem.create(
       res.remainingPath, permission, overwrite, bufferSize, replication, blockSize, progress);
 }
예제 #8
0
 @Override
 public FSDataOutputStream createNonRecursive(
     Path f,
     FsPermission permission,
     EnumSet<CreateFlag> flags,
     int bufferSize,
     short replication,
     long blockSize,
     Progressable progress)
     throws IOException {
   InodeTree.ResolveResult<FileSystem> res;
   try {
     res = fsState.resolve(getUriPath(f), false);
   } catch (FileNotFoundException e) {
     throw readOnlyMountTable("create", f);
   }
   assert (res.remainingPath != null);
   return res.targetFileSystem.createNonRecursive(
       res.remainingPath, permission, flags, bufferSize, replication, blockSize, progress);
 }
예제 #9
0
  @Override
  public FileStatus[] listStatus(final Path f)
      throws AccessControlException, FileNotFoundException, IOException {
    InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);

    FileStatus[] statusLst = res.targetFileSystem.listStatus(res.remainingPath);
    if (!res.isInternalDir()) {
      // We need to change the name in the FileStatus as described in
      // {@link #getFileStatus }
      ChRootedFileSystem targetFs;
      targetFs = (ChRootedFileSystem) res.targetFileSystem;
      int i = 0;
      for (FileStatus status : statusLst) {
        String suffix = targetFs.stripOutRoot(status.getPath());
        statusLst[i++] =
            new ViewFsFileStatus(
                status,
                this.makeQualified(suffix.length() == 0 ? f : new Path(res.resolvedPath, suffix)));
      }
    }
    return statusLst;
  }
예제 #10
0
 @Override
 public void setTimes(final Path f, final long mtime, final long atime)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   res.targetFileSystem.setTimes(res.remainingPath, mtime, atime);
 }
예제 #11
0
 @Override
 public boolean mkdirs(final Path dir, final FsPermission permission) throws IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(dir), false);
   return res.targetFileSystem.mkdirs(res.remainingPath, permission);
 }
예제 #12
0
 @Override
 public void setPermission(final Path f, final FsPermission permission)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   res.targetFileSystem.setPermission(res.remainingPath, permission);
 }
예제 #13
0
 @Override
 public boolean setReplication(final Path f, final short replication)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.setReplication(res.remainingPath, replication);
 }
예제 #14
0
 @Override
 public void setOwner(final Path f, final String username, final String groupname)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   res.targetFileSystem.setOwner(res.remainingPath, username, groupname);
 }
예제 #15
0
 @Override
 public FSDataOutputStream append(final Path f, final int bufferSize, final Progressable progress)
     throws IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.append(res.remainingPath, bufferSize, progress);
 }
예제 #16
0
 @Override
 public FSDataInputStream open(final Path f, final int bufferSize)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.open(res.remainingPath, bufferSize);
 }
예제 #17
0
 @Override
 public FileChecksum getFileChecksum(final Path f)
     throws AccessControlException, FileNotFoundException, IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.getFileChecksum(res.remainingPath);
 }
예제 #18
0
 @Override
 public FsServerDefaults getServerDefaults(Path f) throws IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.getServerDefaults(res.remainingPath);
 }
예제 #19
0
 @Override
 public ContentSummary getContentSummary(Path f) throws IOException {
   InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.targetFileSystem.getContentSummary(res.remainingPath);
 }
예제 #20
0
 public Path getTrashCanLocation(final Path f) throws FileNotFoundException {
   final InodeTree.ResolveResult<FileSystem> res = fsState.resolve(getUriPath(f), true);
   return res.isInternalDir() ? null : res.targetFileSystem.getHomeDirectory();
 }