< prev index next >
src/java.base/share/classes/java/nio/file/attribute/PosixFilePermissions.java
Print this page
rev 51866 : 6194856: Zip Files lose ALL ownership and permissions of the files
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -24,22 +24,137 @@
*/
package java.nio.file.attribute;
import static java.nio.file.attribute.PosixFilePermission.*;
-import java.util.*;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* This class consists exclusively of static methods that operate on sets of
* {@link PosixFilePermission} objects.
*
* @since 1.7
*/
-
public final class PosixFilePermissions {
private PosixFilePermissions() { }
+ /**
+ * The bit flag used to specify read permission by the owner.
+ */
+ public static final int POSIX_USER_READ = 0400;
+
+ /**
+ * The bit flag used to specify write permission by the owner.
+ */
+ public static final int POSIX_USER_WRITE = 0200;
+
+ /**
+ * The bit flag used to specify execute permission by the owner.
+ */
+ public static final int POSIX_USER_EXECUTE = 0100;
+
+ /**
+ * The bit flag used to specify read permission by the group.
+ */
+ public static final int POSIX_GROUP_READ = 040;
+
+ /**
+ * The bit flag used to specify write permission by the group.
+ */
+ public static final int POSIX_GROUP_WRITE = 020;
+
+ /**
+ * The bit flag used to specify execute permission by the group.
+ */
+ public static final int POSIX_GROUP_EXECUTE = 010;
+
+ /**
+ * The bit flag used to specify read permission by others.
+ */
+ public static final int POSIX_OTHER_READ = 04;
+
+ /**
+ * The bit flag used to specify write permission by others.
+ */
+ public static final int POSIX_OTHER_WRITE = 02;
+
+ /**
+ * The bit flag used to specify execute permission by others.
+ */
+ public static final int POSIX_OTHER_EXECUTE = 01;
+
+ /**
+ * Convert a {@link PosixFilePermission} object into the appropriate bit
+ * flag.
+ *
+ * @param perm The {@link PosixFilePermission} object.
+ * @return The bit flag as int.
+ */
+ private static int permToFlag(PosixFilePermission perm) {
+ switch(perm) {
+ case OWNER_READ:
+ return POSIX_USER_READ;
+ case OWNER_WRITE:
+ return POSIX_USER_WRITE;
+ case OWNER_EXECUTE:
+ return POSIX_USER_EXECUTE;
+ case GROUP_READ:
+ return POSIX_GROUP_READ;
+ case GROUP_WRITE:
+ return POSIX_GROUP_WRITE;
+ case GROUP_EXECUTE:
+ return POSIX_GROUP_EXECUTE;
+ case OTHERS_READ:
+ return POSIX_OTHER_READ;
+ case OTHERS_WRITE:
+ return POSIX_OTHER_WRITE;
+ case OTHERS_EXECUTE:
+ return POSIX_OTHER_EXECUTE;
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Converts a set of {@link PosixFilePermission}s into an int value where
+ * the according bits are set.
+ *
+ * @param perms A Set of {@link PosixFilePermission} objects.
+ *
+ * @return A bit mask representing the input Set.
+ */
+ public static int toFlags(Set<PosixFilePermission> perms) {
+ return perms
+ .stream()
+ .mapToInt(PosixFilePermissions::permToFlag)
+ .reduce(0, (p1, p2)-> p1 | p2);
+ }
+
+ /**
+ * Converts a bit mask of Posix file permissions into a set of
+ * {@link PosixFilePermission} objects.
+ *
+ * @param flags The bit mask containing the flags.
+ *
+ * @return A set of {@link PosixFilePermission} objects matching the input
+ * flags.
+ */
+ public static Set<PosixFilePermission> fromFlags(int flags) {
+ if (flags == 0) {
+ return Collections.<PosixFilePermission>emptySet();
+ }
+ return Stream.of(PosixFilePermission.values())
+ .filter(perm -> 0 != (flags & permToFlag(perm)))
+ .collect(Collectors.toSet());
+ }
+
// Write string representation of permission bits to {@code sb}.
private static void writeBits(StringBuilder sb, boolean r, boolean w, boolean x) {
if (r) {
sb.append('r');
} else {
< prev index next >