1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portlet.communities.action;
16  
17  import com.liferay.portal.LayoutFriendlyURLException;
18  import com.liferay.portal.LayoutHiddenException;
19  import com.liferay.portal.LayoutNameException;
20  import com.liferay.portal.LayoutParentLayoutIdException;
21  import com.liferay.portal.LayoutSetVirtualHostException;
22  import com.liferay.portal.LayoutTypeException;
23  import com.liferay.portal.NoSuchGroupException;
24  import com.liferay.portal.NoSuchLayoutException;
25  import com.liferay.portal.RemoteExportException;
26  import com.liferay.portal.RequiredLayoutException;
27  import com.liferay.portal.events.EventsProcessorUtil;
28  import com.liferay.portal.kernel.servlet.SessionErrors;
29  import com.liferay.portal.kernel.upload.UploadPortletRequest;
30  import com.liferay.portal.kernel.util.Constants;
31  import com.liferay.portal.kernel.util.FileUtil;
32  import com.liferay.portal.kernel.util.GetterUtil;
33  import com.liferay.portal.kernel.util.HttpUtil;
34  import com.liferay.portal.kernel.util.LocalizationUtil;
35  import com.liferay.portal.kernel.util.ParamUtil;
36  import com.liferay.portal.kernel.util.PropertiesParamUtil;
37  import com.liferay.portal.kernel.util.PropsKeys;
38  import com.liferay.portal.kernel.util.StringBundler;
39  import com.liferay.portal.kernel.util.StringPool;
40  import com.liferay.portal.kernel.util.StringUtil;
41  import com.liferay.portal.kernel.util.UnicodeProperties;
42  import com.liferay.portal.kernel.util.Validator;
43  import com.liferay.portal.model.ColorScheme;
44  import com.liferay.portal.model.Group;
45  import com.liferay.portal.model.Layout;
46  import com.liferay.portal.model.LayoutConstants;
47  import com.liferay.portal.model.User;
48  import com.liferay.portal.security.auth.PrincipalException;
49  import com.liferay.portal.security.permission.ActionKeys;
50  import com.liferay.portal.security.permission.PermissionChecker;
51  import com.liferay.portal.service.GroupLocalServiceUtil;
52  import com.liferay.portal.service.GroupServiceUtil;
53  import com.liferay.portal.service.LayoutLocalServiceUtil;
54  import com.liferay.portal.service.LayoutServiceUtil;
55  import com.liferay.portal.service.LayoutSetServiceUtil;
56  import com.liferay.portal.service.ThemeLocalServiceUtil;
57  import com.liferay.portal.service.UserLocalServiceUtil;
58  import com.liferay.portal.service.permission.GroupPermissionUtil;
59  import com.liferay.portal.service.permission.LayoutPermissionUtil;
60  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
61  import com.liferay.portal.service.permission.UserPermissionUtil;
62  import com.liferay.portal.struts.PortletAction;
63  import com.liferay.portal.theme.ThemeDisplay;
64  import com.liferay.portal.util.LayoutSettings;
65  import com.liferay.portal.util.PortalUtil;
66  import com.liferay.portal.util.PropsValues;
67  import com.liferay.portal.util.WebKeys;
68  import com.liferay.portlet.communities.util.CommunitiesUtil;
69  import com.liferay.portlet.communities.util.StagingUtil;
70  import com.liferay.portlet.tasks.NoSuchProposalException;
71  import com.liferay.util.servlet.UploadException;
72  
73  import java.io.File;
74  
75  import java.util.Locale;
76  import java.util.Map;
77  
78  import javax.portlet.ActionRequest;
79  import javax.portlet.ActionResponse;
80  import javax.portlet.PortletConfig;
81  import javax.portlet.PortletRequest;
82  import javax.portlet.PortletRequestDispatcher;
83  import javax.portlet.RenderRequest;
84  import javax.portlet.RenderResponse;
85  import javax.portlet.ResourceRequest;
86  import javax.portlet.ResourceResponse;
87  
88  import javax.servlet.http.HttpServletResponse;
89  
90  import org.apache.struts.action.ActionForm;
91  import org.apache.struts.action.ActionForward;
92  import org.apache.struts.action.ActionMapping;
93  
94  /**
95   * <a href="EditPagesAction.java.html"><b><i>View Source</i></b></a>
96   *
97   * @author Brian Wing Shun Chan
98   */
99  public class EditPagesAction extends PortletAction {
100 
101     public void processAction(
102             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
103             ActionRequest actionRequest, ActionResponse actionResponse)
104         throws Exception {
105 
106         try {
107             checkPermissions(actionRequest);
108         }
109         catch (PrincipalException pe) {
110             return;
111         }
112 
113         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
114 
115         try {
116             Layout layout = null;
117             String oldFriendlyURL = StringPool.BLANK;
118 
119             if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
120                 Object[] returnValue = updateLayout(
121                     actionRequest, actionResponse);
122 
123                 layout = (Layout)returnValue[0];
124                 oldFriendlyURL = (String)returnValue[1];
125             }
126             else if (cmd.equals(Constants.DELETE)) {
127                 CommunitiesUtil.deleteLayout(actionRequest, actionResponse);
128             }
129             else if (cmd.equals("copy_from_live")) {
130                 StagingUtil.copyFromLive(actionRequest);
131             }
132             else if (cmd.equals("display_order")) {
133                 updateDisplayOrder(actionRequest);
134             }
135             else if (cmd.equals("logo")) {
136                 updateLogo(actionRequest);
137             }
138             else if (cmd.equals("look_and_feel")) {
139                 updateLookAndFeel(actionRequest);
140             }
141             else if (cmd.equals("merge_pages")) {
142                 updateMergePages(actionRequest);
143             }
144             else if (cmd.equals("monitoring")) {
145                 updateMonitoring(actionRequest);
146             }
147             else if (cmd.equals("publish_to_live")) {
148                 StagingUtil.publishToLive(actionRequest);
149             }
150             else if (cmd.equals("publish_to_remote")) {
151                 StagingUtil.publishToRemote(actionRequest);
152             }
153             else if (cmd.equals("schedule_copy_from_live")) {
154                 StagingUtil.scheduleCopyFromLive(actionRequest);
155             }
156             else if (cmd.equals("schedule_publish_to_live")) {
157                 StagingUtil.schedulePublishToLive(actionRequest);
158             }
159             else if (cmd.equals("schedule_publish_to_remote")) {
160                 StagingUtil.schedulePublishToRemote(actionRequest);
161             }
162             else if (cmd.equals("staging")) {
163                 StagingUtil.updateStaging(actionRequest);
164             }
165             else if (cmd.equals("unschedule_copy_from_live")) {
166                 StagingUtil.unscheduleCopyFromLive(actionRequest);
167             }
168             else if (cmd.equals("unschedule_publish_to_live")) {
169                 StagingUtil.unschedulePublishToLive(actionRequest);
170             }
171             else if (cmd.equals("unschedule_publish_to_remote")) {
172                 StagingUtil.unschedulePublishToRemote(actionRequest);
173             }
174             else if (cmd.equals("virtual_host")) {
175                 updateVirtualHost(actionRequest);
176             }
177             else if (cmd.equals("workflow")) {
178                 updateWorkflow(actionRequest);
179             }
180 
181             String redirect = ParamUtil.getString(
182                 actionRequest, "pagesRedirect");
183 
184             if ((layout != null) && Validator.isNotNull(oldFriendlyURL)) {
185                 ThemeDisplay themeDisplay =
186                     (ThemeDisplay)actionRequest.getAttribute(
187                         WebKeys.THEME_DISPLAY);
188 
189                 if (layout.getPlid() == themeDisplay.getPlid()) {
190                     Group group = layout.getGroup();
191 
192                     String oldPath = group.getFriendlyURL() + oldFriendlyURL;
193                     String newPath =
194                         group.getFriendlyURL() + layout.getFriendlyURL();
195 
196                     redirect = StringUtil.replace(redirect, oldPath, newPath);
197 
198                     redirect = StringUtil.replace(
199                         redirect, HttpUtil.encodeURL(oldPath),
200                         HttpUtil.encodeURL(newPath));
201                 }
202             }
203 
204             sendRedirect(actionRequest, actionResponse, redirect);
205         }
206         catch (Exception e) {
207             if (e instanceof NoSuchLayoutException ||
208                 e instanceof NoSuchProposalException ||
209                 e instanceof PrincipalException) {
210 
211                 SessionErrors.add(actionRequest, e.getClass().getName());
212 
213                 setForward(actionRequest, "portlet.communities.error");
214             }
215             else if (e instanceof RemoteExportException) {
216                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
217 
218                 String redirect = ParamUtil.getString(
219                     actionRequest, "pagesRedirect");
220 
221                 sendRedirect(actionRequest, actionResponse, redirect);
222             }
223             else if (e instanceof LayoutFriendlyURLException ||
224                      e instanceof LayoutHiddenException ||
225                      e instanceof LayoutNameException ||
226                      e instanceof LayoutParentLayoutIdException ||
227                      e instanceof LayoutSetVirtualHostException ||
228                      e instanceof LayoutTypeException ||
229                      e instanceof RequiredLayoutException ||
230                      e instanceof UploadException) {
231 
232                 if (e instanceof LayoutFriendlyURLException) {
233                     SessionErrors.add(
234                         actionRequest,
235                         LayoutFriendlyURLException.class.getName(), e);
236                 }
237                 else {
238                     SessionErrors.add(actionRequest, e.getClass().getName(), e);
239                 }
240             }
241             else {
242                 throw e;
243             }
244         }
245     }
246 
247     public ActionForward render(
248             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
249             RenderRequest renderRequest, RenderResponse renderResponse)
250         throws Exception {
251 
252         try {
253             checkPermissions(renderRequest);
254         }
255         catch (PrincipalException pe) {
256             SessionErrors.add(
257                 renderRequest, PrincipalException.class.getName());
258 
259             return mapping.findForward("portlet.communities.error");
260         }
261 
262         try {
263             ActionUtil.getGroup(renderRequest);
264         }
265         catch (Exception e) {
266             if (e instanceof NoSuchGroupException ||
267                 e instanceof PrincipalException) {
268 
269                 SessionErrors.add(renderRequest, e.getClass().getName());
270 
271                 return mapping.findForward("portlet.communities.error");
272             }
273             else {
274                 throw e;
275             }
276         }
277 
278         return mapping.findForward(
279             getForward(renderRequest, "portlet.communities.edit_pages"));
280     }
281 
282     public void serveResource(
283             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
284             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
285         throws Exception {
286 
287         String resourceId = GetterUtil.getString(
288             resourceRequest.getResourceID());
289 
290         if (resourceId.equals("/html/portlet/communities/tree_js_node.jsp")) {
291             long groupId = ParamUtil.getLong(resourceRequest, "groupId");
292             boolean privateLayout = ParamUtil.getBoolean(
293                 resourceRequest, "privateLayout");
294             long parentLayoutId = ParamUtil.getLong(
295                 resourceRequest, "parentLayoutId");
296             long nodeId = ParamUtil.getLong(resourceRequest, "nodeId");
297             long[] openNodes = StringUtil.split(
298                 ParamUtil.getString(resourceRequest, "openNodes"), 0L);
299             boolean selectableTree = ParamUtil.getBoolean(
300                 resourceRequest, "selectableTree");
301             long[] selectedNodes = StringUtil.split(
302                 ParamUtil.getString(resourceRequest, "selectedNodes"), 0L);
303             String portletURL = ParamUtil.getString(
304                 resourceRequest, "portletURL");
305 
306             resourceRequest.setAttribute(WebKeys.TREE_GROUP_ID, groupId);
307             resourceRequest.setAttribute(
308                 WebKeys.TREE_PRIVATE_LAYOUT, privateLayout);
309             resourceRequest.setAttribute(
310                 WebKeys.TREE_PARENT_LAYOUT_ID, parentLayoutId);
311             resourceRequest.setAttribute(WebKeys.TREE_NODE_ID, nodeId);
312             resourceRequest.setAttribute(WebKeys.TREE_OPEN_NODES, openNodes);
313             resourceRequest.setAttribute(
314                 WebKeys.TREE_SELECTABLE_TREE, selectableTree);
315             resourceRequest.setAttribute(
316                 WebKeys.TREE_SELECTED_NODES, selectedNodes);
317             resourceRequest.setAttribute(WebKeys.TREE_PORTLET_URL, portletURL);
318             resourceRequest.setAttribute(
319                 WebKeys.TREE_RENDER_CHILDREN_ONLY, true);
320         }
321         else {
322             resourceId =
323                 "/html/portlet/communities/scheduled_publishing_events.jsp";
324         }
325 
326         PortletRequestDispatcher portletRequestDispatcher =
327             portletConfig.getPortletContext().getRequestDispatcher(resourceId);
328 
329         portletRequestDispatcher.include(resourceRequest, resourceResponse);
330     }
331 
332     protected void checkPermissions(PortletRequest portletRequest)
333         throws Exception {
334 
335         // LEP-850
336 
337         ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
338             WebKeys.THEME_DISPLAY);
339 
340         PermissionChecker permissionChecker =
341             themeDisplay.getPermissionChecker();
342 
343         long groupId = ParamUtil.getLong(portletRequest, "groupId");
344 
345         Group group = GroupLocalServiceUtil.getGroup(groupId);
346 
347         Layout layout = themeDisplay.getLayout();
348 
349         boolean hasUpdateLayoutPermission = false;
350 
351         if (layout != null) {
352             hasUpdateLayoutPermission = LayoutPermissionUtil.contains(
353                 permissionChecker, layout.getGroupId(),
354                 layout.isPrivateLayout(), layout.getLayoutId(),
355                 ActionKeys.UPDATE);
356         }
357 
358         if (group.isCommunity()) {
359             String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
360 
361             boolean publishToLive =
362                 GroupPermissionUtil.contains(
363                     permissionChecker, group.getGroupId(),
364                     ActionKeys.PUBLISH_STAGING) &&
365                 cmd.equals("publish_to_live");
366 
367             if (!GroupPermissionUtil.contains(
368                     permissionChecker, group.getGroupId(),
369                     ActionKeys.APPROVE_PROPOSAL) &&
370                 !GroupPermissionUtil.contains(
371                     permissionChecker, group.getGroupId(),
372                     ActionKeys.MANAGE_LAYOUTS) &&
373                 !hasUpdateLayoutPermission && !publishToLive) {
374 
375                 throw new PrincipalException();
376             }
377         }
378         else if (group.isOrganization()) {
379             long organizationId = group.getClassPK();
380 
381             String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
382 
383             boolean publishToLive =
384                 OrganizationPermissionUtil.contains(
385                     permissionChecker, organizationId,
386                     ActionKeys.PUBLISH_STAGING) &&
387                 cmd.equals("publish_to_live");
388 
389             if (!OrganizationPermissionUtil.contains(
390                     permissionChecker, organizationId,
391                     ActionKeys.APPROVE_PROPOSAL) &&
392                 !OrganizationPermissionUtil.contains(
393                     permissionChecker, organizationId,
394                     ActionKeys.MANAGE_LAYOUTS) &&
395                 !hasUpdateLayoutPermission && !publishToLive) {
396 
397                 throw new PrincipalException();
398             }
399         }
400         else if (group.isUser()) {
401             long groupUserId = group.getClassPK();
402 
403             User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
404 
405             long[] organizationIds = groupUser.getOrganizationIds();
406 
407             UserPermissionUtil.check(
408                 permissionChecker, groupUserId, organizationIds,
409                 ActionKeys.UPDATE);
410 
411             if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE &&
412                  !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE) {
413 
414                 throw new PrincipalException();
415             }
416         }
417     }
418 
419     protected UnicodeProperties getTypeSettingsProperties(
420         ActionRequest actionRequest) {
421 
422         return PropertiesParamUtil.getProperties(
423             actionRequest, "TypeSettingsProperties(");
424     }
425 
426     protected void updateDisplayOrder(ActionRequest actionRequest)
427         throws Exception {
428 
429         long groupId = ParamUtil.getLong(actionRequest, "groupId");
430         boolean privateLayout = ParamUtil.getBoolean(
431             actionRequest, "privateLayout");
432         long parentLayoutId = ParamUtil.getLong(
433             actionRequest, "parentLayoutId");
434         long[] layoutIds = StringUtil.split(
435             ParamUtil.getString(actionRequest, "layoutIds"), 0L);
436 
437         LayoutServiceUtil.setLayouts(
438             groupId, privateLayout, parentLayoutId, layoutIds);
439     }
440 
441     protected Object[] updateLayout(
442             ActionRequest actionRequest, ActionResponse actionResponse)
443         throws Exception {
444 
445         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
446             actionRequest);
447 
448         String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
449 
450         long groupId = ParamUtil.getLong(actionRequest, "groupId");
451         boolean privateLayout = ParamUtil.getBoolean(
452             actionRequest, "privateLayout");
453         long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
454         long parentLayoutId = ParamUtil.getLong(
455             uploadRequest, "parentLayoutId");
456         String description = ParamUtil.getString(uploadRequest, "description");
457         String type = ParamUtil.getString(uploadRequest, "type");
458         boolean hidden = ParamUtil.getBoolean(uploadRequest, "hidden");
459         String friendlyURL = ParamUtil.getString(uploadRequest, "friendlyURL");
460         boolean iconImage = ParamUtil.getBoolean(uploadRequest, "iconImage");
461         byte[] iconBytes = FileUtil.getBytes(
462             uploadRequest.getFile("iconFileName"));
463 
464         boolean inheritFromParentLayoutId = ParamUtil.getBoolean(
465             uploadRequest, "inheritFromParentLayoutId");
466 
467         long copyLayoutId = ParamUtil.getLong(uploadRequest, "copyLayoutId");
468 
469         Map<Locale, String> localeNamesMap =
470             LocalizationUtil.getLocalizationMap(actionRequest, "name");
471         Map<Locale, String> localeTitlesMap =
472             LocalizationUtil.getLocalizationMap(actionRequest, "title");
473 
474         Layout layout = null;
475         String oldFriendlyURL = StringPool.BLANK;
476 
477         if (cmd.equals(Constants.ADD)) {
478 
479             // Add layout
480 
481             if (inheritFromParentLayoutId && (parentLayoutId > 0)) {
482                 Layout parentLayout = LayoutLocalServiceUtil.getLayout(
483                     groupId, privateLayout, parentLayoutId);
484 
485                 layout = LayoutServiceUtil.addLayout(
486                     groupId, privateLayout, parentLayoutId, localeNamesMap,
487                     localeTitlesMap, description, parentLayout.getType(),
488                     hidden, friendlyURL);
489 
490                 LayoutServiceUtil.updateLayout(
491                     layout.getGroupId(), layout.isPrivateLayout(),
492                     layout.getLayoutId(), parentLayout.getTypeSettings());
493 
494                 if (parentLayout.isTypePortlet()) {
495                     ActionUtil.copyPreferences(
496                         actionRequest, layout, parentLayout);
497                 }
498             }
499             else {
500                 LayoutServiceUtil.addLayout(
501                     groupId, privateLayout, parentLayoutId, localeNamesMap,
502                     localeTitlesMap, description, type, hidden, friendlyURL);
503             }
504         }
505         else {
506 
507             // Update layout
508 
509             layout = LayoutLocalServiceUtil.getLayout(
510                 groupId, privateLayout, layoutId);
511 
512             oldFriendlyURL = layout.getFriendlyURL();
513 
514             layout = LayoutServiceUtil.updateLayout(
515                 groupId, privateLayout, layoutId, layout.getParentLayoutId(),
516                 localeNamesMap, localeTitlesMap, description, type, hidden,
517                 friendlyURL, Boolean.valueOf(iconImage), iconBytes);
518 
519             if (oldFriendlyURL.equals(layout.getFriendlyURL())) {
520                 oldFriendlyURL = StringPool.BLANK;
521             }
522 
523             UnicodeProperties formTypeSettingsProperties =
524                 getTypeSettingsProperties(actionRequest);
525 
526             if (type.equals(LayoutConstants.TYPE_PORTLET)) {
527                 if ((copyLayoutId > 0) &&
528                     (copyLayoutId != layout.getLayoutId())) {
529 
530                     try {
531                         Layout copyLayout = LayoutLocalServiceUtil.getLayout(
532                             groupId, privateLayout, copyLayoutId);
533 
534                         if (copyLayout.isTypePortlet()) {
535                             LayoutServiceUtil.updateLayout(
536                                 groupId, privateLayout, layoutId,
537                                 copyLayout.getTypeSettings());
538 
539                             ActionUtil.copyPreferences(
540                                 actionRequest, layout, copyLayout);
541                         }
542                     }
543                     catch (NoSuchLayoutException nsle) {
544                     }
545                 }
546                 else {
547                     UnicodeProperties layoutTypeSettingsProperties =
548                         layout.getTypeSettingsProperties();
549 
550                     for (String property: formTypeSettingsProperties.keySet()) {
551                         layoutTypeSettingsProperties.setProperty(
552                             property,
553                             formTypeSettingsProperties.getProperty(property));
554                     }
555 
556                     LayoutServiceUtil.updateLayout(
557                         groupId, privateLayout, layoutId,
558                         layout.getTypeSettings());
559                 }
560             }
561             else {
562                 layout.setTypeSettingsProperties(formTypeSettingsProperties);
563 
564                 LayoutServiceUtil.updateLayout(
565                     groupId, privateLayout, layoutId, layout.getTypeSettings());
566             }
567 
568             HttpServletResponse response = PortalUtil.getHttpServletResponse(
569                 actionResponse);
570 
571             LayoutSettings layoutSettings = LayoutSettings.getInstance(layout);
572 
573             EventsProcessorUtil.process(
574                 PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE,
575                 layoutSettings.getConfigurationActionUpdate(), uploadRequest,
576                 response);
577         }
578 
579         return new Object[] {layout, oldFriendlyURL};
580     }
581 
582     protected void updateLogo(ActionRequest actionRequest) throws Exception {
583         UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
584             actionRequest);
585 
586         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
587         long stagingGroupId = ParamUtil.getLong(
588             actionRequest, "stagingGroupId");
589 
590         boolean privateLayout = ParamUtil.getBoolean(
591             actionRequest, "privateLayout");
592         boolean logo = ParamUtil.getBoolean(actionRequest, "logo");
593 
594         File file = uploadRequest.getFile("logoFileName");
595         byte[] bytes = FileUtil.getBytes(file);
596 
597         if (logo && ((bytes == null) || (bytes.length == 0))) {
598             throw new UploadException();
599         }
600 
601         LayoutSetServiceUtil.updateLogo(liveGroupId, privateLayout, logo, file);
602 
603         if (stagingGroupId > 0) {
604             LayoutSetServiceUtil.updateLogo(
605                 stagingGroupId, privateLayout, logo, file);
606         }
607     }
608 
609     protected void updateLookAndFeel(ActionRequest actionRequest)
610         throws Exception {
611 
612         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
613             WebKeys.THEME_DISPLAY);
614 
615         long companyId = themeDisplay.getCompanyId();
616 
617         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
618         long stagingGroupId = ParamUtil.getLong(
619             actionRequest, "stagingGroupId");
620 
621         boolean privateLayout = ParamUtil.getBoolean(
622             actionRequest, "privateLayout");
623         long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
624         String themeId = ParamUtil.getString(actionRequest, "themeId");
625         String colorSchemeId = ParamUtil.getString(
626             actionRequest, "colorSchemeId");
627         String css = ParamUtil.getString(actionRequest, "css");
628         boolean wapTheme = ParamUtil.getBoolean(actionRequest, "wapTheme");
629 
630         if (stagingGroupId > 0) {
631             updateLookAndFeel(
632                 companyId, stagingGroupId, privateLayout, layoutId, themeId,
633                 colorSchemeId, css, wapTheme);
634         }
635         else {
636             updateLookAndFeel(
637                 companyId, liveGroupId, privateLayout, layoutId, themeId,
638                 colorSchemeId, css, wapTheme);
639         }
640     }
641 
642     protected void updateLookAndFeel(
643             long companyId, long groupId, boolean privateLayout, long layoutId,
644             String themeId, String colorSchemeId, String css, boolean wapTheme)
645         throws Exception {
646 
647         if (Validator.isNotNull(themeId) && Validator.isNull(colorSchemeId)) {
648             ColorScheme colorScheme = ThemeLocalServiceUtil.getColorScheme(
649                 companyId, themeId, colorSchemeId, wapTheme);
650 
651             colorSchemeId = colorScheme.getColorSchemeId();
652         }
653 
654         if (layoutId <= 0) {
655             LayoutSetServiceUtil.updateLookAndFeel(
656                 groupId, privateLayout, themeId, colorSchemeId, css, wapTheme);
657         }
658         else {
659             LayoutServiceUtil.updateLookAndFeel(
660                 groupId, privateLayout, layoutId, themeId, colorSchemeId, css,
661                 wapTheme);
662         }
663     }
664 
665     protected void updateMergePages(ActionRequest actionRequest)
666         throws Exception {
667 
668         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
669 
670         boolean mergeGuestPublicPages = ParamUtil.getBoolean(
671             actionRequest, "mergeGuestPublicPages");
672 
673         Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
674 
675         UnicodeProperties typeSettingsProperties =
676             liveGroup.getTypeSettingsProperties();
677 
678         typeSettingsProperties.setProperty(
679             "mergeGuestPublicPages", String.valueOf(mergeGuestPublicPages));
680 
681         GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
682     }
683 
684     protected void updateMonitoring(ActionRequest actionRequest)
685         throws Exception {
686 
687         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
688 
689         String googleAnalyticsId = ParamUtil.getString(
690             actionRequest, "googleAnalyticsId");
691 
692         Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
693 
694         UnicodeProperties typeSettingsProperties =
695             liveGroup.getTypeSettingsProperties();
696 
697         typeSettingsProperties.setProperty(
698             "googleAnalyticsId", googleAnalyticsId);
699 
700         GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
701     }
702 
703     protected void updateVirtualHost(ActionRequest actionRequest)
704         throws Exception {
705 
706         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
707 
708         String publicVirtualHost = ParamUtil.getString(
709             actionRequest, "publicVirtualHost");
710         String privateVirtualHost = ParamUtil.getString(
711             actionRequest, "privateVirtualHost");
712         String friendlyURL = ParamUtil.getString(actionRequest, "friendlyURL");
713 
714         LayoutSetServiceUtil.updateVirtualHost(
715             liveGroupId, false, publicVirtualHost);
716 
717         LayoutSetServiceUtil.updateVirtualHost(
718             liveGroupId, true, privateVirtualHost);
719 
720         GroupServiceUtil.updateFriendlyURL(liveGroupId, friendlyURL);
721 
722         Group liveGroup = GroupServiceUtil.getGroup(liveGroupId);
723 
724         if (liveGroup.hasStagingGroup()) {
725             Group stagingGroup = liveGroup.getStagingGroup();
726 
727             publicVirtualHost = ParamUtil.getString(
728                 actionRequest, "stagingPublicVirtualHost");
729             privateVirtualHost = ParamUtil.getString(
730                 actionRequest, "stagingPrivateVirtualHost");
731             friendlyURL = ParamUtil.getString(
732                 actionRequest, "stagingFriendlyURL");
733 
734             LayoutSetServiceUtil.updateVirtualHost(
735                 stagingGroup.getGroupId(), false, publicVirtualHost);
736 
737             LayoutSetServiceUtil.updateVirtualHost(
738                 stagingGroup.getGroupId(), true, privateVirtualHost);
739 
740             GroupServiceUtil.updateFriendlyURL(
741                 stagingGroup.getGroupId(), friendlyURL);
742         }
743     }
744 
745     protected void updateWorkflow(ActionRequest actionRequest)
746         throws Exception {
747 
748         long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
749 
750         boolean workflowEnabled = ParamUtil.getBoolean(
751             actionRequest, "workflowEnabled");
752         int workflowStages = ParamUtil.getInteger(
753             actionRequest, "workflowStages");
754 
755         String workflowRoleNames;
756 
757         if (workflowStages == 0) {
758             workflowRoleNames = StringPool.BLANK;
759         }
760         else {
761             StringBundler sb = new StringBundler(workflowStages * 2 - 1);
762 
763             for (int i = 1; i <= workflowStages; i++) {
764                 String workflowRoleName = ParamUtil.getString(
765                     actionRequest, "workflowRoleName_" + i);
766 
767                 sb.append(workflowRoleName);
768 
769                 if ((i + 1) <= workflowStages) {
770                     sb.append(",");
771                 }
772             }
773 
774             workflowRoleNames = sb.toString();
775         }
776 
777         GroupServiceUtil.updateWorkflow(
778             liveGroupId, workflowEnabled, workflowStages, workflowRoleNames);
779     }
780 
781 }