001    package org.crsh.spring;
002    
003    import java.util.ArrayList;
004    import java.util.Collection;
005    import java.util.List;
006    
007    import org.crsh.plugin.CRaSHPlugin;
008    import org.crsh.plugin.ServiceLoaderDiscovery;
009    import org.springframework.beans.factory.BeanFactory;
010    import org.springframework.beans.factory.ListableBeanFactory;
011    
012    public class SpringPluginDiscovery extends ServiceLoaderDiscovery {
013    
014            private BeanFactory factory;
015    
016            public SpringPluginDiscovery(ClassLoader classLoader, BeanFactory factory)
017                    throws NullPointerException {
018                    super(classLoader);
019                    this.factory = factory;
020            }
021    
022            @SuppressWarnings("rawtypes")
023        @Override
024        public Iterable<CRaSHPlugin<?>> getPlugins() {
025                    List<CRaSHPlugin<?>> serviceAndSpringPlugins = new ArrayList<CRaSHPlugin<?>>();
026                    
027                    for (CRaSHPlugin<?> cRaSHPlugin : super.getPlugins()) {
028                    serviceAndSpringPlugins.add(cRaSHPlugin);
029            }
030                    
031                    if (factory instanceof ListableBeanFactory) {
032                Collection<CRaSHPlugin> springPlugins = ((ListableBeanFactory)factory)
033                .getBeansOfType(CRaSHPlugin.class).values();
034                            
035                            for (CRaSHPlugin cRaSHPlugin : springPlugins) {
036                        serviceAndSpringPlugins.add(cRaSHPlugin);
037                }
038                    }
039                    
040                    return serviceAndSpringPlugins;
041        }
042    
043    }