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