001    package org.granite.tide.cdi;
002    
003    import java.lang.annotation.Annotation;
004    import java.util.HashSet;
005    import java.util.Set;
006    
007    import javax.enterprise.context.spi.CreationalContext;
008    import javax.enterprise.inject.spi.Bean;
009    import javax.enterprise.inject.spi.BeanManager;
010    import javax.servlet.ServletContext;
011    
012    import org.granite.cdi.CDIUtils;
013    import org.granite.config.ConfigProvider;
014    import org.granite.messaging.service.ServiceFactory;
015    
016    
017    public class CDIConfigProvider implements ConfigProvider {
018            
019            protected BeanManager beanManager;
020    
021            public CDIConfigProvider(ServletContext servletContext) {
022                    beanManager = CDIUtils.lookupBeanManager(servletContext);
023            }
024    
025            public Boolean useTide() {
026                    return true;
027            }
028    
029            public String getType() {
030                    return "cdi";
031            }
032    
033            public Class<? extends ServiceFactory> getFactoryClass() {
034                    return CDIServiceFactory.class;
035            }
036    
037            @SuppressWarnings("unchecked")
038            public <T> T findInstance(Class<T> type) {
039                    Set<Bean<?>> beans = beanManager.getBeans(type);
040                    if (beans.size() == 1) {
041                            Bean<?> bean = beans.iterator().next();
042                            CreationalContext<?> cc = beanManager.createCreationalContext(bean);
043                            return (T)beanManager.getReference(bean, type, cc);
044                    }
045                    return null;
046            }
047    
048            @SuppressWarnings("unchecked")
049            public <T> Set<T> findInstances(Class<T> type) {
050                    Set<Bean<?>> beans = beanManager.getBeans(type);
051                    Set<T> instances = new HashSet<T>(beans.size());
052                    for (Bean<?> bean : beans) {
053                            CreationalContext<?> cc = beanManager.createCreationalContext(bean);
054                            instances.add((T)beanManager.getReference(bean, type, cc));
055                    }
056                    return instances;
057            }
058            
059            public Class<?>[] getTideInterfaces() {
060                    return new Class<?>[] { Identity.class };
061            }
062    
063            @SuppressWarnings("unchecked")
064            public Class<? extends Annotation>[] getTideAnnotations() {
065                    return new Class[0];
066            }
067    
068    }