/*
 * 作成日： 2004/09/07
 */
package org.seasar.tapestry.pageinjection.impl;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.util.StringUtil;
import org.seasar.tapestry.pageinjection.IInjection;
import org.seasar.tapestry.pageinjection.InjectionUtil;

/**
 * 指定したクラスのサブクラスに対してインジェクションを行う。
 * @author maruo_syunsuke
 */
public class ExtentionClassInjection implements IInjection {
	private final S2Container container;

	private final Class baseClass;

	/**
	 *  
	 */
	public ExtentionClassInjection(S2Container container) {
		this.container = container;
		this.baseClass = null ;
	}
	public ExtentionClassInjection(S2Container container, String clazz)
		throws ClassNotFoundException {
		this.container = container;
		if (StringUtil.isEmpty(clazz) == false) {
			this.baseClass = Class.forName(clazz);
		} else {
			this.baseClass = null;
		}
	}

	/**
	 * コンテナよりDIを実行する <br>
	 * targetと同じオブジェクトを返していますが、保障はしません。 <br>
	 * 
	 * @param target
	 *            インジェクションするオブジェクト
	 */
	public void injection(Object target) {
		S2Container container = this.container.getRoot();

		Class runClass = target.getClass();

		for(runClass = target.getClass();
			runClass != null && runClass.equals(this.baseClass) == false ;
			runClass = runClass.getSuperclass()
		) {
			InjectionUtil.injectionTypeS(container, runClass, target );
		}
	}
}