IOExitChannel.java interface


IOExitChannel.java

/*
 *   Licensed Materials - Property of IBM
 *
 *   "Restricted Materials of IBM"
 *
 *   5724-H72
 * 
 *    Copyright IBM Corp. 2011, 2020. All Rights Reserved.
 * 
 *   disclosure restricted by GSA ADP Schedule Contract with
 *   IBM Corp.
 */
package com.ibm.wmqfte.exitroutine.api;

import java.io.IOException;
import java.nio.ByteBuffer;

/**
 * Represents a channel that enables data to be read from or written to an
 * {@link IOExitResourcePath} resource.
 */
public interface IOExitChannel {

	/**
	 * Obtains the data size for the associated {@link IOExitResourcePath} in
	 * bytes.
	 * 
	 * @return The data size in bytes.
	 * @throws IOException
	 *             If a problem occurs while attempting obtain the size.
	 */
	long size() throws IOException;

	/**
	 * Closes the channel, flushing any buffered write data to the resource and
	 * releasing any locks.
	 * 
	 * @throws RecoverableIOException
	 *             If a recoverable problem occurs while closing the resource.
	 *             This means that WMQFTE can attempt to recover the transfer.
	 * @throws IOException
	 *             If some other I/O problem occurs. For example, the channel might
	 *             already be closed.
	 */
	void close() throws RecoverableIOException, IOException;

	/**
	 * Reads data from this channel into the given buffer, starting at this
	 * channel's current position, and updates the current position by the
	 * amount of data read.
	 * <p>
	 * Data is copied into the buffer starting at its current position and up to
	 * its limit. On return, the buffer's position is updated to reflect the
	 * number of bytes read.
	 * 
	 * @param buffer
	 *            The buffer that the data is to be copied into.
	 * @return The number of bytes read, which might be zero, or -1 if the end of
	 *         data has been reached.
	 * @throws RecoverableIOException
	 *             If a recoverable problem occurs while reading the data. For a
	 *             WMQFTE transfer this means that it will attempt to recover.
	 * @throws IOException
	 *             If some other I/O problem occurs. For a WMQFTE transfer this
	 *             means that it will be failed.
	 */
	int read(ByteBuffer buffer) throws RecoverableIOException, IOException;

	/**
	 * Writes data to this channel from the given buffer, starting at this
	 * channel's current position, and updates the current position by the
	 * amount of data written. The channel's resource is grown to accommodate
	 * the data, if necessary.
	 * <p>
	 * Data is copied from the buffer starting at its current position and up to
	 * its limit. On return, the buffer's position is updated to reflect the
	 * number of bytes written.
	 * 
	 * @param buffer
	 *            The buffer containing the data to be written.
	 * @return The number of bytes written, which might be zero.
	 * @throws RecoverableIOException
	 *             If a recoverable problem occurs while writing the data. For a
	 *             WMQFTE transfer this means that it will attempt to recover.
	 * @throws IOException
	 *             If some other I/O problem occurs. For a WMQFTE transfer this
	 *             means that it will be failed.
	 */
	int write(ByteBuffer buffer) throws RecoverableIOException, IOException;

	/**
	 * Forces any updates to this channel's resource to be written to its
	 * storage device.
	 * <p>
	 * This method is required to force changes to both the resource's content
	 * and any associated metadata to be written to storage.
	 * 
	 * @throws RecoverableIOException
	 *             If a recoverable problem occurs while performing the force.
	 *             For a WMQFTE transfer this means that it will attempt to
	 *             recover.
	 * @throws IOException
	 *             If some other I/O problem occurs. For a WMQFTE transfer this
	 *             means that it will be failed.
	 */
	void force() throws RecoverableIOException, IOException;

	/**
	 * Attempts to lock the entire resource associated with the channel for
	 * shared or exclusive access.
	 * <p>
	 * The intention is for this method not to block if the lock is currently
	 * unavailable.
	 * 
	 * @param shared
	 *            {@code true} if a shared lock is required, {@code false} if an
	 *            exclusive lock is required.
	 * @return A {@link IOExitLock} instance representing the newly acquired
	 *         lock or null if the lock cannot be obtained.
	 * @throws IOException
	 *             If a problem occurs while attempting to acquire the lock.
	 */
	IOExitLock tryLock(boolean shared) throws IOException;
}