< 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 >