1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.orchestra.lib.jsf;
20
21 import java.util.LinkedList;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.concurrent.atomic.AtomicLong;
25
26 import javax.faces.FacesException;
27 import javax.faces.context.ExternalContext;
28 import javax.faces.context.FacesContext;
29 import javax.portlet.ActionResponse;
30 import javax.portlet.PortletRequest;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
35 import org.apache.myfaces.orchestra.requestParameterProvider.RequestParameterServletFilter;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class PortletOrchestraFacesContextFactory
52 {
53 private final Log log = LogFactory.getLog(PortletOrchestraFacesContextFactory.class);
54
55 private final AtomicLong _count;
56
57 private final static String REQUEST_CONTEXT_PARAM = "requestContext";
58
59 private final static String CONVERSATION_CONTEXT_PARAM = "conversationContext";
60
61 public final static String REQUEST_HANDLERS = "org.apache.myfaces.orchestra.REQUEST_HANDLERS";
62
63
64
65
66 public final static String PORTLET_LIFECYCLE_PHASE = "javax.portlet.orchestra.phase";
67
68
69 public PortletOrchestraFacesContextFactory()
70 {
71 this._count = new AtomicLong(1);
72 }
73
74
75
76
77
78
79
80
81
82 protected String _getNextToken()
83 {
84 long nextToken = _count.incrementAndGet();
85 return Integer.toString(hashCode())+nextToken;
86 }
87
88 public FacesContext getFacesContext(final FacesContext facesContext, Object context,
89 Object request, Object response) throws FacesException
90 {
91 ExternalContext externalContext = facesContext.getExternalContext();
92 List handlers = null;
93 boolean init = false;
94 String nextToken = null;
95
96 Map requestMap = externalContext.getRequestMap();
97
98 RequestType type = ExternalContextUtils.getRequestType(context, request);
99
100 if (RequestType.RENDER.equals(type))
101 {
102 PortletRequest portletRequest = (PortletRequest) request;
103 nextToken = portletRequest.getParameter(CONVERSATION_CONTEXT_PARAM);
104 if (nextToken == null)
105 {
106 nextToken = portletRequest.getParameter(REQUEST_CONTEXT_PARAM);
107 }
108 if (nextToken != null)
109 {
110
111
112 handlers = (List) externalContext.getApplicationMap().remove(REQUEST_HANDLERS+nextToken);
113 }
114 }
115
116
117
118
119
120
121
122
123 if (RequestType.RENDER.equals(type))
124 {
125 requestMap.put(PORTLET_LIFECYCLE_PHASE, "RENDER_PHASE");
126 }
127 else if (RequestType.ACTION.equals(type))
128 {
129 requestMap.put(PORTLET_LIFECYCLE_PHASE, "ACTION_PHASE");
130 }
131 else if (RequestType.EVENT.equals(type))
132 {
133 requestMap.put(PORTLET_LIFECYCLE_PHASE, "EVENT_PHASE");
134 }
135 else if (RequestType.RESOURCE.equals(type))
136 {
137 requestMap.put(PORTLET_LIFECYCLE_PHASE, "RESOURCE_PHASE");
138 }
139
140 if (handlers == null)
141 {
142
143 handlers = new LinkedList();
144 handlers.add(new FrameworkAdapterRequestHandler());
145
146
147
148
149 handlers.add(new ConversationManagerRequestHandler());
150 handlers.add(new DataSourceLeakRequestHandler());
151
152 Map reqScope = facesContext.getExternalContext().getRequestMap();
153 handlers.addAll(ConfigUtils.getRequestHandlers(reqScope));
154
155 if (RequestType.ACTION.equals(ExternalContextUtils.getRequestType(context, request)))
156 {
157 ActionResponse actionResponse = (ActionResponse) response;
158
159 PortletRequest portletRequest = (PortletRequest) request;
160 nextToken = portletRequest.getParameter(CONVERSATION_CONTEXT_PARAM);
161 if (nextToken == null)
162 {
163 nextToken = _getNextToken();
164 actionResponse.setRenderParameter(REQUEST_CONTEXT_PARAM, nextToken);
165 }
166 if (nextToken != null)
167 {
168
169 externalContext.getApplicationMap().put(REQUEST_HANDLERS+nextToken, handlers);
170 }
171 }
172 init = true;
173 }
174
175
176
177 setRequestParameterResponseWrappedMode(context, request);
178
179 final RequestHandler contextLockHandler = new ContextLockRequestHandler();
180
181
182 return new _PortletFacesContextWrapper(facesContext, true,
183 init, nextToken, handlers, contextLockHandler);
184 }
185
186 private void setRequestParameterResponseWrappedMode(Object context, Object request)
187 {
188 FrameworkAdapter nonJsfFrameworkAdapter = FrameworkAdapter.getCurrentInstance();
189 if (nonJsfFrameworkAdapter != null)
190 {
191 if (!Boolean.TRUE.equals(nonJsfFrameworkAdapter.getRequestAttribute(
192 RequestParameterServletFilter.REQUEST_PARAM_FILTER_CALLED)))
193 {
194 nonJsfFrameworkAdapter.setRequestAttribute(
195 RequestParameterServletFilter.REQUEST_PARAM_RESPONSE_WRAPPED, Boolean.TRUE);
196 }
197 }
198 else if (!getBooleanRequestValue(request,
199 RequestParameterServletFilter.REQUEST_PARAM_FILTER_CALLED))
200 {
201 setBooleanRequestValue(request,
202 RequestParameterServletFilter.REQUEST_PARAM_RESPONSE_WRAPPED, Boolean.TRUE);
203 }
204 }
205
206 private boolean getBooleanRequestValue(Object request, String key)
207 {
208 PortletRequest portletRequest = (PortletRequest) request;
209
210 return Boolean.TRUE.equals(portletRequest.getAttribute(key));
211 }
212
213 private void setBooleanRequestValue(Object request, String key, Boolean value)
214 {
215 PortletRequest portletRequest = (PortletRequest) request;
216
217 portletRequest.setAttribute(key,value);
218 }
219 }