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 */
16package org.mockftpserver.fake.filesystem;
17
18import 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 */
28public 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}