/* * 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.impl; import org.seasar.framework.beans.PropertyNotFoundRuntimeException; import org.seasar.framework.container.ArgDef; import org.seasar.framework.container.AspectDef; import org.seasar.framework.container.AutoBindingDef; import org.seasar.framework.container.ComponentDef; import org.seasar.framework.container.ComponentDeployer; import org.seasar.framework.container.ContainerConstants; import org.seasar.framework.container.DestroyMethodDef; import org.seasar.framework.container.Expression; import org.seasar.framework.container.InitMethodDef; import org.seasar.framework.container.InstanceDef; import org.seasar.framework.container.InterTypeDef; import org.seasar.framework.container.MetaDef; import org.seasar.framework.container.PropertyDef; 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.util.AopProxyUtil; import org.seasar.framework.container.util.ArgDefSupport; import org.seasar.framework.container.util.AspectDefSupport; import org.seasar.framework.container.util.DestroyMethodDefSupport; import org.seasar.framework.container.util.InitMethodDefSupport; import org.seasar.framework.container.util.InterTypeDefSupport; import org.seasar.framework.container.util.MetaDefSupport; import org.seasar.framework.container.util.PropertyDefSupport; /** * {@link ComponentDef}の実装クラスです。 * * @author higa * */ public class ComponentDefImpl implements ComponentDef, ContainerConstants { private Class componentClass; private String componentName; private Class concreteClass; private S2Container container; private Expression expression; private ArgDefSupport argDefSupport = new ArgDefSupport(); private PropertyDefSupport propertyDefSupport = new PropertyDefSupport(); private InitMethodDefSupport initMethodDefSupport = new InitMethodDefSupport(); private DestroyMethodDefSupport destroyMethodDefSupport = new DestroyMethodDefSupport(); private AspectDefSupport aspectDefSupport = new AspectDefSupport(); private InterTypeDefSupport interTypeDefSupport = new InterTypeDefSupport(); private MetaDefSupport metaDefSupport = new MetaDefSupport(); private InstanceDef instanceDef = InstanceDefFactory.SINGLETON; private AutoBindingDef autoBindingDef = AutoBindingDefFactory.AUTO; private ComponentDeployer componentDeployer; private boolean externalBinding = false; /** * {@link ComponentDefImpl}を作成します。 */ public ComponentDefImpl() { } /** * {@link ComponentDefImpl}を作成します。 * * @param componentClass */ public ComponentDefImpl(Class componentClass) { this(componentClass, null); } /** * {@link ComponentDefImpl}を作成します。 * * @param componentClass * @param componentName */ public ComponentDefImpl(Class componentClass, String componentName) { this.componentClass = componentClass; setComponentName(componentName); } public Object getComponent() { return getComponentDeployer().deploy(); } public void injectDependency(Object outerComponent) { getComponentDeployer().injectDependency(outerComponent); } public Class getComponentClass() { return componentClass; } public String getComponentName() { return componentName; } public void setComponentName(String componentName) { this.componentName = componentName; } public Class getConcreteClass() { if (concreteClass == null) { ClassLoader oldLoader = Thread.currentThread() .getContextClassLoader(); try { ClassLoader loader = (container != null ? container .getClassLoader() : null); if (loader != null) { Thread.currentThread().setContextClassLoader(loader); } concreteClass = AopProxyUtil.getConcreteClass(this); } finally { Thread.currentThread().setContextClassLoader(oldLoader); } } return concreteClass; } public S2Container getContainer() { return container; } public void setContainer(S2Container container) { this.container = container; argDefSupport.setContainer(container); metaDefSupport.setContainer(container); propertyDefSupport.setContainer(container); initMethodDefSupport.setContainer(container); destroyMethodDefSupport.setContainer(container); aspectDefSupport.setContainer(container); interTypeDefSupport.setContainer(container); } public void addArgDef(ArgDef argDef) { argDefSupport.addArgDef(argDef); } public void addPropertyDef(PropertyDef propertyDef) { propertyDefSupport.addPropertyDef(propertyDef); } public void addInitMethodDef(InitMethodDef methodDef) { initMethodDefSupport.addInitMethodDef(methodDef); } public void addDestroyMethodDef(DestroyMethodDef methodDef) { destroyMethodDefSupport.addDestroyMethodDef(methodDef); } public void addAspectDef(AspectDef aspectDef) { aspectDefSupport.addAspectDef(aspectDef); concreteClass = null; } public void addAspectDef(int index, AspectDef aspectDef) { aspectDefSupport.addAspectDef(index, aspectDef); concreteClass = null; } public void addInterTypeDef(InterTypeDef interTypeDef) { interTypeDefSupport.addInterTypeDef(interTypeDef); concreteClass = null; } public int getArgDefSize() { return argDefSupport.getArgDefSize(); } public int getPropertyDefSize() { return propertyDefSupport.getPropertyDefSize(); } public int getInitMethodDefSize() { return initMethodDefSupport.getInitMethodDefSize(); } public int getDestroyMethodDefSize() { return destroyMethodDefSupport.getDestroyMethodDefSize(); } public int getAspectDefSize() { return aspectDefSupport.getAspectDefSize(); } public int getInterTypeDefSize() { return interTypeDefSupport.getInterTypeDefSize(); } public InstanceDef getInstanceDef() { return instanceDef; } public void setInstanceDef(InstanceDef instanceDef) { this.instanceDef = instanceDef; } public AutoBindingDef getAutoBindingDef() { return autoBindingDef; } public void setAutoBindingDef(AutoBindingDef autoBindingDef) { this.autoBindingDef = autoBindingDef; } public void init() { getConcreteClass(); getComponentDeployer().init(); } public void destroy() { getComponentDeployer().destroy(); componentClass = null; componentName = null; concreteClass = null; container = null; expression = null; argDefSupport = null; propertyDefSupport = null; initMethodDefSupport = null; destroyMethodDefSupport = null; aspectDefSupport = null; interTypeDefSupport = null; metaDefSupport = null; instanceDef = null; autoBindingDef = null; componentDeployer = null; } public Expression getExpression() { return expression; } public void setExpression(Expression expression) { this.expression = expression; } public ArgDef getArgDef(int index) { return argDefSupport.getArgDef(index); } public PropertyDef getPropertyDef(int index) { return propertyDefSupport.getPropertyDef(index); } public PropertyDef getPropertyDef(String propertyName) { if (hasPropertyDef(propertyName)) { return propertyDefSupport.getPropertyDef(propertyName); } throw new PropertyNotFoundRuntimeException(componentClass, propertyName); } public boolean hasPropertyDef(String propertyName) { return propertyDefSupport.hasPropertyDef(propertyName); } public InitMethodDef getInitMethodDef(int index) { return initMethodDefSupport.getInitMethodDef(index); } public DestroyMethodDef getDestroyMethodDef(int index) { return destroyMethodDefSupport.getDestroyMethodDef(index); } public AspectDef getAspectDef(int index) { return aspectDefSupport.getAspectDef(index); } public InterTypeDef getInterTypeDef(int index) { return interTypeDefSupport.getInterTypeDef(index); } public void addMetaDef(MetaDef metaDef) { metaDefSupport.addMetaDef(metaDef); } public MetaDef getMetaDef(int index) { return metaDefSupport.getMetaDef(index); } public MetaDef getMetaDef(String name) { return metaDefSupport.getMetaDef(name); } public MetaDef[] getMetaDefs(String name) { return metaDefSupport.getMetaDefs(name); } public int getMetaDefSize() { return metaDefSupport.getMetaDefSize(); } /** * {@link ComponentDeployer}を返します。 * * @return {@link ComponentDeployer} */ public ComponentDeployer getComponentDeployer() { if (componentDeployer == null) { componentDeployer = instanceDef.createComponentDeployer(this); } return componentDeployer; } public boolean isExternalBinding() { return externalBinding; } public void setExternalBinding(boolean externalBinding) { this.externalBinding = externalBinding; } }