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