1dfb59d50631968ab1a13002ea5421ece93169851chrismair/* 2dfb59d50631968ab1a13002ea5421ece93169851chrismair * Copyright 2008 the original author or authors. 3dfb59d50631968ab1a13002ea5421ece93169851chrismair * 4dfb59d50631968ab1a13002ea5421ece93169851chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 5dfb59d50631968ab1a13002ea5421ece93169851chrismair * you may not use this file except in compliance with the License. 6dfb59d50631968ab1a13002ea5421ece93169851chrismair * You may obtain a copy of the License at 7dfb59d50631968ab1a13002ea5421ece93169851chrismair * 8dfb59d50631968ab1a13002ea5421ece93169851chrismair * http://www.apache.org/licenses/LICENSE-2.0 9dfb59d50631968ab1a13002ea5421ece93169851chrismair * 10dfb59d50631968ab1a13002ea5421ece93169851chrismair * Unless required by applicable law or agreed to in writing, software 11dfb59d50631968ab1a13002ea5421ece93169851chrismair * distributed under the License is distributed on an "AS IS" BASIS, 12dfb59d50631968ab1a13002ea5421ece93169851chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dfb59d50631968ab1a13002ea5421ece93169851chrismair * See the License for the specific language governing permissions and 14dfb59d50631968ab1a13002ea5421ece93169851chrismair * limitations under the License. 15dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 16dfb59d50631968ab1a13002ea5421ece93169851chrismairpackage org.mockftpserver.fake.filesystem; 17dfb59d50631968ab1a13002ea5421ece93169851chrismair 18dfb59d50631968ab1a13002ea5421ece93169851chrismairimport org.mockftpserver.core.util.Assert; 19dfb59d50631968ab1a13002ea5421ece93169851chrismair 20dfb59d50631968ab1a13002ea5421ece93169851chrismair/** 21dfb59d50631968ab1a13002ea5421ece93169851chrismair * Represents and encapsulates the read/write/execute permissions for a file or directory. 22dfb59d50631968ab1a13002ea5421ece93169851chrismair * This is conceptually (and somewhat loosely) based on the permissions flags within the Unix 23dfb59d50631968ab1a13002ea5421ece93169851chrismair * file system. An instance of this class is immutable. 24dfb59d50631968ab1a13002ea5421ece93169851chrismair * 25dfb59d50631968ab1a13002ea5421ece93169851chrismair * @author Chris Mair 26dfb59d50631968ab1a13002ea5421ece93169851chrismair * @version $Revision$ - $Date$ 27dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 28dfb59d50631968ab1a13002ea5421ece93169851chrismairpublic class Permissions { 29dfb59d50631968ab1a13002ea5421ece93169851chrismair public static final Permissions ALL = new Permissions("rwxrwxrwx"); 30dfb59d50631968ab1a13002ea5421ece93169851chrismair public static final Permissions NONE = new Permissions("---------"); 31dfb59d50631968ab1a13002ea5421ece93169851chrismair public static final Permissions DEFAULT = ALL; 32dfb59d50631968ab1a13002ea5421ece93169851chrismair 33dfb59d50631968ab1a13002ea5421ece93169851chrismair private static final char READ_CHAR = 'r'; 34dfb59d50631968ab1a13002ea5421ece93169851chrismair private static final char WRITE_CHAR = 'w'; 35dfb59d50631968ab1a13002ea5421ece93169851chrismair private static final char EXECUTE_CHAR = 'x'; 36dfb59d50631968ab1a13002ea5421ece93169851chrismair 37dfb59d50631968ab1a13002ea5421ece93169851chrismair private String rwxString; 38dfb59d50631968ab1a13002ea5421ece93169851chrismair 39dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 40dfb59d50631968ab1a13002ea5421ece93169851chrismair * Costruct a new instance for the specified read/write/execute specification String 41dfb59d50631968ab1a13002ea5421ece93169851chrismair * 42dfb59d50631968ab1a13002ea5421ece93169851chrismair * @param rwxString - the read/write/execute specification String; must be 9 characters long, with chars 43dfb59d50631968ab1a13002ea5421ece93169851chrismair * at index 0,3,6 == '-' or 'r', chars at index 1,4,7 == '-' or 'w' and chars at index 2,5,8 == '-' or 'x'. 44dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 45dfb59d50631968ab1a13002ea5421ece93169851chrismair public Permissions(String rwxString) { 46dfb59d50631968ab1a13002ea5421ece93169851chrismair Assert.isTrue(rwxString.length() == 9, "The permissions string must be exactly 9 characters"); 47dfb59d50631968ab1a13002ea5421ece93169851chrismair final String RWX = "(-|r)(-|w)(-|x)"; 48dfb59d50631968ab1a13002ea5421ece93169851chrismair final String PATTERN = RWX + RWX + RWX; 49dfb59d50631968ab1a13002ea5421ece93169851chrismair Assert.isTrue(rwxString.matches(PATTERN), "The permissions string must match [" + PATTERN + "]"); 50dfb59d50631968ab1a13002ea5421ece93169851chrismair this.rwxString = rwxString; 51dfb59d50631968ab1a13002ea5421ece93169851chrismair } 52dfb59d50631968ab1a13002ea5421ece93169851chrismair 53dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 54dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the read/write/execute specification String representing the set of permissions. For example: 55dfb59d50631968ab1a13002ea5421ece93169851chrismair * "rwxrwxrwx" or "rw-r-----". 56dfb59d50631968ab1a13002ea5421ece93169851chrismair * 57dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the String containing 9 characters that represent the read/write/execute permissions. 58dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 59dfb59d50631968ab1a13002ea5421ece93169851chrismair public String asRwxString() { 60dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString; 61dfb59d50631968ab1a13002ea5421ece93169851chrismair } 62dfb59d50631968ab1a13002ea5421ece93169851chrismair 63dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 64dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the RWX string for this instance 65dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 66dfb59d50631968ab1a13002ea5421ece93169851chrismair public String getRwxString() { 67dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString; 68dfb59d50631968ab1a13002ea5421ece93169851chrismair } 69dfb59d50631968ab1a13002ea5421ece93169851chrismair 70dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 71dfb59d50631968ab1a13002ea5421ece93169851chrismair * @see java.lang.Object#equals(java.lang.Object) 72dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 73dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean equals(Object object) { 74dfb59d50631968ab1a13002ea5421ece93169851chrismair return (object != null) 75dfb59d50631968ab1a13002ea5421ece93169851chrismair && (object.getClass() == this.getClass()) 76dfb59d50631968ab1a13002ea5421ece93169851chrismair && (object.hashCode() == hashCode()); 77dfb59d50631968ab1a13002ea5421ece93169851chrismair } 78dfb59d50631968ab1a13002ea5421ece93169851chrismair 79dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 80dfb59d50631968ab1a13002ea5421ece93169851chrismair * Return the hash code for this object. 81dfb59d50631968ab1a13002ea5421ece93169851chrismair * 82dfb59d50631968ab1a13002ea5421ece93169851chrismair * @see java.lang.Object#hashCode() 83dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 84dfb59d50631968ab1a13002ea5421ece93169851chrismair public int hashCode() { 85dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.hashCode(); 86dfb59d50631968ab1a13002ea5421ece93169851chrismair } 87dfb59d50631968ab1a13002ea5421ece93169851chrismair 88dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 89dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the user has read permission 90dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 91dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canUserRead() { 92dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(0) == READ_CHAR; 93dfb59d50631968ab1a13002ea5421ece93169851chrismair } 94dfb59d50631968ab1a13002ea5421ece93169851chrismair 95dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 96dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the user has write permission 97dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 98dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canUserWrite() { 99dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(1) == WRITE_CHAR; 100dfb59d50631968ab1a13002ea5421ece93169851chrismair } 101dfb59d50631968ab1a13002ea5421ece93169851chrismair 102dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 103dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the user has execute permission 104dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 105dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canUserExecute() { 106dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(2) == EXECUTE_CHAR; 107dfb59d50631968ab1a13002ea5421ece93169851chrismair } 108dfb59d50631968ab1a13002ea5421ece93169851chrismair 109dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 110dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the group has read permission 111dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 112dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canGroupRead() { 113dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(3) == READ_CHAR; 114dfb59d50631968ab1a13002ea5421ece93169851chrismair } 115dfb59d50631968ab1a13002ea5421ece93169851chrismair 116dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 117dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the group has write permission 118dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 119dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canGroupWrite() { 120dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(4) == WRITE_CHAR; 121dfb59d50631968ab1a13002ea5421ece93169851chrismair } 122dfb59d50631968ab1a13002ea5421ece93169851chrismair 123dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 124dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the group has execute permission 125dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 126dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canGroupExecute() { 127dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(5) == EXECUTE_CHAR; 128dfb59d50631968ab1a13002ea5421ece93169851chrismair } 129dfb59d50631968ab1a13002ea5421ece93169851chrismair 130dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 131dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the world has read permission 132dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 133dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canWorldRead() { 134dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(6) == READ_CHAR; 135dfb59d50631968ab1a13002ea5421ece93169851chrismair } 136dfb59d50631968ab1a13002ea5421ece93169851chrismair 137dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 138dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the world has write permission 139dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 140dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canWorldWrite() { 141dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(7) == WRITE_CHAR; 142dfb59d50631968ab1a13002ea5421ece93169851chrismair } 143dfb59d50631968ab1a13002ea5421ece93169851chrismair 144dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 145dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return true if and only if the world has execute permission 146dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 147dfb59d50631968ab1a13002ea5421ece93169851chrismair public boolean canWorldExecute() { 148dfb59d50631968ab1a13002ea5421ece93169851chrismair return rwxString.charAt(8) == EXECUTE_CHAR; 149dfb59d50631968ab1a13002ea5421ece93169851chrismair } 150dfb59d50631968ab1a13002ea5421ece93169851chrismair 151dfb59d50631968ab1a13002ea5421ece93169851chrismair /** 152dfb59d50631968ab1a13002ea5421ece93169851chrismair * @return the String representation of this object. 153dfb59d50631968ab1a13002ea5421ece93169851chrismair */ 154dfb59d50631968ab1a13002ea5421ece93169851chrismair public String toString() { 155dfb59d50631968ab1a13002ea5421ece93169851chrismair return "Permissions[" + rwxString + "]"; 156dfb59d50631968ab1a13002ea5421ece93169851chrismair } 157dfb59d50631968ab1a13002ea5421ece93169851chrismair}