Permissions.java revision 35a92abff87b74147a232dc55cf1b3ea0f4d0663
137259d8cbd6487bf94bb12782090f866812ac3a4chrismair/*
237259d8cbd6487bf94bb12782090f866812ac3a4chrismair * Copyright 2008 the original author or authors.
337259d8cbd6487bf94bb12782090f866812ac3a4chrismair *
437259d8cbd6487bf94bb12782090f866812ac3a4chrismair * Licensed under the Apache License, Version 2.0 (the "License");
537259d8cbd6487bf94bb12782090f866812ac3a4chrismair * you may not use this file except in compliance with the License.
637259d8cbd6487bf94bb12782090f866812ac3a4chrismair * You may obtain a copy of the License at
737259d8cbd6487bf94bb12782090f866812ac3a4chrismair *
837259d8cbd6487bf94bb12782090f866812ac3a4chrismair *      http://www.apache.org/licenses/LICENSE-2.0
937259d8cbd6487bf94bb12782090f866812ac3a4chrismair *
1037259d8cbd6487bf94bb12782090f866812ac3a4chrismair * Unless required by applicable law or agreed to in writing, software
1137259d8cbd6487bf94bb12782090f866812ac3a4chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1237259d8cbd6487bf94bb12782090f866812ac3a4chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1337259d8cbd6487bf94bb12782090f866812ac3a4chrismair * See the License for the specific language governing permissions and
1437259d8cbd6487bf94bb12782090f866812ac3a4chrismair * limitations under the License.
1537259d8cbd6487bf94bb12782090f866812ac3a4chrismair */
1637259d8cbd6487bf94bb12782090f866812ac3a4chrismairpackage org.mockftpserver.fake.filesystem
1737259d8cbd6487bf94bb12782090f866812ac3a4chrismair
1837259d8cbd6487bf94bb12782090f866812ac3a4chrismair/**
1937259d8cbd6487bf94bb12782090f866812ac3a4chrismair * Represents and encapsulates the read/write/execute permissions for a file or directory.
2035a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair * This is conceptually (and somewhat loosely) based on the permissions flags within the Unix
2135a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair * file system. An instance of this class is immutable.
2237259d8cbd6487bf94bb12782090f866812ac3a4chrismair *
2337259d8cbd6487bf94bb12782090f866812ac3a4chrismair * @version $Revision: 86 $ - $Date: 2008-07-23 21:16:27 -0400 (Wed, 23 Jul 2008) $
2437259d8cbd6487bf94bb12782090f866812ac3a4chrismair *
2537259d8cbd6487bf94bb12782090f866812ac3a4chrismair * @author Chris Mair
2637259d8cbd6487bf94bb12782090f866812ac3a4chrismair */
2737259d8cbd6487bf94bb12782090f866812ac3a4chrismairclass Permissions {
2881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    public static final ALL = new Permissions('rwxrwxrwx')
2981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    public static final NONE = new Permissions('---------')
3081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    public static final DEFAULT = ALL
3137259d8cbd6487bf94bb12782090f866812ac3a4chrismair
3237259d8cbd6487bf94bb12782090f866812ac3a4chrismair    static final READ_CHAR = 'r'
3337259d8cbd6487bf94bb12782090f866812ac3a4chrismair    static final WRITE_CHAR = 'w'
3437259d8cbd6487bf94bb12782090f866812ac3a4chrismair    static final EXECUTE_CHAR = 'x'
3537259d8cbd6487bf94bb12782090f866812ac3a4chrismair
3635a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair    private String rwxString
3737259d8cbd6487bf94bb12782090f866812ac3a4chrismair
3837259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
3937259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * Costruct a new instance for the specified read/write/execute specification String
4037259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @param rwxString - the read/write/execute specification String; must be 9 characters long, with chars
4137259d8cbd6487bf94bb12782090f866812ac3a4chrismair     *      at index 0,3,6 == '-' or 'r', chars at index 1,4,7 == '-' or 'w' and chars at index 2,5,8 == '-' or 'x'.
4237259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
4337259d8cbd6487bf94bb12782090f866812ac3a4chrismair    Permissions(String rwxString) {
4437259d8cbd6487bf94bb12782090f866812ac3a4chrismair        assert rwxString.size() == 9
4537259d8cbd6487bf94bb12782090f866812ac3a4chrismair        assert rwxString ==~ /(-|r)(-|w)(-|x)/ * 3
4637259d8cbd6487bf94bb12782090f866812ac3a4chrismair        this.rwxString = rwxString
4737259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
4837259d8cbd6487bf94bb12782090f866812ac3a4chrismair
4937259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
5037259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * Return the read/write/execute specification String representing the set of permissions. For example:
5137259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * "rwxrwxrwx" or "rw-r-----".
5237259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return the String containing 9 characters that represent the read/write/execute permissions.
5337259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
5437259d8cbd6487bf94bb12782090f866812ac3a4chrismair    String asRwxString() {
5537259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString
5637259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
5737259d8cbd6487bf94bb12782090f866812ac3a4chrismair
5837259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
5935a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair     * @return the RWX string for this instance
6035a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair     */
6135a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair    String getRwxString() {
6235a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair        return rwxString
6335a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair    }
6435a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair
6535a92abff87b74147a232dc55cf1b3ea0f4d0663chrismair    /**
6681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair     * @see java.lang.Object#equals(java.lang.Object)
6781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair     */
6881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    boolean equals(Object object) {
6981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        (object
7081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair                && object.class == this.class
7181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair                && object.hashCode() == hashCode())
7281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
7381c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
7481c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    /**
7581c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair     * Return the hash code for this object.
7681c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair     * @see java.lang.Object#hashCode()
7781c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair     */
7881c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    int hashCode() {
7981c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair        return rwxString.hashCode()
8081c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    }
8181c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair
8281c5294b43234e26add70ffd5bfb8fbc31db45c9chrismair    /**
8337259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the user has read permission
8437259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
8537259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canUserRead() {
8637259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[0] == READ_CHAR
8737259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
8837259d8cbd6487bf94bb12782090f866812ac3a4chrismair
8937259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
9037259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the user has write permission
9137259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
9237259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canUserWrite() {
9337259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[1] == WRITE_CHAR
9437259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
9537259d8cbd6487bf94bb12782090f866812ac3a4chrismair
9637259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
9737259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the user has execute permission
9837259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
9937259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canUserExecute() {
10037259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[2] == EXECUTE_CHAR
10137259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
10237259d8cbd6487bf94bb12782090f866812ac3a4chrismair
10337259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
10437259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the group has read permission
10537259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
10637259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canGroupRead() {
10737259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[3] == READ_CHAR
10837259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
10937259d8cbd6487bf94bb12782090f866812ac3a4chrismair
11037259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
11137259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the group has write permission
11237259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
11337259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canGroupWrite() {
11437259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[4] == WRITE_CHAR
11537259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
11637259d8cbd6487bf94bb12782090f866812ac3a4chrismair
11737259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
11837259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the group has execute permission
11937259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
12037259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canGroupExecute() {
12137259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[5] == EXECUTE_CHAR
12237259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
12337259d8cbd6487bf94bb12782090f866812ac3a4chrismair
12437259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
12537259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the world has read permission
12637259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
12737259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canWorldRead() {
12837259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[6] == READ_CHAR
12937259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
13037259d8cbd6487bf94bb12782090f866812ac3a4chrismair
13137259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
13237259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the world has write permission
13337259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
13437259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canWorldWrite() {
13537259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[7] == WRITE_CHAR
13637259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
13737259d8cbd6487bf94bb12782090f866812ac3a4chrismair
13837259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
13937259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return true if and only if the world has execute permission
14037259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
14137259d8cbd6487bf94bb12782090f866812ac3a4chrismair    boolean canWorldExecute() {
14237259d8cbd6487bf94bb12782090f866812ac3a4chrismair        rwxString[8] == EXECUTE_CHAR
14337259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
14437259d8cbd6487bf94bb12782090f866812ac3a4chrismair
14537259d8cbd6487bf94bb12782090f866812ac3a4chrismair    /**
14637259d8cbd6487bf94bb12782090f866812ac3a4chrismair     * @return the String representation of this object.
14737259d8cbd6487bf94bb12782090f866812ac3a4chrismair     */
14837259d8cbd6487bf94bb12782090f866812ac3a4chrismair    String toString() {
14937259d8cbd6487bf94bb12782090f866812ac3a4chrismair        "Permissions[$rwxString]"
15037259d8cbd6487bf94bb12782090f866812ac3a4chrismair    }
15137259d8cbd6487bf94bb12782090f866812ac3a4chrismair}