package com.nifty.cloud.ncs.transfer;

/**
 * ファイルの転送状態を保持するクラスです。
 */
public class Transfer
{
	/**
	 * 転送ステータスを定義する列挙型です。
	 */
	public static enum TransferState
	{
		/** 処理の開始待ち */
		Waiting,

		/** 処理中 */
		InProgress,

		/** 正常終了 */
		Completed,

		/** 処理キャンセル */
		Canceled,

		/** 処理失敗 */
		Failed;
	}

	/** 現在のステータス */
	protected volatile TransferState state = TransferState.Waiting;

	/** アップロード監視用のモニター */
	protected TransferMonitor monitor;

	private final String description;

	/**
	 * 新しいTransferを構築します。
	 *
	 * @param description
	 *           転送の説明
	 */
	Transfer(String description)
	{
		this.description = description;
	}

	/**
	 * 処理が終了したかどうかの判定を行います。<br>
	 * 処理終了とは｢正常終了｣、｢処理キャンセル｣、｢処理失敗｣状態を指します。
	 *
	 * @return 処理終了フラグ
	 */
	public synchronized boolean isDone()
	{
		return (state == TransferState.Failed ||
				state == TransferState.Completed ||
				state == TransferState.Canceled);
	}

	/**
	 * アップロードの説明を取得します。
	 *
	 * @return アップロードの説明
	 */
	public String getDescription()
	{
		return (description);
	}

	/**
	 * 現在の転送ステータスを取得します。
	 *
	 * @return アップロードステータス
	 */
	public synchronized TransferState getState()
	{
		return (state);
	}

	/**
	 * 転送ステータスを設定します。
	 *
	 * @param state
	 *  転送ステータス
	 */
	public void setState(TransferState state)
	{
		if (this.state == state) {
			return;
		}
		this.state = state;
	}

}
