/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.framework.container.factory;
import org.seasar.framework.container.ArgDef;
import org.seasar.framework.container.ComponentDef;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.assembler.AutoBindingDefFactory;
import org.seasar.framework.container.deployer.InstanceDefFactory;
import org.seasar.framework.container.impl.ComponentDefImpl;
import org.seasar.framework.util.ClassUtil;
import org.seasar.framework.util.StringUtil;
import org.seasar.framework.xml.TagHandlerContext;
import org.xml.sax.Attributes;
/**
* diconファイルの<code>component</code>要素を解釈するためのクラスです。
*
* @author higa
*/
public class ComponentTagHandler extends AbstractTagHandler {
private static final long serialVersionUID = -8182227769800177833L;
public void start(TagHandlerContext context, Attributes attributes) {
AnnotationHandler annoHandler = AnnotationHandlerFactory
.getAnnotationHandler();
String className = attributes.getValue("class");
Class componentClass = null;
if (className != null) {
componentClass = ClassUtil.forName(className);
}
String name = attributes.getValue("name");
ComponentDef componentDef = null;
if (componentClass != null) {
componentDef = annoHandler.createComponentDef(componentClass, null);
if (name != null) {
componentDef.setComponentName(name);
}
annoHandler.appendDI(componentDef);
} else {
componentDef = createComponentDef(componentClass, name);
}
String instanceMode = attributes.getValue("instance");
if (instanceMode != null) {
componentDef.setInstanceDef(InstanceDefFactory
.getInstanceDef(instanceMode));
}
String autoBindingName = attributes.getValue("autoBinding");
if (autoBindingName != null) {
componentDef.setAutoBindingDef(AutoBindingDefFactory
.getAutoBindingDef(autoBindingName));
}
String externalBindingStr = attributes.getValue("externalBinding");
if (externalBindingStr != null) {
componentDef.setExternalBinding(Boolean.valueOf(externalBindingStr)
.booleanValue());
}
context.push(componentDef);
}
public void end(TagHandlerContext context, String body) {
ComponentDef componentDef = (ComponentDef) context.pop();
AnnotationHandler annoHandler = AnnotationHandlerFactory
.getAnnotationHandler();
annoHandler.appendInitMethod(componentDef);
annoHandler.appendDestroyMethod(componentDef);
annoHandler.appendAspect(componentDef);
annoHandler.appendInterType(componentDef);
String expression = null;
if (body != null) {
expression = body.trim();
if (!StringUtil.isEmpty(expression)) {
componentDef
.setExpression(createExpression(context, expression));
} else {
expression = null;
}
}
if (componentDef.getComponentClass() == null
&& !InstanceDefFactory.OUTER.equals(componentDef
.getInstanceDef()) && expression == null) {
throw new TagAttributeNotDefinedRuntimeException("component",
"class");
}
if (context.peek() instanceof S2Container) {
S2Container container = (S2Container) context.peek();
container.register(componentDef);
} else {
ArgDef argDef = (ArgDef) context.peek();
argDef.setChildComponentDef(componentDef);
}
}
/**
* コンポーネント定義を作成します。
*
* @param componentClass
* @param name
* @return コンポーネント定義
*/
protected ComponentDef createComponentDef(Class componentClass, String name) {
return new ComponentDefImpl(componentClass, name);
}
}