1
22
23 package com.liferay.portal.action;
24
25 import com.liferay.portal.kernel.language.LanguageUtil;
26 import com.liferay.portal.kernel.log.Log;
27 import com.liferay.portal.kernel.log.LogFactoryUtil;
28 import com.liferay.portal.kernel.portlet.PortletModeFactory;
29 import com.liferay.portal.kernel.portlet.WindowStateFactory;
30 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
31 import com.liferay.portal.kernel.servlet.HttpHeaders;
32 import com.liferay.portal.kernel.servlet.StringServletResponse;
33 import com.liferay.portal.kernel.upload.UploadServletRequest;
34 import com.liferay.portal.kernel.util.ContentTypes;
35 import com.liferay.portal.kernel.util.HttpUtil;
36 import com.liferay.portal.kernel.util.JavaConstants;
37 import com.liferay.portal.kernel.util.ParamUtil;
38 import com.liferay.portal.kernel.util.StringPool;
39 import com.liferay.portal.kernel.util.Validator;
40 import com.liferay.portal.kernel.xml.QName;
41 import com.liferay.portal.model.Layout;
42 import com.liferay.portal.model.LayoutConstants;
43 import com.liferay.portal.model.LayoutTypePortlet;
44 import com.liferay.portal.model.Portlet;
45 import com.liferay.portal.model.PortletPreferencesIds;
46 import com.liferay.portal.model.User;
47 import com.liferay.portal.service.PortletLocalServiceUtil;
48 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
49 import com.liferay.portal.service.permission.PortletPermissionUtil;
50 import com.liferay.portal.struts.ActionConstants;
51 import com.liferay.portal.struts.StrutsUtil;
52 import com.liferay.portal.theme.PortletDisplay;
53 import com.liferay.portal.theme.ThemeDisplay;
54 import com.liferay.portal.upload.UploadServletRequestImpl;
55 import com.liferay.portal.util.PortalUtil;
56 import com.liferay.portal.util.PropsValues;
57 import com.liferay.portal.util.WebKeys;
58 import com.liferay.portlet.ActionRequestFactory;
59 import com.liferay.portlet.ActionRequestImpl;
60 import com.liferay.portlet.ActionResponseFactory;
61 import com.liferay.portlet.ActionResponseImpl;
62 import com.liferay.portlet.EventRequestFactory;
63 import com.liferay.portlet.EventRequestImpl;
64 import com.liferay.portlet.EventResponseFactory;
65 import com.liferay.portlet.EventResponseImpl;
66 import com.liferay.portlet.InvokerPortlet;
67 import com.liferay.portlet.InvokerPortletImpl;
68 import com.liferay.portlet.PortletConfigFactory;
69 import com.liferay.portlet.PortletConfigImpl;
70 import com.liferay.portlet.PortletInstanceFactoryUtil;
71 import com.liferay.portlet.PortletPreferencesFactoryUtil;
72 import com.liferay.portlet.PortletRequestImpl;
73 import com.liferay.portlet.PortletURLImpl;
74 import com.liferay.portlet.RenderParametersPool;
75 import com.liferay.portlet.RenderRequestImpl;
76 import com.liferay.portlet.RenderResponseImpl;
77 import com.liferay.portlet.ResourceRequestFactory;
78 import com.liferay.portlet.ResourceRequestImpl;
79 import com.liferay.portlet.ResourceResponseFactory;
80 import com.liferay.portlet.ResourceResponseImpl;
81 import com.liferay.portlet.StateAwareResponseImpl;
82 import com.liferay.portlet.login.util.LoginUtil;
83 import com.liferay.util.MapUtil;
84 import com.liferay.util.servlet.ServletResponseUtil;
85
86 import java.io.ByteArrayInputStream;
87 import java.io.InputStream;
88
89 import java.util.HashMap;
90 import java.util.List;
91 import java.util.Map;
92
93 import javax.portlet.Event;
94 import javax.portlet.PortletConfig;
95 import javax.portlet.PortletContext;
96 import javax.portlet.PortletException;
97 import javax.portlet.PortletMode;
98 import javax.portlet.PortletPreferences;
99 import javax.portlet.PortletRequest;
100 import javax.portlet.PortletURL;
101 import javax.portlet.UnavailableException;
102 import javax.portlet.WindowState;
103
104 import javax.servlet.RequestDispatcher;
105 import javax.servlet.ServletContext;
106 import javax.servlet.http.HttpServletRequest;
107 import javax.servlet.http.HttpServletResponse;
108 import javax.servlet.http.HttpSession;
109
110 import org.apache.struts.action.Action;
111 import org.apache.struts.action.ActionForm;
112 import org.apache.struts.action.ActionForward;
113 import org.apache.struts.action.ActionMapping;
114
115
121 public class LayoutAction extends Action {
122
123 public ActionForward execute(
124 ActionMapping mapping, ActionForm form, HttpServletRequest request,
125 HttpServletResponse response)
126 throws Exception {
127
128 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
129 WebKeys.THEME_DISPLAY);
130
131 Layout layout = themeDisplay.getLayout();
132
133 Boolean layoutDefault = (Boolean)request.getAttribute(
134 WebKeys.LAYOUT_DEFAULT);
135
136 if ((layoutDefault != null) && (layoutDefault.booleanValue())) {
137 Layout requestedLayout = (Layout)request.getAttribute(
138 WebKeys.REQUESTED_LAYOUT);
139
140 if (requestedLayout != null) {
141 String redirectParam = "redirect";
142
143 String authLoginURL = PortalUtil.getCommunityLoginURL(
144 themeDisplay);
145
146 if (Validator.isNull(authLoginURL)) {
147 authLoginURL = PropsValues.AUTH_LOGIN_URL;
148 }
149
150 if (Validator.isNotNull(PropsValues.AUTH_LOGIN_PORTLET_NAME) &&
151 Validator.isNotNull(authLoginURL)) {
152
153 redirectParam =
154 PortalUtil.getPortletNamespace(
155 PropsValues.AUTH_LOGIN_PORTLET_NAME) +
156 redirectParam;
157 }
158
159 String url = PortalUtil.getLayoutURL(
160 requestedLayout, themeDisplay);
161
162 PortletURL loginURL = LoginUtil.getLoginURL(
163 request, themeDisplay.getPlid());
164
165 loginURL.setParameter(redirectParam, url);
166
167 String redirect = loginURL.toString();
168
169 if (_log.isDebugEnabled()) {
170 _log.debug("Redirect requested layout to " + redirect);
171 }
172
173 response.sendRedirect(redirect);
174 }
175 else {
176 String redirect = PortalUtil.getLayoutURL(layout, themeDisplay);
177
178 if (_log.isDebugEnabled()) {
179 _log.debug("Redirect default layout to " + redirect);
180 }
181
182 response.sendRedirect(redirect);
183 }
184
185 return null;
186 }
187
188 long plid = ParamUtil.getLong(request, "p_l_id");
189
190 if (plid > 0) {
191 return processLayout(mapping, request, response, plid);
192 }
193 else {
194 try {
195 forwardLayout(request);
196
197 return mapping.findForward(ActionConstants.COMMON_FORWARD_JSP);
198 }
199 catch (Exception e) {
200 PortalUtil.sendError(e, request, response);
201
202 return null;
203 }
204 }
205 }
206
207 protected void forwardLayout(HttpServletRequest request) throws Exception {
208 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
209
210 long plid = LayoutConstants.DEFAULT_PLID;
211
212 String layoutFriendlyURL = null;
213
214 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
215 WebKeys.THEME_DISPLAY);
216
217 if (layout != null) {
218 plid = layout.getPlid();
219
220 layoutFriendlyURL = PortalUtil.getLayoutFriendlyURL(
221 layout, themeDisplay);
222 }
223
224 String forwardURL = layoutFriendlyURL;
225
226 if (Validator.isNull(forwardURL)) {
227 forwardURL =
228 themeDisplay.getPathMain() + "/portal/layout?p_l_id=" + plid;
229
230 if (Validator.isNotNull(themeDisplay.getDoAsUserId())) {
231 forwardURL = HttpUtil.addParameter(
232 forwardURL, "doAsUserId", themeDisplay.getDoAsUserId());
233 }
234
235 if (Validator.isNotNull(themeDisplay.getDoAsUserLanguageId())) {
236 forwardURL = HttpUtil.addParameter(
237 forwardURL, "doAsUserLanguageId",
238 themeDisplay.getDoAsUserLanguageId());
239 }
240 }
241
242 if (_log.isDebugEnabled()) {
243 _log.debug("Forward layout to " + forwardURL);
244 }
245
246 request.setAttribute(WebKeys.FORWARD_URL, forwardURL);
247 }
248
249 protected void includeLayoutContent(
250 HttpServletRequest request, HttpServletResponse response,
251 ThemeDisplay themeDisplay, Layout layout)
252 throws Exception {
253
254 ServletContext servletContext = (ServletContext)request.getAttribute(
255 WebKeys.CTX);
256
257 String path = StrutsUtil.TEXT_HTML_DIR;
258
259 if (BrowserSnifferUtil.isWap(request)) {
260 path = StrutsUtil.TEXT_WAP_DIR;
261 }
262
263
265 if (themeDisplay.isStateExclusive() ||
266 Validator.isNotNull(ParamUtil.getString(request, "p_p_id"))) {
267
268 if (layout.getType().equals(LayoutConstants.TYPE_PANEL)) {
269 path += "/portal/layout/view/panel.jsp";
270 }
271 else if (layout.getType().equals(
272 LayoutConstants.TYPE_CONTROL_PANEL)) {
273
274 path += "/portal/layout/view/control_panel.jsp";
275 }
276 else {
277 path += "/portal/layout/view/portlet.jsp";
278 }
279 }
280 else {
281 path += PortalUtil.getLayoutViewPage(layout);
282 }
283
284 RequestDispatcher requestDispatcher =
285 servletContext.getRequestDispatcher(path);
286
287 StringServletResponse stringResponse = new StringServletResponse(
288 response);
289
290 requestDispatcher.include(request, stringResponse);
291
292 request.setAttribute(
293 WebKeys.LAYOUT_CONTENT, stringResponse.getString());
294 }
295
296 protected void processEvent(
297 PortletRequestImpl portletRequestImpl,
298 StateAwareResponseImpl stateAwareResponseImpl, Portlet portlet,
299 List<Portlet> portlets, Event event)
300 throws Exception {
301
302 HttpServletRequest request = portletRequestImpl.getHttpServletRequest();
303 HttpServletResponse response =
304 stateAwareResponseImpl.getHttpServletResponse();
305
306 String portletId = portlet.getPortletId();
307
308 ServletContext servletContext =
309 (ServletContext)request.getAttribute(WebKeys.CTX);
310
311 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
312 portlet, servletContext);
313
314 PortletConfig portletConfig = PortletConfigFactory.create(
315 portlet, servletContext);
316 PortletContext portletContext = portletConfig.getPortletContext();
317
318 WindowState windowState = portletRequestImpl.getWindowState();
319 PortletMode portletMode = portletRequestImpl.getPortletMode();
320
321 User user = stateAwareResponseImpl.getUser();
322 Layout layout = stateAwareResponseImpl.getLayout();
323
324 PortletPreferences portletPreferences =
325 portletRequestImpl.getPreferencesImpl();
326
327 EventRequestImpl eventRequestImpl = EventRequestFactory.create(
328 request, portlet, invokerPortlet, portletContext, windowState,
329 portletMode, portletPreferences, layout.getPlid());
330
331 eventRequestImpl.setEvent(event);
332
333 EventResponseImpl eventResponseImpl = EventResponseFactory.create(
334 eventRequestImpl, response, portletId, user, layout, windowState,
335 portletMode);
336
337 eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
338
339 try {
340 try {
341 invokerPortlet.processEvent(
342 eventRequestImpl, eventResponseImpl);
343
344 if (eventResponseImpl.isCalledSetRenderParameter()) {
345 Map<String, String[]> renderParameterMap =
346 new HashMap<String, String[]>();
347
348 MapUtil.copy(
349 eventResponseImpl.getRenderParameterMap(),
350 renderParameterMap);
351
352 RenderParametersPool.put(
353 request, layout.getPlid(), portletId,
354 renderParameterMap);
355 }
356 }
357 catch (UnavailableException ue) {
358 throw ue;
359 }
360 catch (PortletException pe) {
361 eventResponseImpl.setWindowState(windowState);
362 eventResponseImpl.setPortletMode(portletMode);
363 }
364
365 processEvents(eventRequestImpl, eventResponseImpl, portlets);
366 }
367 finally {
368 eventRequestImpl.cleanUp();
369 }
370 }
371
372 protected void processEvents(
373 PortletRequestImpl portletRequestImpl,
374 StateAwareResponseImpl stateAwareResponseImpl,
375 List<Portlet> portlets)
376 throws Exception {
377
378 List<Event> events = stateAwareResponseImpl.getEvents();
379
380 if (events.size() == 0) {
381 return;
382 }
383
384 for (Event event : events) {
385 javax.xml.namespace.QName qName = event.getQName();
386
387 for (Portlet portlet : portlets) {
388 QName processingQName = portlet.getProcessingEvent(
389 qName.getNamespaceURI(), qName.getLocalPart());
390
391 if (processingQName != null) {
392 processEvent(
393 portletRequestImpl, stateAwareResponseImpl, portlet,
394 portlets, event);
395 }
396 }
397 }
398 }
399
400 protected ActionForward processLayout(
401 ActionMapping mapping, HttpServletRequest request,
402 HttpServletResponse response, long plid)
403 throws Exception {
404
405 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
406 WebKeys.THEME_DISPLAY);
407
408 try {
409 Layout layout = themeDisplay.getLayout();
410
411 boolean resetLayout = ParamUtil.getBoolean(
412 request, "p_l_reset", PropsValues.LAYOUT_DEFAULT_P_L_RESET);
413
414 if (!PropsValues.TCK_URL && resetLayout) {
415 RenderParametersPool.clear(request, plid);
416 }
417
418 if (themeDisplay.isLifecycleAction()) {
419 Portlet portlet = processPortletRequest(
420 request, response, PortletRequest.ACTION_PHASE);
421
422 if (portlet != null) {
423 ActionResponseImpl actionResponseImpl =
424 (ActionResponseImpl)request.getAttribute(
425 JavaConstants.JAVAX_PORTLET_RESPONSE);
426
427 String redirectLocation =
428 actionResponseImpl.getRedirectLocation();
429
430 if (Validator.isNotNull(redirectLocation)) {
431 response.sendRedirect(redirectLocation);
432
433 return null;
434 }
435
436 if (portlet.isActionURLRedirect()) {
437 redirectActionURL(
438 request, response, actionResponseImpl, portlet);
439
440 return null;
441 }
442 }
443 }
444 else if (themeDisplay.isLifecycleRender()) {
445 processPortletRequest(
446 request, response, PortletRequest.RENDER_PHASE);
447 }
448
449 if (themeDisplay.isLifecycleResource()) {
450 processPortletRequest(
451 request, response, PortletRequest.RESOURCE_PHASE);
452
453 return null;
454 }
455 else {
456 if (layout != null) {
457
458
462 includeLayoutContent(
463 request, response, themeDisplay, layout);
464
465 if (themeDisplay.isStateExclusive()) {
466 renderExclusive(request, response, themeDisplay);
467
468 return null;
469 }
470 }
471
472 return mapping.findForward("portal.layout");
473 }
474 }
475 catch (Exception e) {
476 PortalUtil.sendError(e, request, response);
477
478 return null;
479 }
480 finally {
481 PortletRequest portletRequest =
482 (PortletRequest)request.getAttribute(
483 JavaConstants.JAVAX_PORTLET_REQUEST);
484
485 if (portletRequest != null) {
486 PortletRequestImpl portletRequestImpl =
487 (PortletRequestImpl)portletRequest;
488
489 portletRequestImpl.cleanUp();
490 }
491 }
492 }
493
494 protected Portlet processPortletRequest(
495 HttpServletRequest request, HttpServletResponse response,
496 String lifecycle)
497 throws Exception {
498
499 HttpSession session = request.getSession();
500
501 long companyId = PortalUtil.getCompanyId(request);
502 User user = PortalUtil.getUser(request);
503 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
504
505 String portletId = ParamUtil.getString(request, "p_p_id");
506
507 Portlet portlet = PortletLocalServiceUtil.getPortletById(
508 companyId, portletId);
509
510 if (portlet == null) {
511 return null;
512 }
513
514 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
515 WebKeys.THEME_DISPLAY);
516
517 themeDisplay.setScopeGroupId(
518 PortalUtil.getScopeGroupId(request, portletId));
519
520 ServletContext servletContext = (ServletContext)request.getAttribute(
521 WebKeys.CTX);
522
523 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
524 portlet, servletContext);
525
526 if (user != null) {
527 InvokerPortletImpl.clearResponse(
528 session, layout.getPrimaryKey(), portletId,
529 LanguageUtil.getLanguageId(request));
530 }
531
532 PortletConfig portletConfig = PortletConfigFactory.create(
533 portlet, servletContext);
534 PortletContext portletContext = portletConfig.getPortletContext();
535
536 WindowState windowState = WindowStateFactory.getWindowState(
537 ParamUtil.getString(request, "p_p_state"));
538
539 PortletMode portletMode = PortletModeFactory.getPortletMode(
540 ParamUtil.getString(request, "p_p_mode"));
541
542 PortletPreferencesIds portletPreferencesIds =
543 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
544 request, portletId);
545
546 PortletPreferences portletPreferences =
547 PortletPreferencesLocalServiceUtil.getPreferences(
548 portletPreferencesIds);
549
550 if (lifecycle.equals(PortletRequest.ACTION_PHASE)) {
551 String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
552
553 if (_log.isDebugEnabled()) {
554 _log.debug("Content type " + contentType);
555 }
556
557 UploadServletRequest uploadRequest = null;
558
559 try {
560 if ((contentType != null) &&
561 (contentType.startsWith(
562 ContentTypes.MULTIPART_FORM_DATA))) {
563
564 PortletConfigImpl invokerPortletConfigImpl =
565 (PortletConfigImpl)invokerPortlet.getPortletConfig();
566
567 if (invokerPortlet.isStrutsPortlet() ||
568 ((invokerPortletConfigImpl != null) &&
569 (!invokerPortletConfigImpl.isWARFile()))) {
570
571 uploadRequest = new UploadServletRequestImpl(request);
572
573 request = uploadRequest;
574 }
575 }
576
577 ActionRequestImpl actionRequestImpl =
578 ActionRequestFactory.create(
579 request, portlet, invokerPortlet, portletContext,
580 windowState, portletMode, portletPreferences,
581 layout.getPlid());
582
583 ActionResponseImpl actionResponseImpl =
584 ActionResponseFactory.create(
585 actionRequestImpl, response, portletId, user, layout,
586 windowState, portletMode);
587
588 actionRequestImpl.defineObjects(
589 portletConfig, actionResponseImpl);
590
591 invokerPortlet.processAction(
592 actionRequestImpl, actionResponseImpl);
593
594 actionResponseImpl.transferHeaders(response);
595
596 RenderParametersPool.put(
597 request, layout.getPlid(), portletId,
598 actionResponseImpl.getRenderParameterMap());
599
600 if (actionResponseImpl.getEvents().size() > 0) {
601 if (layout.getType().equals(LayoutConstants.TYPE_PORTLET)) {
602 LayoutTypePortlet layoutTypePortlet =
603 (LayoutTypePortlet)layout.getLayoutType();
604
605 List<Portlet> portlets =
606 layoutTypePortlet.getPortlets();
607
608 processEvents(
609 actionRequestImpl, actionResponseImpl, portlets);
610
611 actionRequestImpl.defineObjects(
612 portletConfig, actionResponseImpl);
613 }
614 }
615 }
616 finally {
617 if (uploadRequest != null) {
618 uploadRequest.cleanUp();
619 }
620 }
621 }
622 else if (lifecycle.equals(PortletRequest.RENDER_PHASE) ||
623 lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
624
625 PortalUtil.updateWindowState(
626 portletId, user, layout, windowState, request);
627
628 PortalUtil.updatePortletMode(
629 portletId, user, layout, portletMode, request);
630 }
631
632 if (lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
633 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
634
635 String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
636 layout.getPlid(), portletId);
637
638 portletDisplay.setId(portletId);
639 portletDisplay.setRootPortletId(portlet.getRootPortletId());
640 portletDisplay.setInstanceId(portlet.getInstanceId());
641 portletDisplay.setResourcePK(portletPrimaryKey);
642 portletDisplay.setPortletName(portletConfig.getPortletName());
643 portletDisplay.setNamespace(
644 PortalUtil.getPortletNamespace(portletId));
645
646 ResourceRequestImpl resourceRequestImpl =
647 ResourceRequestFactory.create(
648 request, portlet, invokerPortlet, portletContext,
649 windowState, portletMode, portletPreferences,
650 layout.getPlid());
651
652 ResourceResponseImpl resourceResponseImpl =
653 ResourceResponseFactory.create(
654 resourceRequestImpl, response, portletId, companyId);
655
656 resourceRequestImpl.defineObjects(
657 portletConfig, resourceResponseImpl);
658
659 invokerPortlet.serveResource(
660 resourceRequestImpl, resourceResponseImpl);
661 }
662
663 return portlet;
664 }
665
666 protected void redirectActionURL(
667 HttpServletRequest request, HttpServletResponse response,
668 ActionResponseImpl actionResponseImpl, Portlet portlet)
669 throws Exception {
670
671 ActionRequestImpl actionRequestImpl =
672 (ActionRequestImpl)request.getAttribute(
673 JavaConstants.JAVAX_PORTLET_REQUEST);
674
675 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
676
677 PortletURL portletURL = new PortletURLImpl(
678 actionRequestImpl, actionRequestImpl.getPortletName(),
679 layout.getLayoutId(), PortletRequest.RENDER_PHASE);
680
681 Map<String, String[]> renderParameters =
682 actionResponseImpl.getRenderParameterMap();
683
684 for (Map.Entry<String, String[]> entry : renderParameters.entrySet()) {
685 String key = entry.getKey();
686 String[] value = entry.getValue();
687
688 portletURL.setParameter(key, value);
689 }
690
691 response.sendRedirect(portletURL.toString());
692 }
693
694 protected void renderExclusive(
695 HttpServletRequest request, HttpServletResponse response,
696 ThemeDisplay themeDisplay)
697 throws Exception {
698
699 RenderRequestImpl renderRequestImpl =
700 (RenderRequestImpl)request.getAttribute(
701 JavaConstants.JAVAX_PORTLET_REQUEST);
702
703 RenderResponseImpl renderResponseImpl =
704 (RenderResponseImpl)request.getAttribute(
705 JavaConstants.JAVAX_PORTLET_RESPONSE);
706
707 StringServletResponse stringResponse =
708 (StringServletResponse)renderRequestImpl.getAttribute(
709 WebKeys.STRING_SERVLET_RESPONSE);
710
711 renderResponseImpl.transferHeaders(response);
712
713 if (stringResponse.isCalledGetOutputStream()) {
714 InputStream is = new ByteArrayInputStream(
715 stringResponse.getByteArrayMaker().toByteArray());
716
717 ServletResponseUtil.sendFile(
718 response, renderResponseImpl.getResourceName(), is,
719 renderResponseImpl.getContentType());
720 }
721 else {
722 byte[] content = stringResponse.getString().getBytes(
723 StringPool.UTF8);
724
725 ServletResponseUtil.sendFile(
726 response, renderResponseImpl.getResourceName(), content,
727 renderResponseImpl.getContentType());
728 }
729
730 renderRequestImpl.cleanUp();
731 }
732
733 private static Log _log = LogFactoryUtil.getLog(LayoutAction.class);
734
735 }