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