/*
 * $Id: LimitedObject.java,v 1.2 2004/09/14 04:07:34 rampil Exp $
 * Copyright (c) 2004 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.common.util;

import java.io.Serializable;

/**
 * 期限付きオブジェクト
 * 期限付きでオブジェクトを管理するラッパー
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class LimitedObject implements Serializable {
	/**
	 * ラッピング中のオブジェクト
	 */
	private Object o;
	/**
	 * 最終更新日時(msec)
	 */
	private long lastUpdate;
	/**
	 * 有効期限(msec)
	 */
	private long interval;

	/**
	 * コンストラクタ
	 * @param obj ラッピングするオブジェクト
	 * @param i 有効期限(msec)
	 */	
	public LimitedObject(Object obj, long i) {
		o = obj;
		interval = i;
	}
	/**
	 * コンストラクタ
	 * @param i 有効期限(msec)
	 */
	public LimitedObject(int i) {
		o = null;
		interval = i;
	}

	/**
	 * ラッピングされているオブジェクトを返す
	 * @return ラッピングされているオブジェクト
	 */
	public Object get() {
		return o;
	}
	/**
	 * オブジェクトを設定する
	 * @param obj 設定対象のオブジェクト
	 */
	public void set(Object obj) {
		o = obj;
	}
	/**
	 * オブジェクトの最終更新日時を更新する
	 */
	public void touch() {
		lastUpdate = System.currentTimeMillis();
	}

	/**
	 * 有効期限が切れているかどうかを返す
	 * @return true:有効期限切れ / false:有効期限は切れていない
	 */
	public boolean isExpired() {
		if(System.currentTimeMillis() >= lastUpdate + interval) {
			return true;
		}
		
		return false;
	}
	/**
	 * 比較する．
	 * ラッピングしているオブジェクト同士をequalsで比較して、同じであれば有効期限(interval)を比較する。<BR>
	 * 有効期限も一致していれば、同じであるとみなす。<BR>
	 * オブジェクト同士のequals比較でfalseか、あるいは有効期限(interval)が違う場合は違うとみなす。
	 * @param object 比較対象
	 * @return true:同じ / false:違う
	 */
	public boolean equals(Object obj) {
		LimitedObject lo = (LimitedObject)obj;
		if(o.equals(lo.o) == false) {
			return false;
		}
		if(interval != lo.interval) {
			return false;
		}
		return true;
	}
}
