1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2008 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.fake.filesystem;
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.util.Assert;
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.util.Date;
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * The abstract superclass for concrete file system entry classes representing files and directories.
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision: 147 $ - $Date: 2008-11-02 19:10:37 -0500 (Sun, 02 Nov 2008) $
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpublic abstract class AbstractFileSystemEntry implements FileSystemEntry {
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private String path;
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private boolean pathLocked = false;
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private Date lastModified;
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private String owner;
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private String group;
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public Date getLastModified() {
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return lastModified;
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setLastModified(Date lastModified) {
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.lastModified = lastModified;
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public String getOwner() {
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return owner;
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setOwner(String owner) {
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.owner = owner;
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public String getGroup() {
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return group;
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setGroup(String group) {
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.group = group;
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public Permissions getPermissions() {
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return permissions;
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setPermissions(Permissions permissions) {
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.permissions = permissions;
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private Permissions permissions;
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Construct a new instance without setting its path
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public AbstractFileSystemEntry() {
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Construct a new instance with the specified value for its path
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param path - the value for path
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public AbstractFileSystemEntry(String path) {
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.path = path;
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @return the path for this entry
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public String getPath() {
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return path;
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @return the file name or directory name (no path) for this entry
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public String getName() {
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        int separatorIndex1 = path.lastIndexOf('/');
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        int separatorIndex2 = path.lastIndexOf('\\');
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        int separatorIndex = [separatorIndex1, separatorIndex2].max();
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        int separatorIndex = separatorIndex1 > separatorIndex2 ? separatorIndex1 : separatorIndex2;
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return (separatorIndex == -1) ? path : path.substring(separatorIndex + 1);
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Set the path for this entry. Throw an exception if pathLocked is true.
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param path - the new path value
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setPath(String path) {
110ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        Assert.isFalse(pathLocked, "path is locked");
111ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.path = path;
112ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
113ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
114ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void lockPath() {
115ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.pathLocked = true;
116ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
117ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
118ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void setPermissionsFromString(String permissionsString) {
119ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.permissions = new Permissions(permissionsString);
120ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
121ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
122ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
123ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Abstract method -- must be implemented within concrete subclasses
124ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
125ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @return true if this file system entry represents a directory
126ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
127ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public abstract boolean isDirectory();
128ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
129ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}
130