/** * */ package vnet.sms.common.shell.springshell.internal.plugin; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import vnet.sms.common.shell.springshell.plugin.PluginProvider; import vnet.sms.common.shell.springshell.plugin.PluginProvidersRegistry; /** * @author obergner * */ public class ApplicationContextPluginProvidersRegistry implements PluginProvidersRegistry, ApplicationContextAware { private static final AnnotationAwareOrderComparator ANNOTATION_ORDER_COMPARATOR = new AnnotationAwareOrderComparator(); private ApplicationContext applicationContext; /** * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) */ @Override public void setApplicationContext( final ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * @see vnet.sms.common.shell.springshell.plugin.PluginProvidersRegistry#highestPriorityProviderOfType(java.lang.Class) */ @Override public <T extends PluginProvider> T highestPriorityProviderOfType( final Class<T> t) { final Map<String, T> providers = BeanFactoryUtils .beansOfTypeIncludingAncestors(this.applicationContext, t); final List<T> sortedProviders = new ArrayList<T>(providers.values()); Collections.sort(sortedProviders, ANNOTATION_ORDER_COMPARATOR); return sortedProviders.get(0); } }