160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair/*
260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Copyright 2008 the original author or authors.
360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair *
460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Licensed under the Apache License, Version 2.0 (the "License");
560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * you may not use this file except in compliance with the License.
660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * You may obtain a copy of the License at
760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair *
860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair *      http://www.apache.org/licenses/LICENSE-2.0
960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair *
1060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * Unless required by applicable law or agreed to in writing, software
1160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * See the License for the specific language governing permissions and
1460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * limitations under the License.
1560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */
1660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairpackage org.mockftpserver.fake.filesystem;
1760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
1860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport org.mockftpserver.core.util.Assert;
1960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
2060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairimport java.util.Date;
2160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
2260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair/**
2360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * The abstract superclass for concrete file system entry classes representing files and directories.
2460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair *
2560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @author Chris Mair
2660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair * @version $Revision$ - $Date$
2760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair */
2860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismairpublic abstract class AbstractFileSystemEntry implements FileSystemEntry {
2960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
3060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private String path;
3160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private boolean pathLocked = false;
3260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
3360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private Date lastModified;
3460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private String owner;
3560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private String group;
3660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
3760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public Date getLastModified() {
3860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return lastModified;
3960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
4060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
4160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setLastModified(Date lastModified) {
4260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.lastModified = lastModified;
4360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
4460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
4560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public String getOwner() {
4660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return owner;
4760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
4860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
4960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setOwner(String owner) {
5060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.owner = owner;
5160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
5260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
5360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public String getGroup() {
5460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return group;
5560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
5660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
5760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setGroup(String group) {
5860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.group = group;
5960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
6060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
6160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public Permissions getPermissions() {
6260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return permissions;
6360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
6460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
6560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setPermissions(Permissions permissions) {
6660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.permissions = permissions;
6760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
6860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
6960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    private Permissions permissions;
7060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
7160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
7260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * Construct a new instance without setting its path
7360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
7460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public AbstractFileSystemEntry() {
7560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
7660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
7760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
7860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * Construct a new instance with the specified value for its path
7960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     *
8060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * @param path - the value for path
8160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
8260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public AbstractFileSystemEntry(String path) {
8360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.path = path;
8460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
8560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
8660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
8760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * @return the path for this entry
8860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
8960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public String getPath() {
9060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return path;
9160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
9260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
9360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
9460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * @return the file name or directory name (no path) for this entry
9560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
9660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public String getName() {
9760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        int separatorIndex1 = path.lastIndexOf('/');
9860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        int separatorIndex2 = path.lastIndexOf('\\');
9960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair//        int separatorIndex = [separatorIndex1, separatorIndex2].max();
10060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        int separatorIndex = separatorIndex1 > separatorIndex2 ? separatorIndex1 : separatorIndex2;
10160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        return (separatorIndex == -1) ? path : path.substring(separatorIndex + 1);
10260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
10360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
10460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
10560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * Set the path for this entry. Throw an exception if pathLocked is true.
10660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     *
10760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * @param path - the new path value
10860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
10960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setPath(String path) {
11060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        Assert.isFalse(pathLocked, "path is locked");
11160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.path = path;
11260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
11360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
11460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void lockPath() {
11560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.pathLocked = true;
11660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
11760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
11860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public void setPermissionsFromString(String permissionsString) {
11960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair        this.permissions = new Permissions(permissionsString);
12060b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    }
12160b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
12260b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    /**
12360b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * Abstract method -- must be implemented within concrete subclasses
12460b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     *
12560b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     * @return true if this file system entry represents a directory
12660b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair     */
12760b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair    public abstract boolean isDirectory();
12860b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair
12960b81e2faf8511148f0d1e8f296e0b40ce9c7971chrismair}
130