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