1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 package fr.paris.lutece.plugins.jsr168.pluto;
50
51 import fr.paris.lutece.plugins.jsr168.pluto.core.PortletURLProviderImpl;
52
53 import org.apache.pluto.PortletContainer;
54 import org.apache.pluto.PortletContainerServices;
55 import org.apache.pluto.core.InternalActionResponse;
56 import org.apache.pluto.factory.PortletObjectAccess;
57 import org.apache.pluto.invoker.PortletInvoker;
58 import org.apache.pluto.invoker.PortletInvokerAccess;
59 import org.apache.pluto.om.window.PortletWindow;
60 import org.apache.pluto.portalImpl.om.window.impl.PortletWindowImpl;
61 import org.apache.pluto.services.PortletContainerEnvironment;
62 import org.apache.pluto.services.information.InformationProviderAccess;
63 import org.apache.pluto.services.log.LogService;
64 import org.apache.pluto.services.log.Logger;
65
66 import java.io.IOException;
67
68 import java.util.Map;
69 import java.util.Properties;
70
71 import javax.portlet.ActionRequest;
72 import javax.portlet.ActionResponse;
73 import javax.portlet.PortletException;
74 import javax.portlet.RenderRequest;
75 import javax.portlet.RenderResponse;
76
77 import javax.servlet.ServletConfig;
78 import javax.servlet.http.HttpServletRequest;
79 import javax.servlet.http.HttpServletResponse;
80 import javax.servlet.http.HttpServletResponseWrapper;
81
82
83
84
85
86
87
88
89
90 public class PortletContainerImpl implements PortletContainer
91 {
92 private static String CONTAINER_SUPPORTS_BUFFERING = "portletcontainer.supportsBuffering";
93 private String uniqueContainerName;
94 private boolean initialized;
95 private boolean supportsBuffering;
96 private Logger log = null;
97
98
99
100
101 public void init( String uniqueContainerName, ServletConfig servletConfig, PortletContainerEnvironment environment,
102 Properties properties )
103 {
104 this.uniqueContainerName = uniqueContainerName;
105 PortletContainerServices.createReference( uniqueContainerName, environment );
106 initialized = true;
107
108
109
110 log = ( (LogService) environment.getContainerService( LogService.class ) ).getLogger( getClass( ) );
111
112 Boolean b = (Boolean) properties.get( CONTAINER_SUPPORTS_BUFFERING );
113
114 if ( b == null )
115 {
116 log.warn( "org.apache.pluto.PortletContainerImpl#init(): " + "Couldn't retrieve parameter \"" +
117 CONTAINER_SUPPORTS_BUFFERING + "\" from" +
118 "passed properties object. Falling back to default value \"FALSE\"" );
119 supportsBuffering = false;
120 }
121 else
122 {
123 supportsBuffering = b.booleanValue( );
124 }
125 }
126
127
128
129
130 public void shutdown( )
131 {
132 PortletContainerServices.destroyReference( uniqueContainerName );
133 }
134
135
136
137
138 public void renderPortlet( PortletWindow portletWindow, HttpServletRequest servletRequest,
139 HttpServletResponse servletResponse ) throws PortletException, IOException
140 {
141 PortletContainerServices.prepare( uniqueContainerName );
142
143 PortletInvoker invoker = null;
144
145 if ( log.isDebugEnabled( ) )
146 {
147 log.debug( "PortletContainerImpl.portletService(" + portletWindow.getId( ) + ") called." );
148 }
149
150 try
151 {
152 RenderRequest renderRequest = PortletObjectAccess.getRenderRequest( portletWindow, servletRequest,
153 servletResponse );
154
155 RenderResponse renderResponse = PortletObjectAccess.getRenderResponse( portletWindow, servletRequest,
156 servletResponse, supportsBuffering );
157
158 invoker = PortletInvokerAccess.getPortletInvoker( portletWindow.getPortletEntity( ).getPortletDefinition( ) );
159 invoker.render( renderRequest, renderResponse );
160
161 ( (PortletWindowImpl) portletWindow ).saveValues( );
162 }
163 catch ( PortletException e )
164 {
165 ( (PortletWindowImpl) portletWindow ).restoreValues( );
166 throw e;
167 }
168 catch ( IOException e )
169 {
170 ( (PortletWindowImpl) portletWindow ).restoreValues( );
171 throw e;
172 }
173 catch ( RuntimeException e )
174 {
175 ( (PortletWindowImpl) portletWindow ).restoreValues( );
176 throw e;
177 }
178 finally
179 {
180 PortletInvokerAccess.releasePortletInvoker( invoker );
181 PortletContainerServices.release( );
182 }
183 }
184
185
186
187
188 public void processPortletAction( final PortletWindow portletWindow, final HttpServletRequest servletRequest,
189 final HttpServletResponse servletResponse ) throws PortletException, IOException
190 {
191 PortletContainerServices.prepare( uniqueContainerName );
192
193 PortletInvoker invoker = null;
194
195 if ( log.isDebugEnabled( ) )
196 {
197 log.debug( "PortletContainerImpl.performPortletAction(" + portletWindow.getId( ) + ") called." );
198 }
199
200 InternalActionResponse innerActionResponse = null;
201 ActionRequest actionRequest = null;
202
203 try
204 {
205
206 actionRequest = PortletObjectAccess.getActionRequest( portletWindow, servletRequest, servletResponse );
207
208 ActionResponse actionResponse = PortletObjectAccess.getActionResponse( portletWindow, servletRequest,
209 servletResponse );
210
211 invoker = PortletInvokerAccess.getPortletInvoker( portletWindow.getPortletEntity( ).getPortletDefinition( ) );
212 innerActionResponse = (InternalActionResponse) actionResponse;
213
214 invoker.action( actionRequest, actionResponse );
215
216 String location = innerActionResponse.getRedirectLocation( );
217
218
219 if ( location != null )
220 {
221 sendRedirect( servletResponse, location );
222 }
223 else
224 {
225 ( (PortletWindowImpl) portletWindow ).saveValues( );
226
227
228
229 if ( innerActionResponse.getChangedPortletMode( ) != null )
230 {
231 InformationProviderAccess.getDynamicProvider( servletRequest )
232 .getPortletActionProvider( portletWindow )
233 .changePortletMode( innerActionResponse.getChangedPortletMode( ) );
234 }
235
236
237 if ( innerActionResponse.getChangedWindowState( ) != null )
238 {
239 InformationProviderAccess.getDynamicProvider( servletRequest )
240 .getPortletActionProvider( portletWindow )
241 .changePortletWindowState( innerActionResponse.getChangedWindowState( ) );
242 }
243
244
245 Map renderParameter = innerActionResponse.getRenderParameters( );
246 log.debug( "fix params of " + portletWindow.getId( ) + " to " + renderParameter );
247 ( (PortletWindowImpl) portletWindow ).setRenderParameter( renderParameter );
248 }
249 }
250 catch ( PortletException e )
251 {
252 ( (PortletWindowImpl) portletWindow ).restoreValues( );
253 throw e;
254 }
255 catch ( IOException e )
256 {
257 ( (PortletWindowImpl) portletWindow ).restoreValues( );
258 throw e;
259 }
260 catch ( RuntimeException e )
261 {
262 ( (PortletWindowImpl) portletWindow ).restoreValues( );
263 throw e;
264 }
265 finally
266 {
267 try
268 {
269 String strLocation = PortletURLProviderImpl.getRedirectPortalURL( servletRequest, servletResponse );
270 sendRedirect( servletResponse, strLocation );
271 }
272 finally
273 {
274 PortletInvokerAccess.releasePortletInvoker( invoker );
275 PortletContainerServices.release( );
276 }
277 }
278 }
279
280
281
282
283 public void portletLoad( PortletWindow portletWindow, HttpServletRequest servletRequest,
284 HttpServletResponse servletResponse ) throws PortletException
285 {
286 PortletContainerServices.prepare( uniqueContainerName );
287
288 PortletInvoker invoker = null;
289
290 if ( log.isDebugEnabled( ) )
291 {
292 log.debug( "PortletContainerImpl.portletLoad(" + portletWindow.getId( ) + ") called." );
293 }
294
295 RenderRequest renderRequest = PortletObjectAccess.getRenderRequest( portletWindow, servletRequest,
296 servletResponse );
297
298 RenderResponse renderResponse = PortletObjectAccess.getRenderResponse( portletWindow, servletRequest,
299 servletResponse, supportsBuffering );
300
301 invoker = PortletInvokerAccess.getPortletInvoker( portletWindow.getPortletEntity( ).getPortletDefinition( ) );
302
303 try
304 {
305 invoker.load( renderRequest, renderResponse );
306 }
307 finally
308 {
309 PortletInvokerAccess.releasePortletInvoker( invoker );
310 PortletContainerServices.release( );
311 }
312 }
313
314
315
316
317 public boolean isInitialized( )
318 {
319 return initialized;
320 }
321
322
323
324
325
326
327
328
329
330 private void sendRedirect( HttpServletResponse servletResponse, String location )
331 throws IOException
332 {
333 HttpServletResponse redirectResponse = servletResponse;
334
335 while ( redirectResponse instanceof HttpServletResponseWrapper )
336 {
337 redirectResponse = (HttpServletResponse) ( (HttpServletResponseWrapper) redirectResponse ).getResponse( );
338 }
339
340 redirectResponse.sendRedirect( location );
341 }
342 }