/*
* Copyright (C) 2012 The CyanogenMod Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cyanogenmod.filemanager.model;
import com.cyanogenmod.filemanager.util.ParseHelper;
import java.io.Serializable;
import java.text.ParseException;
/**
* Permissions of a filesystem object.
*
* @see Permission
* @see FileSystemObject
*/
public class Permissions implements Serializable, Comparable<Permissions> {
private static final long serialVersionUID = -8268598363293965341L;
private UserPermission mUser;
private GroupPermission mGroup;
private OthersPermission mOthers;
/**
* Constructor of <code>Permissions</code>.
*
* @param user The permissions for the proprietary user of the filesystem object
* @param group The permissions for the proprietary group of the filesystem object
* @param others The permissions for the non proprietary users of the filesystem object
*/
public Permissions(UserPermission user, GroupPermission group, OthersPermission others) {
super();
this.mUser = user;
this.mGroup = group;
this.mOthers = others;
}
/**
* Method that returns the permissions for the proprietary user of the filesystem object.
*
* @return UserPermission The permissions for the proprietary user of the filesystem object
*/
public UserPermission getUser() {
return this.mUser;
}
/**
* Method that returns the permissions for the proprietary user of the filesystem object.
*
* @param user The permissions for the proprietary user of the filesystem object
*/
public void setUser(UserPermission user) {
this.mUser = user;
}
/**
* Method that returns the permissions for the proprietary group of the filesystem object.
*
* @return GroupPermission The permissions for the proprietary group of the filesystem object
*/
public GroupPermission getGroup() {
return this.mGroup;
}
/**
* Method that returns the permissions for the proprietary group of the filesystem object.
*
* @param group The permissions for the proprietary group of the filesystem object
*/
public void setGroup(GroupPermission group) {
this.mGroup = group;
}
/**
* Method that returns the permissions for the non proprietary users of the filesystem object.
*
* @return Permission The permissions for the non proprietary users of the filesystem object
*/
public OthersPermission getOthers() {
return this.mOthers;
}
/**
* Method that returns the permissions for the non proprietary users of the filesystem object.
*
* @param others The permissions for the non proprietary users of the filesystem object
*/
public void setOthers(OthersPermission others) {
this.mOthers = others;
}
/**
* {@inheritDoc}
*/
@Override
public int compareTo(Permissions another) {
String o1 = this.toRawString();
String o2 = another.toRawString();
return o1.compareTo(o2);
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((this.mGroup == null) ? 0 : this.mGroup.hashCode());
result = prime * result + ((this.mOthers == null) ? 0 : this.mOthers.hashCode());
result = prime * result + ((this.mUser == null) ? 0 : this.mUser.hashCode());
return result;
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Permissions other = (Permissions) obj;
if (this.mGroup == null) {
if (other.mGroup != null) {
return false;
}
} else if (!this.mGroup.equals(other.mGroup)) {
return false;
}
if (this.mOthers == null) {
if (other.mOthers != null) {
return false;
}
} else if (!this.mOthers.equals(other.mOthers)) {
return false;
}
if (this.mUser == null) {
if (other.mUser != null) {
return false;
}
} else if (!this.mUser.equals(other.mUser)) {
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return "Permissions [user=" + this.mUser //$NON-NLS-1$
+ ", group=" + this.mGroup + //$NON-NLS-1$
", others=" + this.mOthers + "]"; //$NON-NLS-1$//$NON-NLS-2$
}
/**
* Method that returns a string representation of the permissions,
* conforming with the unix style (rwx).
*
* @return String The string representation of the permissions
*/
public String toRawString() {
return String.format("%s%s%s", //$NON-NLS-1$
this.mUser.toRawString(),
this.mGroup.toRawString(),
this.mOthers.toRawString());
}
/**
* Method that converts every permission into octal numbers,
* conforming with the unix style (xe: 0755).
*
* @return String The octal numbers string for the permissions
*/
@SuppressWarnings("boxing")
public String toOctalString() {
//SetUID/SetGID/Sticky Bit
int b = 0;
if (this.mUser.isSetUID()) {
b = b | 0x04;
}
if (this.mGroup.isSetGID()) {
b = b | 0x02;
}
if (this.mOthers.isStickybit()) {
b = b | 0x01;
}
//User
int u = 0;
if (this.mUser.isRead()) {
u = u | 0x04;
}
if (this.mUser.isWrite()) {
u = u | 0x02;
}
if (this.mUser.isExecute()) {
u = u | 0x01;
}
//Group
int g = 0;
if (this.mGroup.isRead()) {
g = g | 0x04;
}
if (this.mGroup.isWrite()) {
g = g | 0x02;
}
if (this.mGroup.isExecute()) {
g = g | 0x01;
}
//Others
int o = 0;
if (this.mOthers.isRead()) {
o = o | 0x04;
}
if (this.mOthers.isWrite()) {
o = o | 0x02;
}
if (this.mOthers.isExecute()) {
o = o | 0x01;
}
//Return octal string
return String.format("%d%d%d%d", b, u, g, o); //$NON-NLS-1$
}
/**
* Method that parses and extracts the permissions from a unix string format.
*
* @param rawPermissions The raw permissions
* @return Permissions An object with all the permissions
* @throws ParseException If the permissions can't be parsed
* @see ParseHelper#parsePermission(String)
*/
public static Permissions fromRawString(String rawPermissions) throws ParseException {
return ParseHelper.parsePermission(rawPermissions);
}
/**
* Method that converts the unix style octal number into a Permissions reference
*
* @param octalPermissions The octal permissions
* @return Permissions An object with all the permissions
* @throws ParseException If the permissions can't be parsed
*/
public static Permissions fromOctalString(String octalPermissions) throws ParseException {
int size = octalPermissions.length();
if (size != 3 && size != 4) {
throw new ParseException(
"Invalid permissions string length: !=3 or != 4", 0); //$NON-NLS-1$
}
// Extract the data into char
int cc = 0;
char b = 0;
if (size == 4) {
b = octalPermissions.charAt(cc);
cc++;
}
char u = octalPermissions.charAt(cc);
cc++;
char g = octalPermissions.charAt(cc);
cc++;
char o = octalPermissions.charAt(cc);
cc++;
//Get permissions
UserPermission user =
new UserPermission(
(u & 0x04) == 0x04,
(u & 0x02) == 0x02,
(u & 0x01) == 0x01,
(b & 0x01) == 0x01);
GroupPermission group =
new GroupPermission(
(g & 0x04) == 0x04,
(g & 0x02) == 0x02,
(g & 0x01) == 0x01,
(b & 0x02) == 0x02);
OthersPermission other =
new OthersPermission(
(o & 0x04) == 0x04,
(o & 0x02) == 0x02,
(o & 0x01) == 0x01,
(b & 0x04) == 0x04);
return new Permissions(user, group, other);
}
}