IOExitResourcePath.java
package com.ibm.wmqfte.exitroutine.api;
import java.io.IOException;
/**
* Represents a path that denotes a data resource (for example, a file,
* directory, or group of database records). It allows the data to be located
* and {@link IOExitChannel} instances to be created for read or write
* operations.
* <p>
* There are two types of data resources as follows:
* <ul>
* <li>Directory - a container for other data resources. The
* {@link #isDirectory()} method returns {@code true} for these.</li>
* <li>File - a data container. This allows data to be read from or written to
* it. The {@link #isFile()} method returns {@code true} for these.</li>
* </ul>
*/
public interface IOExitResourcePath extends IOExitPath {
/**
* Creates a new {@link IOExitResourcePath} instance for a child path of the
* resource denoted by this abstract path.
* <p>
* For example, with a UNIX-style path, {@code
* IOExitResourcePath("/home/fteuser/test").newPath("subtest")} could be
* equivalent to: {@code IOExitResourcePath("/home/fteuser/test/subtest")}
*
* @param child
* The child path name.
* @return A new {@link IOExitResourcePath} instance that represents a child
* of this path.
*/
IOExitResourcePath newPath(final String child);
/**
* Creates the directory path for the resource denoted by this abstract
* path, including any necessary but nonexistent parent directories. If the
* directory path already exists, this method has no effect.
* <p>
* If this operation fails, it might have succeeded in creating some of the
* necessary parent directories.
*
* @throws IOException
* If the directory path cannot be fully created, when it does
* not already exist.
*/
void makePath() throws IOException;
/**
* Obtains the canonical path of the abstract path as a {@link String}.
* <p>
* A canonical path is defined as being absolute and unique. For example,
* the path can be represented as UNIX-style relative path: {@code
* test/file.txt} but the absolute and unique canonical path representation
* is: {@code /home/fteuser/test/file.txt}
*
* @return The canonical path as a {@link String}.
* @throws IOException
* If the canonical path cannot be determined for any reason.
*/
String getCanonicalPath() throws IOException;
/**
* Tests if this abstract path is an absolute path.
* <p>
* For example, a UNIX-style path, {@code /home/fteuser/test} is an absolute
* path, whereas {@code fteuser/test} is not.
*
* @return {@code true} if this abstract path is an absolute path, {@code
* false} otherwise.
*/
boolean isAbsolute();
/**
* Tests if the resource denoted by this abstract path exists.
*
* @return {@code true} if the resource denoted by this abstract path
* exists, {@code false} otherwise.
* @throws IOException
* If the existence of the resource cannot be determined for any
* reason.
*/
boolean exists() throws IOException;
/**
* Tests whether the calling application can read the resource denoted by
* this abstract path.
*
* @return {@code true} if the resource for this path exists and can be
* read, {@code false} otherwise.
* @throws IOException
* If a problem occurs while attempting to determine if the
* resource can be read.
*/
boolean canRead() throws IOException;
/**
* Tests whether the calling application can modify the resource denoted by
* this abstract path.
*
* @return {@code true} if the resource for this path exists and can be
* modified, {@code false} otherwise.
* @throws IOException
* If a problem occurs while attempting to determine if the
* resource can be modified.
*/
boolean canWrite() throws IOException;
/**
* Tests whether the specified user is permitted to read the resource
* denoted by this abstract path.
* <p>
* When WMQFTE invokes this method, the user identifier is the MQMD user
* identifier for the requesting transfer.
*
* @param userId
* User identifier to test for access.
* @return {@code true} if the resource for this abstract path exists and is
* permitted to be read by the specified user, {@code false}
* otherwise.
* @throws IOException
* If a problem occurs while attempting to determine if the user
* is permitted to read the resource.
*/
boolean readPermitted(String userId) throws IOException;
/**
* Tests whether the specified user is permitted to modify the resource
* denoted by this abstract path.
* <p>
* When WMQFTE invokes this method, the user identifier is the MQMD user
* identifier for the requesting transfer.
*
* @param userId
* User identifier to test for access.
* @return {@code true} if the resource for this abstract path exists and is
* permitted to be modified by the specified user, {@code false}
* otherwise.
* @throws IOException
* If a problem occurs while attempting to determine if the user
* is permitted to modify the resource.
*/
boolean writePermitted(String userId) throws IOException;
/**
* Tests if the resource denoted by this abstract path is a directory-type
* resource.
*
* @return {@code true} if the resource denoted by this abstract path is a
* directory type resource, {@code false} otherwise.
*/
boolean isDirectory();
/**
* Creates the resource denoted by this abstract path, if it does not
* already exist.
*
* @return {@code true} if the resource does not exist and was successfully
* created, {@code false} if the resource already existed.
* @throws RecoverableIOException
* If a recoverable problem occurs while attempting to create
* the resource. This means that WMQFTE can attempt to recover
* the transfer.
* @throws IOException
* If some other I/O problem occurs.
*/
boolean createNewPath() throws RecoverableIOException, IOException;
/**
* Tests if the resource denoted by this abstract path is a file-type
* resource.
*
* @return {@code true} if the resource denoted by this abstract path is a
* file type resource, {@code false} otherwise.
*/
boolean isFile();
/**
* Obtains the last modified time for the resource denoted by this abstract
* path.
* <p>
* This time is measured in milliseconds since the epoch (00:00:00 GMT,
* January 1, 1970).
*
* @return The last modified time for the resource denoted by this abstract
* path, or a value of 0L if the resource does not exist or a
* problem occurs.
*/
long lastModified();
/**
* Deletes the resource denoted by this abstract path.
* <p>
* If the resource is a directory, it must be empty for the delete to work.
*
* @throws IOException
* If the delete of the resource fails for any reason.
*/
void delete() throws IOException;
/**
* Renames the resource denoted by this abstract path to the specified
* destination abstract path.
* <p>
* The rename should still be successful if the resource for the specified
* destination abstract path already exists and it is possible to replace
* it.
*
* @param destination
* The new abstract path for the resource denoted by this
* abstract path.
* @throws IOException
* If the rename of the resource fails for any reason.
*/
void renameTo(IOExitResourcePath destination) throws IOException;
/**
* Creates a new path to use for writing to a temporary resource that did
* not previously exist.
* <p>
* The implementation can choose the abstract path name for the temporary
* resource. However, for clarity and problem diagnosis, the abstract path
* name for the temporary resource should be based on this abstract path
* name with the specified suffix appended and additional characters to make
* the path unique (for example, sequence numbers), as required.
* <p>
* When WMQFTE transfers data to a destination it normally attempts to first
* write to a temporary resource then on transfer completion renames the
* temporary resource to the required destination. This method is called by
* WMQFTE to create a new temporary resource path. The returned path should
* be new and the resource should not previously exist.
*
* @param suffix
* Recommended suffix to use for the generated temporary path.
*
* @return A new {@link IOExitResourcePath} instance for the temporary
* resource path, that did not previously exist.
* @throws RecoverableIOException
* If a recoverable problem occurs whilst attempting to create
* the temporary resource. This means that WMQFTE can attempt to
* recover the transfer.
* @throws IOException
* If some other I/O problem occurs.
*/
IOExitResourcePath createTempPath(String suffix)
throws RecoverableIOException, IOException;
/**
* Opens a {@link IOExitChannel} instance for reading data from the resource
* denoted by this abstract path. The current data byte position for the
* resource is expected to be the passed position value, such that when
* {@link IOExitChannel#read(java.nio.ByteBuffer)} is called, data starting
* from that position is read.
*
* @param position
* The required data byte read position.
* @return A new {@link IOExitChannel} instance allowing data to be read
* from the resource denoted by this abstract path.
* @throws RecoverableIOException
* If a recoverable problem occurs while attempting to open the
* resource for reading. This means that WMQFTE can attempt to
* recover the transfer.
* @throws IOException
* If some other I/O problem occurs.
*/
IOExitChannel openForRead(long position) throws RecoverableIOException,
IOException;
/**
* Opens a {@link IOExitChannel} instance for writing data to the resource
* denoted by this abstract path. Writing of data, using the
* {@link IOExitChannel#write(java.nio.ByteBuffer)} method, starts at either
* the beginning of the resource or end of the current data for the
* resource, depending on the specified append parameter.
*
* @param append
* When {@code true} indicates that data written to the resource
* should be appended to the end of the current data. When
* {@code false} indicates that writing of data is to start at
* the beginning of the resource; any existing data is lost.
* @return A new {@link IOExitChannel} instance allowing data to be written
* to the resource denoted by this abstract path.
* @throws RecoverableIOException
* If a recoverable problem occurs whilst attempting to open the
* resource for writing. This means that WMQFTE can attempt to
* recover the transfer.
* @throws IOException
* If some other I/O problem occurs.
*/
IOExitChannel openForWrite(boolean append) throws RecoverableIOException,
IOException;
/**
* Tests if the resource denoted by this abstract path is in use by another
* application. Typically, this is because another application has a lock on
* the resource either for shared or exclusive access.
*
* @return {code true} if resource denoted by this abstract path is in use
* by another application, {@code false} otherwise.
*/
boolean inUse();
/**
* Obtains a {@link IOExitProperties} instance for properties associated
* with the resource denoted by this abstract path.
* <p>
* WMQFTE will read these properties to govern how a transfer behaves when
* interacting with the resource.
*
* @return A {@link IOExitProperties} instance for properties associated
* with the resource denoted by this abstract path.
*/
IOExitProperties getProperties();
}