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 }