diff --git a/gcs/src/main/java/com/google/cloud/hadoop/fs/gcs/InMemoryGlobberFileSystem.java b/gcs/src/main/java/com/google/cloud/hadoop/fs/gcs/InMemoryGlobberFileSystem.java index 1c590d39a3..21a30bdb18 100644 --- a/gcs/src/main/java/com/google/cloud/hadoop/fs/gcs/InMemoryGlobberFileSystem.java +++ b/gcs/src/main/java/com/google/cloud/hadoop/fs/gcs/InMemoryGlobberFileSystem.java @@ -112,7 +112,7 @@ public FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException FileStatus[] result = new FileStatus[fileStatuses.size()]; for (int i = 0; i < fileStatuses.size(); i++) { // Clone FileStatus objects because they are mutable and Hadoop actually can modify them - result[i] = new FileStatus(fileStatuses.get(i)); + result[i] = newFileStatus(fileStatuses.get(i)); } return result; } @@ -127,7 +127,7 @@ public FileStatus getFileStatus(Path f) throws IOException { String.format("Path '%s' (qualified: '%s') does not exist.", f, qualifiedPath)); } // Clone FileStatus object because it is mutable and Hadoop actually can modify it - return new FileStatus(fileStatus); + return newFileStatus(fileStatus); } // Below are unsupported methods that are not used in 'globStatus' calls @@ -188,4 +188,24 @@ public void setWorkingDirectory(Path newDir) { public boolean mkdirs(Path f, FsPermission permission) throws IOException { throw new UnsupportedOperationException(); } + + private static FileStatus newFileStatus(FileStatus fileStatus) { + FsPermission fsPermission = fileStatus.getPermission(); + return new FileStatus( + fileStatus.getLen(), + fileStatus.isDir(), + fileStatus.getReplication(), + fileStatus.getBlockSize(), + fileStatus.getModificationTime(), + fileStatus.getAccessTime(), + fsPermission == null + ? null + : new FsPermission( + fsPermission.getUserAction(), + fsPermission.getGroupAction(), + fsPermission.getOtherAction()), + fileStatus.getOwner(), + fileStatus.getGroup(), + fileStatus.getPath()); + } }