/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: DiskArrayNode.java,v 1.3 2005/09/28 16:14:59 rampil Exp $
 */
package org.logical_paradox.vsan.node;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;

import org.logical_paradox.vsan.node.dbr.RecordSet;

/**
 * ディスクアレイノード
 * このノードに関する情報を格納するオブジェクト
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.3 $
 */
public class DiskArrayNode implements Serializable {
	/** ホストアドレス */
	private String host;
	/** レコードセット */
	private ArrayList recordSets = new ArrayList();

	/** 開始レコード番号(addされるごとに更新される) */
	private long recordBegin = 0;
	/** 終了レコード番号(addされるこどに更新される) */
	private long recordEnd = 0;

	/**
	 * コンストラクタ
	 */
	public DiskArrayNode() {
	}
	/**
	 * コンストラクタ．
	 * @param nodeId_ ノードID
	 */
	public DiskArrayNode(String nodeId_) {
		host = nodeId_;
	}
	/**
	 * コンストラクタ．
	 * @param nodeId_ ノードID
	 * @param records レコードセット
	 */
	public DiskArrayNode(String nodeId_, ArrayList records) {
		this(nodeId_);
		recordSets.addAll(records);
	}
	/**
	 * レコードのサイズを返す．
	 * @return レコードのサイズ(-1: レコードが1件もない)
	 */
	public int getRecordSize() {
		return recordSets.size() == 0 ? -1 : ((RecordSet)recordSets.get(0)).getRecordSize();
	}
	/**
	 * ノードのホストアドレスを設定する．
	 * @param nodeId_ ホストアドレス
	 */
	public void setHost(String host_) {
		host = host_;
	}
	/**
	 * ノードのホストアドレスを返す．
	 * @return ホストアドレス
	 */
	public String getHost() {
		return host;
	}
	/**
	 * レコードセットを設定する．
	 * @param sets レコードセット
	 */
	public void setRecordSets(ArrayList sets) {
		recordSets = sets;
	}
	/**
	 * レコードセットを追加する．
	 * @param rs 追加するレコードセット
	 */
	public void add(RecordSet rs) {
		recordSets.add(rs);

		if(rs.getRecordBegin() < recordBegin) {
			recordBegin = rs.getRecordBegin();
		}
		if(rs.getRecordEnd() > recordEnd) {
			recordEnd = rs.getRecordEnd();
		}
	}
	/**
	 * レコードセットのイテレータを返す．
	 * @return イテレータ
	 */
	public Iterator recordSet() {
		return recordSets.iterator();	
	}
	/**
	 * このノードが指定レコード番号を含むかどうかを返す．
	 * @param record レコード番号
	 * @return true:含む / false:含まない
	 */
	public boolean contains(long record) {
		for(Iterator it = recordSets.iterator(); it.hasNext();) {
			RecordSet rs = (RecordSet)it.next();
			if(rs.includes(record) == true) {
				return true;
			}
		}
		return false;
	}
	/**
	 * 開始レコード番号を返す．
	 * @return 開始レコード番号
	 */
	public long getRecordBegin() {
		return recordBegin;
	}
	/**
	 * 終了レコード番号を返す．
	 * @return 終了レコード番号
	 */
	public long getRecordEnd() {
		return recordEnd;
	}
	/**
	 * このレコードセットがカバーしているサイズを返す．
	 * @return カバードサイズ
	 */
	public long getSize() {
		long size = 0;

		for(Iterator it = recordSets.iterator(); it.hasNext();) {
			RecordSet rs = (RecordSet)it.next();
			size += rs.getSize();
		}

		return size;
	}
	/**
	 * ディスクアレイノードを比較する．
	 * 単純にノード名のみで比較する．
	 * @param o 比較対象
	 */
	public boolean equals(Object o) {
		if(o instanceof DiskArrayNode == false) {
			return false;
		}

		DiskArrayNode buddy = (DiskArrayNode)o;
		return getHost().equals(buddy.getHost());
	}
}
