001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.communities.action;
016    
017    import com.liferay.portal.ImageTypeException;
018    import com.liferay.portal.LayoutFriendlyURLException;
019    import com.liferay.portal.LayoutHiddenException;
020    import com.liferay.portal.LayoutNameException;
021    import com.liferay.portal.LayoutParentLayoutIdException;
022    import com.liferay.portal.LayoutSetVirtualHostException;
023    import com.liferay.portal.LayoutTypeException;
024    import com.liferay.portal.NoSuchGroupException;
025    import com.liferay.portal.NoSuchLayoutException;
026    import com.liferay.portal.RemoteExportException;
027    import com.liferay.portal.RemoteOptionsException;
028    import com.liferay.portal.RequiredLayoutException;
029    import com.liferay.portal.events.EventsProcessorUtil;
030    import com.liferay.portal.kernel.exception.SystemException;
031    import com.liferay.portal.kernel.servlet.SessionErrors;
032    import com.liferay.portal.kernel.staging.StagingUtil;
033    import com.liferay.portal.kernel.upload.UploadPortletRequest;
034    import com.liferay.portal.kernel.util.Constants;
035    import com.liferay.portal.kernel.util.FileUtil;
036    import com.liferay.portal.kernel.util.HttpUtil;
037    import com.liferay.portal.kernel.util.LocalizationUtil;
038    import com.liferay.portal.kernel.util.ParamUtil;
039    import com.liferay.portal.kernel.util.PropertiesParamUtil;
040    import com.liferay.portal.kernel.util.PropsKeys;
041    import com.liferay.portal.kernel.util.StringPool;
042    import com.liferay.portal.kernel.util.StringUtil;
043    import com.liferay.portal.kernel.util.UnicodeProperties;
044    import com.liferay.portal.kernel.util.Validator;
045    import com.liferay.portal.model.ColorScheme;
046    import com.liferay.portal.model.Group;
047    import com.liferay.portal.model.Layout;
048    import com.liferay.portal.model.LayoutConstants;
049    import com.liferay.portal.model.LayoutPrototype;
050    import com.liferay.portal.model.User;
051    import com.liferay.portal.security.auth.PrincipalException;
052    import com.liferay.portal.security.permission.ActionKeys;
053    import com.liferay.portal.security.permission.PermissionChecker;
054    import com.liferay.portal.service.GroupLocalServiceUtil;
055    import com.liferay.portal.service.GroupServiceUtil;
056    import com.liferay.portal.service.LayoutLocalServiceUtil;
057    import com.liferay.portal.service.LayoutPrototypeServiceUtil;
058    import com.liferay.portal.service.LayoutServiceUtil;
059    import com.liferay.portal.service.LayoutSetServiceUtil;
060    import com.liferay.portal.service.ServiceContext;
061    import com.liferay.portal.service.ServiceContextFactory;
062    import com.liferay.portal.service.ThemeLocalServiceUtil;
063    import com.liferay.portal.service.UserLocalServiceUtil;
064    import com.liferay.portal.service.permission.GroupPermissionUtil;
065    import com.liferay.portal.service.permission.LayoutPermissionUtil;
066    import com.liferay.portal.service.permission.LayoutPrototypePermissionUtil;
067    import com.liferay.portal.service.permission.LayoutSetPrototypePermissionUtil;
068    import com.liferay.portal.service.permission.OrganizationPermissionUtil;
069    import com.liferay.portal.service.permission.UserPermissionUtil;
070    import com.liferay.portal.struts.PortletAction;
071    import com.liferay.portal.theme.ThemeDisplay;
072    import com.liferay.portal.util.LayoutSettings;
073    import com.liferay.portal.util.PortalUtil;
074    import com.liferay.portal.util.PropsValues;
075    import com.liferay.portal.util.WebKeys;
076    import com.liferay.portlet.communities.util.CommunitiesUtil;
077    import com.liferay.portlet.tasks.NoSuchProposalException;
078    import com.liferay.util.servlet.UploadException;
079    
080    import java.io.File;
081    
082    import java.util.Locale;
083    import java.util.Map;
084    
085    import javax.portlet.ActionRequest;
086    import javax.portlet.ActionResponse;
087    import javax.portlet.PortletConfig;
088    import javax.portlet.PortletRequest;
089    import javax.portlet.PortletRequestDispatcher;
090    import javax.portlet.RenderRequest;
091    import javax.portlet.RenderResponse;
092    import javax.portlet.ResourceRequest;
093    import javax.portlet.ResourceResponse;
094    
095    import javax.servlet.http.HttpServletResponse;
096    
097    import org.apache.struts.action.ActionForm;
098    import org.apache.struts.action.ActionForward;
099    import org.apache.struts.action.ActionMapping;
100    
101    /**
102     * @author Brian Wing Shun Chan
103     */
104    public class EditPagesAction extends PortletAction {
105    
106            public void processAction(
107                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
108                            ActionRequest actionRequest, ActionResponse actionResponse)
109                    throws Exception {
110    
111                    try {
112                            checkPermissions(actionRequest);
113                    }
114                    catch (PrincipalException pe) {
115                            return;
116                    }
117    
118                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
119    
120                    try {
121                            Layout layout = null;
122                            String oldFriendlyURL = StringPool.BLANK;
123    
124                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
125                                    Object[] returnValue = updateLayout(
126                                            actionRequest, actionResponse);
127    
128                                    layout = (Layout)returnValue[0];
129                                    oldFriendlyURL = (String)returnValue[1];
130                            }
131                            else if (cmd.equals(Constants.DELETE)) {
132                                    CommunitiesUtil.deleteLayout(actionRequest, actionResponse);
133                            }
134                            else if (cmd.equals("copy_from_live")) {
135                                    StagingUtil.copyFromLive(actionRequest);
136                            }
137                            else if (cmd.equals("display_order")) {
138                                    updateDisplayOrder(actionRequest);
139                            }
140                            else if (cmd.equals("logo")) {
141                                    updateLogo(actionRequest);
142                            }
143                            else if (cmd.equals("look_and_feel")) {
144                                    updateLookAndFeel(actionRequest);
145                            }
146                            else if (cmd.equals("merge_pages")) {
147                                    updateMergePages(actionRequest);
148                            }
149                            else if (cmd.equals("monitoring")) {
150                                    updateMonitoring(actionRequest);
151                            }
152                            else if (cmd.equals("publish_to_live")) {
153                                    StagingUtil.publishToLive(actionRequest);
154                            }
155                            else if (cmd.equals("publish_to_remote")) {
156                                    StagingUtil.publishToRemote(actionRequest);
157                            }
158                            else if (cmd.equals("schedule_copy_from_live")) {
159                                    StagingUtil.scheduleCopyFromLive(actionRequest);
160                            }
161                            else if (cmd.equals("schedule_publish_to_live")) {
162                                    StagingUtil.schedulePublishToLive(actionRequest);
163                            }
164                            else if (cmd.equals("schedule_publish_to_remote")) {
165                                    StagingUtil.schedulePublishToRemote(actionRequest);
166                            }
167                            else if (cmd.equals("staging")) {
168                                    StagingUtil.updateStaging(actionRequest);
169                            }
170                            else if (cmd.equals("unschedule_copy_from_live")) {
171                                    StagingUtil.unscheduleCopyFromLive(actionRequest);
172                            }
173                            else if (cmd.equals("unschedule_publish_to_live")) {
174                                    StagingUtil.unschedulePublishToLive(actionRequest);
175                            }
176                            else if (cmd.equals("unschedule_publish_to_remote")) {
177                                    StagingUtil.unschedulePublishToRemote(actionRequest);
178                            }
179                            else if (cmd.equals("virtual_host")) {
180                                    updateVirtualHost(actionRequest);
181                            }
182    
183                            String redirect = (String)actionRequest.getAttribute(
184                                    WebKeys.REDIRECT);
185    
186                            if (Validator.isNull(redirect)) {
187                                    redirect = ParamUtil.getString(actionRequest, "pagesRedirect");
188                            }
189    
190                            if ((layout != null) && Validator.isNotNull(oldFriendlyURL)) {
191                                    ThemeDisplay themeDisplay =
192                                            (ThemeDisplay)actionRequest.getAttribute(
193                                                    WebKeys.THEME_DISPLAY);
194    
195                                    if (layout.getPlid() == themeDisplay.getPlid()) {
196                                            Group group = layout.getGroup();
197    
198                                            String oldPath = group.getFriendlyURL() + oldFriendlyURL;
199                                            String newPath =
200                                                    group.getFriendlyURL() + layout.getFriendlyURL();
201    
202                                            redirect = StringUtil.replace(redirect, oldPath, newPath);
203    
204                                            redirect = StringUtil.replace(
205                                                    redirect, HttpUtil.encodeURL(oldPath),
206                                                    HttpUtil.encodeURL(newPath));
207                                    }
208                            }
209    
210                            sendRedirect(actionRequest, actionResponse, redirect);
211                    }
212                    catch (Exception e) {
213                            if (e instanceof NoSuchLayoutException ||
214                                    e instanceof NoSuchProposalException ||
215                                    e instanceof PrincipalException) {
216    
217                                    SessionErrors.add(actionRequest, e.getClass().getName());
218    
219                                    setForward(actionRequest, "portlet.communities.error");
220                            }
221                            else if (e instanceof ImageTypeException ||
222                                             e instanceof LayoutFriendlyURLException ||
223                                             e instanceof LayoutHiddenException ||
224                                             e instanceof LayoutNameException ||
225                                             e instanceof LayoutParentLayoutIdException ||
226                                             e instanceof LayoutSetVirtualHostException ||
227                                             e instanceof LayoutTypeException ||
228                                             e instanceof RequiredLayoutException ||
229                                             e instanceof UploadException) {
230    
231                                    if (e instanceof LayoutFriendlyURLException) {
232                                            SessionErrors.add(
233                                                    actionRequest,
234                                                    LayoutFriendlyURLException.class.getName(), e);
235                                    }
236                                    else {
237                                            SessionErrors.add(actionRequest, e.getClass().getName(), e);
238                                    }
239                            }
240                            else if (e instanceof RemoteExportException ||
241                                             e instanceof RemoteOptionsException ||
242                                             e instanceof SystemException) {
243    
244                                    SessionErrors.add(actionRequest, e.getClass().getName(), e);
245    
246                                    String redirect = ParamUtil.getString(
247                                            actionRequest, "pagesRedirect");
248    
249                                    sendRedirect(actionRequest, actionResponse, redirect);
250                            }
251                            else {
252                                    throw e;
253                            }
254                    }
255            }
256    
257            public ActionForward render(
258                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
259                            RenderRequest renderRequest, RenderResponse renderResponse)
260                    throws Exception {
261    
262                    try {
263                            checkPermissions(renderRequest);
264                    }
265                    catch (PrincipalException pe) {
266                            SessionErrors.add(
267                                    renderRequest, PrincipalException.class.getName());
268    
269                            return mapping.findForward("portlet.communities.error");
270                    }
271    
272                    try {
273                            getGroup(renderRequest);
274                    }
275                    catch (Exception e) {
276                            if (e instanceof NoSuchGroupException ||
277                                    e instanceof PrincipalException) {
278    
279                                    SessionErrors.add(renderRequest, e.getClass().getName());
280    
281                                    return mapping.findForward("portlet.communities.error");
282                            }
283                            else {
284                                    throw e;
285                            }
286                    }
287    
288                    return mapping.findForward(
289                            getForward(renderRequest, "portlet.communities.edit_pages"));
290            }
291    
292            public void serveResource(
293                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
294                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
295                    throws Exception {
296    
297                    PortletRequestDispatcher portletRequestDispatcher =
298                            portletConfig.getPortletContext().getRequestDispatcher(
299                                    "/html/portlet/communities/scheduled_publishing_events.jsp");
300    
301                    portletRequestDispatcher.include(resourceRequest, resourceResponse);
302            }
303    
304            protected void checkPermissions(PortletRequest portletRequest)
305                    throws Exception {
306    
307                    // LEP-850
308    
309                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
310                            WebKeys.THEME_DISPLAY);
311    
312                    PermissionChecker permissionChecker =
313                            themeDisplay.getPermissionChecker();
314    
315                    Group group = getGroup(portletRequest);
316    
317                    if (group == null) {
318                            throw new PrincipalException();
319                    }
320    
321                    Layout layout = themeDisplay.getLayout();
322    
323                    boolean hasUpdateLayoutPermission = false;
324    
325                    if (layout != null) {
326                            hasUpdateLayoutPermission = LayoutPermissionUtil.contains(
327                                    permissionChecker, layout.getGroupId(),
328                                    layout.isPrivateLayout(), layout.getLayoutId(),
329                                    ActionKeys.UPDATE);
330                    }
331    
332                    if (group.isCommunity()) {
333                            String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
334    
335                            boolean publishToLive =
336                                    GroupPermissionUtil.contains(
337                                            permissionChecker, group.getGroupId(),
338                                            ActionKeys.PUBLISH_STAGING) &&
339                                    cmd.equals("publish_to_live");
340    
341                            if (!GroupPermissionUtil.contains(
342                                            permissionChecker, group.getGroupId(),
343                                            ActionKeys.APPROVE_PROPOSAL) &&
344                                    !GroupPermissionUtil.contains(
345                                            permissionChecker, group.getGroupId(),
346                                            ActionKeys.MANAGE_LAYOUTS) &&
347                                    !hasUpdateLayoutPermission && !publishToLive) {
348    
349                                    throw new PrincipalException();
350                            }
351                    }
352                    else if (group.isCompany()) {
353                            if (!permissionChecker.isCompanyAdmin()) {
354                                    throw new PrincipalException();
355                            }
356                    }
357                    else if (group.isLayoutPrototype()) {
358                            LayoutPrototypePermissionUtil.check(
359                                    permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
360                    }
361                    else if (group.isLayoutSetPrototype()) {
362                            LayoutSetPrototypePermissionUtil.check(
363                                    permissionChecker, group.getClassPK(), ActionKeys.UPDATE);
364                    }
365                    else if (group.isOrganization()) {
366                            long organizationId = group.getOrganizationId();
367    
368                            String cmd = ParamUtil.getString(portletRequest, Constants.CMD);
369    
370                            boolean publishToLive =
371                                    OrganizationPermissionUtil.contains(
372                                            permissionChecker, organizationId,
373                                            ActionKeys.PUBLISH_STAGING) &&
374                                    cmd.equals("publish_to_live");
375    
376                            if (!OrganizationPermissionUtil.contains(
377                                            permissionChecker, organizationId,
378                                            ActionKeys.APPROVE_PROPOSAL) &&
379                                    !OrganizationPermissionUtil.contains(
380                                            permissionChecker, organizationId,
381                                            ActionKeys.MANAGE_LAYOUTS) &&
382                                    !hasUpdateLayoutPermission && !publishToLive) {
383    
384                                    throw new PrincipalException();
385                            }
386                    }
387                    else if (group.isUser()) {
388                            long groupUserId = group.getClassPK();
389    
390                            User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
391    
392                            long[] organizationIds = groupUser.getOrganizationIds();
393    
394                            UserPermissionUtil.check(
395                                    permissionChecker, groupUserId, organizationIds,
396                                    ActionKeys.UPDATE);
397    
398                            if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE &&
399                                     !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE) {
400    
401                                    throw new PrincipalException();
402                            }
403                    }
404            }
405    
406            protected Group getGroup(PortletRequest portletRequest) throws Exception {
407                    return ActionUtil.getGroup(portletRequest);
408            }
409    
410            protected UnicodeProperties getTypeSettingsProperties(
411                    ActionRequest actionRequest) {
412    
413                    return PropertiesParamUtil.getProperties(
414                            actionRequest, "TypeSettingsProperties--");
415            }
416    
417            protected void updateDisplayOrder(ActionRequest actionRequest)
418                    throws Exception {
419    
420                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
421                    boolean privateLayout = ParamUtil.getBoolean(
422                            actionRequest, "privateLayout");
423                    long parentLayoutId = ParamUtil.getLong(
424                            actionRequest, "parentLayoutId");
425                    long[] layoutIds = StringUtil.split(
426                            ParamUtil.getString(actionRequest, "layoutIds"), 0L);
427    
428                    LayoutServiceUtil.setLayouts(
429                            groupId, privateLayout, parentLayoutId, layoutIds);
430            }
431    
432            protected Object[] updateLayout(
433                            ActionRequest actionRequest, ActionResponse actionResponse)
434                    throws Exception {
435    
436                    UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
437                            actionRequest);
438    
439                    String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
440    
441                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
442                    boolean privateLayout = ParamUtil.getBoolean(
443                            actionRequest, "privateLayout");
444                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
445                    long parentLayoutId = ParamUtil.getLong(
446                            uploadRequest, "parentLayoutId");
447                    String description = ParamUtil.getString(uploadRequest, "description");
448                    String type = ParamUtil.getString(uploadRequest, "type");
449                    boolean hidden = ParamUtil.getBoolean(uploadRequest, "hidden");
450                    String friendlyURL = ParamUtil.getString(uploadRequest, "friendlyURL");
451                    boolean iconImage = ParamUtil.getBoolean(uploadRequest, "iconImage");
452                    byte[] iconBytes = FileUtil.getBytes(
453                            uploadRequest.getFile("iconFileName"));
454                    long layoutPrototypeId = ParamUtil.getLong(
455                            uploadRequest, "layoutPrototypeId");
456    
457                    boolean inheritFromParentLayoutId = ParamUtil.getBoolean(
458                            uploadRequest, "inheritFromParentLayoutId");
459    
460                    long copyLayoutId = ParamUtil.getLong(uploadRequest, "copyLayoutId");
461    
462                    Map<Locale, String> localeNamesMap =
463                            LocalizationUtil.getLocalizationMap(actionRequest, "name");
464                    Map<Locale, String> localeTitlesMap =
465                            LocalizationUtil.getLocalizationMap(actionRequest, "title");
466    
467                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
468                            Layout.class.getName(), actionRequest);
469    
470                    Layout layout = null;
471                    String oldFriendlyURL = StringPool.BLANK;
472    
473                    if (cmd.equals(Constants.ADD)) {
474    
475                            // Add layout
476    
477                            if (inheritFromParentLayoutId && (parentLayoutId > 0)) {
478                                    Layout parentLayout = LayoutLocalServiceUtil.getLayout(
479                                            groupId, privateLayout, parentLayoutId);
480    
481                                    layout = LayoutServiceUtil.addLayout(
482                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
483                                            localeTitlesMap, description, parentLayout.getType(),
484                                            hidden, friendlyURL, serviceContext);
485    
486                                    LayoutServiceUtil.updateLayout(
487                                            layout.getGroupId(), layout.isPrivateLayout(),
488                                            layout.getLayoutId(), parentLayout.getTypeSettings());
489    
490                                    if (parentLayout.isTypePortlet()) {
491                                            ActionUtil.copyPreferences(
492                                                    actionRequest, layout, parentLayout);
493    
494                                            ActionUtil.copyLookAndFeel(layout, parentLayout);
495                                    }
496                            }
497                            else if (layoutPrototypeId > 0) {
498                                    LayoutPrototype layoutPrototype =
499                                            LayoutPrototypeServiceUtil.getLayoutPrototype(
500                                                    layoutPrototypeId);
501    
502                                    Layout layoutPrototypeLayout = layoutPrototype.getLayout();
503    
504                                    layout = LayoutServiceUtil.addLayout(
505                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
506                                            localeTitlesMap, description, LayoutConstants.TYPE_PORTLET,
507                                            false, friendlyURL, serviceContext);
508    
509                                    LayoutServiceUtil.updateLayout(
510                                            layout.getGroupId(), layout.isPrivateLayout(),
511                                            layout.getLayoutId(),
512                                            layoutPrototypeLayout.getTypeSettings());
513    
514                                    ActionUtil.copyPreferences(
515                                            actionRequest, layout, layoutPrototypeLayout);
516    
517                                    ActionUtil.copyLookAndFeel(layout, layoutPrototypeLayout);
518                            }
519                            else {
520                                    LayoutServiceUtil.addLayout(
521                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
522                                            localeTitlesMap, description, type, hidden, friendlyURL,
523                                            serviceContext);
524                            }
525                    }
526                    else {
527    
528                            // Update layout
529    
530                            layout = LayoutLocalServiceUtil.getLayout(
531                                    groupId, privateLayout, layoutId);
532    
533                            oldFriendlyURL = layout.getFriendlyURL();
534    
535                            layout = LayoutServiceUtil.updateLayout(
536                                    groupId, privateLayout, layoutId, layout.getParentLayoutId(),
537                                    localeNamesMap, localeTitlesMap, description, type, hidden,
538                                    friendlyURL, Boolean.valueOf(iconImage), iconBytes,
539                                    serviceContext);
540    
541                            if (oldFriendlyURL.equals(layout.getFriendlyURL())) {
542                                    oldFriendlyURL = StringPool.BLANK;
543                            }
544    
545                            UnicodeProperties formTypeSettingsProperties =
546                                    getTypeSettingsProperties(actionRequest);
547    
548                            if (type.equals(LayoutConstants.TYPE_PORTLET)) {
549                                    if ((copyLayoutId > 0) &&
550                                            (copyLayoutId != layout.getLayoutId())) {
551    
552                                            try {
553                                                    Layout copyLayout = LayoutLocalServiceUtil.getLayout(
554                                                            groupId, privateLayout, copyLayoutId);
555    
556                                                    if (copyLayout.isTypePortlet()) {
557                                                            LayoutServiceUtil.updateLayout(
558                                                                    groupId, privateLayout, layoutId,
559                                                                    copyLayout.getTypeSettings());
560    
561                                                            ActionUtil.copyPreferences(
562                                                                    actionRequest, layout, copyLayout);
563    
564                                                            ActionUtil.copyLookAndFeel(layout, copyLayout);
565                                                    }
566                                            }
567                                            catch (NoSuchLayoutException nsle) {
568                                            }
569                                    }
570                                    else {
571                                            UnicodeProperties layoutTypeSettingsProperties =
572                                                    layout.getTypeSettingsProperties();
573    
574                                            layoutTypeSettingsProperties.putAll(
575                                                    formTypeSettingsProperties);
576    
577                                            LayoutServiceUtil.updateLayout(
578                                                    groupId, privateLayout, layoutId,
579                                                    layout.getTypeSettings());
580                                    }
581                            }
582                            else {
583                                    layout.setTypeSettingsProperties(formTypeSettingsProperties);
584    
585                                    LayoutServiceUtil.updateLayout(
586                                            groupId, privateLayout, layoutId, layout.getTypeSettings());
587                            }
588    
589                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
590                                    actionResponse);
591    
592                            LayoutSettings layoutSettings = LayoutSettings.getInstance(layout);
593    
594                            EventsProcessorUtil.process(
595                                    PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE,
596                                    layoutSettings.getConfigurationActionUpdate(), uploadRequest,
597                                    response);
598                    }
599    
600                    return new Object[] {layout, oldFriendlyURL};
601            }
602    
603            protected void updateLogo(ActionRequest actionRequest) throws Exception {
604                    UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
605                            actionRequest);
606    
607                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
608                    long stagingGroupId = ParamUtil.getLong(
609                            actionRequest, "stagingGroupId");
610    
611                    boolean privateLayout = ParamUtil.getBoolean(
612                            actionRequest, "privateLayout");
613                    boolean logo = ParamUtil.getBoolean(actionRequest, "logo");
614    
615                    File file = uploadRequest.getFile("logoFileName");
616                    byte[] bytes = FileUtil.getBytes(file);
617    
618                    if (logo && ((bytes == null) || (bytes.length == 0))) {
619                            throw new UploadException();
620                    }
621    
622                    LayoutSetServiceUtil.updateLogo(liveGroupId, privateLayout, logo, file);
623    
624                    if (stagingGroupId > 0) {
625                            LayoutSetServiceUtil.updateLogo(
626                                    stagingGroupId, privateLayout, logo, file);
627                    }
628            }
629    
630            protected void updateLookAndFeel(ActionRequest actionRequest)
631                    throws Exception {
632    
633                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
634                            WebKeys.THEME_DISPLAY);
635    
636                    long companyId = themeDisplay.getCompanyId();
637    
638                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
639                    long stagingGroupId = ParamUtil.getLong(
640                            actionRequest, "stagingGroupId");
641    
642                    boolean privateLayout = ParamUtil.getBoolean(
643                            actionRequest, "privateLayout");
644                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
645                    String themeId = ParamUtil.getString(actionRequest, "themeId");
646                    String colorSchemeId = ParamUtil.getString(
647                            actionRequest, "colorSchemeId");
648                    String css = ParamUtil.getString(actionRequest, "css");
649                    boolean wapTheme = ParamUtil.getBoolean(actionRequest, "wapTheme");
650    
651                    if (stagingGroupId > 0) {
652                            updateLookAndFeel(
653                                    companyId, stagingGroupId, privateLayout, layoutId, themeId,
654                                    colorSchemeId, css, wapTheme);
655                    }
656                    else {
657                            updateLookAndFeel(
658                                    companyId, liveGroupId, privateLayout, layoutId, themeId,
659                                    colorSchemeId, css, wapTheme);
660                    }
661            }
662    
663            protected void updateLookAndFeel(
664                            long companyId, long groupId, boolean privateLayout, long layoutId,
665                            String themeId, String colorSchemeId, String css, boolean wapTheme)
666                    throws Exception {
667    
668                    if (Validator.isNotNull(themeId) && Validator.isNull(colorSchemeId)) {
669                            ColorScheme colorScheme = ThemeLocalServiceUtil.getColorScheme(
670                                    companyId, themeId, colorSchemeId, wapTheme);
671    
672                            colorSchemeId = colorScheme.getColorSchemeId();
673                    }
674    
675                    if (layoutId <= 0) {
676                            LayoutSetServiceUtil.updateLookAndFeel(
677                                    groupId, privateLayout, themeId, colorSchemeId, css, wapTheme);
678                    }
679                    else {
680                            LayoutServiceUtil.updateLookAndFeel(
681                                    groupId, privateLayout, layoutId, themeId, colorSchemeId, css,
682                                    wapTheme);
683                    }
684            }
685    
686            protected void updateMergePages(ActionRequest actionRequest)
687                    throws Exception {
688    
689                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
690    
691                    boolean mergeGuestPublicPages = ParamUtil.getBoolean(
692                            actionRequest, "mergeGuestPublicPages");
693    
694                    Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
695    
696                    UnicodeProperties props = liveGroup.getTypeSettingsProperties();
697    
698                    props.setProperty(
699                            "mergeGuestPublicPages", String.valueOf(mergeGuestPublicPages));
700    
701                    GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
702            }
703    
704            protected void updateMonitoring(ActionRequest actionRequest)
705                    throws Exception {
706    
707                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
708    
709                    String googleAnalyticsId = ParamUtil.getString(
710                            actionRequest, "googleAnalyticsId");
711    
712                    Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
713    
714                    UnicodeProperties props = liveGroup.getTypeSettingsProperties();
715    
716                    props.setProperty("googleAnalyticsId", googleAnalyticsId);
717    
718                    GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
719            }
720    
721            protected void updateVirtualHost(ActionRequest actionRequest)
722                    throws Exception {
723    
724                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
725    
726                    String publicVirtualHost = ParamUtil.getString(
727                            actionRequest, "publicVirtualHost");
728                    String privateVirtualHost = ParamUtil.getString(
729                            actionRequest, "privateVirtualHost");
730                    String friendlyURL = ParamUtil.getString(actionRequest, "friendlyURL");
731    
732                    LayoutSetServiceUtil.updateVirtualHost(
733                            liveGroupId, false, publicVirtualHost);
734    
735                    LayoutSetServiceUtil.updateVirtualHost(
736                            liveGroupId, true, privateVirtualHost);
737    
738                    GroupServiceUtil.updateFriendlyURL(liveGroupId, friendlyURL);
739    
740                    Group liveGroup = GroupServiceUtil.getGroup(liveGroupId);
741    
742                    if (liveGroup.hasStagingGroup()) {
743                            Group stagingGroup = liveGroup.getStagingGroup();
744    
745                            publicVirtualHost = ParamUtil.getString(
746                                    actionRequest, "stagingPublicVirtualHost");
747                            privateVirtualHost = ParamUtil.getString(
748                                    actionRequest, "stagingPrivateVirtualHost");
749                            friendlyURL = ParamUtil.getString(
750                                    actionRequest, "stagingFriendlyURL");
751    
752                            LayoutSetServiceUtil.updateVirtualHost(
753                                    stagingGroup.getGroupId(), false, publicVirtualHost);
754    
755                            LayoutSetServiceUtil.updateVirtualHost(
756                                    stagingGroup.getGroupId(), true, privateVirtualHost);
757    
758                            GroupServiceUtil.updateFriendlyURL(
759                                    stagingGroup.getGroupId(), friendlyURL);
760                    }
761            }
762    
763    }