package org.arefgard.icerya.container.def;

import java.util.List;
import java.util.Map;

import org.arefgard.icerya.container.IceryaContainer;
import org.arefgard.icerya.container.cache.CacheStrategy;
import org.arefgard.icerya.container.cache.impl.NoneCacheStrategy;
import org.arefgard.icerya.container.injection.InjectionStrategy;
import org.arefgard.icerya.container.injection.impl.SetterInjectionStrategy;

/**
 * Bean定義ファイルをパースした結果得られるBean情報を
 * 保持するエンティティ。
 * 
 * @author Takashi Yamashina
 * @since 1.0.0
 */
public class BeanDef {
	/** Bean ID */
	private String beanId;
	/** Beanのクラスの完全修飾名 */
	private String beanClass;
	/** インスタンス作成時に実行されるメソッド */
	private String initMethod;
	/** DIコンテナ終了時に実行されるメソッド */
	private String destroyMethod;
	/** JNDI名 */
	private String jndiName;
	
	/** プロパティ */
	private Map<String, PropertyDef> properties = new java.util.HashMap<String, PropertyDef>();
	/** コンストラクタ */
	private List<ConstructorArgDef> constructorArgs = new java.util.ArrayList<ConstructorArgDef>();
	
	private List<ElementDef> elements = new java.util.ArrayList<ElementDef>();
	
	private List<EntryDef> entries = new java.util.ArrayList<EntryDef>();
	
	private List<AspectDef> aspects = new java.util.ArrayList<AspectDef>();
	
	/** コンテキスト(Stringのみ) */
	private String context;
	/** このBeanDefを管理しているコンテナの参照 */
	private IceryaContainer container;
	
	/** Listオブジェクトであるかどうか */
	private boolean listObject = false;
	/** Mapオブジェクトであるかどうか */
	private boolean mapObject = false;
	
	/** キャッシュ戦略 */
	private CacheStrategy cache;
	
	/** インジェクション戦略 */
	private InjectionStrategy injection;
	
	public BeanDef() {
		this.cache = new NoneCacheStrategy();
		this.injection = new SetterInjectionStrategy();
	}
	
	/**
	 * Bean IDを設定する。
	 * 
	 * @param beanId Bean ID
	 */
	public void setBeanId(String beanId) {
		this.beanId = beanId;
	}
	
	/**
	 * Bean IDを取得する。
	 * 
	 * @return Bean ID
	 */
	public String getBeanId() {
		return this.beanId;
	}
	
	/**
	 * Beanのクラスを設定する。
	 * 
	 * @param beanClass Beanのクラス
	 */
	public void setBeanClass(String beanClass) {
		this.beanClass = beanClass;
	}
	
	/**
	 * Beanのクラスを取得する。
	 * 
	 * @return Beanのクラス
	 */
	public String getBeanClass() {
		return beanClass;
	}

	public String getDestroyMethod() {
		return destroyMethod;
	}

	public void setDestroyMethod(String destroyMethod) {
		this.destroyMethod = destroyMethod;
	}

	public String getInitMethod() {
		return initMethod;
	}

	public void setInitMethod(String initMethod) {
		this.initMethod = initMethod;
	}

	public String getJndiName() {
		return jndiName;
	}

	public void setJndiName(String jndiName) {
		this.jndiName = jndiName;
	}

	/**
	 * プロパティを追加する。
	 * 
	 * @param name プロパティ名
	 * @param value 値
	 */
	public void addProperty(String name, PropertyDef propertyDef) {
		this.properties.put(name, propertyDef);
	}
	
	/**
	 * プロパティを取得する。
	 * 
	 * @param name プロパティ名
	 * @return 値
	 */
	public PropertyDef getProperty(String name) {
		return this.properties.get(name);
	}
	
	/**
	 * 全プロパティのマップを取得する。
	 * 
	 * @return 全プロパティのマップ
	 */
	public Map<String, PropertyDef> getProperties() {
		return this.properties;
	}
	
	public void addConstructorArg(ConstructorArgDef constructorArgDef) {
		this.constructorArgs.add(constructorArgDef);
	}
	
	public void setConstructorArg(int index, ConstructorArgDef constructorArgDef) {
		this.constructorArgs.add(index, constructorArgDef);
	}
	
	public ConstructorArgDef getConstructorArg(int index) {
		return this.constructorArgs.get(index);
	}
	
	public List<ConstructorArgDef> getConstructorArgs() {
		return this.constructorArgs;
	}
	
	public String getContext() {
		return context;
	}

	public void setContext(String context) {
		this.context = context;
	}

	public IceryaContainer getContainer() {
		return container;
	}

	public void setContainer(IceryaContainer container) {
		this.container = container;
	}

	public CacheStrategy getCacheStrategy() {
		return cache;
	}

	public void setCacheStrategy(CacheStrategy cache) {
		this.cache = cache;
	}

	public InjectionStrategy getInjectionStrategy() {
		return injection;
	}

	public void setInjectionStrategy(InjectionStrategy injection) {
		this.injection = injection;
	}

	public List<ElementDef> getElements() {
		return elements;
	}

	public void setElements(List<ElementDef> elements) {
		this.elements = elements;
	}

	public List<EntryDef> getEntries() {
		return entries;
	}

	public void setEntries(List<EntryDef> entries) {
		this.entries = entries;
	}
	
	public void addElement(ElementDef element) {
		this.elements.add(element);
	}
	
	public void addEntry(EntryDef entry) {
		this.entries.add(entry);
	}

	public boolean isListObject() {
		return listObject;
	}

	public void setListObject(boolean listObject) {
		this.listObject = listObject;
	}

	public boolean isMapObject() {
		return mapObject;
	}

	public void setMapObject(boolean mapObject) {
		this.mapObject = mapObject;
	}

	public List<AspectDef> getAspects() {
		return aspects;
	}

	public void setAspects(List<AspectDef> aspects) {
		this.aspects = aspects;
	}
	
	public void addAspect(AspectDef aspect) {
		this.aspects.add(aspect);
	}
	
	
}
