001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.spring.aop;
016    
017    import com.liferay.portal.kernel.spring.util.SpringFactoryUtil;
018    
019    import java.util.ArrayList;
020    import java.util.List;
021    
022    import org.springframework.beans.factory.config.BeanDefinition;
023    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
024    import org.springframework.beans.factory.config.ConstructorArgumentValues;
025    import org.springframework.beans.factory.config.TypedStringValue;
026    
027    /**
028     * @author Shuyang Zhou
029     */
030    public class ChainableMethodAdviceInjectorCollector {
031    
032            public static final String BEAN_NAME =
033                    ChainableMethodAdviceInjectorCollector.class.getName();
034    
035            public static void collect(
036                    ConfigurableListableBeanFactory configurableListableBeanFactory) {
037    
038                    ChainableMethodAdviceInjectorCollector
039                            chainableMethodAdviceInjectorCollector =
040                                    new ChainableMethodAdviceInjectorCollector();
041    
042                    String[] beanNames =
043                            configurableListableBeanFactory.getBeanDefinitionNames();
044    
045                    for (String beanName : beanNames) {
046                            if (!beanName.contains(SpringFactoryUtil.class.getName())) {
047                                    continue;
048                            }
049    
050                            BeanDefinition beanDefinition =
051                                    configurableListableBeanFactory.getBeanDefinition(beanName);
052    
053                            ConstructorArgumentValues constructorArgumentValues =
054                                    beanDefinition.getConstructorArgumentValues();
055    
056                            List<ConstructorArgumentValues.ValueHolder> valueHolders =
057                                    constructorArgumentValues.getGenericArgumentValues();
058    
059                            if (valueHolders.isEmpty()) {
060                                    continue;
061                            }
062    
063                            ConstructorArgumentValues.ValueHolder valueHolder =
064                                    valueHolders.get(0);
065    
066                            TypedStringValue typedStringValue =
067                                    (TypedStringValue)valueHolder.getValue();
068    
069                            String className = typedStringValue.getValue();
070    
071                            if (className.contains(
072                                            ChainableMethodAdviceInjector.class.getSimpleName())) {
073    
074                                    chainableMethodAdviceInjectorCollector.addBeanName(beanName);
075                            }
076                    }
077    
078                    if (!chainableMethodAdviceInjectorCollector.hasBeanNames()) {
079                            configurableListableBeanFactory.registerSingleton(
080                                    BEAN_NAME, chainableMethodAdviceInjectorCollector);
081                    }
082            }
083    
084            public List<String> getBeanNames() {
085                    return _beanNames;
086            }
087    
088            protected void addBeanName(String beanName) {
089                    _beanNames.add(beanName);
090            }
091    
092            protected boolean hasBeanNames() {
093                    return _beanNames.isEmpty();
094            }
095    
096            private ChainableMethodAdviceInjectorCollector() {
097            }
098    
099            private List<String> _beanNames = new ArrayList<String>();
100    
101    }