/*
 * $Id: SyncCommand.java,v 1.3 2005/10/10 12:34:52 rampil Exp $
 * Copyright (c) 2004 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.rss.dsync;

import java.io.Serializable;

/**
 * SyncCommand
 * 格納されているオブジェクトをどのように扱うかを記述したオブジェクト
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class SyncCommand implements Serializable {
	/** ロック取得 */
	public static final int COMMAND_LOCK = 1;
	/** ロック解除 */
	public static final int COMMAND_UNLOCK = -1;
	/** 未処理URLの転送処理 */
	public static final int COMMAND_FORWARD_URL = 3;
	/** 未処理URLの転送処理 */
	public static final int COMMAND_UNFORWARD_URL = -3;
	/** シャットダウン */
	public static final int COMMAND_SHUTDOWN = 255;

	/** このコマンドに関連付けされているオブジェクト */
	private Object _o = null;
	/** このコマンドのタイプ */
	private int _commandType = 0;
	/** 発信元 */
	private String _from;
	/** 発信先 */
	private String _to;

	/**
	 * デフォルトコンストラクタ
	 * 直列化を戻す際に必要になる
	 */
	public SyncCommand() {
	}
	/**
	 * コンストラクタ
	 * @param o 引数オブジェクト
	 * @param type コマンドのタイプ
	 * @param from 送信元
	 * @param to 送信先
	 * @throws IllegalArgumentException コマンドタイプがおかしい
	 */
	public SyncCommand(Serializable o, int type, String from, String to) throws IllegalArgumentException {
		// コマンドの種類を確認する
		// コマンドを追加した場合は，ここの判定用コードを追加すること
		if(
			type != COMMAND_LOCK && 
			type != COMMAND_UNLOCK && 
			type != COMMAND_FORWARD_URL &&
			type != COMMAND_UNFORWARD_URL &&
			type != COMMAND_SHUTDOWN
		) {
			throw new IllegalArgumentException("command typeが不正です");
		}

		setObject(o);
		_commandType = type;

		_to = to;
		_from = from;
	}
	/**
	 * このコマンドの文字列表現を返す
	 * @return このコマンドの文字列表現
	 */
	public String toString() {
		StringBuffer bf = new StringBuffer();
		bf.append("SYC_");

		switch(_commandType) {
			case COMMAND_LOCK:
				bf.append("LO");
				break;

			case COMMAND_UNLOCK:
				bf.append("UL");
				break;

			case COMMAND_FORWARD_URL:
				bf.append("FU");
				break;

			case COMMAND_UNFORWARD_URL:
				bf.append("UF");
				break;

			case COMMAND_SHUTDOWN:
				bf.append("SD");
				break;

			default:
				bf.append("ND");
		}

		bf.append(_o.toString());

		return bf.toString();
	}

	/**
	 * コマンドの転送方向を逆にする
	 */
	public void reverse() {
		_commandType = 0 - _commandType;
	}
	/**
	 * 登録されているオブジェクトを返す
	 * @return 登録されているオブジェクト
	 */
	public Object getObject() {
		return _o;
	}
	/**
	 * メッセージと一緒に送信するデータ
	 * @param o データ
	 * @throws IllegalArgumentException
	 */
	public void setObject(Serializable o) throws IllegalArgumentException {
		_o = o;
	}
	/**
	 * コマンドの種類を返す
	 * @return この同期コマンドのタイプ
	 */
	public int getType() {
		return _commandType;
	}
	/**
	 * コマンドの種類を設定する
	 * @param type 同期コマンドの種類
	 */
	public void setType(int type) {
		_commandType = type;
	}
	/**
	 * 発信元を返す
	 * @return 発信元ノードID
	 */
	public String getFrom() {
		return _from;
	}
	/**
	 * 発信元ノードIDを設定する
	 * @param from 発信元ノードID
	 */
	public void setFrom(String from) {
		_from = from;
	}
	/**
	 * 発信先を返す
	 * @return 発信先ノードID
	 */
	public String getTo() {
		return _to;
	}
	/**
	 * 発信先を設定する
	 * @param to 発信先ノードID
	 */
	public void setTo(String to) {
		_to = to;
	}
}

// end of SyncCommand.java
