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 java.util.List;
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Interface for a file system for managing files and directories.
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpublic interface FileSystem {
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Add the specified file system entry (file or directory) to this file system
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param entry - the FileSystemEntry to add
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void add(FileSystemEntry entry);
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return the List of FileSystemEntry objects for the files in the specified directory path. If the
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * path does not refer to a valid directory, then an empty List is returned.
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path of the directory whose contents should be returned
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the List of FileSystemEntry objects for all files in the specified directory may be empty
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public List listFiles(String path);
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return the List of filenames in the specified directory path. The returned filenames do not
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * include a path. If the path does not refer to a valid directory, then an empty List is
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * returned.
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path of the directory whose contents should be returned
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the List of filenames (not including paths) for all files in the specified directory
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *         may be empty
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public List listNames(String path);
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Delete the file or directory specified by the path. Return true if the file is successfully
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * deleted, false otherwise. If the path refers to a directory, it must be empty. Return false
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * if the path does not refer to a valid file or directory or if it is a non-empty directory.
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path of the file or directory to delete
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if the file or directory is successfully deleted
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public boolean delete(String path);
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Rename the file or directory. Specify the FROM path and the TO path. Throw an exception if the FROM path or
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * the parent directory of the TO path do not exist; or if the rename fails for another reason.
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fromPath - the source (old) path + filename
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param toPath   - the target (new) path + filename
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError      - if fromPath or toPath is null
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws FileSystemException - if the rename fails.
752ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
762ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public void rename(String fromPath, String toPath);
772ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
782ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
792ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return the formatted directory listing entry for the file represented by the specified FileSystemEntry
802ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
812ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param fileSystemEntry - the FileSystemEntry representing the file or directory entry to be formatted
822ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the the formatted directory listing entry
832ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
842ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String formatDirectoryListing(FileSystemEntry fileSystemEntry);
852ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
862ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //-------------------------------------------------------------------------
872ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    // Path-related Methods
882ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    //-------------------------------------------------------------------------
892ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
902ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
912ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if there exists a file or directory at the specified path
922ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
932ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
942ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if the file/directory exists
952ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
962ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
972ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public boolean exists(String path);
982ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
992ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1002ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if the specified path designates an existing directory, false otherwise
1012ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1022ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
1032ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if path is a directory, false otherwise
1042ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
1052ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1062ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public boolean isDirectory(String path);
1072ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1082ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1092ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if the specified path designates an existing file, false otherwise
1102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
1122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if path is a file, false otherwise
1132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
1142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public boolean isFile(String path);
1162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return true if the specified path designates an absolute file path. What
1192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * constitutes an absolute path is dependent on the file system implementation.
1202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
1222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return true if path is absolute, false otherwise
1232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
1242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public boolean isAbsolute(String path);
1262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Build a path from the two path components. Concatenate path1 and path2. Insert the file system-dependent
1292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * separator character in between if necessary (i.e., if both are non-empty and path1 does not already
1302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * end with a separator character AND path2 does not begin with one).
1312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path1 - the first path component may be null or empty
1332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path2 - the second path component may be null or empty
1342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the path resulting from concatenating path1 to path2
1352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String path(String path1, String path2);
1372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Returns the FileSystemEntry object representing the file system entry at the specified path, or null
1402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * if the path does not specify an existing file or directory within this file system.
1412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path of the file or directory within this file system
1432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the FileSystemEntry containing the information for the file or directory, or else null
1442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public FileSystemEntry getEntry(String path);
1462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
1482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return the parent path of the specified path. If <code>path</code> specifies a filename,
1492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * then this method returns the path of the directory containing that file. If <code>path</code>
1502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * specifies a directory, the this method returns its parent directory. If <code>path</code> is
1512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * empty or does not have a parent component, then return an empty string.
1522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * <p/>
1532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * All path separators in the returned path are converted to the system-dependent separator character.
1542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     *
1552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param path - the path
1562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @return the parent of the specified path, or null if <code>path</code> has no parent
1572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws AssertionError - if path is null
1582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
1592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public String getParent(String path);
1602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
1612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}