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 }