/**
 * $Id: Context.java,v 1.1 2005/03/18 13:57:43 rampil Exp $
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.util;

import java.util.HashMap;

/**
 * 汎用コンテキストクラス
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class Context implements ObservableAttribute {
	/** 属性 */
	private HashMap context = new HashMap();
	/** 属性変更リスナー */
	private HashMap attributeListeners = new HashMap();

	/**
	 * 属性に関連づいている値を返す
	 * @param key 属性
	 * @return  値
	 */
	public Object getAttribute(String key) {
		return context.get(key);
	}
	/**
	 * 属性に関連づいている値を設定する
	 * @param key 属性
	 * @param o 値
	 */
	public void setAttribute(String key, Object o) {
		AttributeChangeListener lsnr = (AttributeChangeListener)attributeListeners.get(key);
		if(lsnr != null) {
			lsnr.preChange(new AttributeChangeEvent(this, o));
		}
		context.put(key, o);
		if(lsnr != null) {
			lsnr.postChanged(new AttributeChangeEvent(this, o));
		}
	}
	/**
	 * 属性を削除する
	 * @param key 属性
	 */
	public void removeAttribute(String key) {
		context.remove(key);
	}
	/**
	 * 属性に関連づいている値を設定する
	 * @param key 属性
	 * @param o 値
	 * @param lsnr この属性が変更された場合に呼び出されるイベントリスナー
	 */
	public void setAttributeChangeListener(String key, AttributeChangeListener lsnr) {
		attributeListeners.put(key, lsnr);
	}
	/**
	 * 特定の属性に関連づいている属性変更リスナーを除去する
	 * @param key 属性
	 */
	public void removeAttributeChangeListener(String key) {
		attributeListeners.remove(key);
	}

}
