Desugared library nio: Support all FileAttributeView
Change-Id: I3d3f4cc871a8cc07bb4c3ffb026ac32e71f6c11d
diff --git a/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java
new file mode 100644
index 0000000..1b9da3d
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public class AclFileAttributeView {}
diff --git a/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java
new file mode 100644
index 0000000..490fcec
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public class UserDefinedFileAttributeView {}
diff --git a/src/library_desugar/java/java/nio/file/FileApiFlips.java b/src/library_desugar/java/java/nio/file/FileApiFlips.java
index 24a8d31..3ad0a61 100644
--- a/src/library_desugar/java/java/nio/file/FileApiFlips.java
+++ b/src/library_desugar/java/java/nio/file/FileApiFlips.java
@@ -23,18 +23,21 @@
if (attributesClass == j$.nio.file.attribute.BasicFileAttributes.class) {
return java.nio.file.attribute.BasicFileAttributes.class;
}
- if (attributesClass == j$.nio.file.attribute.PosixFileAttributes.class) {
- return java.nio.file.attribute.PosixFileAttributes.class;
- }
if (attributesClass == java.nio.file.attribute.BasicFileAttributes.class) {
return j$.nio.file.attribute.BasicFileAttributes.class;
}
+ if (attributesClass == j$.nio.file.attribute.PosixFileAttributes.class) {
+ return java.nio.file.attribute.PosixFileAttributes.class;
+ }
if (attributesClass == java.nio.file.attribute.PosixFileAttributes.class) {
return j$.nio.file.attribute.PosixFileAttributes.class;
}
if (attributesClass == java.nio.file.attribute.DosFileAttributes.class) {
return j$.nio.file.attribute.DosFileAttributes.class;
}
+ if (attributesClass == j$.nio.file.attribute.DosFileAttributes.class) {
+ return java.nio.file.attribute.DosFileAttributes.class;
+ }
throw exception("java.nio.file.attribute.BasicFileAttributes", attributesClass);
}
@@ -45,24 +48,41 @@
if (attributeView == j$.nio.file.attribute.BasicFileAttributeView.class) {
return java.nio.file.attribute.BasicFileAttributeView.class;
}
- if (attributeView == j$.nio.file.attribute.PosixFileAttributeView.class) {
- return java.nio.file.attribute.PosixFileAttributeView.class;
- }
- if (attributeView == j$.nio.file.attribute.FileOwnerAttributeView.class) {
- return java.nio.file.attribute.FileOwnerAttributeView.class;
- }
if (attributeView == java.nio.file.attribute.BasicFileAttributeView.class) {
return j$.nio.file.attribute.BasicFileAttributeView.class;
}
+ if (attributeView == j$.nio.file.attribute.PosixFileAttributeView.class) {
+ return java.nio.file.attribute.PosixFileAttributeView.class;
+ }
if (attributeView == java.nio.file.attribute.PosixFileAttributeView.class) {
return j$.nio.file.attribute.PosixFileAttributeView.class;
}
+ if (attributeView == j$.nio.file.attribute.FileOwnerAttributeView.class) {
+ return java.nio.file.attribute.FileOwnerAttributeView.class;
+ }
if (attributeView == java.nio.file.attribute.FileOwnerAttributeView.class) {
return j$.nio.file.attribute.FileOwnerAttributeView.class;
}
+ // The following ones don't seem to work on any version in Android, but it's still possible
+ // for generic java code to use them and get null as a result.
if (attributeView == java.nio.file.attribute.DosFileAttributeView.class) {
return j$.nio.file.attribute.DosFileAttributeView.class;
}
+ if (attributeView == j$.nio.file.attribute.DosFileAttributeView.class) {
+ return java.nio.file.attribute.DosFileAttributeView.class;
+ }
+ if (attributeView == java.nio.file.attribute.UserDefinedFileAttributeView.class) {
+ return j$.nio.file.attribute.UserDefinedFileAttributeView.class;
+ }
+ if (attributeView == j$.nio.file.attribute.UserDefinedFileAttributeView.class) {
+ return java.nio.file.attribute.UserDefinedFileAttributeView.class;
+ }
+ if (attributeView == java.nio.file.attribute.AclFileAttributeView.class) {
+ return j$.nio.file.attribute.AclFileAttributeView.class;
+ }
+ if (attributeView == j$.nio.file.attribute.AclFileAttributeView.class) {
+ return java.nio.file.attribute.AclFileAttributeView.class;
+ }
throw exception("java.nio.file.attribute.FileAttributeView", attributeView);
}
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index 52c5568..f4a3aef 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -270,7 +270,9 @@
"java.nio.file.attribute.FileOwnerAttributeView",
"java.nio.file.attribute.DosFileAttributeView",
"java.nio.file.attribute.PosixFileAttributeView",
- "java.nio.file.attribute.BasicFileAttributeView"
+ "java.nio.file.attribute.BasicFileAttributeView",
+ "java.nio.file.attribute.AclFileAttributeView",
+ "java.nio.file.attribute.UserDefinedFileAttributeView"
],
"wrapper_conversion_excluding": {
"java.nio.channels.AsynchronousFileChannel": [
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
index 63e4f02..27f42f0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
@@ -27,14 +27,17 @@
import java.nio.file.OpenOption;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
+import java.nio.file.attribute.AclFileAttributeView;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.DosFileAttributeView;
import java.nio.file.attribute.DosFileAttributes;
+import java.nio.file.attribute.FileOwnerAttributeView;
import java.nio.file.attribute.FileTime;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.UserDefinedFileAttributeView;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
@@ -63,6 +66,9 @@
"true",
"%s",
"null",
+ "null",
+ "%s",
+ "null",
"true",
"%s",
"unsupported",
@@ -81,12 +87,14 @@
ImmutableList.of(
"true",
"true",
+ "true",
"Succeeded with POSIX RO:false",
"Successfully set RO with POSIX",
"Succeeded with POSIX RO:true");
private static final List<String> EXPECTED_RESULT_DESUGARING_NON_POSIX =
ImmutableList.of(
"null",
+ "null",
"unsupported",
"Fail to understand if the file is read-only: class"
+ " java.lang.UnsupportedOperationException",
@@ -153,6 +161,7 @@
Path path = Files.createTempFile("example", ".txt");
readWriteThroughFilesAPI(path);
readThroughFileChannelAPI(path);
+ attributeViewAccess(path);
attributeAccess(path);
Files.setAttribute(path, "basic:lastModifiedTime", FileTime.from(Instant.EPOCH));
pathGeneric();
@@ -247,7 +256,7 @@
System.out.println(mapping.values().iterator().next().getClass().getPackage().getName());
}
- private static void attributeAccess(Path path) throws IOException {
+ private static void attributeViewAccess(Path path) throws IOException {
BasicFileAttributeView basicView =
Files.getFileAttributeView(path, BasicFileAttributeView.class);
if (basicView != null) {
@@ -275,6 +284,43 @@
System.out.println("unsupported");
}
+ try {
+ AclFileAttributeView aclView = Files.getFileAttributeView(path, AclFileAttributeView.class);
+ if (aclView != null) {
+ System.out.println(aclView.getAcl().isEmpty());
+ } else {
+ System.out.println("null");
+ }
+ } catch (UnsupportedOperationException e) {
+ System.out.println("unsupported");
+ }
+
+ try {
+ FileOwnerAttributeView foView =
+ Files.getFileAttributeView(path, FileOwnerAttributeView.class);
+ if (foView != null) {
+ System.out.println(foView.getOwner() != null);
+ } else {
+ System.out.println("null");
+ }
+ } catch (UnsupportedOperationException e) {
+ System.out.println("unsupported");
+ }
+
+ try {
+ UserDefinedFileAttributeView udView =
+ Files.getFileAttributeView(path, UserDefinedFileAttributeView.class);
+ if (udView != null) {
+ System.out.println(udView.name());
+ } else {
+ System.out.println("null");
+ }
+ } catch (UnsupportedOperationException e) {
+ System.out.println("unsupported");
+ }
+ }
+
+ private static void attributeAccess(Path path) throws IOException {
BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);
if (attributes != null) {
System.out.println(attributes.isRegularFile());