100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/* 200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Copyright 2008 the original author or authors. 300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Licensed under the Apache License, Version 2.0 (the "License"); 500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * you may not use this file except in compliance with the License. 600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * You may obtain a copy of the License at 700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * http://www.apache.org/licenses/LICENSE-2.0 900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 1000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Unless required by applicable law or agreed to in writing, software 1100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * distributed under the License is distributed on an "AS IS" BASIS, 1200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * See the License for the specific language governing permissions and 1400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * limitations under the License. 1500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 1600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpackage org.mockftpserver.fake.filesystem; 1700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 1800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairimport org.mockftpserver.core.util.Assert; 1900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 2000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair/** 2100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Represents and encapsulates the read/write/execute permissions for a file or directory. 2200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * This is conceptually (and somewhat loosely) based on the permissions flags within the Unix 2300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * file system. An instance of this class is immutable. 2400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 2500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @author Chris Mair 2600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @version $Revision$ - $Date$ 2700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 2800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismairpublic class Permissions { 2900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public static final Permissions ALL = new Permissions("rwxrwxrwx"); 3000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public static final Permissions NONE = new Permissions("---------"); 3100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public static final Permissions DEFAULT = ALL; 3200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 3300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair private static final char READ_CHAR = 'r'; 3400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair private static final char WRITE_CHAR = 'w'; 3500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair private static final char EXECUTE_CHAR = 'x'; 3600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 3700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair private String rwxString; 3800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 3900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 4000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Costruct a new instance for the specified read/write/execute specification String 4100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 4200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @param rwxString - the read/write/execute specification String; must be 9 characters long, with chars 4300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * at index 0,3,6 == '-' or 'r', chars at index 1,4,7 == '-' or 'w' and chars at index 2,5,8 == '-' or 'x'. 4400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 4500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public Permissions(String rwxString) { 4600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair Assert.isTrue(rwxString.length() == 9, "The permissions string must be exactly 9 characters"); 4700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair final String RWX = "(-|r)(-|w)(-|x)"; 4800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair final String PATTERN = RWX + RWX + RWX; 4900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair Assert.isTrue(rwxString.matches(PATTERN), "The permissions string must match [" + PATTERN + "]"); 5000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair this.rwxString = rwxString; 5100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 5200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 5300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 5400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Return the read/write/execute specification String representing the set of permissions. For example: 5500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * "rwxrwxrwx" or "rw-r-----". 5600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 5700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return the String containing 9 characters that represent the read/write/execute permissions. 5800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 5900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public String asRwxString() { 6000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString; 6100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 6200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 6300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 6400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return the RWX string for this instance 6500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 6600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public String getRwxString() { 6700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString; 6800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 6900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 7000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 7100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @see java.lang.Object#equals(java.lang.Object) 7200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 7300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean equals(Object object) { 7400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return (object != null) 7500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair && (object.getClass() == this.getClass()) 7600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair && (object.hashCode() == hashCode()); 7700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 7800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 7900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 8000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * Return the hash code for this object. 8100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * 8200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @see java.lang.Object#hashCode() 8300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 8400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public int hashCode() { 8500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.hashCode(); 8600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 8700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 8800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 8900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the user has read permission 9000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 9100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canUserRead() { 9200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(0) == READ_CHAR; 9300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 9400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 9500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 9600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the user has write permission 9700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 9800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canUserWrite() { 9900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(1) == WRITE_CHAR; 10000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 10100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 10200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 10300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the user has execute permission 10400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 10500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canUserExecute() { 10600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(2) == EXECUTE_CHAR; 10700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 10800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 10900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 11000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the group has read permission 11100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 11200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canGroupRead() { 11300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(3) == READ_CHAR; 11400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 11500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 11600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 11700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the group has write permission 11800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 11900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canGroupWrite() { 12000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(4) == WRITE_CHAR; 12100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 12200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 12300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 12400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the group has execute permission 12500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 12600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canGroupExecute() { 12700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(5) == EXECUTE_CHAR; 12800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 12900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 13000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 13100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the world has read permission 13200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 13300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canWorldRead() { 13400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(6) == READ_CHAR; 13500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 13600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 13700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 13800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the world has write permission 13900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 14000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canWorldWrite() { 14100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(7) == WRITE_CHAR; 14200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 14300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 14400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 14500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return true if and only if the world has execute permission 14600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 14700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public boolean canWorldExecute() { 14800dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return rwxString.charAt(8) == EXECUTE_CHAR; 14900dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 15000dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair 15100dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair /** 15200dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair * @return the String representation of this object. 15300dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair */ 15400dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair public String toString() { 15500dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair return "Permissions[" + rwxString + "]"; 15600dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair } 15700dc7bdcf1df9e86789d963984dfc6912a8854c6chrismair}