ソース斜め読み #0 自動登録関連

自動登録関連のクラス階層は次の通り。

IAutoRegister
 + AbstractAutoRegister
  + ComponentAutoRegister
  + FileSystemAutoRegister
  + JarAutoRegister

で、ファクトリークラスがAutoRegisterFactory

(略)

public class AutoRegisterFactory {
	
	private static HashMap autoRegisters = new HashMap();
	static {
		autoRegisters.put(
				"org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister",
				new FileSystemAutoRegister());
		autoRegisters.put(
				"org.seasar.framework.container.autoregister.JarComponentAutoRegister",
				new JarAutoRegister());
		autoRegisters.put(
				"org.seasar.framework.container.autoregister.ComponentAutoRegister",
				new ComponentAutoRegister());
	}
	
(略)

	public static boolean isAutoRegister(String className){
		return autoRegisters.containsKey(className);
	}
	
(略)

	public static IAutoRegister getAutoRegister(String className, FuzzyXMLElement element){
		IAutoRegister register = (IAutoRegister)autoRegisters.get(className);
		register.init(element);
		return register;
	}
	
}

diconファイルをパースしているDiconParserのparseメソッドで、自動登録関連のタグがきた場合にファクトリーを使う。

	public void parse(IFile file) throws Exception {

    (略)

		for(int i=0;i<nodes.length;i++){
			if(nodes[i] instanceof FuzzyXMLElement){
				FuzzyXMLElement element = (FuzzyXMLElement)nodes[i];
				// include要素
				if(element.getName().equals("include")){

        (略)

				// component要素
				} else if(element.getName().equals("component")){
					String className = Util.getXPathValue(element,"@class");
					if(AutoRegisterFactory.isAutoRegister(className)){
						handleAutoRegister(className, element);
					} else if(namespace!=null && namespace.equals("jsf")){
						if(className.equals("org.seasar.jsf.runtime.JsfConfigImpl")){
							handleJsfConfigImpl(element);
						} else if(className.equals("org.seasar.jsf.runtime.TagProcessorTreeFactoryImpl")){
							handleTagProcessorTreeFactoryImpl(element);
						}
					} else {
						handleComponent(element);
					}
				}
			}
		}
	}

handleAutoRegisterメソッドで、classNameに対応するAutoRegisterをつくって、コンポーネントを登録している。
コンポーネントはregisterAll→register→processClass経由でAbstractAutoRegisterクラスのmanagedBeansフィールドにaddしている。

	private void handleAutoRegister(String className, FuzzyXMLElement element){
		IAutoRegister register = AutoRegisterFactory.getAutoRegister(className, element);
		register.setProject(project);
		register.registerAll();
		
		ManagedBean[] beans = register.getRegisteredBeans();
		for(int i=0;i<beans.length;i++){
			managedBeans.add(beans[i]);
		}
	}