1919import static com .google .common .base .Preconditions .checkArgument ;
2020import static com .google .common .base .Preconditions .checkNotNull ;
2121import static com .google .common .base .Strings .isNullOrEmpty ;
22+ import static java .nio .file .attribute .PosixFilePermission .GROUP_EXECUTE ;
23+ import static java .nio .file .attribute .PosixFilePermission .GROUP_READ ;
24+ import static java .nio .file .attribute .PosixFilePermission .GROUP_WRITE ;
25+ import static java .nio .file .attribute .PosixFilePermission .OWNER_EXECUTE ;
26+ import static java .nio .file .attribute .PosixFilePermission .OWNER_READ ;
27+ import static java .nio .file .attribute .PosixFilePermission .OWNER_WRITE ;
2228
2329import com .google .api .gax .paging .Page ;
2430import com .google .cloud .storage .Acl ;
6268import java .nio .file .attribute .BasicFileAttributes ;
6369import java .nio .file .attribute .FileAttribute ;
6470import java .nio .file .attribute .FileAttributeView ;
71+ import java .nio .file .attribute .GroupPrincipal ;
72+ import java .nio .file .attribute .UserPrincipal ;
6573import java .nio .file .spi .FileSystemProvider ;
6674import java .util .ArrayList ;
6775import java .util .Arrays ;
6876import java .util .Collections ;
77+ import java .util .EnumSet ;
6978import java .util .HashMap ;
7079import java .util .Iterator ;
7180import java .util .List ;
@@ -852,7 +861,7 @@ public Map<String, Object> readAttributes(Path path, String attributes, LinkOpti
852861 // (eg. BasicFileAttributeView and PosixFileAttributeView), so rather than a partial
853862 // implementation we rely on the other overload for now.
854863
855- // Partial implementation for a few commonly used ones: basic, gcs
864+ // Partial implementation for a few commonly used ones: basic, gcs, posix
856865 String [] split = attributes .split (":" , 2 );
857866 if (split .length != 2 ) {
858867 throw new UnsupportedOperationException ();
@@ -868,6 +877,9 @@ public Map<String, Object> readAttributes(Path path, String attributes, LinkOpti
868877 case "gcs" :
869878 fileAttributes = readAttributes (path , CloudStorageFileAttributes .class , options );
870879 break ;
880+ case "posix" :
881+ // There is no real support for posix.
882+ // Some systems expect Posix support for everything so these attributes are faked.
871883 case "basic" :
872884 fileAttributes = readAttributes (path , BasicFileAttributes .class , options );
873885 break ;
@@ -905,6 +917,53 @@ public Map<String, Object> readAttributes(Path path, String attributes, LinkOpti
905917 results .put ("size" , fileAttributes .size ());
906918 }
907919
920+ // There is no real support for posix.
921+ // Some systems fail if there is no posix support at all.
922+ // To let these systems use this FileSystem these attributes are faked.
923+ if (view .equals ("posix" )) {
924+ if (allAttributes || attributeNames .contains ("owner" )) {
925+ results .put (
926+ "owner" ,
927+ new UserPrincipal () {
928+ @ Override
929+ public String getName () {
930+ return "fakeowner" ;
931+ }
932+
933+ @ Override
934+ public String toString () {
935+ return "fakeowner" ;
936+ }
937+ });
938+ }
939+ if (allAttributes || attributeNames .contains ("group" )) {
940+ results .put (
941+ "group" ,
942+ new GroupPrincipal () {
943+ @ Override
944+ public String getName () {
945+ return "fakegroup" ;
946+ }
947+
948+ @ Override
949+ public String toString () {
950+ return "fakegroup" ;
951+ }
952+ });
953+ }
954+ if (allAttributes || attributeNames .contains ("permissions" )) {
955+ if (fileAttributes .isRegularFile ()) {
956+ results .put ("permissions" , EnumSet .of (OWNER_READ , OWNER_WRITE , GROUP_READ , GROUP_WRITE ));
957+ } else {
958+ // Directories, Symlinks and Other:
959+ results .put (
960+ "permissions" ,
961+ EnumSet .of (
962+ OWNER_READ , OWNER_WRITE , OWNER_EXECUTE , GROUP_READ , GROUP_WRITE , GROUP_EXECUTE ));
963+ }
964+ }
965+ }
966+
908967 // CloudStorageFileAttributes
909968 if (fileAttributes instanceof CloudStorageFileAttributes ) {
910969 CloudStorageFileAttributes cloudStorageFileAttributes =
0 commit comments