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