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 20a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair/** 21a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Implementation of the {@link FileSystem} interface that simulates a Unix 22a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * file system. The rules for file and directory names include: 23a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <ul> 24a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <li>Filenames are case-sensitive</li> 25a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <li>Forward slashes (/) are the only valid path separators</li> 26a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * </ul> 27a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * <p/> 28a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * The <code>directoryListingFormatter</code> property is automatically initialized to an instance 29a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * of {@link UnixDirectoryListingFormatter}. 30a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 31a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @author Chris Mair 32a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @version $Revision$ - $Date$ 33a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 34a0ad464efff5f5e2d2523a3522cce6823ce05858chrismairpublic class UnixFakeFileSystem extends AbstractFakeFileSystem { 35a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 36a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public static final char SEPARATOR = '/'; 37a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 38a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 39a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Construct a new instance and initialize the directoryListingFormatter to a UnixDirectoryListingFormatter. 40a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 41a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair public UnixFakeFileSystem() { 42a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair this.setDirectoryListingFormatter(new UnixDirectoryListingFormatter()); 43a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 44a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 45a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair //------------------------------------------------------------------------- 46a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair // Abstract Method Implementations 47a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair //------------------------------------------------------------------------- 48a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 49a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected char getSeparatorChar() { 50a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return SEPARATOR; 51a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 52a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 53a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 54a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if the specified path designates a valid (absolute) file path. For Unix, 55a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * a path is valid if it starts with the '/' character, followed by an optional sequence of 56a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * any characters except '/'. 57a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 58a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param path - the path 59a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if path is valid, false otherwise 60a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @throws AssertionError - if path is null 61a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 62a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected boolean isValidName(String path) { 63a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair Assert.notNull(path, "path"); 64a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair // Any character but '/' 65a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return path.matches("\\/|(\\/[^\\/]+)+"); 66a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 67a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 68a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 69a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * Return true if the specified char is a separator character ('\' or '/') 70a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * 71a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @param c - the character to test 72a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if the specified char is a separator character ('\' or '/') 73a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 74a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected boolean isSeparator(char c) { 75a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return c == SEPARATOR; 76a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 77a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 78a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair /** 79a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair * @return true if the specified path component is a root for this filesystem 80a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair */ 81a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair protected boolean isRoot(String pathComponent) { 82a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair return pathComponent.indexOf(":") != -1; 83a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair } 84a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair 85a0ad464efff5f5e2d2523a3522cce6823ce05858chrismair}