/**
* Copyright (c) 2008-2016, XebiaLabs B.V., All rights reserved.
*
*
* Overthere is licensed under the terms of the GPLv2
* <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most XebiaLabs Libraries.
* There are special exceptions to the terms and conditions of the GPLv2 as it is applied to
* this software, see the FLOSS License Exception
* <http://github.com/xebialabs/overthere/blob/master/LICENSE>.
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; version 2
* of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
package com.xebialabs.overthere;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
/**
* An abstract representation of a file that can be access through an {@link OverthereConnection}. It could be a local
* file or a remote file. It could be accessed from the local machine or through some remote connection methods (e.g.
* SFTP, CIFS) or read from a repository. A file object can represent a regular file, a directory or some other
* filesystem object such as links, symbolic links, pipes. It can also represent non-existent file.
* <p/>
* All methods in this interface may throw a {@link RuntimeIOException} if an error occurs. Checked {@link IOException
* IOExceptions} are never thrown.
*/
public interface OverthereFile {
/**
* Return the connection through which this file is accessible. If the connection is closed, this file may no longer
* be accessible.
*
* @return the connection through which this file is accessible.
*/
OverthereConnection getConnection();
/**
* Return the full path of the file on the remote system.
*
* @return the full path of the file.
*/
String getPath();
/**
* The name of the file on the remote system.
*
* @return the name of the file.
*/
String getName();
/**
* Return a reference to the parent of this file or <code>null</code> if this file does not have a parent file. The
* parent of a regular file is the directory that contains it, the parent of a directory is the directory that
* contains that directory. A root directory does not have a parent.
*
* @return the parent of this file or <code>null</code> if this file does not have a parent file.
*/
OverthereFile getParentFile();
/**
* Returns a reference to a named child of this file or <code>null</code> if this file is not a directory. The child
* file returned may or may not exist.
*
* @param child the name of the child relative to this file. May not contain path separators.
* @return the child of this file or <code>null</code> if this file is not a directory.
*/
OverthereFile getFile(String child);
/**
* Tests whether the file represented by this object exists.
*
* @return <code>true</code> if and only if this file exists.
* @throws RuntimeIOException if an I/O error occured
*/
boolean exists();
/**
* Tests whether this file can be read.
*
* @return <code>true</code> if and only if this file can be read.
*/
boolean canRead();
/**
* Tests whether this file can be written.
*
* @return <code>true</code> if and only if this file can be written.
*/
boolean canWrite();
/**
* Tests whether this file can be executed.
*
* @return <code>true</code> if and only if this file can be executed.
*/
boolean canExecute();
/**
* Tests whether this file is a regular file.
*
* @return <code>true</code> if and only if this file is a regular file.
*/
boolean isFile();
/**
* Tests whether this file is a directory.
*
* @return <code>true</code> if and only if this file is a directory.
*/
boolean isDirectory();
/**
* Tests whether this file is a hidden file.
*
* @return <code>true</code> if and only if this file is a hidden file.
*/
boolean isHidden();
/**
* Returns the time this file was last modified, in milliseconds since the epoch (00:00:00 GMT, January 1, 1970).
*
* @return the time this file was last modified, in milliseconds since the epoch (00:00:00 GMT, January 1, 1970).
*/
long lastModified();
/**
* Returns the length of this file, in bytes.
*
* @return the length of this file.
*/
long length();
/**
* Returns an input stream to read from this file. The complete contents of this input stream must be read before
* another operation on this file or its corresponding {@link OverthereConnection} is performed.
*
* @return an input stream connected to this file.
*/
InputStream getInputStream();
/**
* Returns an output stream to write to this file. The complete contents of this output stream must be written
* before another operation on this file or its corresponding {@link OverthereConnection} is performed.
*
* @return an output stream connected to this file.
*/
OutputStream getOutputStream();
/**
* Sets the execute permission on this file.
*
* @param executable If <code>true</code>, sets the access permission to allow execute operations; if <code>false</code> to
* disallow execute operations.
*/
void setExecutable(boolean executable);
/**
* Deletes this file or directory. If this file is a directory and it is not empty, a {@link RuntimeIOException} is
* thrown.
*/
void delete();
/**
* Deletes this file or directory. If this file is a directory, its contents are deleted first.
*/
void deleteRecursively();
/**
* Lists the files in this directory. If this file is not a directory, the outcome is unspecified.
*
* @return the files in this directory, in an unspecified order.
*/
List<OverthereFile> listFiles();
/**
* Creates this directory. If the parent directory does not exists, a {@link RuntimeIOException} is thrown.
*/
void mkdir();
/**
* Creates this directory and any of its parent directories.
*/
void mkdirs();
/**
* Renames or moves this file. Usually, a file cannot be moved to a different type of connection and sometimes not
* even to a different connection. Also, it depends on the {@link OverthereConnection connaction} implementation
* whether or not the file can be moved accross file system boundaries within that connection.
*
* @param dest the new location for this file.
*/
void renameTo(OverthereFile dest);
/**
* Copies this file or directory (recursively) to the destination. Contrary to the semantics of
* {@link #renameTo(OverthereFile)}, a file <em>can</em> be copied accross {@link OverthereConnection connections}
* and across file systems withtin a {@link OverthereConnection connection}.
*
* @param dest the file to copy to.
*/
void copyTo(final OverthereFile dest);
}