001    /**
002     * Copyright (c) 2000-2013 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.portal.events;
016    
017    import com.liferay.portal.LayoutPermissionException;
018    import com.liferay.portal.NoSuchGroupException;
019    import com.liferay.portal.NoSuchLayoutException;
020    import com.liferay.portal.NoSuchUserException;
021    import com.liferay.portal.kernel.dao.orm.QueryUtil;
022    import com.liferay.portal.kernel.events.Action;
023    import com.liferay.portal.kernel.events.ActionException;
024    import com.liferay.portal.kernel.exception.PortalException;
025    import com.liferay.portal.kernel.exception.SystemException;
026    import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
027    import com.liferay.portal.kernel.log.Log;
028    import com.liferay.portal.kernel.log.LogFactoryUtil;
029    import com.liferay.portal.kernel.portlet.LiferayPortletURL;
030    import com.liferay.portal.kernel.portlet.LiferayWindowState;
031    import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
032    import com.liferay.portal.kernel.servlet.HttpHeaders;
033    import com.liferay.portal.kernel.servlet.SessionErrors;
034    import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
035    import com.liferay.portal.kernel.util.GetterUtil;
036    import com.liferay.portal.kernel.util.HttpUtil;
037    import com.liferay.portal.kernel.util.LocaleUtil;
038    import com.liferay.portal.kernel.util.ParamUtil;
039    import com.liferay.portal.kernel.util.PropsKeys;
040    import com.liferay.portal.kernel.util.SessionParamUtil;
041    import com.liferay.portal.kernel.util.StringBundler;
042    import com.liferay.portal.kernel.util.StringPool;
043    import com.liferay.portal.kernel.util.StringUtil;
044    import com.liferay.portal.kernel.util.UnicodeProperties;
045    import com.liferay.portal.kernel.util.Validator;
046    import com.liferay.portal.model.ColorScheme;
047    import com.liferay.portal.model.Company;
048    import com.liferay.portal.model.Group;
049    import com.liferay.portal.model.GroupConstants;
050    import com.liferay.portal.model.Image;
051    import com.liferay.portal.model.Layout;
052    import com.liferay.portal.model.LayoutConstants;
053    import com.liferay.portal.model.LayoutSet;
054    import com.liferay.portal.model.LayoutTypePortlet;
055    import com.liferay.portal.model.LayoutTypePortletConstants;
056    import com.liferay.portal.model.Portlet;
057    import com.liferay.portal.model.RoleConstants;
058    import com.liferay.portal.model.Theme;
059    import com.liferay.portal.model.User;
060    import com.liferay.portal.model.impl.ColorSchemeImpl;
061    import com.liferay.portal.model.impl.VirtualLayout;
062    import com.liferay.portal.security.auth.PrincipalException;
063    import com.liferay.portal.security.permission.ActionKeys;
064    import com.liferay.portal.security.permission.PermissionChecker;
065    import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
066    import com.liferay.portal.security.permission.PermissionThreadLocal;
067    import com.liferay.portal.service.GroupLocalServiceUtil;
068    import com.liferay.portal.service.ImageLocalServiceUtil;
069    import com.liferay.portal.service.LayoutLocalServiceUtil;
070    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
071    import com.liferay.portal.service.PortletLocalServiceUtil;
072    import com.liferay.portal.service.RoleLocalServiceUtil;
073    import com.liferay.portal.service.ServiceContext;
074    import com.liferay.portal.service.ServiceContextFactory;
075    import com.liferay.portal.service.ServiceContextThreadLocal;
076    import com.liferay.portal.service.ThemeLocalServiceUtil;
077    import com.liferay.portal.service.UserLocalServiceUtil;
078    import com.liferay.portal.service.permission.GroupPermissionUtil;
079    import com.liferay.portal.service.permission.LayoutPermissionUtil;
080    import com.liferay.portal.service.permission.PortletPermissionUtil;
081    import com.liferay.portal.theme.ThemeDisplay;
082    import com.liferay.portal.theme.ThemeDisplayFactory;
083    import com.liferay.portal.util.CookieKeys;
084    import com.liferay.portal.util.LayoutClone;
085    import com.liferay.portal.util.LayoutCloneFactory;
086    import com.liferay.portal.util.PortalUtil;
087    import com.liferay.portal.util.PortletCategoryKeys;
088    import com.liferay.portal.util.PortletKeys;
089    import com.liferay.portal.util.PrefsPropsUtil;
090    import com.liferay.portal.util.PropsUtil;
091    import com.liferay.portal.util.PropsValues;
092    import com.liferay.portal.util.WebKeys;
093    import com.liferay.portal.webserver.WebServerServletTokenUtil;
094    import com.liferay.portlet.PortalPreferences;
095    import com.liferay.portlet.PortletPreferencesFactoryUtil;
096    import com.liferay.portlet.PortletURLImpl;
097    import com.liferay.portlet.asset.model.AssetEntry;
098    import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
099    import com.liferay.portlet.journal.NoSuchArticleException;
100    import com.liferay.portlet.journal.model.JournalArticle;
101    import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
102    import com.liferay.portlet.sites.util.SitesUtil;
103    
104    import java.io.File;
105    
106    import java.util.ArrayList;
107    import java.util.HashMap;
108    import java.util.LinkedHashMap;
109    import java.util.List;
110    import java.util.Locale;
111    import java.util.Map;
112    import java.util.TimeZone;
113    
114    import javax.portlet.PortletMode;
115    import javax.portlet.PortletRequest;
116    import javax.portlet.PortletURL;
117    import javax.portlet.WindowState;
118    
119    import javax.servlet.http.HttpServletRequest;
120    import javax.servlet.http.HttpServletResponse;
121    import javax.servlet.http.HttpSession;
122    
123    import org.apache.commons.lang.time.StopWatch;
124    
125    /**
126     * @author Brian Wing Shun Chan
127     * @author Felix Ventero
128     * @author Jorge Ferrer
129     */
130    public class ServicePreAction extends Action {
131    
132            public ServicePreAction() {
133                    initImportLARFiles();
134            }
135    
136            public ThemeDisplay initThemeDisplay(
137                            HttpServletRequest request, HttpServletResponse response)
138                    throws Exception {
139    
140                    HttpSession session = request.getSession();
141    
142                    // Company
143    
144                    Company company = PortalUtil.getCompany(request);
145    
146                    long companyId = company.getCompanyId();
147    
148                    // CDN host
149    
150                    String cdnHost = PortalUtil.getCDNHost(request);
151    
152                    String dynamicResourcesCDNHost = StringPool.BLANK;
153    
154                    boolean cdnDynamicResourceEnabled =
155                            PortalUtil.isCDNDynamicResourcesEnabled(request);
156    
157                    if (cdnDynamicResourceEnabled) {
158                            dynamicResourcesCDNHost = cdnHost;
159                    }
160    
161                    // Portal URL
162    
163                    String portalURL = PortalUtil.getPortalURL(request);
164    
165                    // Paths
166    
167                    String contextPath = PortalUtil.getPathContext();
168                    String friendlyURLPrivateGroupPath =
169                            PortalUtil.getPathFriendlyURLPrivateGroup();
170                    String friendlyURLPrivateUserPath =
171                            PortalUtil.getPathFriendlyURLPrivateUser();
172                    String friendlyURLPublicPath = PortalUtil.getPathFriendlyURLPublic();
173                    String imagePath = dynamicResourcesCDNHost.concat(
174                            PortalUtil.getPathImage());
175                    String mainPath = PortalUtil.getPathMain();
176    
177                    String i18nPath = (String)request.getAttribute(WebKeys.I18N_PATH);
178    
179                    if (Validator.isNotNull(i18nPath)) {
180                            if (Validator.isNotNull(contextPath)) {
181                                    String i18nContextPath = contextPath.concat(i18nPath);
182    
183                                    friendlyURLPrivateGroupPath = StringUtil.replaceFirst(
184                                            friendlyURLPrivateGroupPath, contextPath, i18nContextPath);
185                                    friendlyURLPrivateUserPath = StringUtil.replaceFirst(
186                                            friendlyURLPrivateUserPath, contextPath, i18nContextPath);
187                                    friendlyURLPublicPath = StringUtil.replaceFirst(
188                                            friendlyURLPublicPath, contextPath, i18nContextPath);
189                                    mainPath = StringUtil.replaceFirst(
190                                            mainPath, contextPath, i18nContextPath);
191                            }
192                            else {
193                                    friendlyURLPrivateGroupPath = i18nPath.concat(
194                                            friendlyURLPrivateGroupPath);
195                                    friendlyURLPrivateUserPath = i18nPath.concat(
196                                            friendlyURLPrivateUserPath);
197                                    friendlyURLPublicPath = i18nPath.concat(friendlyURLPublicPath);
198                                    mainPath = i18nPath.concat(mainPath);
199                            }
200                    }
201    
202                    // Company logo
203    
204                    StringBundler sb = new StringBundler(5);
205    
206                    sb.append(imagePath);
207                    sb.append("/company_logo?img_id=");
208                    sb.append(company.getLogoId());
209                    sb.append("&t=");
210                    sb.append(WebServerServletTokenUtil.getToken(company.getLogoId()));
211    
212                    String companyLogo = sb.toString();
213    
214                    int companyLogoHeight = 0;
215                    int companyLogoWidth = 0;
216    
217                    Image companyLogoImage = ImageLocalServiceUtil.getCompanyLogo(
218                            company.getLogoId());
219    
220                    if (companyLogoImage != null) {
221                            companyLogoHeight = companyLogoImage.getHeight();
222                            companyLogoWidth = companyLogoImage.getWidth();
223                    }
224    
225                    String realCompanyLogo = companyLogo;
226                    int realCompanyLogoHeight = companyLogoHeight;
227                    int realCompanyLogoWidth = companyLogoWidth;
228    
229                    // User
230    
231                    User user = null;
232    
233                    try {
234                            user = PortalUtil.initUser(request);
235                    }
236                    catch (NoSuchUserException nsue) {
237                            return null;
238                    }
239    
240                    boolean signedIn = !user.isDefaultUser();
241    
242                    if (PropsValues.BROWSER_CACHE_DISABLED ||
243                            (PropsValues.BROWSER_CACHE_SIGNED_IN_DISABLED && signedIn)) {
244    
245                            response.setDateHeader(HttpHeaders.EXPIRES, 0);
246                            response.setHeader(
247                                    HttpHeaders.CACHE_CONTROL,
248                                    HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE);
249                            response.setHeader(
250                                    HttpHeaders.PRAGMA, HttpHeaders.PRAGMA_NO_CACHE_VALUE);
251                    }
252    
253                    User realUser = user;
254    
255                    Long realUserId = (Long)session.getAttribute(WebKeys.USER_ID);
256    
257                    if (realUserId != null) {
258                            if (user.getUserId() != realUserId.longValue()) {
259                                    realUser = UserLocalServiceUtil.getUserById(
260                                            realUserId.longValue());
261                            }
262                    }
263    
264                    String doAsUserId = ParamUtil.getString(request, "doAsUserId");
265                    String doAsUserLanguageId = ParamUtil.getString(
266                            request, "doAsUserLanguageId");
267                    long doAsGroupId = ParamUtil.getLong(request, "doAsGroupId");
268    
269                    long refererGroupId = ParamUtil.getLong(request, "refererGroupId");
270    
271                    long refererPlid = ParamUtil.getLong(request, "refererPlid");
272    
273                    if (LayoutLocalServiceUtil.fetchLayout(refererPlid) == null) {
274                            refererPlid = 0;
275                    }
276    
277                    String controlPanelCategory = ParamUtil.getString(
278                            request, "controlPanelCategory");
279    
280                    // Permission checker
281    
282                    PermissionChecker permissionChecker =
283                            PermissionCheckerFactoryUtil.create(user);
284    
285                    PermissionThreadLocal.setPermissionChecker(permissionChecker);
286    
287                    // Locale
288    
289                    String i18nLanguageId = (String)request.getAttribute(
290                            WebKeys.I18N_LANGUAGE_ID);
291    
292                    Locale locale = PortalUtil.getLocale(request, response, true);
293    
294                    // Cookie support
295    
296                    try {
297    
298                            // LEP-4069
299    
300                            CookieKeys.validateSupportCookie(request);
301                    }
302                    catch (Exception e) {
303                            CookieKeys.addSupportCookie(request, response);
304                    }
305    
306                    // Time zone
307    
308                    TimeZone timeZone = user.getTimeZone();
309    
310                    if (timeZone == null) {
311                            timeZone = company.getTimeZone();
312                    }
313    
314                    // Layouts
315    
316                    if (signedIn) {
317                            updateUserLayouts(user);
318                    }
319    
320                    Layout layout = null;
321                    List<Layout> layouts = null;
322    
323                    long plid = ParamUtil.getLong(request, "p_l_id");
324    
325                    if (plid > 0) {
326                            layout = LayoutLocalServiceUtil.getLayout(plid);
327    
328                            long sourceGroupId = ParamUtil.getLong(request, "p_v_l_s_g_id");
329    
330                            if ((sourceGroupId > 0) && (sourceGroupId != layout.getGroupId())) {
331                                    Group sourceGroup = GroupLocalServiceUtil.getGroup(
332                                            sourceGroupId);
333    
334                                    if (layout.isPublicLayout() ||
335                                            SitesUtil.isUserGroupLayoutSetViewable(
336                                                    permissionChecker, layout.getGroup())) {
337    
338                                            layout = new VirtualLayout(layout, sourceGroup);
339                                    }
340                                    else {
341                                            layout = null;
342                                    }
343                            }
344                    }
345                    else {
346                            long groupId = ParamUtil.getLong(request, "groupId");
347                            boolean privateLayout = ParamUtil.getBoolean(
348                                    request, "privateLayout");
349                            long layoutId = ParamUtil.getLong(request, "layoutId");
350    
351                            if ((groupId > 0) && (layoutId > 0)) {
352                                    layout = LayoutLocalServiceUtil.getLayout(
353                                            groupId, privateLayout, layoutId);
354                            }
355                    }
356    
357                    String ppid = ParamUtil.getString(request, "p_p_id");
358    
359                    Boolean redirectToDefaultLayout = (Boolean)request.getAttribute(
360                            WebKeys.REDIRECT_TO_DEFAULT_LAYOUT);
361    
362                    if (redirectToDefaultLayout == null) {
363                            redirectToDefaultLayout = Boolean.FALSE;
364                    }
365    
366                    if (layout != null) {
367                            Group group = layout.getGroup();
368    
369                            if (!signedIn && PropsValues.AUTH_FORWARD_BY_REDIRECT) {
370                                    request.setAttribute(WebKeys.REQUESTED_LAYOUT, layout);
371                            }
372    
373                            if (Validator.isNull(controlPanelCategory) &&
374                                    Validator.isNotNull(ppid) &&
375                                    (LiferayWindowState.isPopUp(request) ||
376                                     LiferayWindowState.isExclusive(request))) {
377    
378                                    controlPanelCategory =
379                                            _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + ppid;
380                            }
381    
382                            boolean viewableGroup = LayoutPermissionUtil.contains(
383                                    permissionChecker, layout, controlPanelCategory, true,
384                                    ActionKeys.VIEW);
385                            boolean viewableStaging = GroupPermissionUtil.contains(
386                                    permissionChecker, group.getGroupId(), ActionKeys.VIEW_STAGING);
387    
388                            if (viewableStaging) {
389                                    layouts = LayoutLocalServiceUtil.getLayouts(
390                                            layout.getGroupId(), layout.isPrivateLayout(),
391                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
392                            }
393                            else if (!viewableGroup && group.isStagingGroup()) {
394                                    layout = null;
395                            }
396                            else if (!isLoginRequest(request) &&
397                                             (!viewableGroup ||
398                                              (!redirectToDefaultLayout &&
399                                               !LayoutPermissionUtil.contains(
400                                                       permissionChecker, layout, false,
401                                                       ActionKeys.VIEW)))) {
402    
403                                    if (user.isDefaultUser() &&
404                                            PropsValues.AUTH_LOGIN_PROMPT_ENABLED) {
405    
406                                            throw new PrincipalException("User is not authenticated");
407                                    }
408    
409                                    sb = new StringBundler(6);
410    
411                                    sb.append("User ");
412                                    sb.append(user.getUserId());
413                                    sb.append(" is not allowed to access the ");
414                                    sb.append(layout.isPrivateLayout() ? "private": "public");
415                                    sb.append(" pages of group ");
416                                    sb.append(layout.getGroupId());
417    
418                                    if (_log.isWarnEnabled()) {
419                                            _log.warn(sb.toString());
420                                    }
421    
422                                    throw new NoSuchLayoutException(sb.toString());
423                            }
424                            else if (isLoginRequest(request) && !viewableGroup) {
425                                    layout = null;
426                            }
427                            else if (group.isLayoutPrototype()) {
428                                    layouts = new ArrayList<Layout>();
429                            }
430                            else {
431                                    layouts = LayoutLocalServiceUtil.getLayouts(
432                                            layout.getGroupId(), layout.isPrivateLayout(),
433                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
434    
435                                    if (!group.isControlPanel()) {
436                                            doAsGroupId = 0;
437                                    }
438                            }
439                    }
440    
441                    List<Layout> unfilteredLayouts = layouts;
442    
443                    if (layout == null) {
444                            Object[] defaultLayout = getDefaultLayout(request, user, signedIn);
445    
446                            layout = (Layout)defaultLayout[0];
447                            layouts = (List<Layout>)defaultLayout[1];
448    
449                            request.setAttribute(WebKeys.LAYOUT_DEFAULT, Boolean.TRUE);
450                    }
451    
452                    Object[] viewableLayouts = getViewableLayouts(
453                            request, user, permissionChecker, layout, layouts);
454    
455                    String layoutSetLogo = null;
456    
457                    layout = (Layout)viewableLayouts[0];
458                    layouts = (List<Layout>)viewableLayouts[1];
459    
460                    Group group = null;
461    
462                    if (layout != null) {
463                            group = layout.getGroup();
464    
465                            if (!group.isControlPanel()) {
466                                    rememberVisitedGroupIds(request, group.getGroupId());
467                            }
468                    }
469    
470                    LayoutTypePortlet layoutTypePortlet = null;
471    
472                    layouts = mergeAdditionalLayouts(
473                            request, user, permissionChecker, layout, layouts);
474    
475                    LayoutSet layoutSet = null;
476    
477                    boolean hasCustomizeLayoutPermission = false;
478                    boolean hasUpdateLayoutPermission = false;
479    
480                    boolean customizedView = SessionParamUtil.getBoolean(
481                            request, "customized_view", true);
482    
483                    if (layout != null) {
484                            hasCustomizeLayoutPermission = LayoutPermissionUtil.contains(
485                                    permissionChecker, layout, ActionKeys.CUSTOMIZE);
486                            hasUpdateLayoutPermission = LayoutPermissionUtil.contains(
487                                    permissionChecker, layout, ActionKeys.UPDATE);
488    
489                            layoutSet = layout.getLayoutSet();
490    
491                            if (company.isSiteLogo()) {
492                                    long logoId = 0;
493    
494                                    if (layoutSet.isLogo()) {
495                                            logoId = layoutSet.getLogoId();
496    
497                                            if (logoId == 0) {
498                                                    logoId = layoutSet.getLiveLogoId();
499                                            }
500                                    }
501                                    else {
502                                            LayoutSet siblingLayoutSet =
503                                                    LayoutSetLocalServiceUtil.getLayoutSet(
504                                                            layout.getGroupId(), !layout.isPrivateLayout());
505    
506                                            if (siblingLayoutSet.isLogo()) {
507                                                    logoId = siblingLayoutSet.getLogoId();
508                                            }
509                                    }
510    
511                                    if (logoId > 0) {
512                                            sb = new StringBundler(5);
513    
514                                            sb.append(imagePath);
515                                            sb.append("/layout_set_logo?img_id=");
516                                            sb.append(logoId);
517                                            sb.append("&t=");
518                                            sb.append(WebServerServletTokenUtil.getToken(logoId));
519    
520                                            layoutSetLogo = sb.toString();
521    
522                                            Image layoutSetLogoImage =
523                                                    ImageLocalServiceUtil.getCompanyLogo(logoId);
524    
525                                            companyLogo = layoutSetLogo;
526                                            companyLogoHeight = layoutSetLogoImage.getHeight();
527                                            companyLogoWidth = layoutSetLogoImage.getWidth();
528                                    }
529                            }
530    
531                            plid = layout.getPlid();
532    
533                            // Updates to shared layouts are not reflected until the next time
534                            // the user logs in because group layouts are cached in the session
535    
536                            layout = (Layout)layout.clone();
537    
538                            layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
539    
540                            boolean customizable = layoutTypePortlet.isCustomizable();
541    
542                            if (!customizable ||
543                                    (group.isLayoutPrototype() || group.isLayoutSetPrototype())) {
544    
545                                    customizedView = false;
546                            }
547    
548                            layoutTypePortlet.setCustomizedView(customizedView);
549                            layoutTypePortlet.setUpdatePermission(hasUpdateLayoutPermission);
550    
551                            if (signedIn && customizable && customizedView &&
552                                    hasCustomizeLayoutPermission) {
553    
554                                    PortalPreferences portalPreferences =
555                                            PortletPreferencesFactoryUtil.getPortalPreferences(
556                                                    companyId, user.getUserId(), true);
557    
558                                    layoutTypePortlet.setPortalPreferences(portalPreferences);
559                            }
560    
561                            LayoutClone layoutClone = LayoutCloneFactory.getInstance();
562    
563                            if (layoutClone != null) {
564                                    String typeSettings = layoutClone.get(request, plid);
565    
566                                    if (typeSettings != null) {
567                                            UnicodeProperties typeSettingsProperties =
568                                                    new UnicodeProperties(true);
569    
570                                            typeSettingsProperties.load(typeSettings);
571    
572                                            String stateMax = typeSettingsProperties.getProperty(
573                                                    LayoutTypePortletConstants.STATE_MAX);
574                                            String stateMin = typeSettingsProperties.getProperty(
575                                                    LayoutTypePortletConstants.STATE_MIN);
576                                            String modeAbout = typeSettingsProperties.getProperty(
577                                                    LayoutTypePortletConstants.MODE_ABOUT);
578                                            String modeConfig = typeSettingsProperties.getProperty(
579                                                    LayoutTypePortletConstants.MODE_CONFIG);
580                                            String modeEdit = typeSettingsProperties.getProperty(
581                                                    LayoutTypePortletConstants.MODE_EDIT);
582                                            String modeEditDefaults =
583                                                    typeSettingsProperties.getProperty(
584                                                            LayoutTypePortletConstants.MODE_EDIT_DEFAULTS);
585                                            String modeEditGuest = typeSettingsProperties.getProperty(
586                                                    LayoutTypePortletConstants.MODE_EDIT_GUEST);
587                                            String modeHelp = typeSettingsProperties.getProperty(
588                                                    LayoutTypePortletConstants.MODE_HELP);
589                                            String modePreview = typeSettingsProperties.getProperty(
590                                                    LayoutTypePortletConstants.MODE_PREVIEW);
591                                            String modePrint = typeSettingsProperties.getProperty(
592                                                    LayoutTypePortletConstants.MODE_PRINT);
593    
594                                            layoutTypePortlet.setStateMax(stateMax);
595                                            layoutTypePortlet.setStateMin(stateMin);
596                                            layoutTypePortlet.setModeAbout(modeAbout);
597                                            layoutTypePortlet.setModeConfig(modeConfig);
598                                            layoutTypePortlet.setModeEdit(modeEdit);
599                                            layoutTypePortlet.setModeEditDefaults(modeEditDefaults);
600                                            layoutTypePortlet.setModeEditGuest(modeEditGuest);
601                                            layoutTypePortlet.setModeHelp(modeHelp);
602                                            layoutTypePortlet.setModePreview(modePreview);
603                                            layoutTypePortlet.setModePrint(modePrint);
604                                    }
605                            }
606    
607                            request.setAttribute(WebKeys.LAYOUT, layout);
608                            request.setAttribute(WebKeys.LAYOUTS, layouts);
609                    }
610    
611                    // Scope
612    
613                    long scopeGroupId = PortalUtil.getScopeGroupId(request);
614    
615                    if ((scopeGroupId <= 0) && (doAsGroupId > 0)) {
616                            scopeGroupId = doAsGroupId;
617                    }
618    
619                    long parentGroupId = PortalUtil.getParentGroupId(scopeGroupId);
620    
621                    // Theme and color scheme
622    
623                    Theme theme = null;
624                    ColorScheme colorScheme = null;
625    
626                    boolean wapTheme = BrowserSnifferUtil.isWap(request);
627    
628                    if ((layout != null) && group.isControlPanel()) {
629                            String themeId = PrefsPropsUtil.getString(
630                                    companyId, PropsKeys.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID);
631                            String colorSchemeId =
632                                    ColorSchemeImpl.getDefaultRegularColorSchemeId();
633    
634                            theme = ThemeLocalServiceUtil.getTheme(
635                                    companyId, themeId, wapTheme);
636                            colorScheme = ThemeLocalServiceUtil.getColorScheme(
637                                    companyId, theme.getThemeId(), colorSchemeId, wapTheme);
638    
639                            if (!wapTheme && theme.isWapTheme()) {
640                                    theme = ThemeLocalServiceUtil.getTheme(
641                                            companyId,
642                                            PropsValues.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID, false);
643                                    colorScheme = ThemeLocalServiceUtil.getColorScheme(
644                                            companyId, theme.getThemeId(), colorSchemeId, false);
645                            }
646    
647                            request.setAttribute(WebKeys.THEME, theme);
648                            request.setAttribute(WebKeys.COLOR_SCHEME, colorScheme);
649                    }
650    
651                    boolean themeCssFastLoad = SessionParamUtil.getBoolean(
652                            request, "css_fast_load", PropsValues.THEME_CSS_FAST_LOAD);
653                    boolean themeImagesFastLoad = SessionParamUtil.getBoolean(
654                            request, "images_fast_load", PropsValues.THEME_IMAGES_FAST_LOAD);
655    
656                    boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED;
657    
658                    if (themeJsBarebone) {
659                            if (signedIn) {
660                                    themeJsBarebone = false;
661                            }
662                    }
663    
664                    boolean themeJsFastLoad = SessionParamUtil.getBoolean(
665                            request, "js_fast_load", PropsValues.JAVASCRIPT_FAST_LOAD);
666    
667                    String lifecycle = ParamUtil.getString(request, "p_p_lifecycle", "0");
668    
669                    lifecycle = ParamUtil.getString(request, "p_t_lifecycle", lifecycle);
670    
671                    boolean isolated = ParamUtil.getBoolean(request, "p_p_isolated");
672    
673                    String facebookCanvasPageURL = (String)request.getAttribute(
674                            WebKeys.FACEBOOK_CANVAS_PAGE_URL);
675    
676                    boolean widget = false;
677    
678                    Boolean widgetObj = (Boolean)request.getAttribute(WebKeys.WIDGET);
679    
680                    if (widgetObj != null) {
681                            widget = widgetObj.booleanValue();
682                    }
683    
684                    // Theme display
685    
686                    ThemeDisplay themeDisplay = ThemeDisplayFactory.create();
687    
688                    // Set the CDN host, portal URL, and Facebook application ID first
689                    // because other methods (setLookAndFeel) depend on them being set
690    
691                    themeDisplay.setCDNHost(cdnHost);
692                    themeDisplay.setCDNDynamicResourcesHost(dynamicResourcesCDNHost);
693                    themeDisplay.setPortalURL(portalURL);
694                    themeDisplay.setFacebookCanvasPageURL(facebookCanvasPageURL);
695                    themeDisplay.setWidget(widget);
696    
697                    themeDisplay.setCompany(company);
698                    themeDisplay.setCompanyLogo(companyLogo);
699                    themeDisplay.setCompanyLogoHeight(companyLogoHeight);
700                    themeDisplay.setCompanyLogoWidth(companyLogoWidth);
701                    themeDisplay.setRealCompanyLogo(realCompanyLogo);
702                    themeDisplay.setRealCompanyLogoHeight(realCompanyLogoHeight);
703                    themeDisplay.setRealCompanyLogoWidth(realCompanyLogoWidth);
704                    themeDisplay.setUser(user);
705                    themeDisplay.setRealUser(realUser);
706                    themeDisplay.setDoAsUserId(doAsUserId);
707                    themeDisplay.setDoAsUserLanguageId(doAsUserLanguageId);
708                    themeDisplay.setDoAsGroupId(doAsGroupId);
709                    themeDisplay.setRefererGroupId(refererGroupId);
710                    themeDisplay.setRefererPlid(refererPlid);
711                    themeDisplay.setControlPanelCategory(controlPanelCategory);
712                    themeDisplay.setLayoutSet(layoutSet);
713                    themeDisplay.setLayoutSetLogo(layoutSetLogo);
714                    themeDisplay.setLayout(layout);
715                    themeDisplay.setLayouts(layouts);
716                    themeDisplay.setUnfilteredLayouts(unfilteredLayouts);
717                    themeDisplay.setPlid(plid);
718                    themeDisplay.setPpid(ppid);
719                    themeDisplay.setLayoutTypePortlet(layoutTypePortlet);
720                    themeDisplay.setScopeGroupId(scopeGroupId);
721                    themeDisplay.setParentGroupId(parentGroupId);
722                    themeDisplay.setSignedIn(signedIn);
723                    themeDisplay.setPermissionChecker(permissionChecker);
724                    themeDisplay.setLocale(locale);
725                    themeDisplay.setLanguageId(LocaleUtil.toLanguageId(locale));
726                    themeDisplay.setI18nLanguageId(i18nLanguageId);
727                    themeDisplay.setI18nPath(i18nPath);
728                    themeDisplay.setTimeZone(timeZone);
729                    themeDisplay.setLookAndFeel(theme, colorScheme);
730                    themeDisplay.setThemeCssFastLoad(themeCssFastLoad);
731                    themeDisplay.setThemeImagesFastLoad(themeImagesFastLoad);
732                    themeDisplay.setThemeJsBarebone(themeJsBarebone);
733                    themeDisplay.setThemeJsFastLoad(themeJsFastLoad);
734                    themeDisplay.setServerName(request.getServerName());
735                    themeDisplay.setServerPort(request.getServerPort());
736                    themeDisplay.setSecure(request.isSecure());
737                    themeDisplay.setLifecycle(lifecycle);
738                    themeDisplay.setLifecycleAction(lifecycle.equals("1"));
739                    themeDisplay.setLifecycleEvent(lifecycle.equals("3"));
740                    themeDisplay.setLifecycleRender(lifecycle.equals("0"));
741                    themeDisplay.setLifecycleResource(lifecycle.equals("2"));
742                    themeDisplay.setStateExclusive(LiferayWindowState.isExclusive(request));
743                    themeDisplay.setStateMaximized(LiferayWindowState.isMaximized(request));
744                    themeDisplay.setStatePopUp(LiferayWindowState.isPopUp(request));
745                    themeDisplay.setIsolated(isolated);
746                    themeDisplay.setPathApplet(contextPath.concat("/applets"));
747                    themeDisplay.setPathCms(contextPath.concat("/cms"));
748                    themeDisplay.setPathContext(contextPath);
749                    themeDisplay.setPathFlash(contextPath.concat("/flash"));
750                    themeDisplay.setPathFriendlyURLPrivateGroup(
751                            friendlyURLPrivateGroupPath);
752                    themeDisplay.setPathFriendlyURLPrivateUser(friendlyURLPrivateUserPath);
753                    themeDisplay.setPathFriendlyURLPublic(friendlyURLPublicPath);
754                    themeDisplay.setPathImage(imagePath);
755                    themeDisplay.setPathJavaScript(contextPath.concat("/html/js"));
756                    themeDisplay.setPathMain(mainPath);
757                    themeDisplay.setPathSound(contextPath.concat("/html/sound"));
758    
759                    // Icons
760    
761                    themeDisplay.setShowAddContentIcon(false);
762                    themeDisplay.setShowControlPanelIcon(signedIn);
763                    themeDisplay.setShowHomeIcon(true);
764                    themeDisplay.setShowMyAccountIcon(signedIn);
765                    themeDisplay.setShowPageSettingsIcon(false);
766                    themeDisplay.setShowPortalIcon(true);
767                    themeDisplay.setShowSignInIcon(!signedIn);
768                    themeDisplay.setShowSignOutIcon(signedIn);
769    
770                    boolean showSiteContentIcon = false;
771    
772                    long controlPanelPlid = 0;
773    
774                    if (signedIn && PropsValues.DOCKBAR_SHOW_SITE_CONTENT_ICON) {
775                            Group controlPanelGroup = GroupLocalServiceUtil.getGroup(
776                                    companyId, GroupConstants.CONTROL_PANEL);
777    
778                            controlPanelPlid = LayoutLocalServiceUtil.getDefaultPlid(
779                                    controlPanelGroup.getGroupId(), true);
780    
781                            List<Portlet> siteContentPortlets =
782                                    PortalUtil.getControlPanelPortlets(
783                                            PortletCategoryKeys.CONTENT, themeDisplay);
784    
785                            Portlet groupPagesPortlet = PortletLocalServiceUtil.getPortletById(
786                                    PortletKeys.GROUP_PAGES);
787    
788                            siteContentPortlets.remove(groupPagesPortlet);
789    
790                            Portlet siteMembershipsAdminPortlet =
791                                    PortletLocalServiceUtil.getPortletById(
792                                            PortletKeys.SITE_MEMBERSHIPS_ADMIN);
793    
794                            siteContentPortlets.remove(siteMembershipsAdminPortlet);
795    
796                            Portlet siteSettingsPortlet =
797                                    PortletLocalServiceUtil.getPortletById(
798                                            PortletKeys.SITE_SETTINGS);
799    
800                            siteContentPortlets.remove(siteSettingsPortlet);
801    
802                            showSiteContentIcon = PortletPermissionUtil.contains(
803                                    permissionChecker, scopeGroupId, controlPanelPlid,
804                                    siteContentPortlets, ActionKeys.VIEW);
805                    }
806    
807                    themeDisplay.setShowSiteContentIcon(showSiteContentIcon);
808    
809                    themeDisplay.setShowStagingIcon(false);
810    
811                    // Session
812    
813                    if (PropsValues.SESSION_ENABLE_URL_WITH_SESSION_ID &&
814                            !CookieKeys.hasSessionId(request)) {
815    
816                            themeDisplay.setAddSessionIdToURL(true);
817                            themeDisplay.setSessionId(session.getId());
818                    }
819    
820                    // URLs
821    
822                    String urlControlPanel = friendlyURLPrivateGroupPath.concat(
823                            GroupConstants.CONTROL_PANEL_FRIENDLY_URL);
824    
825                    if (Validator.isNotNull(doAsUserId)) {
826                            urlControlPanel = HttpUtil.addParameter(
827                                    urlControlPanel, "doAsUserId", doAsUserId);
828                    }
829    
830                    if (scopeGroupId > 0) {
831                            urlControlPanel = HttpUtil.addParameter(
832                                    urlControlPanel, "doAsGroupId", scopeGroupId);
833                    }
834    
835                    if (refererGroupId > 0) {
836                            urlControlPanel = HttpUtil.addParameter(
837                                    urlControlPanel, "refererGroupId", refererGroupId);
838                    }
839                    else if (scopeGroupId > 0) {
840                            Layout refererLayout = LayoutLocalServiceUtil.fetchLayout(plid);
841    
842                            if (refererLayout != null) {
843                                    Group refererLayoutGroup = refererLayout.getGroup();
844    
845                                    if (refererLayoutGroup.isUserGroup()) {
846                                            urlControlPanel = HttpUtil.addParameter(
847                                                    urlControlPanel, "refererGroupId", scopeGroupId);
848                                    }
849                            }
850                    }
851    
852                    if (refererPlid > 0) {
853                            urlControlPanel = HttpUtil.addParameter(
854                                    urlControlPanel, "refererPlid", refererPlid);
855                    }
856                    else if (plid > 0) {
857                            urlControlPanel = HttpUtil.addParameter(
858                                    urlControlPanel, "refererPlid", plid);
859                    }
860    
861                    if (themeDisplay.isAddSessionIdToURL()) {
862                            urlControlPanel = PortalUtil.getURLWithSessionId(
863                                    urlControlPanel, session.getId());
864                    }
865    
866                    themeDisplay.setURLControlPanel(urlControlPanel);
867    
868                    String siteContentURL = urlControlPanel;
869    
870                    siteContentURL = HttpUtil.addParameter(
871                            siteContentURL, "controlPanelCategory",
872                            PortletCategoryKeys.CONTENT);
873    
874                    themeDisplay.setURLSiteContent(siteContentURL);
875    
876                    String currentURL = PortalUtil.getCurrentURL(request);
877    
878                    themeDisplay.setURLCurrent(currentURL);
879    
880                    String urlHome = PortalUtil.getHomeURL(request);
881    
882                    themeDisplay.setURLHome(urlHome);
883    
884                    if (layout != null) {
885                            if (layout.isTypePortlet()) {
886                                    boolean freeformLayout =
887                                            layoutTypePortlet.getLayoutTemplateId().equals("freeform");
888    
889                                    themeDisplay.setFreeformLayout(freeformLayout);
890    
891                                    if (hasUpdateLayoutPermission) {
892                                            themeDisplay.setShowAddContentIconPermission(true);
893    
894                                            if (!LiferayWindowState.isMaximized(request)) {
895                                                    themeDisplay.setShowAddContentIcon(true);
896                                            }
897    
898                                            themeDisplay.setShowLayoutTemplatesIcon(true);
899    
900                                            if (!group.isUser()) {
901                                                    themeDisplay.setShowPageCustomizationIcon(true);
902                                            }
903    
904                                            themeDisplay.setURLAddContent(
905                                                    "Liferay.LayoutConfiguration.toggle('".concat(
906                                                            PortletKeys.LAYOUT_CONFIGURATION).concat("');"));
907                                    }
908    
909                                    if (hasCustomizeLayoutPermission && customizedView) {
910                                            themeDisplay.setShowAddContentIconPermission(true);
911    
912                                            if (!LiferayWindowState.isMaximized(request)) {
913                                                    themeDisplay.setShowAddContentIcon(true);
914                                            }
915    
916                                            themeDisplay.setURLAddContent(
917                                                    "Liferay.LayoutConfiguration.toggle('".concat(
918                                                            PortletKeys.LAYOUT_CONFIGURATION).concat("');"));
919                                    }
920                            }
921    
922                            if (hasUpdateLayoutPermission) {
923                                    themeDisplay.setShowPageSettingsIcon(true);
924    
925                                    LiferayPortletURL pageSettingsURL = new PortletURLImpl(
926                                            request, PortletKeys.LAYOUTS_ADMIN, controlPanelPlid,
927                                            PortletRequest.RENDER_PHASE);
928    
929                                    pageSettingsURL.setDoAsGroupId(scopeGroupId);
930                                    pageSettingsURL.setParameter(
931                                            "struts_action", "/layouts_admin/edit_layouts");
932    
933                                    if (layout.isPrivateLayout()) {
934                                            pageSettingsURL.setParameter("tabs1", "private-pages");
935                                    }
936                                    else {
937                                            pageSettingsURL.setParameter("tabs1", "public-pages");
938                                    }
939    
940                                    pageSettingsURL.setParameter(
941                                            "groupId", String.valueOf(scopeGroupId));
942                                    pageSettingsURL.setParameter("selPlid", String.valueOf(plid));
943                                    pageSettingsURL.setPortletMode(PortletMode.VIEW);
944    
945                                    if (PropsValues.DOCKBAR_ADMINISTRATIVE_LINKS_SHOW_IN_POP_UP) {
946                                            pageSettingsURL.setControlPanelCategory(
947                                                    _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX +
948                                                            PortletKeys.LAYOUTS_ADMIN);
949                                            pageSettingsURL.setParameter("closeRedirect", currentURL);
950                                            pageSettingsURL.setWindowState(LiferayWindowState.POP_UP);
951                                    }
952                                    else {
953                                            pageSettingsURL.setParameter(
954                                                    "redirect", themeDisplay.getURLHome());
955                                            pageSettingsURL.setPlid(plid);
956                                            pageSettingsURL.setWindowState(WindowState.MAXIMIZED);
957                                    }
958    
959                                    themeDisplay.setURLPageSettings(pageSettingsURL);
960    
961                                    boolean site = group.isSite();
962    
963                                    if (!site && group.isStagingGroup()) {
964                                            Group liveGroup = group.getLiveGroup();
965    
966                                            site = liveGroup.isSite();
967                                    }
968    
969                                    if (site &&
970                                            GroupPermissionUtil.contains(
971                                                    permissionChecker, scopeGroupId,
972                                                    ActionKeys.ASSIGN_MEMBERS)) {
973    
974                                            themeDisplay.setShowManageSiteMembershipsIcon(true);
975    
976                                            LiferayPortletURL manageSiteMembershipsURL =
977                                                    new PortletURLImpl(
978                                                            request, PortletKeys.SITE_MEMBERSHIPS_ADMIN,
979                                                            controlPanelPlid, PortletRequest.RENDER_PHASE);
980    
981                                            manageSiteMembershipsURL.setDoAsGroupId(scopeGroupId);
982                                            manageSiteMembershipsURL.setParameter(
983                                                    "struts_action", "/sites_admin/edit_site_assignments");
984                                            manageSiteMembershipsURL.setParameter(
985                                                    "groupId", String.valueOf(scopeGroupId));
986                                            manageSiteMembershipsURL.setParameter(
987                                                    "selPlid", String.valueOf(plid));
988                                            manageSiteMembershipsURL.setPortletMode(PortletMode.VIEW);
989    
990                                            if (PropsValues.
991                                                            DOCKBAR_ADMINISTRATIVE_LINKS_SHOW_IN_POP_UP) {
992    
993                                                    manageSiteMembershipsURL.setControlPanelCategory(
994                                                            _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX +
995                                                                    PortletKeys.SITE_MEMBERSHIPS_ADMIN);
996                                                    manageSiteMembershipsURL.setWindowState(
997                                                            LiferayWindowState.POP_UP);
998                                            }
999                                            else {
1000                                                    manageSiteMembershipsURL.setParameter(
1001                                                            "redirect", themeDisplay.getURLHome());
1002                                                    manageSiteMembershipsURL.setParameter(
1003                                                            "showBackURL", Boolean.FALSE.toString());
1004                                                    manageSiteMembershipsURL.setPlid(plid);
1005                                                    manageSiteMembershipsURL.setWindowState(
1006                                                            WindowState.MAXIMIZED);
1007                                            }
1008    
1009                                            themeDisplay.setURLManageSiteMemberships(
1010                                                    manageSiteMembershipsURL);
1011                                    }
1012                                    else {
1013                                            themeDisplay.setShowManageSiteMembershipsIcon(false);
1014                                    }
1015                            }
1016    
1017                            boolean hasAddLayoutGroupPermission = GroupPermissionUtil.contains(
1018                                    permissionChecker, scopeGroupId, ActionKeys.ADD_LAYOUT);
1019                            boolean hasAddLayoutLayoutPermission =
1020                                    LayoutPermissionUtil.contains(
1021                                            permissionChecker, layout, ActionKeys.ADD_LAYOUT);
1022                            boolean hasManageLayoutsGroupPermission =
1023                                    GroupPermissionUtil.contains(
1024                                            permissionChecker, scopeGroupId, ActionKeys.MANAGE_LAYOUTS);
1025                            boolean hasManageStagingPermission = GroupPermissionUtil.contains(
1026                                    permissionChecker, scopeGroupId, ActionKeys.MANAGE_STAGING);
1027                            boolean hasPublishStagingPermission = GroupPermissionUtil.contains(
1028                                    permissionChecker, scopeGroupId, ActionKeys.PUBLISH_STAGING);
1029                            boolean hasUpdateGroupPermission = GroupPermissionUtil.contains(
1030                                    permissionChecker, scopeGroupId, ActionKeys.UPDATE);
1031                            boolean hasViewStagingPermission = GroupPermissionUtil.contains(
1032                                    permissionChecker, scopeGroupId, ActionKeys.VIEW_STAGING);
1033    
1034                            if (!group.isControlPanel() && !group.isUser() &&
1035                                    !group.isUserGroup() && hasUpdateGroupPermission) {
1036    
1037                                    themeDisplay.setShowSiteSettingsIcon(true);
1038    
1039                                    LiferayPortletURL siteSettingsURL = new PortletURLImpl(
1040                                            request, PortletKeys.SITE_SETTINGS, controlPanelPlid,
1041                                            PortletRequest.RENDER_PHASE);
1042    
1043                                    siteSettingsURL.setDoAsGroupId(scopeGroupId);
1044                                    siteSettingsURL.setParameter(
1045                                            "struts_action", "/sites_admin/edit_site");
1046                                    siteSettingsURL.setParameter(
1047                                            "groupId", String.valueOf(scopeGroupId));
1048                                    siteSettingsURL.setParameter(
1049                                            "showBackURL", Boolean.FALSE.toString());
1050                                    siteSettingsURL.setPortletMode(PortletMode.VIEW);
1051    
1052                                    if (PropsValues.DOCKBAR_ADMINISTRATIVE_LINKS_SHOW_IN_POP_UP) {
1053                                            siteSettingsURL.setControlPanelCategory(
1054                                                    _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX +
1055                                                            PortletKeys.SITE_SETTINGS);
1056                                            siteSettingsURL.setParameter("closeRedirect", currentURL);
1057                                            siteSettingsURL.setWindowState(LiferayWindowState.POP_UP);
1058                                    }
1059                                    else {
1060                                            siteSettingsURL.setParameter(
1061                                                    "redirect", themeDisplay.getURLHome());
1062                                            siteSettingsURL.setPlid(plid);
1063                                            siteSettingsURL.setWindowState(
1064                                                    LiferayWindowState.MAXIMIZED);
1065                                    }
1066    
1067                                    themeDisplay.setURLSiteSettings(siteSettingsURL);
1068                            }
1069    
1070                            if (!group.isLayoutPrototype() &&
1071                                    (hasAddLayoutGroupPermission || hasAddLayoutLayoutPermission ||
1072                                     hasManageLayoutsGroupPermission || hasUpdateGroupPermission)) {
1073    
1074                                    themeDisplay.setShowSiteMapSettingsIcon(true);
1075    
1076                                    LiferayPortletURL siteMapSettingsURL = new PortletURLImpl(
1077                                            request, PortletKeys.LAYOUTS_ADMIN, controlPanelPlid,
1078                                            PortletRequest.RENDER_PHASE);
1079    
1080                                    siteMapSettingsURL.setDoAsGroupId(scopeGroupId);
1081                                    siteMapSettingsURL.setParameter(
1082                                            "struts_action", "/layouts_admin/edit_layouts");
1083    
1084                                    if (layout.isPrivateLayout()) {
1085                                            siteMapSettingsURL.setParameter("tabs1", "private-pages");
1086                                    }
1087                                    else {
1088                                            siteMapSettingsURL.setParameter("tabs1", "public-pages");
1089                                    }
1090    
1091                                    siteMapSettingsURL.setParameter(
1092                                            "groupId", String.valueOf(scopeGroupId));
1093                                    siteMapSettingsURL.setPortletMode(PortletMode.VIEW);
1094    
1095                                    if (PropsValues.DOCKBAR_ADMINISTRATIVE_LINKS_SHOW_IN_POP_UP) {
1096                                            siteMapSettingsURL.setControlPanelCategory(
1097                                                    _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX +
1098                                                            PortletKeys.LAYOUTS_ADMIN);
1099                                            siteMapSettingsURL.setParameter(
1100                                                    "closeRedirect", currentURL);
1101                                            siteMapSettingsURL.setWindowState(
1102                                                    LiferayWindowState.POP_UP);
1103                                    }
1104                                    else {
1105                                            siteMapSettingsURL.setParameter(
1106                                                    "redirect", themeDisplay.getURLHome());
1107                                            siteMapSettingsURL.setPlid(plid);
1108                                            siteMapSettingsURL.setWindowState(
1109                                                    LiferayWindowState.MAXIMIZED);
1110                                    }
1111    
1112                                    themeDisplay.setURLSiteMapSettings(siteMapSettingsURL);
1113                            }
1114    
1115                            if (group.hasStagingGroup() && !group.isStagingGroup()) {
1116                                    themeDisplay.setShowAddContentIcon(false);
1117                                    themeDisplay.setShowLayoutTemplatesIcon(false);
1118                                    themeDisplay.setShowPageSettingsIcon(false);
1119                                    themeDisplay.setURLPublishToLive(null);
1120                            }
1121    
1122                            if (group.isControlPanel()) {
1123                                    themeDisplay.setShowPageSettingsIcon(false);
1124                                    themeDisplay.setURLPublishToLive(null);
1125                            }
1126    
1127                            // LEP-4987
1128    
1129                            if (group.isStaged() || group.isStagingGroup()) {
1130                                    if (hasManageStagingPermission || hasPublishStagingPermission ||
1131                                            hasUpdateLayoutPermission || hasViewStagingPermission) {
1132    
1133                                            themeDisplay.setShowStagingIcon(true);
1134                                    }
1135    
1136                                    if (hasPublishStagingPermission) {
1137                                            PortletURL publishToLiveURL = new PortletURLImpl(
1138                                                    request, PortletKeys.LAYOUTS_ADMIN, plid,
1139                                                    PortletRequest.RENDER_PHASE);
1140    
1141                                            publishToLiveURL.setParameter(
1142                                                    "struts_action", "/layouts_admin/publish_layouts");
1143    
1144                                            if (layout.isPrivateLayout()) {
1145                                                    publishToLiveURL.setParameter("tabs1", "private-pages");
1146                                            }
1147                                            else {
1148                                                    publishToLiveURL.setParameter("tabs1", "public-pages");
1149                                            }
1150    
1151                                            publishToLiveURL.setParameter("pagesRedirect", currentURL);
1152                                            publishToLiveURL.setParameter(
1153                                                    "groupId", String.valueOf(scopeGroupId));
1154                                            publishToLiveURL.setParameter(
1155                                                    "selPlid", String.valueOf(plid));
1156                                            publishToLiveURL.setPortletMode(PortletMode.VIEW);
1157                                            publishToLiveURL.setWindowState(
1158                                                    LiferayWindowState.EXCLUSIVE);
1159    
1160                                            themeDisplay.setURLPublishToLive(publishToLiveURL);
1161                                    }
1162                            }
1163    
1164                            PortletURLImpl myAccountURL = new PortletURLImpl(
1165                                    request, PortletKeys.MY_ACCOUNT, controlPanelPlid,
1166                                    PortletRequest.RENDER_PHASE);
1167    
1168                            if (scopeGroupId > 0) {
1169                                    myAccountURL.setDoAsGroupId(scopeGroupId);
1170                            }
1171    
1172                            myAccountURL.setParameter("struts_action", "/my_account/edit_user");
1173                            myAccountURL.setPortletMode(PortletMode.VIEW);
1174    
1175                            if (refererPlid > 0) {
1176                                    myAccountURL.setRefererPlid(refererPlid);
1177                            }
1178                            else {
1179                                    myAccountURL.setRefererPlid(plid);
1180                            }
1181    
1182                            myAccountURL.setWindowState(WindowState.MAXIMIZED);
1183    
1184                            themeDisplay.setURLMyAccount(myAccountURL);
1185                    }
1186    
1187                    if (!user.isActive() ||
1188                            (PrefsPropsUtil.getBoolean(
1189                                    companyId, PropsKeys.TERMS_OF_USE_REQUIRED) &&
1190                             !user.isAgreedToTermsOfUse())) {
1191    
1192                            themeDisplay.setShowAddContentIcon(false);
1193                            themeDisplay.setShowMyAccountIcon(false);
1194                            themeDisplay.setShowPageSettingsIcon(false);
1195                    }
1196    
1197                    if (layout.isLayoutPrototypeLinkActive()) {
1198                            themeDisplay.setShowPageCustomizationIcon(false);
1199                    }
1200    
1201                    if (group.isLayoutPrototype()) {
1202                            themeDisplay.setShowControlPanelIcon(false);
1203                            themeDisplay.setShowHomeIcon(false);
1204                            themeDisplay.setShowManageSiteMembershipsIcon(false);
1205                            themeDisplay.setShowMyAccountIcon(false);
1206                            themeDisplay.setShowPageCustomizationIcon(false);
1207                            themeDisplay.setShowPageSettingsIcon(true);
1208                            themeDisplay.setShowPortalIcon(false);
1209                            themeDisplay.setShowSignInIcon(false);
1210                            themeDisplay.setShowSignOutIcon(false);
1211                            themeDisplay.setShowSiteContentIcon(false);
1212                            themeDisplay.setShowSiteSettingsIcon(false);
1213                            themeDisplay.setShowStagingIcon(false);
1214                    }
1215    
1216                    if (group.isLayoutSetPrototype()) {
1217                            themeDisplay.setShowPageCustomizationIcon(false);
1218                            themeDisplay.setShowSiteSettingsIcon(false);
1219                    }
1220    
1221                    if (group.hasStagingGroup() && !group.isStagingGroup()) {
1222                            themeDisplay.setShowLayoutTemplatesIcon(false);
1223                            themeDisplay.setShowPageCustomizationIcon(false);
1224                            themeDisplay.setShowPageSettingsIcon(false);
1225                            themeDisplay.setShowSiteContentIcon(false);
1226                            themeDisplay.setShowSiteMapSettingsIcon(false);
1227                            themeDisplay.setShowSiteSettingsIcon(false);
1228                    }
1229    
1230                    themeDisplay.setURLPortal(portalURL.concat(contextPath));
1231    
1232                    String urlSignIn = mainPath.concat("/portal/login");
1233    
1234                    if (layout != null) {
1235                            urlSignIn = HttpUtil.addParameter(
1236                                    urlSignIn, "p_l_id", layout.getPlid());
1237                    }
1238    
1239                    themeDisplay.setURLSignIn(urlSignIn);
1240    
1241                    themeDisplay.setURLSignOut(mainPath.concat("/portal/logout"));
1242    
1243                    PortletURL updateManagerURL = new PortletURLImpl(
1244                            request, PortletKeys.UPDATE_MANAGER, plid,
1245                            PortletRequest.RENDER_PHASE);
1246    
1247                    updateManagerURL.setParameter("struts_action", "/update_manager/view");
1248                    updateManagerURL.setPortletMode(PortletMode.VIEW);
1249                    updateManagerURL.setWindowState(WindowState.MAXIMIZED);
1250    
1251                    themeDisplay.setURLUpdateManager(updateManagerURL);
1252    
1253                    return themeDisplay;
1254            }
1255    
1256            @Override
1257            public void run(HttpServletRequest request, HttpServletResponse response)
1258                    throws ActionException {
1259    
1260                    StopWatch stopWatch = null;
1261    
1262                    if (_log.isDebugEnabled()) {
1263                            stopWatch = new StopWatch();
1264    
1265                            stopWatch.start();
1266                    }
1267    
1268                    try {
1269                            servicePre(request, response);
1270                    }
1271                    catch (Exception e) {
1272                            throw new ActionException(e);
1273                    }
1274    
1275                    if (_log.isDebugEnabled()) {
1276                            _log.debug("Running takes " + stopWatch.getTime() + " ms");
1277                    }
1278            }
1279    
1280            protected void addDefaultLayoutsByLAR(
1281                            long userId, long groupId, boolean privateLayout, File larFile)
1282                    throws PortalException, SystemException {
1283    
1284                    Map<String, String[]> parameterMap = new HashMap<String, String[]>();
1285    
1286                    parameterMap.put(
1287                            PortletDataHandlerKeys.PERMISSIONS,
1288                            new String[] {Boolean.TRUE.toString()});
1289                    parameterMap.put(
1290                            PortletDataHandlerKeys.PORTLET_DATA,
1291                            new String[] {Boolean.TRUE.toString()});
1292                    parameterMap.put(
1293                            PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT,
1294                            new String[] {Boolean.TRUE.toString()});
1295                    parameterMap.put(
1296                            PortletDataHandlerKeys.PORTLET_SETUP,
1297                            new String[] {Boolean.TRUE.toString()});
1298                    parameterMap.put(
1299                            PortletDataHandlerKeys.THEME_REFERENCE,
1300                            new String[] {Boolean.TRUE.toString()});
1301                    parameterMap.put(
1302                            PortletDataHandlerKeys.USER_PERMISSIONS,
1303                            new String[] {Boolean.FALSE.toString()});
1304    
1305                    LayoutLocalServiceUtil.importLayouts(
1306                            userId, groupId, privateLayout, parameterMap, larFile);
1307            }
1308    
1309            protected void addDefaultUserPrivateLayoutByProperties(
1310                            long userId, long groupId)
1311                    throws PortalException, SystemException {
1312    
1313                    String friendlyURL = getFriendlyURL(
1314                            PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_FRIENDLY_URL);
1315    
1316                    ServiceContext serviceContext = new ServiceContext();
1317    
1318                    Layout layout = LayoutLocalServiceUtil.addLayout(
1319                            userId, groupId, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
1320                            PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_NAME, StringPool.BLANK,
1321                            StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL,
1322                            serviceContext);
1323    
1324                    LayoutTypePortlet layoutTypePortlet =
1325                            (LayoutTypePortlet)layout.getLayoutType();
1326    
1327                    layoutTypePortlet.setLayoutTemplateId(
1328                            0, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_TEMPLATE_ID, false);
1329    
1330                    for (int i = 0; i < 10; i++) {
1331                            String columnId = "column-" + i;
1332                            String portletIds = PropsUtil.get(
1333                                    PropsKeys.DEFAULT_USER_PRIVATE_LAYOUT_COLUMN + i);
1334    
1335                            String[] portletIdsArray = StringUtil.split(portletIds);
1336    
1337                            layoutTypePortlet.addPortletIds(
1338                                    0, portletIdsArray, columnId, false);
1339                    }
1340    
1341                    LayoutLocalServiceUtil.updateLayout(
1342                            layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
1343                            layout.getTypeSettings());
1344    
1345                    boolean updateLayoutSet = false;
1346    
1347                    LayoutSet layoutSet = layout.getLayoutSet();
1348    
1349                    if (Validator.isNotNull(
1350                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID)) {
1351    
1352                            layoutSet.setThemeId(
1353                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID);
1354    
1355                            updateLayoutSet = true;
1356                    }
1357    
1358                    if (Validator.isNotNull(
1359                                    PropsValues.
1360                                            DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
1361    
1362                            layoutSet.setColorSchemeId(
1363                                    PropsValues.
1364                                            DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID);
1365    
1366                            updateLayoutSet = true;
1367                    }
1368    
1369                    if (Validator.isNotNull(
1370                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID)) {
1371    
1372                            layoutSet.setWapThemeId(
1373                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID);
1374    
1375                            updateLayoutSet = true;
1376                    }
1377    
1378                    if (Validator.isNotNull(
1379                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID)) {
1380    
1381                            layoutSet.setWapColorSchemeId(
1382                                    PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID);
1383    
1384                            updateLayoutSet = true;
1385                    }
1386    
1387                    if (updateLayoutSet) {
1388                            LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
1389                    }
1390            }
1391    
1392            protected void addDefaultUserPrivateLayouts(User user)
1393                    throws PortalException, SystemException {
1394    
1395                    Group userGroup = user.getGroup();
1396    
1397                    if (privateLARFile != null) {
1398                            addDefaultLayoutsByLAR(
1399                                    user.getUserId(), userGroup.getGroupId(), true, privateLARFile);
1400                    }
1401                    else {
1402                            addDefaultUserPrivateLayoutByProperties(
1403                                    user.getUserId(), userGroup.getGroupId());
1404                    }
1405            }
1406    
1407            protected void addDefaultUserPublicLayoutByProperties(
1408                            long userId, long groupId)
1409                    throws PortalException, SystemException {
1410    
1411                    String friendlyURL = getFriendlyURL(
1412                            PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_FRIENDLY_URL);
1413    
1414                    ServiceContext serviceContext = new ServiceContext();
1415    
1416                    Layout layout = LayoutLocalServiceUtil.addLayout(
1417                            userId, groupId, false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
1418                            PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_NAME, StringPool.BLANK,
1419                            StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL,
1420                            serviceContext);
1421    
1422                    LayoutTypePortlet layoutTypePortlet =
1423                            (LayoutTypePortlet)layout.getLayoutType();
1424    
1425                    layoutTypePortlet.setLayoutTemplateId(
1426                            0, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_TEMPLATE_ID, false);
1427    
1428                    for (int i = 0; i < 10; i++) {
1429                            String columnId = "column-" + i;
1430                            String portletIds = PropsUtil.get(
1431                                    PropsKeys.DEFAULT_USER_PUBLIC_LAYOUT_COLUMN + i);
1432    
1433                            String[] portletIdsArray = StringUtil.split(portletIds);
1434    
1435                            layoutTypePortlet.addPortletIds(
1436                                    0, portletIdsArray, columnId, false);
1437                    }
1438    
1439                    LayoutLocalServiceUtil.updateLayout(
1440                            layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
1441                            layout.getTypeSettings());
1442    
1443                    boolean updateLayoutSet = false;
1444    
1445                    LayoutSet layoutSet = layout.getLayoutSet();
1446    
1447                    if (Validator.isNotNull(
1448                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID)) {
1449    
1450                            layoutSet.setThemeId(
1451                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID);
1452    
1453                            updateLayoutSet = true;
1454                    }
1455    
1456                    if (Validator.isNotNull(
1457                                    PropsValues.
1458                                            DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
1459    
1460                            layoutSet.setColorSchemeId(
1461                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID);
1462    
1463                            updateLayoutSet = true;
1464                    }
1465    
1466                    if (Validator.isNotNull(
1467                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID)) {
1468    
1469                            layoutSet.setWapThemeId(
1470                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID);
1471    
1472                            updateLayoutSet = true;
1473                    }
1474    
1475                    if (Validator.isNotNull(
1476                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID)) {
1477    
1478                            layoutSet.setWapColorSchemeId(
1479                                    PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID);
1480    
1481                            updateLayoutSet = true;
1482                    }
1483    
1484                    if (updateLayoutSet) {
1485                            LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
1486                    }
1487            }
1488    
1489            protected void addDefaultUserPublicLayouts(User user)
1490                    throws PortalException, SystemException {
1491    
1492                    Group userGroup = user.getGroup();
1493    
1494                    if (publicLARFile != null) {
1495                            addDefaultLayoutsByLAR(
1496                                    user.getUserId(), userGroup.getGroupId(), false, publicLARFile);
1497                    }
1498                    else {
1499                            addDefaultUserPublicLayoutByProperties(
1500                                    user.getUserId(), userGroup.getGroupId());
1501                    }
1502            }
1503    
1504            protected void deleteDefaultUserPrivateLayouts(User user)
1505                    throws PortalException, SystemException {
1506    
1507                    Group userGroup = user.getGroup();
1508    
1509                    ServiceContext serviceContext = new ServiceContext();
1510    
1511                    LayoutLocalServiceUtil.deleteLayouts(
1512                            userGroup.getGroupId(), true, serviceContext);
1513            }
1514    
1515            protected void deleteDefaultUserPublicLayouts(User user)
1516                    throws PortalException, SystemException {
1517    
1518                    Group userGroup = user.getGroup();
1519    
1520                    ServiceContext serviceContext = new ServiceContext();
1521    
1522                    LayoutLocalServiceUtil.deleteLayouts(
1523                            userGroup.getGroupId(), false, serviceContext);
1524            }
1525    
1526            protected Object[] getDefaultLayout(
1527                            HttpServletRequest request, User user, boolean signedIn)
1528                    throws PortalException, SystemException {
1529    
1530                    Layout layout = null;
1531                    List<Layout> layouts = null;
1532    
1533                    if (signedIn) {
1534    
1535                            // Check the user's personal layouts
1536    
1537                            Group userGroup = user.getGroup();
1538    
1539                            layouts = LayoutLocalServiceUtil.getLayouts(
1540                                    userGroup.getGroupId(), true,
1541                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1542    
1543                            if (layouts.size() == 0) {
1544                                    layouts = LayoutLocalServiceUtil.getLayouts(
1545                                            userGroup.getGroupId(), false,
1546                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1547                            }
1548    
1549                            if (layouts.size() > 0) {
1550                                    layout = layouts.get(0);
1551                            }
1552    
1553                            // Check the user's sites
1554    
1555                            if (layout == null) {
1556                                    LinkedHashMap<String, Object> groupParams =
1557                                            new LinkedHashMap<String, Object>();
1558    
1559                                    groupParams.put("usersGroups", new Long(user.getUserId()));
1560    
1561                                    List<Group> groups = GroupLocalServiceUtil.search(
1562                                            user.getCompanyId(), null, null, groupParams,
1563                                            QueryUtil.ALL_POS, QueryUtil.ALL_POS);
1564    
1565                                    for (Group group : groups) {
1566                                            layouts = LayoutLocalServiceUtil.getLayouts(
1567                                                    group.getGroupId(), true,
1568                                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1569    
1570                                            if (layouts.size() == 0) {
1571                                                    layouts = LayoutLocalServiceUtil.getLayouts(
1572                                                            group.getGroupId(), false,
1573                                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1574                                            }
1575    
1576                                            if (layouts.size() > 0) {
1577                                                    layout = layouts.get(0);
1578    
1579                                                    break;
1580                                            }
1581                                    }
1582                            }
1583                    }
1584                    else {
1585    
1586                            // Check the virtual host
1587    
1588                            LayoutSet layoutSet = (LayoutSet)request.getAttribute(
1589                                    WebKeys.VIRTUAL_HOST_LAYOUT_SET);
1590    
1591                            if (layoutSet != null) {
1592                                    layouts = LayoutLocalServiceUtil.getLayouts(
1593                                            layoutSet.getGroupId(), layoutSet.isPrivateLayout(),
1594                                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1595    
1596                                    Group group = null;
1597    
1598                                    if (!layouts.isEmpty()) {
1599                                            layout = layouts.get(0);
1600    
1601                                            group = layout.getGroup();
1602                                    }
1603    
1604                                    if ((layout != null) && layout.isPrivateLayout()) {
1605                                            layouts = LayoutLocalServiceUtil.getLayouts(
1606                                                    group.getGroupId(), false,
1607                                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1608    
1609                                            if (!layouts.isEmpty()) {
1610                                                    layout = layouts.get(0);
1611                                            }
1612                                            else {
1613                                                    group = null;
1614                                                    layout = null;
1615                                            }
1616                                    }
1617    
1618                                    if ((group != null) && group.isStagingGroup()) {
1619                                            Group liveGroup = group.getLiveGroup();
1620    
1621                                            layouts = LayoutLocalServiceUtil.getLayouts(
1622                                                    liveGroup.getGroupId(), false,
1623                                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1624    
1625                                            if (!layouts.isEmpty()) {
1626                                                    layout = layouts.get(0);
1627                                            }
1628                                            else {
1629                                                    layout = null;
1630                                            }
1631                                    }
1632                            }
1633                    }
1634    
1635                    if (layout == null) {
1636    
1637                            // Check the Guest site
1638    
1639                            Group guestGroup = GroupLocalServiceUtil.getGroup(
1640                                    user.getCompanyId(), GroupConstants.GUEST);
1641    
1642                            layouts = LayoutLocalServiceUtil.getLayouts(
1643                                    guestGroup.getGroupId(), false,
1644                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1645    
1646                            if (layouts.size() > 0) {
1647                                    layout = layouts.get(0);
1648                            }
1649                    }
1650    
1651                    return new Object[] {layout, layouts};
1652            }
1653    
1654            protected String getFriendlyURL(String friendlyURL) {
1655                    friendlyURL = GetterUtil.getString(friendlyURL);
1656    
1657                    return FriendlyURLNormalizerUtil.normalize(friendlyURL);
1658            }
1659    
1660            protected Object[] getViewableLayouts(
1661                            HttpServletRequest request, User user,
1662                            PermissionChecker permissionChecker, Layout layout,
1663                            List<Layout> layouts)
1664                    throws PortalException, SystemException {
1665    
1666                    if ((layouts == null) || layouts.isEmpty()) {
1667                            return new Object[] {layout, layouts};
1668                    }
1669    
1670                    Group group = layout.getGroup();
1671    
1672                    boolean hasViewLayoutPermission = false;
1673                    boolean hasViewStagingPermission =
1674                            (group.isStagingGroup() || group.isStagedRemotely()) &&
1675                             GroupPermissionUtil.contains(
1676                                     permissionChecker, group.getGroupId(),
1677                                     ActionKeys.VIEW_STAGING);
1678    
1679                    if (LayoutPermissionUtil.contains(
1680                                    permissionChecker, layout, false, ActionKeys.VIEW) ||
1681                            hasViewStagingPermission) {
1682    
1683                            hasViewLayoutPermission = true;
1684                    }
1685    
1686                    List<Layout> accessibleLayouts = new ArrayList<Layout>();
1687    
1688                    for (int i = 0; i < layouts.size(); i++) {
1689                            Layout curLayout = layouts.get(i);
1690    
1691                            if (!curLayout.isHidden() &&
1692                                    (LayoutPermissionUtil.contains(
1693                                            permissionChecker, curLayout, false, ActionKeys.VIEW) ||
1694                                     hasViewStagingPermission)) {
1695    
1696                                    if (accessibleLayouts.isEmpty() && !hasViewLayoutPermission) {
1697                                            layout = curLayout;
1698                                    }
1699    
1700                                    accessibleLayouts.add(curLayout);
1701                            }
1702                    }
1703    
1704                    if (accessibleLayouts.isEmpty()) {
1705                            layouts = null;
1706    
1707                            if (!isLoginRequest(request) && !hasViewLayoutPermission) {
1708                                    if (user.isDefaultUser() &&
1709                                            PropsValues.AUTH_LOGIN_PROMPT_ENABLED) {
1710    
1711                                            throw new PrincipalException("User is not authenticated");
1712                                    }
1713    
1714                                    SessionErrors.add(
1715                                            request, LayoutPermissionException.class.getName());
1716                            }
1717                    }
1718                    else {
1719                            layouts = accessibleLayouts;
1720                    }
1721    
1722                    return new Object[] {layout, layouts};
1723            }
1724    
1725            protected Boolean hasPowerUserRole(User user) throws Exception {
1726                    return RoleLocalServiceUtil.hasUserRole(
1727                            user.getUserId(), user.getCompanyId(), RoleConstants.POWER_USER,
1728                            true);
1729            }
1730    
1731            protected void initImportLARFiles() {
1732                    String privateLARFileName =
1733                            PropsValues.DEFAULT_USER_PRIVATE_LAYOUTS_LAR;
1734    
1735                    if (_log.isDebugEnabled()) {
1736                            _log.debug("Reading private LAR file " + privateLARFileName);
1737                    }
1738    
1739                    if (Validator.isNotNull(privateLARFileName)) {
1740                            privateLARFile = new File(privateLARFileName);
1741    
1742                            if (!privateLARFile.exists()) {
1743                                    _log.error(
1744                                            "Private LAR file " + privateLARFile + " does not exist");
1745    
1746                                    privateLARFile = null;
1747                            }
1748                            else {
1749                                    if (_log.isDebugEnabled()) {
1750                                            _log.debug("Using private LAR file " + privateLARFileName);
1751                                    }
1752                            }
1753                    }
1754    
1755                    String publicLARFileName = PropsValues.DEFAULT_USER_PUBLIC_LAYOUTS_LAR;
1756    
1757                    if (_log.isDebugEnabled()) {
1758                            _log.debug("Reading public LAR file " + publicLARFileName);
1759                    }
1760    
1761                    if (Validator.isNotNull(publicLARFileName)) {
1762                            publicLARFile = new File(publicLARFileName);
1763    
1764                            if (!publicLARFile.exists()) {
1765                                    _log.error(
1766                                            "Public LAR file " + publicLARFile + " does not exist");
1767    
1768                                    publicLARFile = null;
1769                            }
1770                            else {
1771                                    if (_log.isDebugEnabled()) {
1772                                            _log.debug("Using public LAR file " + publicLARFileName);
1773                                    }
1774                            }
1775                    }
1776            }
1777    
1778            protected boolean isLoginRequest(HttpServletRequest request) {
1779                    String requestURI = request.getRequestURI();
1780    
1781                    String mainPath = PortalUtil.getPathMain();
1782    
1783                    if (requestURI.startsWith(mainPath.concat("/portal/login"))) {
1784                            return true;
1785                    }
1786                    else {
1787                            return false;
1788                    }
1789            }
1790    
1791            /**
1792             * @deprecated
1793             */
1794            protected boolean isViewableCommunity(
1795                            User user, long groupId, boolean privateLayout,
1796                            PermissionChecker permissionChecker)
1797                    throws PortalException, SystemException {
1798    
1799                    return LayoutPermissionUtil.contains(
1800                            permissionChecker, groupId, privateLayout, 0, ActionKeys.VIEW);
1801            }
1802    
1803            /**
1804             * @deprecated
1805             */
1806            protected boolean isViewableGroup(
1807                            User user, long groupId, boolean privateLayout, long layoutId,
1808                            String controlPanelCategory, PermissionChecker permissionChecker)
1809                    throws PortalException, SystemException {
1810    
1811                    return LayoutPermissionUtil.contains(
1812                            permissionChecker, groupId, privateLayout, layoutId,
1813                            controlPanelCategory, ActionKeys.VIEW);
1814            }
1815    
1816            protected List<Layout> mergeAdditionalLayouts(
1817                            HttpServletRequest request, User user,
1818                            PermissionChecker permissionChecker, Layout layout,
1819                            List<Layout> layouts)
1820                    throws PortalException, SystemException {
1821    
1822                    if ((layout == null) || layout.isPrivateLayout()) {
1823                            return layouts;
1824                    }
1825    
1826                    long layoutGroupId = layout.getGroupId();
1827    
1828                    Group guestGroup = GroupLocalServiceUtil.getGroup(
1829                            user.getCompanyId(), GroupConstants.GUEST);
1830    
1831                    if (layoutGroupId != guestGroup.getGroupId()) {
1832                            Group layoutGroup = GroupLocalServiceUtil.getGroup(layoutGroupId);
1833    
1834                            UnicodeProperties typeSettingsProperties =
1835                                    layoutGroup.getTypeSettingsProperties();
1836    
1837                            boolean mergeGuestPublicPages = GetterUtil.getBoolean(
1838                                    typeSettingsProperties.getProperty("mergeGuestPublicPages"));
1839    
1840                            if (!mergeGuestPublicPages) {
1841                                    return layouts;
1842                            }
1843    
1844                            List<Layout> guestLayouts = LayoutLocalServiceUtil.getLayouts(
1845                                    guestGroup.getGroupId(), false,
1846                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1847    
1848                            Object[] viewableLayouts = getViewableLayouts(
1849                                    request, user, permissionChecker, layout, guestLayouts);
1850    
1851                            guestLayouts = (List<Layout>)viewableLayouts[1];
1852    
1853                            if (layouts == null) {
1854                                    return guestLayouts;
1855                            }
1856    
1857                            layouts.addAll(0, guestLayouts);
1858                    }
1859                    else {
1860                            HttpSession session = request.getSession();
1861    
1862                            Long previousGroupId = (Long)session.getAttribute(
1863                                    WebKeys.VISITED_GROUP_ID_PREVIOUS);
1864    
1865                            if ((previousGroupId != null) &&
1866                                    (previousGroupId.longValue() != layoutGroupId)) {
1867    
1868                                    Group previousGroup = null;
1869    
1870                                    try {
1871                                            previousGroup = GroupLocalServiceUtil.getGroup(
1872                                                    previousGroupId.longValue());
1873                                    }
1874                                    catch (NoSuchGroupException nsge) {
1875                                            if (_log.isWarnEnabled()) {
1876                                                    _log.warn(nsge);
1877                                            }
1878    
1879                                            return layouts;
1880                                    }
1881    
1882                                    UnicodeProperties typeSettingsProperties =
1883                                            previousGroup.getTypeSettingsProperties();
1884    
1885                                    boolean mergeGuestPublicPages = GetterUtil.getBoolean(
1886                                            typeSettingsProperties.getProperty(
1887                                                    "mergeGuestPublicPages"));
1888    
1889                                    if (!mergeGuestPublicPages) {
1890                                            return layouts;
1891                                    }
1892    
1893                                    List<Layout> previousLayouts =
1894                                            LayoutLocalServiceUtil.getLayouts(
1895                                                    previousGroupId.longValue(), false,
1896                                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1897    
1898                                    Object[] viewableLayouts = getViewableLayouts(
1899                                            request, user, permissionChecker, layout, previousLayouts);
1900    
1901                                    previousLayouts = (List<Layout>)viewableLayouts[1];
1902    
1903                                    if (previousLayouts != null) {
1904                                            layouts.addAll(previousLayouts);
1905                                    }
1906                            }
1907                    }
1908    
1909                    return layouts;
1910            }
1911    
1912            protected void rememberVisitedGroupIds(
1913                    HttpServletRequest request, long currentGroupId) {
1914    
1915                    String requestURI = GetterUtil.getString(request.getRequestURI());
1916    
1917                    if (!requestURI.endsWith(_PATH_PORTAL_LAYOUT)) {
1918                            return;
1919                    }
1920    
1921                    HttpSession session = request.getSession();
1922    
1923                    Long recentGroupId = (Long)session.getAttribute(
1924                            WebKeys.VISITED_GROUP_ID_RECENT);
1925    
1926                    Long previousGroupId = (Long)session.getAttribute(
1927                            WebKeys.VISITED_GROUP_ID_PREVIOUS);
1928    
1929                    if (recentGroupId == null) {
1930                            recentGroupId = new Long(currentGroupId);
1931    
1932                            session.setAttribute(
1933                                    WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);
1934                    }
1935                    else if (recentGroupId.longValue() != currentGroupId) {
1936                            previousGroupId = new Long(recentGroupId.longValue());
1937    
1938                            recentGroupId = new Long(currentGroupId);
1939    
1940                            session.setAttribute(
1941                                    WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);
1942    
1943                            session.setAttribute(
1944                                    WebKeys.VISITED_GROUP_ID_PREVIOUS, previousGroupId);
1945                    }
1946    
1947                    if (_log.isDebugEnabled()) {
1948                            _log.debug("Current group id " + currentGroupId);
1949                            _log.debug("Recent group id " + recentGroupId);
1950                            _log.debug("Previous group id " + previousGroupId);
1951                    }
1952            }
1953    
1954            protected void servicePre(
1955                            HttpServletRequest request, HttpServletResponse response)
1956                    throws Exception {
1957    
1958                    ThemeDisplay themeDisplay = initThemeDisplay(request, response);
1959    
1960                    if (themeDisplay == null) {
1961                            return;
1962                    }
1963    
1964                    request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
1965    
1966                    // Service context
1967    
1968                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
1969                            request);
1970    
1971                    ServiceContextThreadLocal.pushServiceContext(serviceContext);
1972    
1973                    // Parallel render
1974    
1975                    boolean parallelRenderEnable = true;
1976    
1977                    Layout layout = themeDisplay.getLayout();
1978    
1979                    if (layout != null) {
1980                            LayoutTypePortlet layoutTypePortlet =
1981                                    themeDisplay.getLayoutTypePortlet();
1982    
1983                            List<String> portletIds = layoutTypePortlet.getPortletIds();
1984    
1985                            if (portletIds.size() == 1) {
1986                                    String portletId = portletIds.get(0);
1987    
1988                                    Portlet portlet = PortletLocalServiceUtil.getPortletById(
1989                                            portletId);
1990    
1991                                    if ((portlet != null) && !portlet.isAjaxable()) {
1992                                            parallelRenderEnable = false;
1993                                    }
1994                            }
1995                    }
1996    
1997                    Boolean parallelRenderEnableObj = Boolean.valueOf(
1998                            ParamUtil.getBoolean(
1999                                    request, "p_p_parallel", parallelRenderEnable));
2000    
2001                    request.setAttribute(
2002                            WebKeys.PORTLET_PARALLEL_RENDER, parallelRenderEnableObj);
2003    
2004                    // Main Journal article
2005    
2006                    long mainJournalArticleId = ParamUtil.getLong(request, "p_j_a_id");
2007    
2008                    if (mainJournalArticleId > 0) {
2009                            try {
2010                                    JournalArticle mainJournalArticle =
2011                                            JournalArticleServiceUtil.getArticle(mainJournalArticleId);
2012    
2013                                    AssetEntry layoutAssetEntry =
2014                                            AssetEntryLocalServiceUtil.getEntry(
2015                                                    JournalArticle.class.getName(),
2016                                                    mainJournalArticle.getResourcePrimKey());
2017    
2018                                    request.setAttribute(
2019                                            WebKeys.LAYOUT_ASSET_ENTRY, layoutAssetEntry);
2020                            }
2021                            catch (NoSuchArticleException nsae) {
2022                                    if (_log.isWarnEnabled()) {
2023                                            _log.warn(nsae.getMessage());
2024                                    }
2025                            }
2026                    }
2027            }
2028    
2029            protected void updateUserLayouts(User user) throws Exception {
2030                    Boolean hasPowerUserRole = null;
2031    
2032                    // Private layouts
2033    
2034                    boolean addDefaultUserPrivateLayouts = false;
2035    
2036                    if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED &&
2037                            PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_AUTO_CREATE) {
2038    
2039                            addDefaultUserPrivateLayouts = true;
2040    
2041                            if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
2042                                    if (hasPowerUserRole == null) {
2043                                            hasPowerUserRole = hasPowerUserRole(user);
2044                                    }
2045    
2046                                    if (!hasPowerUserRole.booleanValue()) {
2047                                            addDefaultUserPrivateLayouts = false;
2048                                    }
2049                            }
2050                    }
2051    
2052                    Boolean hasPrivateLayouts = null;
2053    
2054                    if (addDefaultUserPrivateLayouts) {
2055                            hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts(
2056                                    user, true, false);
2057    
2058                            if (!hasPrivateLayouts) {
2059                                    addDefaultUserPrivateLayouts(user);
2060                            }
2061                    }
2062    
2063                    boolean deleteDefaultUserPrivateLayouts = false;
2064    
2065                    if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) {
2066                            deleteDefaultUserPrivateLayouts = true;
2067                    }
2068                    else if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
2069                            if (hasPowerUserRole == null) {
2070                                    hasPowerUserRole = hasPowerUserRole(user);
2071                            }
2072    
2073                            if (!hasPowerUserRole.booleanValue()) {
2074                                    deleteDefaultUserPrivateLayouts = true;
2075                            }
2076                    }
2077    
2078                    if (deleteDefaultUserPrivateLayouts) {
2079                            if (hasPrivateLayouts == null) {
2080                                    hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts(
2081                                            user, true, false);
2082                            }
2083    
2084                            if (hasPrivateLayouts) {
2085                                    deleteDefaultUserPrivateLayouts(user);
2086                            }
2087                    }
2088    
2089                    // Public pages
2090    
2091                    boolean addDefaultUserPublicLayouts = false;
2092    
2093                    if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED &&
2094                            PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_AUTO_CREATE) {
2095    
2096                            addDefaultUserPublicLayouts = true;
2097    
2098                            if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
2099                                    if (hasPowerUserRole == null) {
2100                                            hasPowerUserRole = hasPowerUserRole(user);
2101                                    }
2102    
2103                                    if (!hasPowerUserRole.booleanValue()) {
2104                                            addDefaultUserPublicLayouts = false;
2105                                    }
2106                            }
2107                    }
2108    
2109                    Boolean hasPublicLayouts = null;
2110    
2111                    if (addDefaultUserPublicLayouts) {
2112                            hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts(
2113                                    user, false, false);
2114    
2115                            if (!hasPublicLayouts) {
2116                                    addDefaultUserPublicLayouts(user);
2117                            }
2118                    }
2119    
2120                    boolean deleteDefaultUserPublicLayouts = false;
2121    
2122                    if (!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
2123                            deleteDefaultUserPublicLayouts = true;
2124                    }
2125                    else if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
2126                            if (hasPowerUserRole == null) {
2127                                    hasPowerUserRole = hasPowerUserRole(user);
2128                            }
2129    
2130                            if (!hasPowerUserRole.booleanValue()) {
2131                                    deleteDefaultUserPublicLayouts = true;
2132                            }
2133                    }
2134    
2135                    if (deleteDefaultUserPublicLayouts) {
2136                            if (hasPublicLayouts == null) {
2137                                    hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts(
2138                                            user, false, false);
2139                            }
2140    
2141                            if (hasPublicLayouts) {
2142                                    deleteDefaultUserPublicLayouts(user);
2143                            }
2144                    }
2145            }
2146    
2147            protected File privateLARFile;
2148            protected File publicLARFile;
2149    
2150            private static final String _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX =
2151                    "portlet_";
2152    
2153            private static final String _PATH_PORTAL_LAYOUT = "/portal/layout";
2154    
2155            private static Log _log = LogFactoryUtil.getLog(ServicePreAction.class);
2156    
2157    }