1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
|
20 | |
package org.apache.myfaces.cdi.view; |
21 | |
|
22 | |
|
23 | |
import javax.enterprise.context.spi.Contextual; |
24 | |
import javax.enterprise.context.spi.CreationalContext; |
25 | |
import javax.enterprise.inject.spi.BeanManager; |
26 | |
import javax.enterprise.inject.spi.PassivationCapable; |
27 | |
import java.io.Serializable; |
28 | |
import java.util.HashMap; |
29 | |
import java.util.Map; |
30 | |
import javax.enterprise.inject.spi.Bean; |
31 | |
import javax.faces.context.FacesContext; |
32 | |
import org.apache.myfaces.cdi.util.CDIUtils; |
33 | |
import org.apache.myfaces.cdi.util.ContextualInstanceInfo; |
34 | |
|
35 | |
|
36 | |
|
37 | |
|
38 | |
|
39 | |
|
40 | |
|
41 | |
public class ViewScopeContextualStorage implements Serializable |
42 | |
{ |
43 | |
private static final long serialVersionUID = 1L; |
44 | |
|
45 | |
private final Map<Object, ContextualInstanceInfo<?>> contextualInstances; |
46 | |
|
47 | |
private final Map<String, Object> nameBeanKeyMap; |
48 | |
|
49 | |
private transient BeanManager beanManager; |
50 | |
|
51 | |
private transient volatile boolean deactivated; |
52 | |
|
53 | |
|
54 | |
|
55 | |
|
56 | |
|
57 | |
|
58 | |
public ViewScopeContextualStorage(BeanManager beanManager) |
59 | 0 | { |
60 | 0 | this.beanManager = beanManager; |
61 | 0 | contextualInstances = new HashMap<Object, ContextualInstanceInfo<?>>(); |
62 | 0 | nameBeanKeyMap = new HashMap<String, Object>(); |
63 | 0 | deactivated = false; |
64 | 0 | } |
65 | |
|
66 | |
|
67 | |
|
68 | |
|
69 | |
public Map<Object, ContextualInstanceInfo<?>> getStorage() |
70 | |
{ |
71 | 0 | return contextualInstances; |
72 | |
} |
73 | |
|
74 | |
public Map<String, Object> getNameBeanKeyMap() |
75 | |
{ |
76 | 0 | return nameBeanKeyMap; |
77 | |
} |
78 | |
|
79 | |
|
80 | |
|
81 | |
|
82 | |
|
83 | |
|
84 | |
|
85 | |
|
86 | |
public <T> T createContextualInstance(Contextual<T> bean, CreationalContext<T> creationalContext) |
87 | |
{ |
88 | 0 | Object beanKey = getBeanKey(bean); |
89 | |
|
90 | |
|
91 | 0 | ContextualInstanceInfo<T> instanceInfo = new ContextualInstanceInfo<T>(); |
92 | 0 | instanceInfo.setCreationalContext(creationalContext); |
93 | 0 | instanceInfo.setContextualInstance(bean.create(creationalContext)); |
94 | |
|
95 | 0 | contextualInstances.put(beanKey, instanceInfo); |
96 | 0 | if(bean instanceof Bean) |
97 | |
{ |
98 | 0 | String name = ((Bean<T>) bean).getName(); |
99 | 0 | if (name != null) |
100 | |
{ |
101 | 0 | nameBeanKeyMap.put(name, beanKey); |
102 | |
} |
103 | |
} |
104 | |
|
105 | 0 | return instanceInfo.getContextualInstance(); |
106 | |
} |
107 | |
|
108 | |
|
109 | |
|
110 | |
|
111 | |
|
112 | |
|
113 | |
|
114 | |
public <T> Object getBeanKey(Contextual<T> bean) |
115 | |
{ |
116 | 0 | return ((PassivationCapable) bean).getId(); |
117 | |
} |
118 | |
|
119 | |
|
120 | |
|
121 | |
|
122 | |
|
123 | |
public Contextual<?> getBean(FacesContext context, Object beanKey) |
124 | |
{ |
125 | 0 | if (beanManager == null) |
126 | |
{ |
127 | 0 | beanManager = CDIUtils.getBeanManager(context.getExternalContext()); |
128 | |
} |
129 | 0 | return beanManager.getPassivationCapableBean((String) beanKey); |
130 | |
} |
131 | |
|
132 | |
public boolean isActive() |
133 | |
{ |
134 | 0 | return !deactivated; |
135 | |
} |
136 | |
|
137 | |
public void deactivate() |
138 | |
{ |
139 | 0 | deactivated = true; |
140 | 0 | } |
141 | |
} |