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