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