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}