< 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 **** /* ! * Copyright (c) 2007, 2011, 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 --- 1,7 ---- /* ! * 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,45 **** */ package java.nio.file.attribute; import static java.nio.file.attribute.PosixFilePermission.*; ! import java.util.*; /** * This class consists exclusively of static methods that operate on sets of * {@link PosixFilePermission} objects. * * @since 1.7 */ - public final class PosixFilePermissions { private PosixFilePermissions() { } // 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 { --- 24,160 ---- */ package java.nio.file.attribute; import static java.nio.file.attribute.PosixFilePermission.*; ! ! 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 >