1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.bridges.jsf;
18
19 import javax.faces.FactoryFinder;
20 import javax.faces.application.Application;
21 import javax.faces.application.ApplicationFactory;
22 import javax.faces.application.FacesMessage;
23 import javax.faces.component.UIViewRoot;
24 import javax.faces.context.ExternalContext;
25 import javax.faces.context.FacesContext;
26 import javax.faces.context.ResponseStream;
27 import javax.faces.context.ResponseWriter;
28 import javax.faces.render.RenderKit;
29 import javax.faces.render.RenderKitFactory;
30 import javax.servlet.ServletContext;
31 import javax.servlet.ServletRequest;
32 import javax.servlet.ServletResponse;
33 import java.util.*;
34
35 /***
36 * @author Apache MyFaces team
37 */
38 public class ServletFacesContextImpl
39 extends FacesContext {
40
41
42 private List _messageClientIds = null;
43 private List _messages = null;
44 private Application _application;
45 private ServletExternalContextImpl _externalContext;
46 private ResponseStream _responseStream = null;
47 private ResponseWriter _responseWriter = null;
48 private FacesMessage.Severity _maximumSeverity = null;
49 private UIViewRoot _viewRoot;
50 private boolean _renderResponse = false;
51 private boolean _responseComplete = false;
52 private RenderKitFactory _renderKitFactory;
53 private boolean _released = false;
54
55
56
57 public ServletFacesContextImpl(ServletContext servletContext,
58 ServletRequest servletRequest,
59 ServletResponse servletResponse)
60 {
61 this(new ServletExternalContextImpl(servletContext,
62 servletRequest,
63 servletResponse));
64 }
65
66 private ServletFacesContextImpl(ServletExternalContextImpl externalContext)
67 {
68 _application = ((ApplicationFactory)FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY))
69 .getApplication();
70 _renderKitFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
71 _externalContext = externalContext;
72 FacesContext.setCurrentInstance(this);
73 }
74
75
76
77 public ExternalContext getExternalContext()
78 {
79 if (_released) {
80 throw new IllegalStateException("FacesContext already released");
81 }
82 return (ExternalContext)_externalContext;
83 }
84
85 public FacesMessage.Severity getMaximumSeverity()
86 {
87 if (_released) {
88 throw new IllegalStateException("FacesContext already released");
89 }
90 return _maximumSeverity;
91 }
92
93 public Iterator getMessages()
94 {
95 if (_released) {
96 throw new IllegalStateException("FacesContext already released");
97 }
98 return (_messages != null) ? _messages.iterator() : Collections.EMPTY_LIST.iterator();
99 }
100
101 public Application getApplication()
102 {
103 if (_released) {
104 throw new IllegalStateException("FacesContext already released");
105 }
106
107 return _application;
108 }
109
110 public Iterator getClientIdsWithMessages()
111 {
112 if (_released) {
113 throw new IllegalStateException("FacesContext already released");
114 }
115 if (_messages == null || _messages.isEmpty())
116 {
117 return NullIterator.instance();
118 }
119
120 final Set uniqueClientIds = new LinkedHashSet(_messageClientIds);
121 return uniqueClientIds.iterator();
122 }
123
124 public Iterator getMessages(String clientId)
125 {
126 if (_released) {
127 throw new IllegalStateException("FacesContext already released");
128 }
129 if (_messages == null)
130 {
131 return NullIterator.instance();
132 }
133
134 List lst = new ArrayList();
135 for (int i = 0; i < _messages.size(); i++)
136 {
137 Object savedClientId = _messageClientIds.get(i);
138 if (clientId == null)
139 {
140 if (savedClientId == null) lst.add(_messages.get(i));
141 }
142 else
143 {
144 if (clientId.equals(savedClientId)) lst.add(_messages.get(i));
145 }
146 }
147 return lst.iterator();
148 }
149
150 public RenderKit getRenderKit()
151 {
152 if (getViewRoot() == null)
153 {
154 return null;
155 }
156
157 String renderKitId = getViewRoot().getRenderKitId();
158
159 if (renderKitId == null)
160 {
161 return null;
162 }
163
164 return _renderKitFactory.getRenderKit(this, renderKitId);
165 }
166
167 public boolean getRenderResponse()
168 {
169 if (_released) {
170 throw new IllegalStateException("FacesContext already released");
171 }
172 return _renderResponse;
173 }
174
175 public boolean getResponseComplete()
176 {
177 if (_released) {
178 throw new IllegalStateException("FacesContext already released");
179 }
180 return _responseComplete;
181 }
182
183 public void setResponseStream(ResponseStream responseStream)
184 {
185 if (_released) {
186 throw new IllegalStateException("FacesContext already released");
187 }
188 if (responseStream == null)
189 {
190 throw new NullPointerException("responseStream");
191 }
192 _responseStream = responseStream;
193 }
194
195 public ResponseStream getResponseStream()
196 {
197 if (_released) {
198 throw new IllegalStateException("FacesContext already released");
199 }
200 return _responseStream;
201 }
202
203 public void setResponseWriter(ResponseWriter responseWriter)
204 {
205 if (_released) {
206 throw new IllegalStateException("FacesContext already released");
207 }
208 if (responseWriter == null)
209 {
210 throw new NullPointerException("responseWriter");
211 }
212 _responseWriter = responseWriter;
213 }
214
215 public ResponseWriter getResponseWriter()
216 {
217 if (_released) {
218 throw new IllegalStateException("FacesContext already released");
219 }
220 return _responseWriter;
221 }
222
223 public void setViewRoot(UIViewRoot viewRoot)
224 {
225 if (_released) {
226 throw new IllegalStateException("FacesContext already released");
227 }
228 if (viewRoot == null)
229 {
230 throw new NullPointerException("viewRoot");
231 }
232 _viewRoot = viewRoot;
233 }
234
235 public UIViewRoot getViewRoot()
236 {
237 if (_released) {
238 throw new IllegalStateException("FacesContext already released");
239 }
240 return _viewRoot;
241 }
242
243 public void addMessage(String clientId, FacesMessage message)
244 {
245 if (_released) {
246 throw new IllegalStateException("FacesContext already released");
247 }
248 if (message == null)
249 {
250 throw new NullPointerException("message");
251 }
252
253 if (_messages == null)
254 {
255 _messages = new ArrayList();
256 _messageClientIds = new ArrayList();
257 }
258 _messages.add(message);
259 _messageClientIds.add((clientId != null) ? clientId : null);
260 FacesMessage.Severity serSeverity = message.getSeverity();
261 if (serSeverity != null) {
262 if (_maximumSeverity == null)
263 {
264 _maximumSeverity = serSeverity;
265 }
266 else if (serSeverity.compareTo(_maximumSeverity) > 0)
267 {
268 _maximumSeverity = serSeverity;
269 }
270 }
271 }
272
273 public boolean isReleased()
274 {
275 return _released;
276 }
277
278 public void release()
279 {
280 if (_released) {
281 throw new IllegalStateException("FacesContext already released");
282 }
283 if (_externalContext != null)
284 {
285 _externalContext.release();
286 _externalContext = null;
287 }
288
289 _messageClientIds = null;
290 _messages = null;
291 _application = null;
292 _responseStream = null;
293 _responseWriter = null;
294 _viewRoot = null;
295 _maximumSeverity = null;
296
297 _released = true;
298 FacesContext.setCurrentInstance(null);
299 }
300
301 public void renderResponse()
302 {
303 if (_released) {
304 throw new IllegalStateException("FacesContext already released");
305 }
306 _renderResponse = true;
307 }
308
309 public void responseComplete()
310 {
311 if (_released) {
312 throw new IllegalStateException("FacesContext already released");
313 }
314 _responseComplete = true;
315 }
316
317
318
319 public void setExternalContext(ServletExternalContextImpl extContext)
320 {
321 _externalContext = extContext;
322 FacesContext.setCurrentInstance(this);
323 }
324 }