@Override
 public boolean rename(Path src, Path dst) throws IOException {
   Path absoluteSrc = makeAbsolute(src);
   INode srcINode = store.retrieveINode(absoluteSrc);
   if (srcINode == null) {
     // src path doesn't exist
     return false;
   }
   Path absoluteDst = makeAbsolute(dst);
   INode dstINode = store.retrieveINode(absoluteDst);
   if (dstINode != null && dstINode.isDirectory()) {
     absoluteDst = new Path(absoluteDst, absoluteSrc.getName());
     dstINode = store.retrieveINode(absoluteDst);
   }
   if (dstINode != null) {
     // dst path already exists - can't overwrite
     return false;
   }
   Path dstParent = absoluteDst.getParent();
   if (dstParent != null) {
     INode dstParentINode = store.retrieveINode(dstParent);
     if (dstParentINode == null || dstParentINode.isFile()) {
       // dst parent doesn't exist or is a file
       return false;
     }
   }
   return renameRecursive(absoluteSrc, absoluteDst);
 }
 private static long findLength(INode inode) {
   if (!inode.isDirectory()) {
     long length = 0L;
     for (Block block : inode.getBlocks()) {
       length += block.getLength();
     }
     return length;
   }
   return 0;
 }
 private INode checkFile(Path path) throws IOException {
   INode inode = store.retrieveINode(makeAbsolute(path));
   if (inode == null) {
     throw new IOException("No such file.");
   }
   if (inode.isDirectory()) {
     throw new IOException("Path " + path + " is a directory.");
   }
   return inode;
 }
 private boolean renameRecursive(Path src, Path dst) throws IOException {
   INode srcINode = store.retrieveINode(src);
   store.storeINode(dst, srcINode);
   store.deleteINode(src);
   if (srcINode.isDirectory()) {
     for (Path oldSrc : store.listDeepSubPaths(src)) {
       INode inode = store.retrieveINode(oldSrc);
       if (inode == null) {
         return false;
       }
       String oldSrcPath = oldSrc.toUri().getPath();
       String srcPath = src.toUri().getPath();
       String dstPath = dst.toUri().getPath();
       Path newDst = new Path(oldSrcPath.replaceFirst(srcPath, dstPath));
       store.storeINode(newDst, inode);
       store.deleteINode(oldSrc);
     }
   }
   return true;
 }
 OssFileStatus(Path f, INode inode) throws IOException {
   super(findLength(inode), inode.isDirectory(), 1, findBlocksize(inode), 0, f);
 }