12ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/*
22ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Copyright 2008 the original author or authors.
32ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
42ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
52ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * you may not use this file except in compliance with the License.
62ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * You may obtain a copy of the License at
72ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
82ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
92ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Unless required by applicable law or agreed to in writing, software
112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * See the License for the specific language governing permissions and
142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * limitations under the License.
152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpackage org.mockftpserver.fake.filesystem;
172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport org.mockftpserver.core.util.Assert;
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport java.util.Date;
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * The abstract superclass for concrete file system entry classes representing files and directories.
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpublic abstract class AbstractFileSystemEntry implements FileSystemEntry {
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private String path;
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private boolean pathLocked = false;
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private Date lastModified;
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private String owner;
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private String group;
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public Date getLastModified() {
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return lastModified;
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setLastModified(Date lastModified) {
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.lastModified = lastModified;
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String getOwner() {
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return owner;
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setOwner(String owner) {
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.owner = owner;
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String getGroup() {
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return group;
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setGroup(String group) {
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.group = group;
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public Permissions getPermissions() {
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return permissions;
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setPermissions(Permissions permissions) {
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.permissions = permissions;
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private Permissions permissions;
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Construct a new instance without setting its path
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public AbstractFileSystemEntry() {
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Construct a new instance with the specified value for its path
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the value for path
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public AbstractFileSystemEntry(String path) {
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.path = path;
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the path for this entry
882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String getPath() {
902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return path;
912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the file name or directory name (no path) for this entry
952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String getName() {
972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        int separatorIndex1 = path.lastIndexOf('/');
982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        int separatorIndex2 = path.lastIndexOf('\\');
992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair//        int separatorIndex = [separatorIndex1, separatorIndex2].max();
1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        int separatorIndex = separatorIndex1 > separatorIndex2 ? separatorIndex1 : separatorIndex2;
1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return (separatorIndex == -1) ? path : path.substring(separatorIndex + 1);
1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Set the path for this entry. Throw an exception if pathLocked is true.
1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the new path value
1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setPath(String path) {
1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        Assert.isFalse(pathLocked, "path is locked");
1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.path = path;
1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void lockPath() {
1152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.pathLocked = true;
1162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void setPermissionsFromString(String permissionsString) {
1192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.permissions = new Permissions(permissionsString);
1202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
1212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Abstract method -- must be implemented within concrete subclasses
1242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if this file system entry represents a directory
1262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public abstract boolean isDirectory();
1282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}
130