001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.xbean.spring.util;
018
019 import org.springframework.beans.BeansException;
020 import org.springframework.beans.MutablePropertyValues;
021 import org.springframework.beans.PropertyValue;
022 import org.springframework.beans.factory.config.BeanDefinition;
023 import org.springframework.beans.factory.config.BeanDefinitionHolder;
024 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
025 import org.springframework.beans.factory.config.ConstructorArgumentValues;
026 import org.springframework.beans.factory.config.RuntimeBeanReference;
027
028 import java.util.Collection;
029 import java.util.Iterator;
030 import java.util.List;
031 import java.util.Map;
032
033 /**
034 * Default do nothing implementation of SpringVisitor.
035 * @author Dain Sundstrom
036 * @version $Id$
037 * @since 2.0
038 */
039 public abstract class AbstractSpringVisitor implements SpringVisitor {
040 public void visitBeanFactory(ConfigurableListableBeanFactory beanRegistry, Object data) throws BeansException {
041 String[] beanNames = beanRegistry.getBeanDefinitionNames();
042 for (int i = 0; i < beanNames.length; i++) {
043 String beanName = beanNames[i];
044 visitBeanDefinition(beanName, beanRegistry.getBeanDefinition(beanName), data);
045 }
046 }
047
048 public void visitBeanDefinitionHolder(BeanDefinitionHolder beanDefinitionHolder, Object data) throws BeansException {
049 visitBeanDefinition(beanDefinitionHolder.getBeanName(), beanDefinitionHolder.getBeanDefinition(), data);
050 }
051
052 public void visitBeanDefinition(String beanName, BeanDefinition beanDefinition, Object data) throws BeansException {
053 visitBeanDefinition(beanDefinition, data);
054 }
055
056 public void visitBeanDefinition(BeanDefinition beanDefinition, Object data) throws BeansException {
057 visitConstructorArgumentValues(beanDefinition.getConstructorArgumentValues(), data);
058 visitMutablePropertyValues(beanDefinition.getPropertyValues(), data);
059 }
060
061 public void visitMutablePropertyValues(MutablePropertyValues propertyValues, Object data) throws BeansException {
062 PropertyValue[] values = propertyValues.getPropertyValues();
063 for (int i = 0; i < values.length; i++) {
064 visitPropertyValue(values[i], data);
065 }
066 }
067
068 public void visitConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues, Object data) throws BeansException {
069 Map indexedArgumentValues = constructorArgumentValues.getIndexedArgumentValues();
070 for (Iterator iterator = indexedArgumentValues.values().iterator(); iterator.hasNext();) {
071 visitConstructorArgumentValue((ConstructorArgumentValues.ValueHolder) iterator.next(), data);
072 }
073 List genericArgumentValues = constructorArgumentValues.getGenericArgumentValues();
074 for (Iterator iterator = genericArgumentValues.iterator(); iterator.hasNext();) {
075 visitConstructorArgumentValue((ConstructorArgumentValues.ValueHolder) iterator.next(), data);
076 }
077 }
078
079 public void visitConstructorArgumentValue(ConstructorArgumentValues.ValueHolder valueHolder, Object data) throws BeansException {
080 visitNext(valueHolder.getValue(), data);
081 }
082
083 public void visitPropertyValue(PropertyValue propertyValue, Object data) throws BeansException {
084 visitNext(propertyValue.getValue(), data);
085 }
086
087 public void visitRuntimeBeanReference(RuntimeBeanReference beanReference, Object data) throws BeansException {
088 }
089
090 public void visitCollection(Collection collection, Object data) throws BeansException {
091 for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
092 visitNext(iterator.next(), data);
093 }
094 }
095
096 public void visitMap(Map map, Object data) throws BeansException {
097 for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
098 Map.Entry entry = (Map.Entry) iterator.next();
099 visitNext(entry.getKey(), data);
100 visitNext(entry.getValue(), data);
101 }
102 }
103
104 public void visitObject(Object value, Object data) throws BeansException {
105 }
106
107 protected void visitNext(Object value, Object data) throws BeansException {
108 if (value == null) {
109 return;
110 }
111
112 if (value instanceof ConfigurableListableBeanFactory) {
113 visitBeanFactory((ConfigurableListableBeanFactory) value, data);
114 } else if (value instanceof BeanDefinitionHolder) {
115 visitBeanDefinitionHolder((BeanDefinitionHolder) value, data);
116 } else if (value instanceof BeanDefinition) {
117 visitBeanDefinition((BeanDefinition) value, data);
118 } else if (value instanceof ConstructorArgumentValues) {
119 visitConstructorArgumentValues((ConstructorArgumentValues) value, data);
120 } else if (value instanceof ConstructorArgumentValues.ValueHolder) {
121 visitConstructorArgumentValue((ConstructorArgumentValues.ValueHolder) value, data);
122 } else if (value instanceof MutablePropertyValues) {
123 visitMutablePropertyValues((MutablePropertyValues) value, data);
124 } else if (value instanceof PropertyValue) {
125 visitPropertyValue((PropertyValue) value, data);
126 } else if (value instanceof RuntimeBeanReference) {
127 visitRuntimeBeanReference((RuntimeBeanReference) value, data);
128 } else if (value instanceof Map) {
129 visitMap((Map) value, data);
130 } else if (value instanceof Collection) {
131 visitCollection((Collection) value, data);
132 } else {
133 visitObject(value, data);
134 }
135 }
136
137 }