/*
* Copyright 2004-2007 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 java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import org.seasar.framework.beans.BeanDesc;
import org.seasar.framework.beans.PropertyDesc;
import org.seasar.framework.beans.factory.BeanDescFactory;
import org.seasar.framework.container.AccessTypeDef;
import org.seasar.framework.container.AutoBindingDef;
import org.seasar.framework.container.BindingTypeDef;
import org.seasar.framework.container.ComponentDef;
import org.seasar.framework.container.DestroyMethodDef;
import org.seasar.framework.container.InitMethodDef;
import org.seasar.framework.container.InstanceDef;
import org.seasar.framework.container.PropertyDef;
import org.seasar.framework.container.assembler.AccessTypeDefFactory;
import org.seasar.framework.container.assembler.AutoBindingDefFactory;
import org.seasar.framework.container.assembler.BindingTypeDefFactory;
import org.seasar.framework.container.deployer.InstanceDefFactory;
import org.seasar.framework.container.impl.ComponentDefImpl;
import org.seasar.framework.container.impl.PropertyDefImpl;
import org.seasar.framework.container.ognl.OgnlExpression;
import org.seasar.framework.util.ClassUtil;
import org.seasar.framework.util.StringUtil;
/**
* @author vestige
*
*/
public abstract class AbstractAnnotationHandler implements AnnotationHandler {
protected static final String COMPONENT = "COMPONENT";
protected static final String NAME = "name";
protected static final String INSTANCE = "instance";
protected static final String AUTO_BINDING = "autoBinding";
protected static final String BINDING_SUFFIX = "_BINDING";
protected static final String BINDING_TYPE = "bindingType";
protected static final String EXTERNAL_BINDING = "externalBinding";
protected static final String VALUE = "value";
protected static final String ASPECT = "ASPECT";
protected static final String INTER_TYPE = "INTER_TYPE";
protected static final String INIT_METHOD = "INIT_METHOD";
protected static final String DESTROY_METHOD = "DESTROY_METHOD";
protected static final String INTERCEPTOR = "interceptor";
protected static final String POINTCUT = "pointcut";
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#createComponentDef(java.lang.String, org.seasar.framework.container.InstanceDef)
*/
public ComponentDef createComponentDef(String className,
InstanceDef instanceDef) {
return createComponentDef(ClassUtil.forName(className), instanceDef);
}
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#createComponentDef(java.lang.String, org.seasar.framework.container.InstanceDef, org.seasar.framework.container.AutoBindingDef)
*/
public ComponentDef createComponentDef(String className,
InstanceDef instanceDef, AutoBindingDef autoBindingDef) {
return createComponentDef(ClassUtil.forName(className), instanceDef,
autoBindingDef);
}
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#createComponentDef(java.lang.String, org.seasar.framework.container.InstanceDef, org.seasar.framework.container.AutoBindingDef, boolean)
*/
public ComponentDef createComponentDef(String className,
InstanceDef instanceDef, AutoBindingDef autoBindingDef,
boolean externalBinding) {
return createComponentDef(ClassUtil.forName(className), instanceDef,
autoBindingDef, externalBinding);
}
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#createComponentDef(java.lang.Class, org.seasar.framework.container.InstanceDef)
*/
public ComponentDef createComponentDef(Class componentClass,
InstanceDef instanceDef) {
return createComponentDef(componentClass, instanceDef, null);
}
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#createComponentDef(java.lang.Class, org.seasar.framework.container.InstanceDef, org.seasar.framework.container.AutoBindingDef)
*/
public ComponentDef createComponentDef(Class componentClass,
InstanceDef instanceDef, AutoBindingDef autoBindingDef) {
return createComponentDef(componentClass, instanceDef, autoBindingDef,
false);
}
/* (non-Javadoc)
* @see org.seasar.framework.container.factory.AnnotationHandler#appendDI(org.seasar.framework.container.ComponentDef)
*/
public void appendDI(ComponentDef componentDef) {
BeanDesc beanDesc = BeanDescFactory.getBeanDesc(componentDef
.getComponentClass());
for (int i = 0; i < beanDesc.getPropertyDescSize(); ++i) {
PropertyDesc pd = beanDesc.getPropertyDesc(i);
if (!pd.hasWriteMethod()) {
continue;
}
PropertyDef propDef = createPropertyDef(beanDesc, pd);
if (propDef == null) {
continue;
}
componentDef.addPropertyDef(propDef);
}
for (int i = 0; i < beanDesc.getFieldSize(); ++i) {
Field field = beanDesc.getField(i);
if (componentDef.hasPropertyDef(field.getName())) {
continue;
}
if (!isFieldInjectionTarget(field)) {
continue;
}
PropertyDef propDef = createPropertyDef(beanDesc, field);
if (propDef == null) {
continue;
}
componentDef.addPropertyDef(propDef);
}
}
/**
* インスタンス定義を返します。
* 指定した名前のインスタンス定義が存在しない場合、デフォルトのインスタンス定義を返します。
*
* @param name
* インスタンス定義の種類
* @param defaultInstanceDef
* デフォルトのインスタンス定義(singleton)
* @return インスタンス定義
*/
protected InstanceDef getInstanceDef(String name,
InstanceDef defaultInstanceDef) {
InstanceDef instanceDef = getInstanceDef(name);
if (instanceDef != null) {
return instanceDef;
}
return defaultInstanceDef;
}
/**
* インスタンス定義を返します。
*
* @param name
* インスタンス定義の種類
* @return インスタンス定義
*/
protected InstanceDef getInstanceDef(String name) {
if (StringUtil.isEmpty(name)) {
return null;
}
return InstanceDefFactory.getInstanceDef(name);
}
/**
* 自動バインディング定義を取得します。
*
* @param name
* 自動バインディング定義の種類
* @return 自動バインディング定義
*/
protected AutoBindingDef getAutoBindingDef(String name) {
if (StringUtil.isEmpty(name)) {
return null;
}
return AutoBindingDefFactory.getAutoBindingDef(name);
}
/**
* 指定したコンポーネントクラスからコンポーネント定義を作成します。
*
* 以下の設定がある場合はおのおのコンポーネント定義に設定します。
*
True
、そうでないときはFlase
*/
protected boolean isFieldInjectionTarget(Field field) {
return !Modifier.isStatic(field.getModifiers())
&& !Modifier.isFinal(field.getModifiers());
}
}