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