001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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 = ParamUtil.getString(
184                                    actionRequest, "pagesRedirect");
185    
186                            if ((layout != null) && Validator.isNotNull(oldFriendlyURL)) {
187                                    ThemeDisplay themeDisplay =
188                                            (ThemeDisplay)actionRequest.getAttribute(
189                                                    WebKeys.THEME_DISPLAY);
190    
191                                    if (layout.getPlid() == themeDisplay.getPlid()) {
192                                            Group group = layout.getGroup();
193    
194                                            String oldPath = group.getFriendlyURL() + oldFriendlyURL;
195                                            String newPath =
196                                                    group.getFriendlyURL() + layout.getFriendlyURL();
197    
198                                            redirect = StringUtil.replace(redirect, oldPath, newPath);
199    
200                                            redirect = StringUtil.replace(
201                                                    redirect, HttpUtil.encodeURL(oldPath),
202                                                    HttpUtil.encodeURL(newPath));
203                                    }
204                            }
205    
206                            sendRedirect(actionRequest, actionResponse, redirect);
207                    }
208                    catch (Exception e) {
209                            if (e instanceof NoSuchLayoutException ||
210                                    e instanceof NoSuchProposalException ||
211                                    e instanceof PrincipalException) {
212    
213                                    SessionErrors.add(actionRequest, e.getClass().getName());
214    
215                                    setForward(actionRequest, "portlet.communities.error");
216                            }
217                            else if (e instanceof ImageTypeException ||
218                                             e instanceof LayoutFriendlyURLException ||
219                                             e instanceof LayoutHiddenException ||
220                                             e instanceof LayoutNameException ||
221                                             e instanceof LayoutParentLayoutIdException ||
222                                             e instanceof LayoutSetVirtualHostException ||
223                                             e instanceof LayoutTypeException ||
224                                             e instanceof RequiredLayoutException ||
225                                             e instanceof UploadException) {
226    
227                                    if (e instanceof LayoutFriendlyURLException) {
228                                            SessionErrors.add(
229                                                    actionRequest,
230                                                    LayoutFriendlyURLException.class.getName(), e);
231                                    }
232                                    else {
233                                            SessionErrors.add(actionRequest, e.getClass().getName(), e);
234                                    }
235                            }
236                            else if (e instanceof RemoteExportException ||
237                                             e instanceof RemoteOptionsException ||
238                                             e instanceof SystemException) {
239    
240                                    SessionErrors.add(actionRequest, e.getClass().getName(), e);
241    
242                                    String redirect = ParamUtil.getString(
243                                            actionRequest, "pagesRedirect");
244    
245                                    sendRedirect(actionRequest, actionResponse, redirect);
246                            }
247                            else {
248                                    throw e;
249                            }
250                    }
251            }
252    
253            public ActionForward render(
254                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
255                            RenderRequest renderRequest, RenderResponse renderResponse)
256                    throws Exception {
257    
258                    try {
259                            checkPermissions(renderRequest);
260                    }
261                    catch (PrincipalException pe) {
262                            SessionErrors.add(
263                                    renderRequest, PrincipalException.class.getName());
264    
265                            return mapping.findForward("portlet.communities.error");
266                    }
267    
268                    try {
269                            getGroup(renderRequest);
270                    }
271                    catch (Exception e) {
272                            if (e instanceof NoSuchGroupException ||
273                                    e instanceof PrincipalException) {
274    
275                                    SessionErrors.add(renderRequest, e.getClass().getName());
276    
277                                    return mapping.findForward("portlet.communities.error");
278                            }
279                            else {
280                                    throw e;
281                            }
282                    }
283    
284                    return mapping.findForward(
285                            getForward(renderRequest, "portlet.communities.edit_pages"));
286            }
287    
288            public void serveResource(
289                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
290                            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
291                    throws Exception {
292    
293                    PortletRequestDispatcher portletRequestDispatcher =
294                            portletConfig.getPortletContext().getRequestDispatcher(
295                                    "/html/portlet/communities/scheduled_publishing_events.jsp");
296    
297                    portletRequestDispatcher.include(resourceRequest, resourceResponse);
298            }
299    
300            protected void checkPermissions(PortletRequest portletRequest)
301                    throws Exception {
302    
303                    // LEP-850
304    
305                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
306                            WebKeys.THEME_DISPLAY);
307    
308                    PermissionChecker permissionChecker =
309                            themeDisplay.getPermissionChecker();
310    
311                    Group group = getGroup(portletRequest);
312    
313                    if (group == null) {
314                            throw new PrincipalException();
315                    }
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 Group getGroup(PortletRequest portletRequest) throws Exception {
403                    return ActionUtil.getGroup(portletRequest);
404            }
405    
406            protected UnicodeProperties getTypeSettingsProperties(
407                    ActionRequest actionRequest) {
408    
409                    return PropertiesParamUtil.getProperties(
410                            actionRequest, "TypeSettingsProperties--");
411            }
412    
413            protected void updateDisplayOrder(ActionRequest actionRequest)
414                    throws Exception {
415    
416                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
417                    boolean privateLayout = ParamUtil.getBoolean(
418                            actionRequest, "privateLayout");
419                    long parentLayoutId = ParamUtil.getLong(
420                            actionRequest, "parentLayoutId");
421                    long[] layoutIds = StringUtil.split(
422                            ParamUtil.getString(actionRequest, "layoutIds"), 0L);
423    
424                    LayoutServiceUtil.setLayouts(
425                            groupId, privateLayout, parentLayoutId, layoutIds);
426            }
427    
428            protected Object[] updateLayout(
429                            ActionRequest actionRequest, ActionResponse actionResponse)
430                    throws Exception {
431    
432                    UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
433                            actionRequest);
434    
435                    String cmd = ParamUtil.getString(uploadRequest, Constants.CMD);
436    
437                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
438                    boolean privateLayout = ParamUtil.getBoolean(
439                            actionRequest, "privateLayout");
440                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
441                    long parentLayoutId = ParamUtil.getLong(
442                            uploadRequest, "parentLayoutId");
443                    String description = ParamUtil.getString(uploadRequest, "description");
444                    String type = ParamUtil.getString(uploadRequest, "type");
445                    boolean hidden = ParamUtil.getBoolean(uploadRequest, "hidden");
446                    String friendlyURL = ParamUtil.getString(uploadRequest, "friendlyURL");
447                    boolean iconImage = ParamUtil.getBoolean(uploadRequest, "iconImage");
448                    byte[] iconBytes = FileUtil.getBytes(
449                            uploadRequest.getFile("iconFileName"));
450                    long layoutPrototypeId = ParamUtil.getLong(
451                            uploadRequest, "layoutPrototypeId");
452    
453                    boolean inheritFromParentLayoutId = ParamUtil.getBoolean(
454                            uploadRequest, "inheritFromParentLayoutId");
455    
456                    long copyLayoutId = ParamUtil.getLong(uploadRequest, "copyLayoutId");
457    
458                    Map<Locale, String> localeNamesMap =
459                            LocalizationUtil.getLocalizationMap(actionRequest, "name");
460                    Map<Locale, String> localeTitlesMap =
461                            LocalizationUtil.getLocalizationMap(actionRequest, "title");
462    
463                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
464                            Layout.class.getName(), actionRequest);
465    
466                    Layout layout = null;
467                    String oldFriendlyURL = StringPool.BLANK;
468    
469                    if (cmd.equals(Constants.ADD)) {
470    
471                            // Add layout
472    
473                            if (inheritFromParentLayoutId && (parentLayoutId > 0)) {
474                                    Layout parentLayout = LayoutLocalServiceUtil.getLayout(
475                                            groupId, privateLayout, parentLayoutId);
476    
477                                    layout = LayoutServiceUtil.addLayout(
478                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
479                                            localeTitlesMap, description, parentLayout.getType(),
480                                            parentLayout.isHidden(), friendlyURL,
481                                            serviceContext);
482    
483                                    LayoutServiceUtil.updateLayout(
484                                            layout.getGroupId(), layout.isPrivateLayout(),
485                                            layout.getLayoutId(), parentLayout.getTypeSettings());
486    
487                                    if (parentLayout.isTypePortlet()) {
488                                            ActionUtil.copyPreferences(
489                                                    actionRequest, layout, parentLayout);
490                                    }
491                            }
492                            else if (layoutPrototypeId > 0) {
493                                    LayoutPrototype layoutPrototype =
494                                            LayoutPrototypeServiceUtil.getLayoutPrototype(
495                                                    layoutPrototypeId);
496    
497                                    Layout layoutPrototypeLayout = layoutPrototype.getLayout();
498    
499                                    layout = LayoutServiceUtil.addLayout(
500                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
501                                            localeTitlesMap, description, LayoutConstants.TYPE_PORTLET,
502                                            false, friendlyURL, serviceContext);
503    
504                                    LayoutServiceUtil.updateLayout(
505                                            layout.getGroupId(), layout.isPrivateLayout(),
506                                            layout.getLayoutId(),
507                                            layoutPrototypeLayout.getTypeSettings());
508    
509                                    ActionUtil.copyPreferences(
510                                            actionRequest, layout, layoutPrototypeLayout);
511    
512                                    if (Validator.isNotNull(layoutPrototypeLayout.getThemeId())) {
513                                            LayoutServiceUtil.updateLookAndFeel(
514                                                    layout.getGroupId(), layout.isPrivateLayout(),
515                                                    layout.getLayoutId(),
516                                                    layoutPrototypeLayout.getThemeId(),
517                                                    layoutPrototypeLayout.getColorSchemeId(),
518                                                    layoutPrototypeLayout.getCss(), false);
519                                    }
520    
521                                    if (Validator.isNotNull(
522                                                    layoutPrototypeLayout.getWapThemeId())) {
523    
524                                            LayoutServiceUtil.updateLookAndFeel(
525                                                    layout.getGroupId(), layout.isPrivateLayout(),
526                                                    layout.getLayoutId(),
527                                                    layoutPrototypeLayout.getWapThemeId(),
528                                                    layoutPrototypeLayout.getWapColorSchemeId(),
529                                                    layoutPrototypeLayout.getCss(), true);
530                                    }
531                            }
532                            else {
533                                    LayoutServiceUtil.addLayout(
534                                            groupId, privateLayout, parentLayoutId, localeNamesMap,
535                                            localeTitlesMap, description, type, hidden, friendlyURL,
536                                            serviceContext);
537                            }
538                    }
539                    else {
540    
541                            // Update layout
542    
543                            layout = LayoutLocalServiceUtil.getLayout(
544                                    groupId, privateLayout, layoutId);
545    
546                            oldFriendlyURL = layout.getFriendlyURL();
547    
548                            layout = LayoutServiceUtil.updateLayout(
549                                    groupId, privateLayout, layoutId, layout.getParentLayoutId(),
550                                    localeNamesMap, localeTitlesMap, description, type, hidden,
551                                    friendlyURL, Boolean.valueOf(iconImage), iconBytes,
552                                    serviceContext);
553    
554                            if (oldFriendlyURL.equals(layout.getFriendlyURL())) {
555                                    oldFriendlyURL = StringPool.BLANK;
556                            }
557    
558                            UnicodeProperties formTypeSettingsProperties =
559                                    getTypeSettingsProperties(actionRequest);
560    
561                            if (type.equals(LayoutConstants.TYPE_PORTLET)) {
562                                    if ((copyLayoutId > 0) &&
563                                            (copyLayoutId != layout.getLayoutId())) {
564    
565                                            try {
566                                                    Layout copyLayout = LayoutLocalServiceUtil.getLayout(
567                                                            groupId, privateLayout, copyLayoutId);
568    
569                                                    if (copyLayout.isTypePortlet()) {
570                                                            LayoutServiceUtil.updateLayout(
571                                                                    groupId, privateLayout, layoutId,
572                                                                    copyLayout.getTypeSettings());
573    
574                                                            ActionUtil.copyPreferences(
575                                                                    actionRequest, layout, copyLayout);
576                                                    }
577                                            }
578                                            catch (NoSuchLayoutException nsle) {
579                                            }
580                                    }
581                                    else {
582                                            UnicodeProperties layoutTypeSettingsProperties =
583                                                    layout.getTypeSettingsProperties();
584    
585                                            for (String property: formTypeSettingsProperties.keySet()) {
586                                                    layoutTypeSettingsProperties.setProperty(
587                                                            property,
588                                                            formTypeSettingsProperties.getProperty(property));
589                                            }
590    
591                                            LayoutServiceUtil.updateLayout(
592                                                    groupId, privateLayout, layoutId,
593                                                    layout.getTypeSettings());
594                                    }
595                            }
596                            else {
597                                    layout.setTypeSettingsProperties(formTypeSettingsProperties);
598    
599                                    LayoutServiceUtil.updateLayout(
600                                            groupId, privateLayout, layoutId, layout.getTypeSettings());
601                            }
602    
603                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
604                                    actionResponse);
605    
606                            LayoutSettings layoutSettings = LayoutSettings.getInstance(layout);
607    
608                            EventsProcessorUtil.process(
609                                    PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE,
610                                    layoutSettings.getConfigurationActionUpdate(), uploadRequest,
611                                    response);
612                    }
613    
614                    return new Object[] {layout, oldFriendlyURL};
615            }
616    
617            protected void updateLogo(ActionRequest actionRequest) throws Exception {
618                    UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(
619                            actionRequest);
620    
621                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
622                    long stagingGroupId = ParamUtil.getLong(
623                            actionRequest, "stagingGroupId");
624    
625                    boolean privateLayout = ParamUtil.getBoolean(
626                            actionRequest, "privateLayout");
627                    boolean logo = ParamUtil.getBoolean(actionRequest, "logo");
628    
629                    File file = uploadRequest.getFile("logoFileName");
630                    byte[] bytes = FileUtil.getBytes(file);
631    
632                    if (logo && ((bytes == null) || (bytes.length == 0))) {
633                            throw new UploadException();
634                    }
635    
636                    LayoutSetServiceUtil.updateLogo(liveGroupId, privateLayout, logo, file);
637    
638                    if (stagingGroupId > 0) {
639                            LayoutSetServiceUtil.updateLogo(
640                                    stagingGroupId, privateLayout, logo, file);
641                    }
642            }
643    
644            protected void updateLookAndFeel(ActionRequest actionRequest)
645                    throws Exception {
646    
647                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
648                            WebKeys.THEME_DISPLAY);
649    
650                    long companyId = themeDisplay.getCompanyId();
651    
652                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
653                    long stagingGroupId = ParamUtil.getLong(
654                            actionRequest, "stagingGroupId");
655    
656                    boolean privateLayout = ParamUtil.getBoolean(
657                            actionRequest, "privateLayout");
658                    long layoutId = ParamUtil.getLong(actionRequest, "layoutId");
659                    String themeId = ParamUtil.getString(actionRequest, "themeId");
660                    String colorSchemeId = ParamUtil.getString(
661                            actionRequest, "colorSchemeId");
662                    String css = ParamUtil.getString(actionRequest, "css");
663                    boolean wapTheme = ParamUtil.getBoolean(actionRequest, "wapTheme");
664    
665                    if (stagingGroupId > 0) {
666                            updateLookAndFeel(
667                                    companyId, stagingGroupId, privateLayout, layoutId, themeId,
668                                    colorSchemeId, css, wapTheme);
669                    }
670                    else {
671                            updateLookAndFeel(
672                                    companyId, liveGroupId, privateLayout, layoutId, themeId,
673                                    colorSchemeId, css, wapTheme);
674                    }
675            }
676    
677            protected void updateLookAndFeel(
678                            long companyId, long groupId, boolean privateLayout, long layoutId,
679                            String themeId, String colorSchemeId, String css, boolean wapTheme)
680                    throws Exception {
681    
682                    if (Validator.isNotNull(themeId) && Validator.isNull(colorSchemeId)) {
683                            ColorScheme colorScheme = ThemeLocalServiceUtil.getColorScheme(
684                                    companyId, themeId, colorSchemeId, wapTheme);
685    
686                            colorSchemeId = colorScheme.getColorSchemeId();
687                    }
688    
689                    if (layoutId <= 0) {
690                            LayoutSetServiceUtil.updateLookAndFeel(
691                                    groupId, privateLayout, themeId, colorSchemeId, css, wapTheme);
692                    }
693                    else {
694                            LayoutServiceUtil.updateLookAndFeel(
695                                    groupId, privateLayout, layoutId, themeId, colorSchemeId, css,
696                                    wapTheme);
697                    }
698            }
699    
700            protected void updateMergePages(ActionRequest actionRequest)
701                    throws Exception {
702    
703                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
704    
705                    boolean mergeGuestPublicPages = ParamUtil.getBoolean(
706                            actionRequest, "mergeGuestPublicPages");
707    
708                    Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
709    
710                    UnicodeProperties props = liveGroup.getTypeSettingsProperties();
711    
712                    props.setProperty(
713                            "mergeGuestPublicPages", String.valueOf(mergeGuestPublicPages));
714    
715                    GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
716            }
717    
718            protected void updateMonitoring(ActionRequest actionRequest)
719                    throws Exception {
720    
721                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
722    
723                    String googleAnalyticsId = ParamUtil.getString(
724                            actionRequest, "googleAnalyticsId");
725    
726                    Group liveGroup = GroupLocalServiceUtil.getGroup(liveGroupId);
727    
728                    UnicodeProperties props = liveGroup.getTypeSettingsProperties();
729    
730                    props.setProperty("googleAnalyticsId", googleAnalyticsId);
731    
732                    GroupServiceUtil.updateGroup(liveGroupId, liveGroup.getTypeSettings());
733            }
734    
735            protected void updateVirtualHost(ActionRequest actionRequest)
736                    throws Exception {
737    
738                    long liveGroupId = ParamUtil.getLong(actionRequest, "liveGroupId");
739    
740                    String publicVirtualHost = ParamUtil.getString(
741                            actionRequest, "publicVirtualHost");
742                    String privateVirtualHost = ParamUtil.getString(
743                            actionRequest, "privateVirtualHost");
744                    String friendlyURL = ParamUtil.getString(actionRequest, "friendlyURL");
745    
746                    LayoutSetServiceUtil.updateVirtualHost(
747                            liveGroupId, false, publicVirtualHost);
748    
749                    LayoutSetServiceUtil.updateVirtualHost(
750                            liveGroupId, true, privateVirtualHost);
751    
752                    GroupServiceUtil.updateFriendlyURL(liveGroupId, friendlyURL);
753    
754                    Group liveGroup = GroupServiceUtil.getGroup(liveGroupId);
755    
756                    if (liveGroup.hasStagingGroup()) {
757                            Group stagingGroup = liveGroup.getStagingGroup();
758    
759                            publicVirtualHost = ParamUtil.getString(
760                                    actionRequest, "stagingPublicVirtualHost");
761                            privateVirtualHost = ParamUtil.getString(
762                                    actionRequest, "stagingPrivateVirtualHost");
763                            friendlyURL = ParamUtil.getString(
764                                    actionRequest, "stagingFriendlyURL");
765    
766                            LayoutSetServiceUtil.updateVirtualHost(
767                                    stagingGroup.getGroupId(), false, publicVirtualHost);
768    
769                            LayoutSetServiceUtil.updateVirtualHost(
770                                    stagingGroup.getGroupId(), true, privateVirtualHost);
771    
772                            GroupServiceUtil.updateFriendlyURL(
773                                    stagingGroup.getGroupId(), friendlyURL);
774                    }
775            }
776    
777    }