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