From 6ab698cf9ae4fd3fb1aaf33fdce7dccbcf857247 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Mon, 16 May 2016 10:58:42 +0200 Subject: [PATCH] optional callbacks for non-POSIX file systems --- .../tools/ant/taskdefs/SetPermissions.java | 2 +- .../tools/ant/util/PermissionUtils.java | 44 ++++++++++++++++--- .../tools/ant/util/PermissionUtilsTest.java | 12 ++--- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/SetPermissions.java b/src/main/org/apache/tools/ant/taskdefs/SetPermissions.java index b1ccc5a75..f06c4af9e 100644 --- a/src/main/org/apache/tools/ant/taskdefs/SetPermissions.java +++ b/src/main/org/apache/tools/ant/taskdefs/SetPermissions.java @@ -101,7 +101,7 @@ public class SetPermissions extends Task { for (Resource r : resources) { currentResource = r; try { - PermissionUtils.setPermissions(r, permissions); + PermissionUtils.setPermissions(r, permissions, null); } catch (IOException ioe) { maybeThrowException(ioe, "Failed to set permissions on '%s' due to %s", r, ioe.getMessage()); } diff --git a/src/main/org/apache/tools/ant/util/PermissionUtils.java b/src/main/org/apache/tools/ant/util/PermissionUtils.java index 6fbf163c7..ad363f092 100644 --- a/src/main/org/apache/tools/ant/util/PermissionUtils.java +++ b/src/main/org/apache/tools/ant/util/PermissionUtils.java @@ -21,9 +21,12 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFilePermission; import java.util.EnumSet; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.resources.ArchiveResource; @@ -48,7 +51,7 @@ public class PermissionUtils { * @return the "mode" */ public static int modeFromPermissions(Set permissions, - FileType type) { + FileType type) { int mode; switch (type) { case SYMLINK: @@ -101,12 +104,24 @@ public class PermissionUtils { * * @param resource the resource to set permissions for * @param permissions the permissions + * @param posixNotSupportedCallback optional callback that is + * invoked for a file provider resource if the file-system holding + * the file doesn't support PosixFilePermissions. The Path + * corresponding to the file is passed to the callback. */ - public static void setPermissions(Resource r, Set permissions) + public static void setPermissions(Resource r, Set permissions, + Consumer posixNotSupportedCallback) throws IOException { FileProvider f = r.as(FileProvider.class); if (f != null) { - Files.setPosixFilePermissions(f.getFile().toPath(), permissions); + Path p = f.getFile().toPath(); + PosixFileAttributeView view = + Files.getFileAttributeView(p, PosixFileAttributeView.class); + if (view != null) { + view.setPermissions(permissions); + } else if (posixNotSupportedCallback != null) { + posixNotSupportedCallback.accept(p); + } } else if (r instanceof ArchiveResource) { ((ArchiveResource) r).setMode(modeFromPermissions(permissions, FileType.of(r))); @@ -114,8 +129,10 @@ public class PermissionUtils { } /** - * Sets permissions of a {@link Resource} - doesn't returns an - * empty set for unsupported resource types. + * Sets permissions of a {@link Resource} - returns an empty set + * for unsupported resource types or file systems that don't + * support PosixFilePermissions and no fallback has been + * provided.. * *

Supported types are:

*
    @@ -124,12 +141,25 @@ public class PermissionUtils { *
* * @param resource the resource to read permissions from + * @param posixNotSupportedFallback optional fallback function to provide + * permissions for file system that don't support + * PosixFilePermissions. The Path corresponding to the file is + * passed to the callback. * @return the permissions */ - public static Set getPermissions(Resource r) throws IOException { + public static Set getPermissions(Resource r, + Function> posixNotSupportedFallback) + throws IOException { FileProvider f = r.as(FileProvider.class); if (f != null) { - return Files.getPosixFilePermissions(f.getFile().toPath()); + Path p = f.getFile().toPath(); + PosixFileAttributeView view = + Files.getFileAttributeView(p, PosixFileAttributeView.class); + if (view != null) { + return view.readAttributes().permissions(); + } else if (posixNotSupportedFallback != null) { + return posixNotSupportedFallback.apply(p); + } } else if (r instanceof ArchiveResource) { return permissionsFromMode(((ArchiveResource) r).getMode()); } diff --git a/src/tests/junit/org/apache/tools/ant/util/PermissionUtilsTest.java b/src/tests/junit/org/apache/tools/ant/util/PermissionUtilsTest.java index eed265de3..6ec486a61 100644 --- a/src/tests/junit/org/apache/tools/ant/util/PermissionUtilsTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/PermissionUtilsTest.java @@ -105,8 +105,8 @@ public class PermissionUtilsTest { PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.GROUP_READ); - PermissionUtils.setPermissions(new FileResource(f), s); - assertEquals(s, PermissionUtils.getPermissions(new FileResource(f))); + PermissionUtils.setPermissions(new FileResource(f), s, null); + assertEquals(s, PermissionUtils.getPermissions(new FileResource(f), null)); } @Test @@ -127,8 +127,8 @@ public class PermissionUtilsTest { PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.GROUP_READ); - PermissionUtils.setPermissions(r, s); - assertEquals(s, PermissionUtils.getPermissions(r)); + PermissionUtils.setPermissions(r, s, null); + assertEquals(s, PermissionUtils.getPermissions(r, null)); } @Test @@ -149,7 +149,7 @@ public class PermissionUtilsTest { PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.GROUP_READ); - PermissionUtils.setPermissions(r, s); - assertEquals(s, PermissionUtils.getPermissions(r)); + PermissionUtils.setPermissions(r, s, null); + assertEquals(s, PermissionUtils.getPermissions(r, null)); } }