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