001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.layoutsadmin.action;
016    
017    import com.liferay.portal.DuplicateLockException;
018    import com.liferay.portal.ImageTypeException;
019    import com.liferay.portal.LayoutFriendlyURLException;
020    import com.liferay.portal.LayoutHiddenException;
021    import com.liferay.portal.LayoutNameException;
022    import com.liferay.portal.LayoutParentLayoutIdException;
023    import com.liferay.portal.LayoutPrototypeException;
024    import com.liferay.portal.LayoutSetVirtualHostException;
025    import com.liferay.portal.LayoutTypeException;
026    import com.liferay.portal.NoSuchGroupException;
027    import com.liferay.portal.NoSuchLayoutException;
028    import com.liferay.portal.RemoteExportException;
029    import com.liferay.portal.RemoteOptionsException;
030    import com.liferay.portal.RequiredLayoutException;
031    import com.liferay.portal.events.EventsProcessorUtil;
032    import com.liferay.portal.kernel.exception.PortalException;
033    import com.liferay.portal.kernel.exception.SystemException;
034    import com.liferay.portal.kernel.log.Log;
035    import com.liferay.portal.kernel.log.LogFactoryUtil;
036    import com.liferay.portal.kernel.portlet.LiferayPortletConfig;
037    import com.liferay.portal.kernel.servlet.SessionErrors;
038    import com.liferay.portal.kernel.servlet.SessionMessages;
039    import com.liferay.portal.kernel.staging.StagingUtil;
040    import com.liferay.portal.kernel.upload.UploadException;
041    import com.liferay.portal.kernel.upload.UploadPortletRequest;
042    import com.liferay.portal.kernel.util.Constants;
043    import com.liferay.portal.kernel.util.FileUtil;
044    import com.liferay.portal.kernel.util.HttpUtil;
045    import com.liferay.portal.kernel.util.LocalizationUtil;
046    import com.liferay.portal.kernel.util.ParamUtil;
047    import com.liferay.portal.kernel.util.PropertiesParamUtil;
048    import com.liferay.portal.kernel.util.PropsKeys;
049    import com.liferay.portal.kernel.util.StringPool;
050    import com.liferay.portal.kernel.util.StringUtil;
051    import com.liferay.portal.kernel.util.UnicodeProperties;
052    import com.liferay.portal.kernel.util.Validator;
053    import com.liferay.portal.kernel.workflow.WorkflowConstants;
054    import com.liferay.portal.model.ColorScheme;
055    import com.liferay.portal.model.Group;
056    import com.liferay.portal.model.Layout;
057    import com.liferay.portal.model.LayoutConstants;
058    import com.liferay.portal.model.LayoutPrototype;
059    import com.liferay.portal.model.LayoutRevision;
060    import com.liferay.portal.model.LayoutSet;
061    import com.liferay.portal.model.LayoutSetBranch;
062    import com.liferay.portal.model.LayoutTypePortlet;
063    import com.liferay.portal.model.Theme;
064    import com.liferay.portal.model.ThemeSetting;
065    import com.liferay.portal.model.User;
066    import com.liferay.portal.model.impl.ThemeImpl;
067    import com.liferay.portal.model.impl.ThemeSettingImpl;
068    import com.liferay.portal.security.auth.PrincipalException;
069    import com.liferay.portal.security.permission.ActionKeys;
070    import com.liferay.portal.security.permission.PermissionChecker;
071    import com.liferay.portal.service.LayoutLocalServiceUtil;
072    import com.liferay.portal.service.LayoutPrototypeServiceUtil;
073    import com.liferay.portal.service.LayoutRevisionLocalServiceUtil;
074    import com.liferay.portal.service.LayoutServiceUtil;
075    import com.liferay.portal.service.LayoutSetBranchLocalServiceUtil;
076    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
077    import com.liferay.portal.service.PortletLocalServiceUtil;
078    import com.liferay.portal.service.ServiceContext;
079    import com.liferay.portal.service.ServiceContextFactory;
080    import com.liferay.portal.service.ThemeLocalServiceUtil;
081    import com.liferay.portal.service.UserLocalServiceUtil;
082    import com.liferay.portal.service.permission.GroupPermissionUtil;
083    import com.liferay.portal.service.permission.LayoutPermissionUtil;
084    import com.liferay.portal.service.permission.LayoutPrototypePermissionUtil;
085    import com.liferay.portal.service.permission.LayoutSetPrototypePermissionUtil;
086    import com.liferay.portal.service.permission.OrganizationPermissionUtil;
087    import com.liferay.portal.service.permission.UserPermissionUtil;
088    import com.liferay.portal.struts.PortletAction;
089    import com.liferay.portal.theme.ThemeDisplay;
090    import com.liferay.portal.util.LayoutSettings;
091    import com.liferay.portal.util.PortalUtil;
092    import com.liferay.portal.util.PropsValues;
093    import com.liferay.portal.util.WebKeys;
094    import com.liferay.portlet.mobiledevicerules.model.MDRAction;
095    import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroupInstance;
096    import com.liferay.portlet.mobiledevicerules.service.MDRActionLocalServiceUtil;
097    import com.liferay.portlet.mobiledevicerules.service.MDRActionServiceUtil;
098    import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceLocalServiceUtil;
099    import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceServiceUtil;
100    import com.liferay.portlet.sites.action.ActionUtil;
101    import com.liferay.portlet.sites.util.SitesUtil;
102    
103    import java.io.IOException;
104    import java.io.InputStream;
105    
106    import java.util.Iterator;
107    import java.util.List;
108    import java.util.Locale;
109    import java.util.Map;
110    import java.util.Set;
111    
112    import javax.portlet.ActionRequest;
113    import javax.portlet.ActionResponse;
114    import javax.portlet.PortletConfig;
115    import javax.portlet.PortletContext;
116    import javax.portlet.PortletRequest;
117    import javax.portlet.PortletRequestDispatcher;
118    import javax.portlet.RenderRequest;
119    import javax.portlet.RenderResponse;
120    import javax.portlet.ResourceRequest;
121    import javax.portlet.ResourceResponse;
122    
123    import javax.servlet.http.HttpServletRequest;
124    import javax.servlet.http.HttpServletResponse;
125    
126    import org.apache.struts.action.ActionForm;
127    import org.apache.struts.action.ActionForward;
128    import org.apache.struts.action.ActionMapping;
129    
130    /**
131     * @author Brian Wing Shun Chan
132     * @author Julio Camarero
133     */
134    public class EditLayoutsAction extends PortletAction {
135    
136            @Override
137            public void processAction(
138                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
139                            ActionRequest actionRequest, ActionResponse actionResponse)
140                    throws Exception {
141    
142                    try {
143                            checkPermissions(actionRequest);
144                    }
145                    catch (PrincipalException pe) {
146                            return;
147                    }
148    
149                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
150                            WebKeys.THEME_DISPLAY);
151    
152                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
153    
154                    try {
155                            String redirect = ParamUtil.getString(actionRequest, "redirect");
156                            String closeRedirect = ParamUtil.getString(
157                                    actionRequest, "closeRedirect");
158    
159                            Layout layout = null;
160                            String oldFriendlyURL = StringPool.BLANK;
161    
162                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
163                                    Object[] returnValue = updateLayout(
164                                            actionRequest, actionResponse);
165    
166                                    layout = (Layout)returnValue[0];
167                                    oldFriendlyURL = (String)returnValue[1];
168    
169                                    redirect = updateCloseRedirect(
170                                            redirect, null, layout, oldFriendlyURL);
171                                    closeRedirect = updateCloseRedirect(
172                                            closeRedirect, null, layout, oldFriendlyURL);
173                            }
174                            else if (cmd.equals(Constants.DELETE)) {
175                                    Object[] returnValue = SitesUtil.deleteLayout(
176                                            actionRequest, actionResponse);
177    
178                                    Group group = (Group)returnValue[0];
179                                    oldFriendlyURL = (String)returnValue[1];
180                                    long newRefererPlid = (Long)returnValue[2];
181    
182                                    redirect = updateCloseRedirect(
183                                            redirect, group, null, oldFriendlyURL);
184                                    redirect = HttpUtil.setParameter(
185                                            redirect, "refererPlid", newRefererPlid);
186    
187                                    closeRedirect = updateCloseRedirect(
188                                            closeRedirect, group, null, oldFriendlyURL);
189                            }
190                            else if (cmd.equals("copy_from_live")) {
191                                    StagingUtil.copyFromLive(actionRequest);
192                            }
193                            else if (cmd.equals("display_order")) {
194                                    updateDisplayOrder(actionRequest);
195                            }
196                            else if (cmd.equals("delete_layout_revision")) {
197                                    deleteLayoutRevision(actionRequest);
198                            }
199                            else if (cmd.equals("enable")) {
200                                    enableLayout(actionRequest);
201                            }
202                            else if (cmd.equals("publish_to_live")) {
203                                    StagingUtil.publishToLive(actionRequest);
204                            }
205                            else if (cmd.equals("publish_to_remote")) {
206                                    StagingUtil.publishToRemote(actionRequest);
207                            }
208                            else if (cmd.equals("reset_customized_view")) {
209                                    LayoutTypePortlet layoutTypePortlet =
210                                            themeDisplay.getLayoutTypePortlet();
211    
212                                    if ((layoutTypePortlet != null) &&
213                                            layoutTypePortlet.isCustomizable() &&
214                                            layoutTypePortlet.isCustomizedView()) {
215    
216                                            layoutTypePortlet.resetUserPreferences();
217                                    }
218                            }
219                            else if (cmd.equals("reset_prototype")) {
220                                    SitesUtil.resetPrototype(themeDisplay.getLayout());
221                            }
222                            else if (cmd.equals("schedule_copy_from_live")) {
223                                    StagingUtil.scheduleCopyFromLive(actionRequest);
224                            }
225                            else if (cmd.equals("schedule_publish_to_live")) {
226                                    StagingUtil.schedulePublishToLive(actionRequest);
227                            }
228                            else if (cmd.equals("schedule_publish_to_remote")) {
229                                    StagingUtil.schedulePublishToRemote(actionRequest);
230                            }
231                            else if (cmd.equals("select_layout_set_branch")) {
232                                    selectLayoutSetBranch(actionRequest);
233                            }
234                            else if (cmd.equals("select_layout_branch")) {
235                                    selectLayoutBranch(actionRequest);
236                            }
237                            else if (cmd.equals("unschedule_copy_from_live")) {
238                                    StagingUtil.unscheduleCopyFromLive(actionRequest);
239                            }
240                            else if (cmd.equals("unschedule_publish_to_live")) {
241                                    StagingUtil.unschedulePublishToLive(actionRequest);
242                            }
243                            else if (cmd.equals("unschedule_publish_to_remote")) {
244                                    StagingUtil.unschedulePublishToRemote(actionRequest);
245                            }
246                            else if (cmd.equals("update_layout_revision")) {
247                                    updateLayoutRevision(actionRequest, themeDisplay);
248                            }
249    
250                            if (Validator.isNotNull(closeRedirect)) {
251                                    LiferayPortletConfig liferayPortletConfig =
252                                            (LiferayPortletConfig)portletConfig;
253    
254                                    SessionMessages.add(
255                                            actionRequest,
256                                            liferayPortletConfig.getPortletId() +
257                                                    SessionMessages.KEY_SUFFIX_CLOSE_REDIRECT,
258                                            closeRedirect);
259                            }
260    
261                            sendRedirect(actionRequest, actionResponse, redirect);
262                    }
263                    catch (Exception e) {
264                            if (e instanceof NoSuchLayoutException ||
265                                    e instanceof PrincipalException) {
266    
267                                    SessionErrors.add(actionRequest, e.getClass());
268    
269                                    setForward(actionRequest, "portlet.layouts_admin.error");
270                            }
271                            else if (e instanceof ImageTypeException ||
272                                             e instanceof LayoutFriendlyURLException ||
273                                             e instanceof LayoutHiddenException ||
274                                             e instanceof LayoutNameException ||
275                                             e instanceof LayoutParentLayoutIdException ||
276                                             e instanceof LayoutSetVirtualHostException ||
277                                             e instanceof LayoutTypeException ||
278                                             e instanceof RequiredLayoutException ||
279                                             e instanceof UploadException) {
280    
281                                    if (e instanceof LayoutFriendlyURLException) {
282                                            SessionErrors.add(
283                                                    actionRequest,
284                                                    LayoutFriendlyURLException.class.getName(), e);
285                                    }
286                                    else {
287                                            SessionErrors.add(actionRequest, e.getClass(), e);
288                                    }
289                            }
290                            else if (e instanceof DuplicateLockException ||
291                                             e instanceof LayoutPrototypeException ||
292                                             e instanceof RemoteExportException ||
293                                             e instanceof RemoteOptionsException ||
294                                             e instanceof SystemException) {
295    
296                                    SessionErrors.add(actionRequest, e.getClass(), e);
297    
298                                    String redirect = ParamUtil.getString(
299                                            actionRequest, "pagesRedirect");
300    
301                                    sendRedirect(actionRequest, actionResponse, redirect);
302                            }
303                            else {
304                                    throw e;
305                            }
306                    }
307            }
308    
309            @Override
310            public ActionForward render(
311                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
312                            RenderRequest renderRequest, RenderResponse renderResponse)
313                    throws Exception {
314    
315                    try {
316                            checkPermissions(renderRequest);
317                    }
318                    catch (PrincipalException pe) {
319                            SessionErrors.add(
320                                    renderRequest, PrincipalException.class.getName());
321    
322                            return mapping.findForward("portlet.layouts_admin.error");
323                    }
324    
325                    try {
326                            getGroup(renderRequest);
327                    }
328                    catch (Exception e) {
329                            if (e instanceof NoSuchGroupException ||
330                                    e instanceof PrincipalException) {
331    
332                                    SessionErrors.add(renderRequest, e.getClass());
333    
334                                    return mapping.findForward("portlet.layouts_admin.error");
335                            }
336                            else {
337                                    throw e;
338                            }
339                    }
340    
341                    return mapping.findForward(
342                            getForward(renderRequest, "portlet.layouts_admin.edit_layouts"));
343            }
344    
345            @Override
346            public void serveResource(
347                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
348                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
349                    throws Exception {
350    
351                    String cmd = ParamUtil.getString(resourceRequest, Constants.CMD);
352    
353                    PortletContext portletContext = portletConfig.getPortletContext();
354    
355                    PortletRequestDispatcher portletRequestDispatcher = null;
356    
357                    if (cmd.equals(ActionKeys.PUBLISH_STAGING)) {
358                            portletRequestDispatcher = portletContext.getRequestDispatcher(
359                                    "/html/portlet/layouts_admin/scheduled_publishing_events.jsp");
360                    }
361                    else if (cmd.equals(ActionKeys.VIEW_TREE)) {
362                            getGroup(resourceRequest);
363    
364                            portletRequestDispatcher = portletContext.getRequestDispatcher(
365                                    "/html/portlet/layouts_admin/tree_js.jsp");
366                    }
367                    else {
368                            getGroup(resourceRequest);
369    
370                            portletRequestDispatcher = portletContext.getRequestDispatcher(
371                                    "/html/portlet/layouts_admin/view_resources.jsp");
372                    }
373    
374                    portletRequestDispatcher.include(resourceRequest, resourceResponse);
375            }
376    
377            protected void checkPermissions(PortletRequest portletRequest)
378                    throws Exception {
379    
380                    // LEP-850
381    
382                    Group group = getGroup(portletRequest);
383    
384                    if (group == null) {
385                            throw new PrincipalException();
386                    }
387    
388                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
389                            WebKeys.THEME_DISPLAY);
390    
391                    PermissionChecker permissionChecker =
392                            themeDisplay.getPermissionChecker();
393    
394                    Layout layout = themeDisplay.getLayout();
395    
396                    String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
397    
398                    long selPlid = ParamUtil.getLong(portletRequest, "selPlid");
399    
400                    if (selPlid > 0) {
401                            layout = LayoutLocalServiceUtil.getLayout(selPlid);
402                    }
403    
404                    if (cmd.equals(Constants.ADD)) {
405                            long parentPlid = ParamUtil.getLong(portletRequest, "parentPlid");
406    
407                            if (parentPlid == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
408                                    if (!GroupPermissionUtil.contains(
409                                                    permissionChecker, group.getGroupId(),
410                                                    ActionKeys.ADD_LAYOUT)) {
411    
412                                            throw new PrincipalException();
413                                    }
414                                    else {
415                                            return;
416                                    }
417                            }
418                            else {
419                                    layout = LayoutLocalServiceUtil.getLayout(parentPlid);
420    
421                                    if (!LayoutPermissionUtil.contains(
422                                                    permissionChecker, layout, ActionKeys.ADD_LAYOUT)) {
423    
424                                            throw new PrincipalException();
425                                    }
426                                    else {
427                                            return;
428                                    }
429                            }
430                    }
431                    else if (cmd.equals(Constants.DELETE)) {
432                            if (!LayoutPermissionUtil.contains(
433                                            permissionChecker, layout, ActionKeys.DELETE)) {
434    
435                                    throw new PrincipalException();
436                            }
437                            else {
438                                    return;
439                            }
440                    }
441                    else if (cmd.equals("reset_customized_view")) {
442                            if (!LayoutPermissionUtil.contains(
443                                            permissionChecker, layout, ActionKeys.CUSTOMIZE)) {
444    
445                                    throw new PrincipalException();
446                            }
447                            else {
448                                    return;
449                            }
450                    }
451                    else if (cmd.equals("reset_prototype")) {
452                            if (!LayoutPermissionUtil.contains(
453                                            permissionChecker, layout, ActionKeys.UPDATE) ||
454                                    !GroupPermissionUtil.contains(
455                                            permissionChecker, layout.getGroupId(),
456                                            ActionKeys.UPDATE)) {
457    
458                                    throw new PrincipalException();
459                            }
460                            else {
461                                    return;
462                            }
463                    }
464    
465                    boolean hasUpdateLayoutPermission = false;
466    
467                    if (layout != null) {
468                            hasUpdateLayoutPermission = LayoutPermissionUtil.contains(
469                                    permissionChecker, layout, ActionKeys.UPDATE);
470                    }
471    
472                    boolean hasPermission = true;
473    
474                    if (cmd.equals("publish_to_live")) {
475                            if (group.isSite()) {
476                                    boolean publishToLive = GroupPermissionUtil.contains(
477                                            permissionChecker, group.getGroupId(),
478                                            ActionKeys.PUBLISH_STAGING);
479    
480                                    if (!hasUpdateLayoutPermission && !publishToLive) {
481                                            hasPermission = false;
482                                    }
483                            }
484                            else if (group.isOrganization()) {
485                                    boolean publishToLive = OrganizationPermissionUtil.contains(
486                                            permissionChecker, group.getOrganizationId(),
487                                            ActionKeys.PUBLISH_STAGING);
488    
489                                    if (!hasUpdateLayoutPermission && !publishToLive) {
490                                            hasPermission = false;
491                                    }
492                            }
493                    }
494    
495                    if (group.isCompany()) {
496                            if (!permissionChecker.isCompanyAdmin()) {
497                                    hasPermission = false;
498                            }
499                    }
500                    else if (group.isLayoutPrototype()) {
501                            LayoutPrototypePermissionUtil.check(
502                                    permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
503                    }
504                    else if (group.isLayoutSetPrototype()) {
505                            LayoutSetPrototypePermissionUtil.check(
506                                    permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
507                    }
508                    else if (group.isUser()) {
509                            long groupUserId = group.getClassPK();
510    
511                            User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
512    
513                            long[] organizationIds = groupUser.getOrganizationIds();
514    
515                            UserPermissionUtil.check(
516                                    permissionChecker, groupUserId, organizationIds,
517                                    ActionKeys.UPDATE);
518                    }
519    
520                    if (!hasPermission) {
521                            throw new PrincipalException();
522                    }
523            }
524    
525            protected void deleteLayoutRevision(ActionRequest actionRequest)
526                    throws Exception {
527    
528                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
529                            actionRequest);
530    
531                    long layoutRevisionId = ParamUtil.getLong(
532                            actionRequest, "layoutRevisionId");
533    
534                    LayoutRevision layoutRevision =
535                            LayoutRevisionLocalServiceUtil.getLayoutRevision(layoutRevisionId);
536    
537                    LayoutRevisionLocalServiceUtil.deleteLayoutRevision(layoutRevision);
538    
539                    boolean updateRecentLayoutRevisionId = ParamUtil.getBoolean(
540                            actionRequest, "updateRecentLayoutRevisionId");
541    
542                    if (updateRecentLayoutRevisionId) {
543                            StagingUtil.setRecentLayoutRevisionId(
544                                    request, layoutRevision.getLayoutSetBranchId(),
545                                    layoutRevision.getPlid(),
546                                    layoutRevision.getParentLayoutRevisionId());
547                    }
548            }
549    
550            protected void deleteThemeSettingsProperties(
551                    UnicodeProperties typeSettingsProperties, String device) {
552    
553                    String keyPrefix = ThemeSettingImpl.namespaceProperty(device);
554    
555                    Set<String> keys = typeSettingsProperties.keySet();
556    
557                    Iterator<String> itr = keys.iterator();
558    
559                    while (itr.hasNext()) {
560                            String key = itr.next();
561    
562                            if (key.startsWith(keyPrefix)) {
563                                    itr.remove();
564                            }
565                    }
566            }
567    
568            protected void enableLayout(ActionRequest actionRequest) throws Exception {
569                    long incompleteLayoutRevisionId = ParamUtil.getLong(
570                            actionRequest, "incompleteLayoutRevisionId");
571    
572                    LayoutRevision incompleteLayoutRevision =
573                            LayoutRevisionLocalServiceUtil.getLayoutRevision(
574                                    incompleteLayoutRevisionId);
575    
576                    long layoutBranchId = ParamUtil.getLong(
577                            actionRequest, "layoutBranchId",
578                            incompleteLayoutRevision.getLayoutBranchId());
579    
580                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
581                            actionRequest);
582    
583                    serviceContext.setWorkflowAction(WorkflowConstants.ACTION_SAVE_DRAFT);
584    
585                    LayoutRevisionLocalServiceUtil.updateLayoutRevision(
586                            serviceContext.getUserId(),
587                            incompleteLayoutRevision.getLayoutRevisionId(), layoutBranchId,
588                            incompleteLayoutRevision.getName(),
589                            incompleteLayoutRevision.getTitle(),
590                            incompleteLayoutRevision.getDescription(),
591                            incompleteLayoutRevision.getKeywords(),
592                            incompleteLayoutRevision.getRobots(),
593                            incompleteLayoutRevision.getTypeSettings(),
594                            incompleteLayoutRevision.getIconImage(),
595                            incompleteLayoutRevision.getIconImageId(),
596                            incompleteLayoutRevision.getThemeId(),
597                            incompleteLayoutRevision.getColorSchemeId(),
598                            incompleteLayoutRevision.getWapThemeId(),
599                            incompleteLayoutRevision.getWapColorSchemeId(),
600                            incompleteLayoutRevision.getCss(), serviceContext);
601            }
602    
603            protected String getColorSchemeId(
604                            long companyId, String themeId, String colorSchemeId,
605                            boolean wapTheme)
606                    throws Exception {
607    
608                    Theme theme = ThemeLocalServiceUtil.getTheme(
609                            companyId, themeId, wapTheme);
610    
611                    if (!theme.hasColorSchemes()) {
612                            colorSchemeId = StringPool.BLANK;
613                    }
614    
615                    if (Validator.isNull(colorSchemeId)) {
616                            ColorScheme colorScheme = ThemeLocalServiceUtil.getColorScheme(
617                                    companyId, themeId, colorSchemeId, wapTheme);
618    
619                            colorSchemeId = colorScheme.getColorSchemeId();
620                    }
621    
622                    return colorSchemeId;
623            }
624    
625            protected Group getGroup(PortletRequest portletRequest) throws Exception {
626                    return ActionUtil.getGroup(portletRequest);
627            }
628    
629            protected byte[] getIconBytes(
630                    UploadPortletRequest uploadPortletRequest, String iconFileName) {
631    
632                    InputStream inputStream = null;
633    
634                    try {
635                            inputStream = uploadPortletRequest.getFileAsStream(iconFileName);
636    
637                            if (inputStream != null) {
638                                    return FileUtil.getBytes(inputStream);
639                            }
640                    }
641                    catch (IOException ioe) {
642                            if (_log.isWarnEnabled()) {
643                                    _log.warn("Unable to retrieve icon", ioe);
644                            }
645                    }
646    
647                    return new byte[0];
648            }
649    
650            protected void inheritMobileRuleGroups(
651                            Layout layout, ServiceContext serviceContext)
652                    throws PortalException, SystemException {
653    
654                    List<MDRRuleGroupInstance> parentMDRRuleGroupInstances =
655                            MDRRuleGroupInstanceLocalServiceUtil.getRuleGroupInstances(
656                                    Layout.class.getName(), layout.getParentPlid());
657    
658                    for (MDRRuleGroupInstance parentMDRRuleGroupInstance :
659                                    parentMDRRuleGroupInstances) {
660    
661                            MDRRuleGroupInstance mdrRuleGroupInstance =
662                                    MDRRuleGroupInstanceServiceUtil.addRuleGroupInstance(
663                                            layout.getGroupId(), Layout.class.getName(),
664                                            layout.getPlid(),
665                                            parentMDRRuleGroupInstance.getRuleGroupId(),
666                                            parentMDRRuleGroupInstance.getPriority(), serviceContext);
667    
668                            List<MDRAction> parentMDRActions =
669                                    MDRActionLocalServiceUtil.getActions(
670                                            parentMDRRuleGroupInstance.getRuleGroupInstanceId());
671    
672                            for (MDRAction mdrAction : parentMDRActions) {
673                                    MDRActionServiceUtil.addAction(
674                                            mdrRuleGroupInstance.getRuleGroupInstanceId(),
675                                            mdrAction.getNameMap(), mdrAction.getDescriptionMap(),
676                                            mdrAction.getType(), mdrAction.getTypeSettings(),
677                                            serviceContext);
678                            }
679                    }
680            }
681    
682            @Override
683            protected boolean isCheckMethodOnProcessAction() {
684                    return _CHECK_METHOD_ON_PROCESS_ACTION;
685            }
686    
687            protected void selectLayoutBranch(ActionRequest actionRequest)
688                    throws Exception {
689    
690                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
691                            actionRequest);
692    
693                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
694                            WebKeys.THEME_DISPLAY);
695    
696                    long layoutSetBranchId = ParamUtil.getLong(
697                            actionRequest, "layoutSetBranchId");
698    
699                    long layoutBranchId = ParamUtil.getLong(
700                            actionRequest, "layoutBranchId");
701    
702                    StagingUtil.setRecentLayoutBranchId(
703                            request, layoutSetBranchId, themeDisplay.getPlid(), layoutBranchId);
704            }
705    
706            protected void selectLayoutSetBranch(ActionRequest actionRequest)
707                    throws Exception {
708    
709                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
710                            actionRequest);
711    
712                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
713                    boolean privateLayout = ParamUtil.getBoolean(
714                            actionRequest, "privateLayout");
715    
716                    LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
717                            groupId, privateLayout);
718    
719                    long layoutSetBranchId = ParamUtil.getLong(
720                            actionRequest, "layoutSetBranchId");
721    
722                    // Ensure layout set branch exists
723    
724                    LayoutSetBranch layoutSetBranch =
725                            LayoutSetBranchLocalServiceUtil.getLayoutSetBranch(
726                                    layoutSetBranchId);
727    
728                    StagingUtil.setRecentLayoutSetBranchId(
729                            request, layoutSet.getLayoutSetId(),
730                            layoutSetBranch.getLayoutSetBranchId());
731            }
732    
733            protected void setThemeSettingProperties(
734                            ActionRequest actionRequest,
735                            UnicodeProperties typeSettingsProperties, String themeId,
736                            Map<String, ThemeSetting> themeSettings, String device,
737                            String deviceThemeId)
738                    throws PortalException, SystemException {
739    
740                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
741                    boolean privateLayout = ParamUtil.getBoolean(
742                            actionRequest, "privateLayout");
743                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
744    
745                    Layout layout = LayoutLocalServiceUtil.getLayout(
746                            groupId, privateLayout, layoutId);
747    
748                    LayoutSet layoutSet = layout.getLayoutSet();
749    
750                    for (String key : themeSettings.keySet()) {
751                            ThemeSetting themeSetting = themeSettings.get(key);
752    
753                            String value = null;
754    
755                            if (!themeId.equals(deviceThemeId)) {
756                                    value = themeSetting.getValue();
757                            }
758                            else {
759                                    String property =
760                                            device + "ThemeSettingsProperties--" + key +
761                                                    StringPool.DOUBLE_DASH;
762    
763                                    value = ParamUtil.getString(actionRequest, property);
764                            }
765    
766                            if (!value.equals(layoutSet.getThemeSetting(key, device))) {
767                                    typeSettingsProperties.setProperty(
768                                            ThemeSettingImpl.namespaceProperty(device, key), value);
769                            }
770                    }
771            }
772    
773            protected String updateCloseRedirect(
774                    String closeRedirect, Group group, Layout layout,
775                    String oldLayoutFriendlyURL) {
776    
777                    if (Validator.isNull(closeRedirect) ||
778                            Validator.isNull(oldLayoutFriendlyURL)) {
779    
780                            return closeRedirect;
781                    }
782    
783                    if (layout != null) {
784                            String oldPath = oldLayoutFriendlyURL;
785                            String newPath = layout.getFriendlyURL();
786    
787                            return PortalUtil.updateRedirect(closeRedirect, oldPath, newPath);
788                    }
789                    else if (group != null) {
790                            String oldPath = group.getFriendlyURL() + oldLayoutFriendlyURL;
791                            String newPath = group.getFriendlyURL();
792    
793                            return PortalUtil.updateRedirect(closeRedirect, oldPath, newPath);
794                    }
795    
796                    return closeRedirect;
797            }
798    
799            protected void updateDisplayOrder(ActionRequest actionRequest)
800                    throws Exception {
801    
802                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
803                    boolean privateLayout = ParamUtil.getBoolean(
804                            actionRequest, "privateLayout");
805                    long parentLayoutId = ParamUtil.getLong(
806                            actionRequest, "parentLayoutId");
807                    long[] layoutIds = StringUtil.split(
808                            ParamUtil.getString(actionRequest, "layoutIds"), 0L);
809    
810                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
811                            actionRequest);
812    
813                    LayoutServiceUtil.setLayouts(
814                            groupId, privateLayout, parentLayoutId, layoutIds, serviceContext);
815            }
816    
817            protected Object[] updateLayout(
818                            ActionRequest actionRequest, ActionResponse actionResponse)
819                    throws Exception {
820    
821                    UploadPortletRequest uploadPortletRequest =
822                            PortalUtil.getUploadPortletRequest(actionRequest);
823    
824                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
825                            WebKeys.THEME_DISPLAY);
826    
827                    String cmd = ParamUtil.getString(uploadPortletRequest, Constants.CMD);
828    
829                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
830                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
831                    long stagingGroupId = ParamUtil.getLong(
832                            actionRequest, "stagingGroupId");
833                    boolean privateLayout = ParamUtil.getBoolean(
834                            actionRequest, "privateLayout");
835                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
836                    long parentLayoutId = ParamUtil.getLong(
837                            uploadPortletRequest, "parentLayoutId");
838                    Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
839                            actionRequest, "name");
840                    Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
841                            actionRequest, "title");
842                    Map<Locale, String> descriptionMap =
843                            LocalizationUtil.getLocalizationMap(actionRequest, "description");
844                    Map<Locale, String> keywordsMap = LocalizationUtil.getLocalizationMap(
845                            actionRequest, "keywords");
846                    Map<Locale, String> robotsMap = LocalizationUtil.getLocalizationMap(
847                            actionRequest, "robots");
848                    String type = ParamUtil.getString(uploadPortletRequest, "type");
849                    boolean hidden = ParamUtil.getBoolean(uploadPortletRequest, "hidden");
850                    String friendlyURL = ParamUtil.getString(
851                            uploadPortletRequest, "friendlyURL");
852                    boolean iconImage = ParamUtil.getBoolean(
853                            uploadPortletRequest, "iconImage");
854                    byte[] iconBytes = getIconBytes(uploadPortletRequest, "iconFileName");
855                    long layoutPrototypeId = ParamUtil.getLong(
856                            uploadPortletRequest, "layoutPrototypeId");
857    
858                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
859                            Layout.class.getName(), actionRequest);
860    
861                    Layout layout = null;
862                    UnicodeProperties layoutTypeSettingsProperties = null;
863                    String oldFriendlyURL = StringPool.BLANK;
864    
865                    if (cmd.equals(Constants.ADD)) {
866    
867                            // Add layout
868    
869                            boolean inheritFromParentLayoutId = ParamUtil.getBoolean(
870                                    uploadPortletRequest, "inheritFromParentLayoutId");
871    
872                            if (inheritFromParentLayoutId && (parentLayoutId > 0)) {
873                                    Layout parentLayout = LayoutLocalServiceUtil.getLayout(
874                                            groupId, privateLayout, parentLayoutId);
875    
876                                    layout = LayoutServiceUtil.addLayout(
877                                            groupId, privateLayout, parentLayoutId, nameMap, titleMap,
878                                            parentLayout.getDescriptionMap(),
879                                            parentLayout.getKeywordsMap(), parentLayout.getRobotsMap(),
880                                            parentLayout.getType(), hidden, friendlyURL,
881                                            serviceContext);
882    
883                                    LayoutServiceUtil.updateLayout(
884                                            layout.getGroupId(), layout.isPrivateLayout(),
885                                            layout.getLayoutId(), parentLayout.getTypeSettings());
886    
887                                    inheritMobileRuleGroups(layout, serviceContext);
888    
889                                    if (parentLayout.isTypePortlet()) {
890                                            ActionUtil.copyPreferences(
891                                                    actionRequest, layout, parentLayout);
892    
893                                            SitesUtil.copyLookAndFeel(layout, parentLayout);
894                                    }
895                            }
896                            else if (layoutPrototypeId > 0) {
897                                    LayoutPrototype layoutPrototype =
898                                            LayoutPrototypeServiceUtil.getLayoutPrototype(
899                                                    layoutPrototypeId);
900    
901                                    String layoutPrototypeLinkEnabled= ParamUtil.getString(
902                                            uploadPortletRequest, "layoutPrototypeLinkEnabled");
903    
904                                    if (Validator.isNotNull(layoutPrototypeLinkEnabled)) {
905                                            serviceContext.setAttribute(
906                                                    "layoutPrototypeLinkEnabled",
907                                                    layoutPrototypeLinkEnabled);
908                                    }
909    
910                                    serviceContext.setAttribute(
911                                            "layoutPrototypeUuid", layoutPrototype.getUuid());
912    
913                                    layout = LayoutServiceUtil.addLayout(
914                                            groupId, privateLayout, parentLayoutId, nameMap, titleMap,
915                                            descriptionMap, keywordsMap, robotsMap,
916                                            LayoutConstants.TYPE_PORTLET, hidden, friendlyURL,
917                                            serviceContext);
918                            }
919                            else {
920                                    layout = LayoutServiceUtil.addLayout(
921                                            groupId, privateLayout, parentLayoutId, nameMap, titleMap,
922                                            descriptionMap, keywordsMap, robotsMap, type, hidden,
923                                            friendlyURL, serviceContext);
924                            }
925    
926                            layoutTypeSettingsProperties = layout.getTypeSettingsProperties();
927                    }
928                    else {
929    
930                            // Update layout
931    
932                            layout = LayoutLocalServiceUtil.getLayout(
933                                    groupId, privateLayout, layoutId);
934    
935                            oldFriendlyURL = layout.getFriendlyURL();
936    
937                            layout = LayoutServiceUtil.updateLayout(
938                                    groupId, privateLayout, layoutId, layout.getParentLayoutId(),
939                                    nameMap, titleMap, descriptionMap, keywordsMap, robotsMap, type,
940                                    hidden, friendlyURL, Boolean.valueOf(iconImage), iconBytes,
941                                    serviceContext);
942    
943                            layoutTypeSettingsProperties = layout.getTypeSettingsProperties();
944    
945                            if (oldFriendlyURL.equals(layout.getFriendlyURL())) {
946                                    oldFriendlyURL = StringPool.BLANK;
947                            }
948    
949                            UnicodeProperties formTypeSettingsProperties =
950                                    PropertiesParamUtil.getProperties(
951                                            actionRequest, "TypeSettingsProperties--");
952    
953                            if (type.equals(LayoutConstants.TYPE_PORTLET)) {
954                                    LayoutTypePortlet layoutTypePortlet =
955                                            (LayoutTypePortlet)layout.getLayoutType();
956    
957                                    String layoutTemplateId = ParamUtil.getString(
958                                            uploadPortletRequest, "layoutTemplateId",
959                                            PropsValues.DEFAULT_LAYOUT_TEMPLATE_ID);
960    
961                                    layoutTypePortlet.setLayoutTemplateId(
962                                            themeDisplay.getUserId(), layoutTemplateId);
963    
964                                    long copyLayoutId = ParamUtil.getLong(
965                                            uploadPortletRequest, "copyLayoutId");
966    
967                                    if ((copyLayoutId > 0) &&
968                                            (copyLayoutId != layout.getLayoutId())) {
969    
970                                            try {
971                                                    Layout copyLayout = LayoutLocalServiceUtil.getLayout(
972                                                            groupId, privateLayout, copyLayoutId);
973    
974                                                    if (copyLayout.isTypePortlet()) {
975                                                            layoutTypeSettingsProperties =
976                                                                    copyLayout.getTypeSettingsProperties();
977    
978                                                            ActionUtil.copyPreferences(
979                                                                    actionRequest, layout, copyLayout);
980    
981                                                            SitesUtil.copyLookAndFeel(layout, copyLayout);
982                                                    }
983                                            }
984                                            catch (NoSuchLayoutException nsle) {
985                                            }
986                                    }
987                                    else {
988                                            layoutTypeSettingsProperties.putAll(
989                                                    formTypeSettingsProperties);
990    
991                                            LayoutServiceUtil.updateLayout(
992                                                    groupId, privateLayout, layoutId,
993                                                    layout.getTypeSettings());
994                                    }
995                            }
996                            else {
997                                    layout.setTypeSettingsProperties(formTypeSettingsProperties);
998    
999                                    layoutTypeSettingsProperties.putAll(
1000                                            layout.getTypeSettingsProperties());
1001    
1002                                    LayoutServiceUtil.updateLayout(
1003                                            groupId, privateLayout, layoutId, layout.getTypeSettings());
1004                            }
1005    
1006                            String[] removeEmbeddedPortletIds = ParamUtil.getParameterValues(
1007                                    actionRequest, "removeEmbeddedPortletIds");
1008    
1009                            if (removeEmbeddedPortletIds.length > 0) {
1010                                    PortletLocalServiceUtil.deletePortlets(
1011                                            themeDisplay.getCompanyId(), removeEmbeddedPortletIds,
1012                                            layout.getPlid());
1013                            }
1014    
1015                            LayoutSettings layoutSettings = LayoutSettings.getInstance(layout);
1016    
1017                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
1018                                    actionResponse);
1019    
1020                            EventsProcessorUtil.process(
1021                                    PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE,
1022                                    layoutSettings.getConfigurationActionUpdate(),
1023                                    uploadPortletRequest, response);
1024                    }
1025    
1026                    updateLookAndFeel(
1027                            actionRequest, themeDisplay.getCompanyId(), liveGroupId,
1028                            stagingGroupId, privateLayout, layout.getLayoutId(),
1029                            layoutTypeSettingsProperties, layout.getThemeId());
1030    
1031                    return new Object[] {layout, oldFriendlyURL};
1032            }
1033    
1034            protected void updateLayoutRevision(
1035                            ActionRequest actionRequest, ThemeDisplay themeDisplay)
1036                    throws Exception {
1037    
1038                    long layoutRevisionId = ParamUtil.getLong(
1039                            actionRequest, "layoutRevisionId");
1040    
1041                    LayoutRevision layoutRevision =
1042                            LayoutRevisionLocalServiceUtil.getLayoutRevision(layoutRevisionId);
1043    
1044                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
1045                            actionRequest);
1046    
1047                    LayoutRevision enableLayoutRevision =
1048                            LayoutRevisionLocalServiceUtil.updateLayoutRevision(
1049                            serviceContext.getUserId(), layoutRevisionId,
1050                            layoutRevision.getLayoutBranchId(), layoutRevision.getName(),
1051                            layoutRevision.getTitle(), layoutRevision.getDescription(),
1052                            layoutRevision.getKeywords(), layoutRevision.getRobots(),
1053                            layoutRevision.getTypeSettings(), layoutRevision.getIconImage(),
1054                            layoutRevision.getIconImageId(), layoutRevision.getThemeId(),
1055                            layoutRevision.getColorSchemeId(), layoutRevision.getWapThemeId(),
1056                            layoutRevision.getWapColorSchemeId(), layoutRevision.getCss(),
1057                            serviceContext);
1058    
1059                    if (layoutRevision.getStatus() == WorkflowConstants.STATUS_INCOMPLETE) {
1060                            LayoutRevision lastLayoutRevision =
1061                                    LayoutRevisionLocalServiceUtil.fetchLastLayoutRevision(
1062                                            enableLayoutRevision.getPlid(), true);
1063    
1064                            if (lastLayoutRevision != null) {
1065                                    LayoutRevision newLayoutRevision =
1066                                            LayoutRevisionLocalServiceUtil.addLayoutRevision(
1067                                                    serviceContext.getUserId(),
1068                                                    layoutRevision.getLayoutSetBranchId(),
1069                                                    layoutRevision.getLayoutBranchId(),
1070                                                    enableLayoutRevision.getLayoutRevisionId(), false,
1071                                                    layoutRevision.getPlid(),
1072                                                    lastLayoutRevision.getLayoutRevisionId(),
1073                                                    lastLayoutRevision.getPrivateLayout(),
1074                                                    lastLayoutRevision.getName(),
1075                                                    lastLayoutRevision.getTitle(),
1076                                                    lastLayoutRevision.getDescription(),
1077                                                    lastLayoutRevision.getKeywords(),
1078                                                    lastLayoutRevision.getRobots(),
1079                                                    lastLayoutRevision.getTypeSettings(),
1080                                                    lastLayoutRevision.isIconImage(),
1081                                                    lastLayoutRevision.getIconImageId(),
1082                                                    lastLayoutRevision.getThemeId(),
1083                                                    lastLayoutRevision.getColorSchemeId(),
1084                                                    lastLayoutRevision.getWapThemeId(),
1085                                                    lastLayoutRevision.getWapColorSchemeId(),
1086                                                    lastLayoutRevision.getCss(), serviceContext);
1087    
1088                                    StagingUtil.setRecentLayoutRevisionId(
1089                                            themeDisplay.getUser(),
1090                                            newLayoutRevision.getLayoutSetBranchId(),
1091                                            newLayoutRevision.getPlid(),
1092                                            newLayoutRevision.getLayoutRevisionId());
1093                            }
1094                    }
1095            }
1096    
1097            protected void updateLookAndFeel(
1098                            ActionRequest actionRequest, long companyId, long liveGroupId,
1099                            long stagingGroupId, boolean privateLayout, long layoutId,
1100                            UnicodeProperties typeSettingsProperties, String themeId)
1101                    throws Exception {
1102    
1103                    String[] devices = StringUtil.split(
1104                            ParamUtil.getString(actionRequest, "devices"));
1105    
1106                    for (String device : devices) {
1107                            String deviceThemeId = ParamUtil.getString(
1108                                    actionRequest, device + "ThemeId");
1109                            String deviceColorSchemeId = ParamUtil.getString(
1110                                    actionRequest, device + "ColorSchemeId");
1111                            String deviceCss = ParamUtil.getString(
1112                                    actionRequest, device + "Css");
1113                            boolean deviceWapTheme = device.equals("wap");
1114    
1115                            boolean deviceInheritLookAndFeel = ParamUtil.getBoolean(
1116                                    actionRequest, device + "InheritLookAndFeel");
1117    
1118                            if (deviceInheritLookAndFeel) {
1119                                    deviceThemeId = ThemeImpl.getDefaultRegularThemeId(companyId);
1120                                    deviceColorSchemeId = StringPool.BLANK;
1121    
1122                                    deleteThemeSettingsProperties(typeSettingsProperties, device);
1123                            }
1124                            else if (Validator.isNotNull(deviceThemeId)) {
1125                                    deviceColorSchemeId = getColorSchemeId(
1126                                            companyId, deviceThemeId, deviceColorSchemeId,
1127                                            deviceWapTheme);
1128    
1129                                    updateThemeSettingsProperties(
1130                                            actionRequest, companyId, typeSettingsProperties, themeId,
1131                                            device, deviceThemeId, deviceWapTheme);
1132                            }
1133    
1134                            long groupId = liveGroupId;
1135    
1136                            if (stagingGroupId > 0) {
1137                                    groupId = stagingGroupId;
1138                            }
1139    
1140                            LayoutServiceUtil.updateLayout(
1141                                    groupId, privateLayout, layoutId,
1142                                    typeSettingsProperties.toString());
1143    
1144                            LayoutServiceUtil.updateLookAndFeel(
1145                                    groupId, privateLayout, layoutId, deviceThemeId,
1146                                    deviceColorSchemeId, deviceCss, deviceWapTheme);
1147                    }
1148            }
1149    
1150            protected UnicodeProperties updateThemeSettingsProperties(
1151                            ActionRequest actionRequest, long companyId,
1152                            UnicodeProperties typeSettingsProperties, String themeId,
1153                            String device, String deviceThemeId, boolean wapTheme)
1154                    throws Exception {
1155    
1156                    Theme theme = ThemeLocalServiceUtil.getTheme(
1157                            companyId, deviceThemeId, wapTheme);
1158    
1159                    deleteThemeSettingsProperties(typeSettingsProperties, device);
1160    
1161                    Map<String, ThemeSetting> themeSettings =
1162                            theme.getConfigurableSettings();
1163    
1164                    if (themeSettings.isEmpty()) {
1165                            return typeSettingsProperties;
1166                    }
1167    
1168                    setThemeSettingProperties(
1169                            actionRequest, typeSettingsProperties, themeId, themeSettings,
1170                            device, deviceThemeId);
1171    
1172                    return typeSettingsProperties;
1173            }
1174    
1175            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
1176    
1177            private static Log _log = LogFactoryUtil.getLog(EditLayoutsAction.class);
1178    
1179    }