View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.cdi.util;
20  
21  import java.lang.annotation.Annotation;
22  import java.lang.reflect.Type;
23  import java.util.Collections;
24  import java.util.Set;
25  import javax.enterprise.context.ContextNotActiveException;
26  import javax.enterprise.context.SessionScoped;
27  import javax.enterprise.context.spi.Context;
28  
29  import javax.enterprise.context.spi.CreationalContext;
30  import javax.enterprise.inject.spi.Bean;
31  import javax.enterprise.inject.spi.BeanManager;
32  import javax.faces.context.ExternalContext;
33  import javax.faces.view.ViewScoped;
34  import org.apache.myfaces.webapp.AbstractFacesInitializer;
35  
36  /**
37   * Lookup code for Contextual Instances.
38   */
39  public class CDIUtils
40  {
41      public static BeanManager getBeanManager(ExternalContext externalContext)
42      {
43          return (BeanManager) externalContext.getApplicationMap().get(
44              AbstractFacesInitializer.CDI_BEAN_MANAGER_INSTANCE);
45      }
46  
47  
48  
49      public static <T> T lookup(BeanManager bm, Class<T> clazz)
50      {
51          Set<Bean<?>> beans = bm.getBeans(clazz);
52          return resolveInstance(bm, beans, clazz);
53      }
54  
55      public static Object lookup(BeanManager bm, String name)
56      {
57          Set<Bean<?>> beans = bm.getBeans(name);
58          return resolveInstance(bm, beans, Object.class);
59      }
60  
61      private static <T> T resolveInstance(BeanManager bm, Set<Bean<?>> beans, Type type)
62      {
63          Bean<?> bean = bm.resolve(beans);
64          CreationalContext<?> cc = bm.createCreationalContext(bean);
65          T dao = (T) bm.getReference(bean, type, cc);
66          return dao;
67  
68      }
69      
70      @SuppressWarnings("unchecked")
71      public static <T> Bean<T> resolve(BeanManager beanManager, Class<T> beanClass, Annotation... qualifiers)
72      {
73          Set<Bean<?>> beans = beanManager.getBeans(beanClass, qualifiers);
74  
75          for (Bean<?> bean : beans)
76          {
77              if (bean.getBeanClass() == beanClass)
78              {
79                  return (Bean<T>) beanManager.resolve(Collections.<Bean<?>>singleton(bean));
80              }
81          }
82  
83          return (Bean<T>) beanManager.resolve(beans);
84      }
85  
86      @SuppressWarnings("unchecked")
87      public static <T> Bean<T> resolve(BeanManager beanManager, Type type, Annotation... qualifiers)
88      {
89          Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers);
90  
91          return (Bean<T>) beanManager.resolve(beans);
92      }
93  
94      public static <T> T getInstance(BeanManager beanManager, Class<T> beanClass, 
95              boolean create, Annotation... qualifiers)
96      {
97          try
98          {
99              Bean<T> bean = resolve(beanManager, beanClass, qualifiers);
100             return (bean != null) ? getInstance(beanManager, bean, create) : null;
101         }
102         catch (ContextNotActiveException e)
103         {
104             return null;
105         }
106     }
107 
108     public static <T> T getInstance(BeanManager beanManager, Type type, 
109     boolean create, Annotation... qualifiers)
110     {
111         try
112         {
113             Bean<T> bean = resolve(beanManager, type, qualifiers);
114             return (bean != null) ? getInstance(beanManager, bean, create) : null;
115         }
116         catch (ContextNotActiveException e)
117         {
118             return null;
119         }
120     }
121 
122     public static <T> T getInstance(BeanManager beanManager, Bean<T> bean, boolean create)
123     {
124         Context context = beanManager.getContext(bean.getScope());
125 
126         if (create)
127         {
128             return context.get(bean, beanManager.createCreationalContext(bean));
129         }
130         else
131         {
132             return context.get(bean);
133         }
134     }
135     
136     public static boolean isSessionScopeActive(BeanManager beanManager)
137     {
138         try 
139         {
140             Context ctx = beanManager.getContext(SessionScoped.class);
141             return ctx != null;
142         }
143         catch (ContextNotActiveException ex)
144         {
145             //No op
146         }
147         catch (Exception ex)
148         {
149             // Sometimes on startup time, since there is no active request context, trying to grab session scope
150             // throws NullPointerException.
151             //No op
152         }
153         return false;
154     }
155     
156     public static boolean isViewScopeActive(BeanManager beanManager)
157     {
158         try 
159         {
160             Context ctx = beanManager.getContext(ViewScoped.class);
161             return ctx != null;
162         }
163         catch (ContextNotActiveException ex)
164         {
165             //No op
166         }
167         catch (Exception ex)
168         {
169             // Sometimes on startup time, since there is no active request context, trying to grab session scope
170             // throws NullPointerException.
171             //No op
172         }
173         return false;
174     }
175         
176 }