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
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Implementation of the {@link FileSystem} interface that simulates a Unix
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * file system. The rules for file and directory names include:
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <ul>
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <li>Filenames are case-sensitive</li>
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <li>Forward slashes (/) are the only valid path separators</li>
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * </ul>
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * <p/>
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * The <code>directoryListingFormatter</code> property is automatically initialized to an instance
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * of {@link UnixDirectoryListingFormatter}.
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpublic class UnixFakeFileSystem extends AbstractFakeFileSystem {
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public static final char SEPARATOR = '/';
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Construct a new instance and initialize the directoryListingFormatter to a UnixDirectoryListingFormatter.
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public UnixFakeFileSystem() {
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.setDirectoryListingFormatter(new UnixDirectoryListingFormatter());
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //-------------------------------------------------------------------------
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Abstract Method Implementations
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //-------------------------------------------------------------------------
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected char getSeparatorChar() {
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return SEPARATOR;
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if the specified path designates a valid (absolute) file path. For Unix,
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * a path is valid if it starts with the '/' character, followed by an optional sequence of
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * any characters except '/'.
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if path is valid, false otherwise
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected boolean isValidName(String path) {
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        Assert.notNull(path, "path");
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        // Any character but '/'
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return path.matches("\\/|(\\/[^\\/]+)+");
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if the specified char is a separator character ('\' or '/')
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param c - the character to test
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if the specified char is a separator character ('\' or '/')
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected boolean isSeparator(char c) {
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return c == SEPARATOR;
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if the specified path component is a root for this filesystem
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    protected boolean isRoot(String pathComponent) {
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return pathComponent.indexOf(":") != -1;
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}