/*
 * LOGICAL-PARADOX.ORG b-tree library
 * Copyright (C)2004,2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: BtreeAvailableList.java,v 1.2 2005/05/16 15:36:45 rampil Exp $
 */
package org.logical_paradox.common.btree;

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

import org.logical_paradox.common.io.AvailableList;

/**
 * B-tree構造で使用する利用可能リストをファイル上に投影するクラス
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class BtreeAvailableList extends AvailableList {
	/**
	 * コンストラクタ
	 * @param filename ファイル名
	 */
	public BtreeAvailableList(String filename) {
		super(filename, 0);
	}
	/**
	 * コンストラクタ
	 * @param filename ファイル名
	 * @param size フラグメントコレクションのサイズ
	 */
	public BtreeAvailableList(String filename, int size) {
		super(filename, size);
	}
	/**
	 * バイト列から利用可能リストを復元する処理
	 * @param bstream バイト列
	 * @throws IOException 復元処理中に例外が発生した
	 */
	protected void restore(ByteBuffer buffer) throws IOException {
		while(buffer.hasRemaining()) {
			cache.add(new Long(buffer.getLong()));
		}
	}
	/**
	 * メモリ上にキャッシュされている断片化情報をファイルに出力する
	 * @throws IOException ファイルアクセスに失敗
	 */
	public void flush() throws IOException {
		ByteBuffer buffer = ByteBuffer.allocate(cache.size() * 8).order(ByteOrder.BIG_ENDIAN);
		Long buf = null;

		// 全ての断片化レコード番号を取得してバイトバッファへ登録する
		while((buf = (Long)cache.getOne()) != null) {
			buffer.putLong(buf.longValue());
		}

		// デフォルトの出力ストリームを開いてファイルへ出力する
		OutputStream out = getOutputStream();
		out.write(buffer.array());
		out.close();
	}
}
