001package org.crsh.spring;
002
003import java.util.ArrayList;
004import java.util.Collection;
005import java.util.List;
006
007import org.crsh.plugin.CRaSHPlugin;
008import org.crsh.plugin.ServiceLoaderDiscovery;
009import org.springframework.beans.factory.BeanFactory;
010import org.springframework.beans.factory.ListableBeanFactory;
011
012public 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}