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