| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.tuscany.sca.implementation.spring.context; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.tuscany.sca.implementation.spring.SpringBeanElement; |
| import org.apache.tuscany.sca.implementation.spring.SpringConstructorArgElement; |
| import org.apache.tuscany.sca.implementation.spring.SpringPropertyElement; |
| import org.apache.tuscany.sca.implementation.spring.SpringSCAPropertyElement; |
| import org.apache.tuscany.sca.implementation.spring.SpringSCAReferenceElement; |
| import org.apache.tuscany.sca.implementation.spring.SpringSCAServiceElement; |
| import org.springframework.beans.MutablePropertyValues; |
| import org.springframework.beans.PropertyValue; |
| import org.springframework.beans.factory.BeanFactory; |
| import org.springframework.beans.factory.config.BeanDefinition; |
| import org.springframework.beans.factory.config.BeanReference; |
| import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
| import org.springframework.beans.factory.config.ConstructorArgumentValues; |
| import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; |
| import org.springframework.beans.factory.config.TypedStringValue; |
| import org.springframework.beans.factory.support.DefaultListableBeanFactory; |
| import org.springframework.context.ApplicationContext; |
| import org.springframework.context.support.GenericApplicationContext; |
| |
| public class SCAGenericApplicationContext extends GenericApplicationContext { |
| |
| private ClassLoader classloader = null; |
| private List<SpringSCAPropertyElement> propertyElements = new ArrayList<SpringSCAPropertyElement>(); |
| private List<SpringSCAServiceElement> serviceElements = new ArrayList<SpringSCAServiceElement>(); |
| private List<SpringSCAReferenceElement> referenceElements = new ArrayList<SpringSCAReferenceElement>(); |
| private List<SpringBeanElement> beanElements; |
| |
| public SCAGenericApplicationContext(DefaultListableBeanFactory beanFactory, |
| ApplicationContext parent, |
| ClassLoader classloader) { |
| super(beanFactory, parent); |
| this.classloader = classloader; |
| } |
| |
| public SCAGenericApplicationContext(ApplicationContext parent, ClassLoader classloader) { |
| super(parent); |
| this.classloader = classloader; |
| } |
| |
| /** |
| * Force the parent bean factory to be the SCA parent context itself |
| */ |
| protected BeanFactory getInternalParentBeanFactory() { |
| return getParent(); |
| } |
| |
| @Override |
| protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { |
| beanFactory.setBeanClassLoader(classloader); |
| } |
| |
| public void addSCAPropertyElement(SpringSCAPropertyElement propertyElement) { |
| propertyElements.add(propertyElement); |
| } |
| |
| public void addSCAServiceElement(SpringSCAServiceElement serviceElement) { |
| serviceElements.add(serviceElement); |
| } |
| |
| public void addSCAReferenceElement(SpringSCAReferenceElement referenceElement) { |
| referenceElements.add(referenceElement); |
| } |
| |
| public synchronized List<SpringBeanElement> getBeanElements() { |
| if (beanElements == null) { |
| beanElements = new ArrayList<SpringBeanElement>(); |
| for (String name : getBeanDefinitionNames()) { |
| BeanDefinition def = getBeanDefinition(name); |
| SpringBeanElement beanElement = new SpringBeanElement(name, def.getBeanClassName()); |
| beanElements.add(beanElement); |
| beanElement.setAbstractBean(def.isAbstract()); |
| beanElement.setFactoryBeanAttribute(def.getFactoryBeanName() != null); |
| beanElement.setFactoryMethodAttribute(def.getFactoryMethodName() != null); |
| beanElement.setParentAttribute(def.getParentName() != null); |
| beanElement.setInnerBean(beanElement.getId() == null); |
| |
| ConstructorArgumentValues args = def.getConstructorArgumentValues(); |
| for (Map.Entry<Integer, ValueHolder> e: args.getIndexedArgumentValues().entrySet()) { |
| ValueHolder holder = e.getValue(); |
| SpringConstructorArgElement arg = new SpringConstructorArgElement(holder.getType()); |
| arg.setIndex(e.getKey()); |
| beanElement.addCustructorArgs(arg); |
| } |
| |
| MutablePropertyValues values = def.getPropertyValues(); |
| for (PropertyValue p : values.getPropertyValueList()) { |
| SpringPropertyElement propertyElement = new SpringPropertyElement(p.getName()); |
| Object value = p.getValue(); |
| configurePropertyElement(propertyElement, value); |
| beanElement.getProperties().add(propertyElement); |
| } |
| } |
| } |
| return beanElements; |
| } |
| |
| public void configurePropertyElement(SpringPropertyElement propertyElement, Object value) { |
| if (value instanceof BeanReference) { |
| BeanReference beanRef = (BeanReference)value; |
| propertyElement.addRef(beanRef.getBeanName()); |
| } else if (value instanceof Collection) { |
| Collection collection = (Collection)value; |
| for (Object item : collection) { |
| configurePropertyElement(propertyElement, item); |
| } |
| } else if (value instanceof TypedStringValue) { |
| TypedStringValue stringValue = (TypedStringValue)value; |
| propertyElement.addValue(stringValue.getValue()); |
| } else { |
| if (value != null) { |
| propertyElement.addValue(value.toString()); |
| } |
| } |
| } |
| |
| public List<SpringSCAPropertyElement> getPropertyElements() { |
| return propertyElements; |
| } |
| |
| public List<SpringSCAServiceElement> getServiceElements() { |
| return serviceElements; |
| } |
| |
| public List<SpringSCAReferenceElement> getReferenceElements() { |
| return referenceElements; |
| } |
| |
| } |