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