/**
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* muCommander is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.commons.file;
/**
* SimpleFilePermissions is a FilePermissions implementation that takes int values for the permission values and mask.
* Additionally, this class defines <code>padPermission</code> static methods that allows to pad unsupported permission
* bits with default values.
*
* @author Maxence Bernard
*/
public class SimpleFilePermissions extends GroupedPermissionBits implements FilePermissions {
/** The permissions mask */
protected PermissionBits mask;
/**
* Creates a new SimpleFilePermissions using the specified UNIX-style permission int for permission values and
* {@link #FULL_PERMISSION_BITS full permissions mask}.
*
* @param permissions a UNIX-style permission int that holds permission values.
*/
public SimpleFilePermissions(int permissions) {
this(permissions, FULL_PERMISSION_BITS);
}
/**
* Creates a new SimpleFilePermissions using the specified UNIX-style permission int values for permission values
* and mask.
*
* @param permissions a UNIX-style permission int that holds permission values.
* @param mask a UNIX-style permission int which defines which permission bits are supported.
*/
public SimpleFilePermissions(int permissions, int mask) {
this(permissions, new GroupedPermissionBits(mask));
}
/**
* Creates a new SimpleFilePermissions using the specified UNIX-style permission int and permission mask.
*
* @param permissions a UNIX-style permission int that holds permission values.
* @param mask a permission mask which defines which permission bits are supported.
*/
public SimpleFilePermissions(int permissions, PermissionBits mask) {
super(permissions);
this.mask = mask;
}
/**
* Pads the given permissions with the specified ones: the permission bits that are not supported
* (as reported by the supplied permissions mask} are replaced by those of the default permissions.
* That means:<br/>
* - if the mask indicates that all permission bits are supported (mask = 777 octal), the supplied permissions will
* simply be returned, without using any of the default permissions<br/>
* - if the mask indicates that none of the permission bits are supported (mask = 0), the default permissions will
* be returned, without using any of the supplied permissions<br/>
*
* @param permissions the permissions to pad with default permissions for the bits that are not supported
* @param defaultPermissions permissions to use for the bits that are not supported
* @return the permissions padded with the default permissions
*/
public static FilePermissions padPermissions(FilePermissions permissions, FilePermissions defaultPermissions) {
int permissionMask = permissions.getMask().getIntValue();
return new SimpleFilePermissions((
permissions.getIntValue() & permissionMask) | (~permissionMask & defaultPermissions.getIntValue()),
defaultPermissions.getMask());
}
/**
* Pads the given permissions with the specified ones: the permission bits that are not supported
* (as reported by the supplied permissions mask} are replaced by those of the default permissions.
* That means:<br/>
* - if the mask indicates that all permission bits are supported (mask = 777 octal), the supplied permissions will
* simply be returned, without using any of the default permissions<br/>
* - if the mask indicates that none of the permission bits are supported (mask = 0), the default permissions will
* be returned, without using any of the supplied permissions<br/>
*
* @param permissions the permissions to pad with default permissions for the bits that are not supported
* @param supportedPermissionsMask the bit mask that indicates which bits of the given permissions are supported
* @param defaultPermissions permissions to use for the bits that are not supported
* @return the given permissions padded with the default permissions
*/
public static int padPermissions(int permissions, int supportedPermissionsMask, int defaultPermissions) {
return (permissions & supportedPermissionsMask) | (~supportedPermissionsMask & defaultPermissions);
}
////////////////////////////////////
// FilePermissions implementation //
////////////////////////////////////
public PermissionBits getMask() {
return mask;
}
}