Skip to content
This repository was archived by the owner on Apr 2, 2026. It is now read-only.

Commit b813ccc

Browse files
authored
feat: FileSystemProvider::readAttributes faked posix support (#1067)
1 parent 25ee1b7 commit b813ccc

4 files changed

Lines changed: 112 additions & 5 deletions

File tree

google-cloud-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystem.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,11 @@ public final class CloudStorageFileSystem extends FileSystem {
6464
public static final String URI_SCHEME = "gs";
6565
public static final String GCS_VIEW = "gcs";
6666
public static final String BASIC_VIEW = "basic";
67+
public static final String POSIX_VIEW = "posix";
6768
public static final int BLOCK_SIZE_DEFAULT = 2 * 1024 * 1024;
6869
public static final FileTime FILE_TIME_UNKNOWN = FileTime.fromMillis(0);
69-
public static final Set<String> SUPPORTED_VIEWS = ImmutableSet.of(BASIC_VIEW, GCS_VIEW);
70+
public static final Set<String> SUPPORTED_VIEWS =
71+
ImmutableSet.of(BASIC_VIEW, GCS_VIEW, POSIX_VIEW);
7072
private final CloudStorageFileSystemProvider provider;
7173
private final String bucket;
7274
private final CloudStorageConfiguration config;

google-cloud-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystemProvider.java

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
import static com.google.common.base.Preconditions.checkArgument;
2020
import static com.google.common.base.Preconditions.checkNotNull;
2121
import 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

2329
import com.google.api.gax.paging.Page;
2430
import com.google.cloud.storage.Acl;
@@ -62,10 +68,13 @@
6268
import java.nio.file.attribute.BasicFileAttributes;
6369
import java.nio.file.attribute.FileAttribute;
6470
import java.nio.file.attribute.FileAttributeView;
71+
import java.nio.file.attribute.GroupPrincipal;
72+
import java.nio.file.attribute.UserPrincipal;
6573
import java.nio.file.spi.FileSystemProvider;
6674
import java.util.ArrayList;
6775
import java.util.Arrays;
6876
import java.util.Collections;
77+
import java.util.EnumSet;
6978
import java.util.HashMap;
7079
import java.util.Iterator;
7180
import 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 =

google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystemProviderTest.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@
5959
import java.nio.file.Paths;
6060
import java.nio.file.attribute.BasicFileAttributes;
6161
import java.nio.file.attribute.FileTime;
62+
import java.nio.file.attribute.GroupPrincipal;
63+
import java.nio.file.attribute.UserPrincipal;
6264
import java.util.ArrayList;
6365
import java.util.HashMap;
6466
import java.util.List;
@@ -906,7 +908,51 @@ public void testReadAttributes() throws IOException {
906908
assertEquals(
907909
expectedSpecific,
908910
fileSystemProvider.readAttributes(
909-
path1, "basic:lastModifiedTime,isSymbolicLink,isOther,etag,cacheControl"));
911+
path1, "basic:lastModifiedTime,isSymbolicLink,isOther,etag,cacheControl,owner,group"));
912+
913+
// Add the attributes that are only known in posix view
914+
// These are all fake values
915+
expectedSpecific.put(
916+
"owner",
917+
new UserPrincipal() {
918+
@Override
919+
public String getName() {
920+
return "fakeowner";
921+
}
922+
923+
@Override
924+
public String toString() {
925+
return "fakeowner";
926+
}
927+
});
928+
929+
expectedSpecific.put(
930+
"group",
931+
new GroupPrincipal() {
932+
@Override
933+
public String getName() {
934+
return "fakegroup";
935+
}
936+
937+
@Override
938+
public String toString() {
939+
return "fakegroup";
940+
}
941+
});
942+
943+
// The equals between two anonymous classes (the UserPrincipal and GroupPrincipal) is always
944+
// false
945+
// so we compare the toString() instead.
946+
assertEquals(
947+
expectedSpecific.toString(),
948+
fileSystemProvider
949+
.readAttributes(
950+
path1,
951+
"posix:lastModifiedTime,isSymbolicLink,isOther,etag,cacheControl,owner,group")
952+
.toString());
953+
954+
expectedSpecific.remove("owner");
955+
expectedSpecific.remove("group");
910956

911957
// Add the attributes that are only known in gcs view
912958
expectedSpecific.put("etag", Optional.of("TheEtag"));
@@ -915,7 +961,7 @@ public void testReadAttributes() throws IOException {
915961
assertEquals(
916962
expectedSpecific,
917963
fileSystemProvider.readAttributes(
918-
path1, "gcs:lastModifiedTime,isSymbolicLink,isOther,etag,cacheControl"));
964+
path1, "gcs:lastModifiedTime,isSymbolicLink,isOther,etag,cacheControl,owner,group"));
919965
}
920966

921967
private static CloudStorageConfiguration permitEmptyPathComponents(boolean value) {

google-cloud-nio/src/test/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystemTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ public void testGetters() throws IOException {
179179
assertThat(fs.getRootDirectories()).containsExactly(fs.getPath("/"));
180180
assertThat(fs.getFileStores()).isEmpty();
181181
assertThat(fs.getSeparator()).isEqualTo("/");
182-
assertThat(fs.supportedFileAttributeViews()).containsExactly("basic", "gcs");
182+
assertThat(fs.supportedFileAttributeViews()).containsExactly("basic", "gcs", "posix");
183183
}
184184
}
185185

0 commit comments

Comments
 (0)