com.liferay.portal.events.ServicePreAction.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portal.events.ServicePreAction.java

Source

/**
 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portal.events;

import java.util.Locale;

import com.liferay.portal.*;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.events.Action;
import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortletURL;
import com.liferay.portal.kernel.portlet.LiferayWindowState;
import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.*;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.model.*;
import com.liferay.portal.model.impl.ColorSchemeImpl;
import com.liferay.portal.model.impl.VirtualLayout;
import com.liferay.portal.security.auth.PrincipalException;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
import com.liferay.portal.security.permission.PermissionThreadLocal;
import com.liferay.portal.service.*;
import com.liferay.portal.service.permission.GroupPermissionUtil;
import com.liferay.portal.service.permission.LayoutPermissionUtil;
import com.liferay.portal.service.permission.PortletPermissionUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.theme.ThemeDisplayFactory;
import com.liferay.portal.util.CookieKeys;
import com.liferay.portal.util.*;
import com.liferay.portal.util.PrefsPropsUtil;
import com.liferay.portal.util.PropsUtil;
import com.liferay.portal.util.WebKeys;
import com.liferay.portal.webserver.WebServerServletTokenUtil;
import com.liferay.portlet.PortalPreferences;
import com.liferay.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portlet.PortletURLImpl;
import com.liferay.portlet.asset.model.AssetEntry;
import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
import com.liferay.portlet.journal.NoSuchArticleException;
import com.liferay.portlet.journal.model.JournalArticle;
import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
import com.liferay.portlet.sites.util.SitesUtil;
import com.playtech.portal.platform.portlet.util.LanguageDetectionUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
import org.apache.struts.Globals;
import javax.portlet.PortletMode;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.WindowState;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.util.*;

/**
 * @author Brian Wing Shun Chan
 * @author Felix Ventero
 * @author Jorge Ferrer
 */
public class ServicePreAction extends Action {

    public ServicePreAction() {
        initImportLARFiles();
    }

    public ThemeDisplay initThemeDisplay(HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        HttpSession session = request.getSession();

        // Company

        Company company = PortalUtil.getCompany(request);

        long companyId = company.getCompanyId();

        // CDN host

        String cdnHost = PortalUtil.getCDNHost(request);

        String dynamicResourcesCDNHost = StringPool.BLANK;

        boolean cdnDynamicResourceEnabled = PortalUtil.isCDNDynamicResourcesEnabled(request);

        if (cdnDynamicResourceEnabled) {
            dynamicResourcesCDNHost = cdnHost;
        }

        // Portal URL

        String portalURL = PortalUtil.getPortalURL(request);

        // Paths

        String contextPath = PortalUtil.getPathContext();
        String friendlyURLPrivateGroupPath = PortalUtil.getPathFriendlyURLPrivateGroup();
        String friendlyURLPrivateUserPath = PortalUtil.getPathFriendlyURLPrivateUser();
        String friendlyURLPublicPath = PortalUtil.getPathFriendlyURLPublic();
        String imagePath = dynamicResourcesCDNHost.concat(PortalUtil.getPathImage());
        String mainPath = PortalUtil.getPathMain();

        String i18nPath = (String) request.getAttribute(WebKeys.I18N_PATH);

        if (Validator.isNotNull(i18nPath)) {
            if (Validator.isNotNull(contextPath)) {
                String i18nContextPath = contextPath.concat(i18nPath);

                friendlyURLPrivateGroupPath = StringUtil.replaceFirst(friendlyURLPrivateGroupPath, contextPath,
                        i18nContextPath);
                friendlyURLPrivateUserPath = StringUtil.replaceFirst(friendlyURLPrivateUserPath, contextPath,
                        i18nContextPath);
                friendlyURLPublicPath = StringUtil.replaceFirst(friendlyURLPublicPath, contextPath,
                        i18nContextPath);
                mainPath = StringUtil.replaceFirst(mainPath, contextPath, i18nContextPath);
            } else {
                friendlyURLPrivateGroupPath = i18nPath.concat(friendlyURLPrivateGroupPath);
                friendlyURLPrivateUserPath = i18nPath.concat(friendlyURLPrivateUserPath);
                friendlyURLPublicPath = i18nPath.concat(friendlyURLPublicPath);
                mainPath = i18nPath.concat(mainPath);
            }
        }

        // Company logo

        StringBundler sb = new StringBundler(5);

        sb.append(imagePath);
        sb.append("/company_logo?img_id=");
        sb.append(company.getLogoId());
        sb.append("&t=");
        sb.append(WebServerServletTokenUtil.getToken(company.getLogoId()));

        String companyLogo = sb.toString();

        int companyLogoHeight = 0;
        int companyLogoWidth = 0;

        Image companyLogoImage = ImageLocalServiceUtil.getCompanyLogo(company.getLogoId());

        if (companyLogoImage != null) {
            companyLogoHeight = companyLogoImage.getHeight();
            companyLogoWidth = companyLogoImage.getWidth();
        }

        String realCompanyLogo = companyLogo;
        int realCompanyLogoHeight = companyLogoHeight;
        int realCompanyLogoWidth = companyLogoWidth;

        // User

        User user = null;

        try {
            user = PortalUtil.getUser(request);
        } catch (NoSuchUserException nsue) {
            if (_log.isWarnEnabled()) {
                _log.warn(nsue.getMessage());
            }

            long userId = PortalUtil.getUserId(request);

            if (userId > 0) {
                session.invalidate();
            }

            return null;
        }

        boolean signedIn = false;

        if (user == null) {
            user = company.getDefaultUser();
        } else if (!user.isDefaultUser()) {
            signedIn = true;
        }

        if (PropsValues.BROWSER_CACHE_DISABLED || (PropsValues.BROWSER_CACHE_SIGNED_IN_DISABLED && signedIn)) {

            response.setDateHeader(HttpHeaders.EXPIRES, 0);
            response.setHeader(HttpHeaders.CACHE_CONTROL, HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE);
            response.setHeader(HttpHeaders.PRAGMA, HttpHeaders.PRAGMA_NO_CACHE_VALUE);
        }

        User realUser = user;

        Long realUserId = (Long) session.getAttribute(WebKeys.USER_ID);

        if (realUserId != null) {
            if (user.getUserId() != realUserId.longValue()) {
                realUser = UserLocalServiceUtil.getUserById(realUserId.longValue());
            }
        }

        String doAsUserId = ParamUtil.getString(request, "doAsUserId");
        String doAsUserLanguageId = ParamUtil.getString(request, "doAsUserLanguageId");
        long doAsGroupId = ParamUtil.getLong(request, "doAsGroupId");

        long refererPlid = ParamUtil.getLong(request, "refererPlid");

        if (LayoutLocalServiceUtil.fetchLayout(refererPlid) == null) {
            refererPlid = 0;
        }

        String controlPanelCategory = ParamUtil.getString(request, "controlPanelCategory");

        // Permission checker

        PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(user);

        PermissionThreadLocal.setPermissionChecker(permissionChecker);
        //Modification start (code changed and moved to the bottom)
        // Locale
        /*
            Locale locale = (Locale)session.getAttribute(Globals.LOCALE_KEY);
            
            if (Validator.isNotNull(doAsUserLanguageId)) {
              locale = LocaleUtil.fromLanguageId(doAsUserLanguageId);
            }
            
            String i18nLanguageId = (String)request.getAttribute(
                  WebKeys.I18N_LANGUAGE_ID);
            
            if (Validator.isNotNull(i18nLanguageId)) {
              locale = LocaleUtil.fromLanguageId(i18nLanguageId);
            }
            else if (locale == null) {
              if (signedIn) {
                  locale = user.getLocale();
              }
              else {
            
                  // User previously set their preferred language
            
                  String languageId = CookieKeys.getCookie(
              request, CookieKeys.GUEST_LANGUAGE_ID, false);
            
                  if (Validator.isNotNull(languageId)) {
          locale = LocaleUtil.fromLanguageId(languageId);
                  }
            
                  // Get locale from the request
            
                  if ((locale == null) && PropsValues.LOCALE_DEFAULT_REQUEST) {
          Enumeration<Locale> locales = request.getLocales();
            
          while (locales.hasMoreElements()) {
              Locale requestLocale = locales.nextElement();
            
              if (Validator.isNull(requestLocale.getCountry())) {
            
                  // Locales must contain a country code
            
                  requestLocale = LanguageUtil.getLocale(
                          requestLocale.getLanguage());
              }
            
              if (LanguageUtil.isAvailableLocale(requestLocale)) {
                  locale = requestLocale;
            
                  break;
              }
          }
                  }
            
                  // Get locale from the default user
            
                  if (locale == null) {
          locale = user.getLocale();
                  }
            
                  if (Validator.isNull(locale.getCountry())) {
            
          // Locales must contain a country code
            
          locale = LanguageUtil.getLocale(locale.getLanguage());
                  }
            
                  if (!LanguageUtil.isAvailableLocale(locale)) {
          locale = user.getLocale();
                  }
              }
            
              session.setAttribute(Globals.LOCALE_KEY, locale);
            
              LanguageUtil.updateCookie(request, response, locale);
            }*/
        //Modification end
        // Cookie support

        try {

            // LEP-4069

            CookieKeys.validateSupportCookie(request);
        } catch (Exception e) {
            CookieKeys.addSupportCookie(request, response);
        }

        // Time zone

        TimeZone timeZone = user.getTimeZone();

        if (timeZone == null) {
            timeZone = company.getTimeZone();
        }

        // Layouts

        if (signedIn) {
            updateUserLayouts(user);
        }

        Layout layout = null;
        List<Layout> layouts = null;

        long plid = ParamUtil.getLong(request, "p_l_id");

        if (plid > 0) {
            layout = LayoutLocalServiceUtil.getLayout(plid);

            long sourceGroupId = ParamUtil.getLong(request, "p_v_l_s_g_id");

            if ((sourceGroupId > 0) && (sourceGroupId != layout.getGroupId())) {
                Group sourceGroup = GroupLocalServiceUtil.getGroup(sourceGroupId);

                if (layout.isPublicLayout()
                        || SitesUtil.isUserGroupLayoutSetViewable(permissionChecker, layout.getGroup())) {

                    layout = new VirtualLayout(layout, sourceGroup);
                } else {
                    layout = null;
                }
            }
        } else {
            long groupId = ParamUtil.getLong(request, "groupId");
            boolean privateLayout = ParamUtil.getBoolean(request, "privateLayout");
            long layoutId = ParamUtil.getLong(request, "layoutId");

            if ((groupId > 0) && (layoutId > 0)) {
                layout = LayoutLocalServiceUtil.getLayout(groupId, privateLayout, layoutId);
            }
        }

        Boolean redirectToDefaultLayout = (Boolean) request.getAttribute(WebKeys.REDIRECT_TO_DEFAULT_LAYOUT);

        if (redirectToDefaultLayout == null) {
            redirectToDefaultLayout = Boolean.FALSE;
        }

        if (layout != null) {
            Group group = layout.getGroup();

            if (!signedIn && PropsValues.AUTH_FORWARD_BY_REDIRECT) {
                request.setAttribute(WebKeys.REQUESTED_LAYOUT, layout);
            }

            String ppid = ParamUtil.getString(request, "p_p_id");

            if (Validator.isNull(controlPanelCategory) && Validator.isNotNull(ppid)
                    && (LiferayWindowState.isPopUp(request) || LiferayWindowState.isExclusive(request))) {

                controlPanelCategory = _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + ppid;
            }

            boolean viewableGroup = LayoutPermissionUtil.contains(permissionChecker, layout, controlPanelCategory,
                    true, ActionKeys.VIEW);
            boolean viewableStaging = GroupPermissionUtil.contains(permissionChecker, group.getGroupId(),
                    ActionKeys.VIEW_STAGING);

            if (viewableStaging) {
                layouts = LayoutLocalServiceUtil.getLayouts(layout.getGroupId(), layout.isPrivateLayout(),
                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
            } else if (!viewableGroup && group.isStagingGroup()) {
                layout = null;
            } else
            /* Permissions are managed by Mobile Portlet
            if (!isLoginRequest(request) &&
                (!viewableGroup ||
                    (!redirectToDefaultLayout &&
              !LayoutPermissionUtil.contains(
                  permissionChecker, layout, false,
                  ActionKeys.VIEW)))) {
                
              if (user.isDefaultUser() &&
                  PropsValues.AUTH_LOGIN_PROMPT_ENABLED) {
                
                throw new PrincipalException("User is not authenticated");
              }
                
              sb = new StringBundler(6);
                
              sb.append("User ");
              sb.append(user.getUserId());
              sb.append(" is not allowed to access the ");
              sb.append(layout.isPrivateLayout() ? "private" : "public");
              sb.append(" pages of group ");
              sb.append(layout.getGroupId());
                
              if (_log.isWarnEnabled()) {
                _log.warn(sb.toString());
              }
                
              throw new NoSuchLayoutException(sb.toString());
            } else*/ if (isLoginRequest(request) && !viewableGroup) {
                layout = null;
            } else if (group.isLayoutPrototype()) {
                layouts = new ArrayList<Layout>();
            } else {
                layouts = LayoutLocalServiceUtil.getLayouts(layout.getGroupId(), layout.isPrivateLayout(),
                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

                if (!group.isControlPanel()) {
                    doAsGroupId = 0;
                }
            }
        }

        List<Layout> unfilteredLayouts = layouts;

        if (layout == null) {
            Object[] defaultLayout = getDefaultLayout(request, user, signedIn);

            layout = (Layout) defaultLayout[0];
            layouts = (List<Layout>) defaultLayout[1];

            request.setAttribute(WebKeys.LAYOUT_DEFAULT, Boolean.TRUE);
        }

        Object[] viewableLayouts = getViewableLayouts(request, user, permissionChecker, layout, layouts);

        String layoutSetLogo = null;

        layout = (Layout) viewableLayouts[0];
        layouts = (List<Layout>) viewableLayouts[1];

        Group group = null;

        if (layout != null) {
            group = layout.getGroup();

            if (!group.isControlPanel()) {
                rememberVisitedGroupIds(request, group.getGroupId());
            }
        }

        LayoutTypePortlet layoutTypePortlet = null;

        layouts = mergeAdditionalLayouts(request, user, permissionChecker, layout, layouts);

        LayoutSet layoutSet = null;

        boolean hasCustomizeLayoutPermission = false;
        boolean hasUpdateLayoutPermission = false;

        boolean customizedView = SessionParamUtil.getBoolean(request, "customized_view", true);

        if (layout != null) {
            hasCustomizeLayoutPermission = LayoutPermissionUtil.contains(permissionChecker, layout,
                    ActionKeys.CUSTOMIZE);
            hasUpdateLayoutPermission = LayoutPermissionUtil.contains(permissionChecker, layout, ActionKeys.UPDATE);

            layoutSet = layout.getLayoutSet();

            if (company.isSiteLogo()) {
                long logoId = 0;

                if (layoutSet.isLogo()) {
                    logoId = layoutSet.getLogoId();

                    if (logoId == 0) {
                        logoId = layoutSet.getLiveLogoId();
                    }
                } else {
                    LayoutSet siblingLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet(layout.getGroupId(),
                            !layout.isPrivateLayout());

                    if (siblingLayoutSet.isLogo()) {
                        logoId = siblingLayoutSet.getLogoId();
                    }
                }

                if (logoId > 0) {
                    sb = new StringBundler(5);

                    sb.append(imagePath);
                    sb.append("/layout_set_logo?img_id=");
                    sb.append(logoId);
                    sb.append("&t=");
                    sb.append(WebServerServletTokenUtil.getToken(logoId));

                    layoutSetLogo = sb.toString();

                    Image layoutSetLogoImage = ImageLocalServiceUtil.getCompanyLogo(logoId);

                    companyLogo = layoutSetLogo;
                    companyLogoHeight = layoutSetLogoImage.getHeight();
                    companyLogoWidth = layoutSetLogoImage.getWidth();
                }
            }

            plid = layout.getPlid();

            // Updates to shared layouts are not reflected until the next time
            // the user logs in because group layouts are cached in the session

            layout = (Layout) layout.clone();

            layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();

            boolean customizable = layoutTypePortlet.isCustomizable();

            if (!customizable || (group.isLayoutPrototype() || group.isLayoutSetPrototype())) {

                customizedView = false;
            }

            layoutTypePortlet.setCustomizedView(customizedView);
            layoutTypePortlet.setUpdatePermission(hasUpdateLayoutPermission);

            if (signedIn && customizable && customizedView && hasCustomizeLayoutPermission) {

                PortalPreferences portalPreferences = PortletPreferencesFactoryUtil.getPortalPreferences(companyId,
                        user.getUserId(), true);

                layoutTypePortlet.setPortalPreferences(portalPreferences);
            }

            LayoutClone layoutClone = LayoutCloneFactory.getInstance();

            if (layoutClone != null) {
                String typeSettings = layoutClone.get(request, plid);

                if (typeSettings != null) {
                    UnicodeProperties typeSettingsProperties = new UnicodeProperties(true);

                    typeSettingsProperties.load(typeSettings);

                    String stateMax = typeSettingsProperties.getProperty(LayoutTypePortletConstants.STATE_MAX);
                    String stateMin = typeSettingsProperties.getProperty(LayoutTypePortletConstants.STATE_MIN);
                    String modeAbout = typeSettingsProperties.getProperty(LayoutTypePortletConstants.MODE_ABOUT);
                    String modeConfig = typeSettingsProperties.getProperty(LayoutTypePortletConstants.MODE_CONFIG);
                    String modeEdit = typeSettingsProperties.getProperty(LayoutTypePortletConstants.MODE_EDIT);
                    String modeEditDefaults = typeSettingsProperties
                            .getProperty(LayoutTypePortletConstants.MODE_EDIT_DEFAULTS);
                    String modeEditGuest = typeSettingsProperties
                            .getProperty(LayoutTypePortletConstants.MODE_EDIT_GUEST);
                    String modeHelp = typeSettingsProperties.getProperty(LayoutTypePortletConstants.MODE_HELP);
                    String modePreview = typeSettingsProperties
                            .getProperty(LayoutTypePortletConstants.MODE_PREVIEW);
                    String modePrint = typeSettingsProperties.getProperty(LayoutTypePortletConstants.MODE_PRINT);

                    layoutTypePortlet.setStateMax(stateMax);
                    layoutTypePortlet.setStateMin(stateMin);
                    layoutTypePortlet.setModeAbout(modeAbout);
                    layoutTypePortlet.setModeConfig(modeConfig);
                    layoutTypePortlet.setModeEdit(modeEdit);
                    layoutTypePortlet.setModeEditDefaults(modeEditDefaults);
                    layoutTypePortlet.setModeEditGuest(modeEditGuest);
                    layoutTypePortlet.setModeHelp(modeHelp);
                    layoutTypePortlet.setModePreview(modePreview);
                    layoutTypePortlet.setModePrint(modePrint);
                }
            }

            request.setAttribute(WebKeys.LAYOUT, layout);
            request.setAttribute(WebKeys.LAYOUTS, layouts);
        }

        // Scope

        long scopeGroupId = PortalUtil.getScopeGroupId(request);

        if ((scopeGroupId <= 0) && (doAsGroupId > 0)) {
            scopeGroupId = doAsGroupId;
        }

        long parentGroupId = PortalUtil.getParentGroupId(scopeGroupId);

        // Theme and color scheme

        Theme theme = null;
        ColorScheme colorScheme = null;

        boolean wapTheme = BrowserSnifferUtil.isWap(request);

        if ((layout != null) && group.isControlPanel()) {
            String themeId = PrefsPropsUtil.getString(companyId, PropsKeys.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID);
            String colorSchemeId = ColorSchemeImpl.getDefaultRegularColorSchemeId();

            theme = ThemeLocalServiceUtil.getTheme(companyId, themeId, wapTheme);
            colorScheme = ThemeLocalServiceUtil.getColorScheme(companyId, theme.getThemeId(), colorSchemeId,
                    wapTheme);

            if (!wapTheme && theme.isWapTheme()) {
                theme = ThemeLocalServiceUtil.getTheme(companyId, PropsValues.CONTROL_PANEL_LAYOUT_REGULAR_THEME_ID,
                        false);
                colorScheme = ThemeLocalServiceUtil.getColorScheme(companyId, theme.getThemeId(), colorSchemeId,
                        false);
            }

            request.setAttribute(WebKeys.THEME, theme);
            request.setAttribute(WebKeys.COLOR_SCHEME, colorScheme);
        }

        boolean themeCssFastLoad = SessionParamUtil.getBoolean(request, "css_fast_load",
                PropsValues.THEME_CSS_FAST_LOAD);
        boolean themeImagesFastLoad = SessionParamUtil.getBoolean(request, "images_fast_load",
                PropsValues.THEME_IMAGES_FAST_LOAD);

        boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED;

        if (themeJsBarebone) {
            if (signedIn) {
                themeJsBarebone = false;
            }
        }

        boolean themeJsFastLoad = SessionParamUtil.getBoolean(request, "js_fast_load",
                PropsValues.JAVASCRIPT_FAST_LOAD);

        String lifecycle = ParamUtil.getString(request, "p_p_lifecycle", "0");

        lifecycle = ParamUtil.getString(request, "p_t_lifecycle", lifecycle);

        boolean isolated = ParamUtil.getBoolean(request, "p_p_isolated");

        String facebookCanvasPageURL = (String) request.getAttribute(WebKeys.FACEBOOK_CANVAS_PAGE_URL);

        boolean widget = false;

        Boolean widgetObj = (Boolean) request.getAttribute(WebKeys.WIDGET);

        if (widgetObj != null) {
            widget = widgetObj.booleanValue();
        }

        ////////// Modification start //////////

        // Locale
        Locale locale = null;
        String[] languageIds = request.getParameterMap().get("languageId");
        if (languageIds != null && languageIds.length > 0 && StringUtils.isNotEmpty(languageIds[0])) {
            Locale localeFromLanguageId = LocaleUtil.fromLanguageId(languageIds[0]);
            session.setAttribute(Globals.LOCALE_KEY, localeFromLanguageId);
        }
        try {
            locale = (Locale) session.getAttribute(Globals.LOCALE_KEY);
        } catch (IllegalStateException e) {
            _log.warn("Can't get locale from session, session is invalidated");
        }
        if (Validator.isNotNull(doAsUserLanguageId)) {
            locale = LocaleUtil.fromLanguageId(doAsUserLanguageId);
        }

        String i18nLanguageId = (String) request.getAttribute(WebKeys.I18N_LANGUAGE_ID);
        if (Validator.isNotNull(i18nLanguageId)) {
            locale = LocaleUtil.fromLanguageId(i18nLanguageId);
        }

        if (locale == null) {
            locale = LanguageDetectionUtil.detectLocale(request);
        }

        ////////// Modification end //////////

        // Theme display

        ThemeDisplay themeDisplay = ThemeDisplayFactory.create();
        //Modification start
        //    themeDisplay.setHttpServletRequest(request);
        //Modification end

        // Set the CDN host, portal URL, and Facebook application ID first
        // because other methods (setLookAndFeel) depend on them being set

        themeDisplay.setCDNHost(cdnHost);
        themeDisplay.setCDNDynamicResourcesHost(dynamicResourcesCDNHost);
        themeDisplay.setPortalURL(portalURL);
        themeDisplay.setFacebookCanvasPageURL(facebookCanvasPageURL);
        themeDisplay.setWidget(widget);

        themeDisplay.setCompany(company);
        themeDisplay.setCompanyLogo(companyLogo);
        themeDisplay.setCompanyLogoHeight(companyLogoHeight);
        themeDisplay.setCompanyLogoWidth(companyLogoWidth);
        themeDisplay.setRealCompanyLogo(realCompanyLogo);
        themeDisplay.setRealCompanyLogoHeight(realCompanyLogoHeight);
        themeDisplay.setRealCompanyLogoWidth(realCompanyLogoWidth);
        themeDisplay.setUser(user);
        themeDisplay.setRealUser(realUser);
        themeDisplay.setDoAsUserId(doAsUserId);
        themeDisplay.setDoAsUserLanguageId(doAsUserLanguageId);
        themeDisplay.setDoAsGroupId(doAsGroupId);
        themeDisplay.setRefererPlid(refererPlid);
        themeDisplay.setControlPanelCategory(controlPanelCategory);
        themeDisplay.setLayoutSet(layoutSet);
        themeDisplay.setLayoutSetLogo(layoutSetLogo);
        themeDisplay.setLayout(layout);
        themeDisplay.setLayouts(layouts);
        themeDisplay.setUnfilteredLayouts(unfilteredLayouts);
        themeDisplay.setPlid(plid);
        themeDisplay.setLayoutTypePortlet(layoutTypePortlet);
        themeDisplay.setScopeGroupId(scopeGroupId);
        themeDisplay.setParentGroupId(parentGroupId);
        themeDisplay.setSignedIn(signedIn);
        themeDisplay.setPermissionChecker(permissionChecker);
        themeDisplay.setLocale(locale);
        themeDisplay.setLanguageId(LocaleUtil.toLanguageId(locale));
        themeDisplay.setI18nLanguageId(i18nLanguageId);
        themeDisplay.setI18nPath(i18nPath);
        themeDisplay.setTimeZone(timeZone);
        themeDisplay.setLookAndFeel(theme, colorScheme);
        themeDisplay.setThemeCssFastLoad(themeCssFastLoad);
        themeDisplay.setThemeImagesFastLoad(themeImagesFastLoad);
        themeDisplay.setThemeJsBarebone(themeJsBarebone);
        themeDisplay.setThemeJsFastLoad(themeJsFastLoad);
        themeDisplay.setServerName(request.getServerName());
        themeDisplay.setServerPort(request.getServerPort());
        themeDisplay.setSecure(request.isSecure());
        themeDisplay.setLifecycle(lifecycle);
        themeDisplay.setLifecycleAction(lifecycle.equals("1"));
        themeDisplay.setLifecycleRender(lifecycle.equals("0"));
        themeDisplay.setLifecycleResource(lifecycle.equals("2"));
        themeDisplay.setStateExclusive(LiferayWindowState.isExclusive(request));
        themeDisplay.setStateMaximized(LiferayWindowState.isMaximized(request));
        themeDisplay.setStatePopUp(LiferayWindowState.isPopUp(request));
        themeDisplay.setIsolated(isolated);
        themeDisplay.setPathApplet(contextPath.concat("/applets"));
        themeDisplay.setPathCms(contextPath.concat("/cms"));
        themeDisplay.setPathContext(contextPath);
        themeDisplay.setPathFlash(contextPath.concat("/flash"));
        themeDisplay.setPathFriendlyURLPrivateGroup(friendlyURLPrivateGroupPath);
        themeDisplay.setPathFriendlyURLPrivateUser(friendlyURLPrivateUserPath);
        themeDisplay.setPathFriendlyURLPublic(friendlyURLPublicPath);
        themeDisplay.setPathImage(imagePath);
        themeDisplay.setPathJavaScript(contextPath.concat("/html/js"));
        themeDisplay.setPathMain(mainPath);
        themeDisplay.setPathSound(contextPath.concat("/html/sound"));

        // Icons

        themeDisplay.setShowAddContentIcon(false);
        themeDisplay.setShowControlPanelIcon(signedIn);
        themeDisplay.setShowHomeIcon(true);
        themeDisplay.setShowMyAccountIcon(signedIn);
        themeDisplay.setShowPageSettingsIcon(false);
        themeDisplay.setShowPortalIcon(true);
        themeDisplay.setShowSignInIcon(!signedIn);
        themeDisplay.setShowSignOutIcon(signedIn);

        boolean showSiteContentIcon = false;

        long controlPanelPlid = 0;

        if (signedIn) {
            Group controlPanelGroup = GroupLocalServiceUtil.getGroup(companyId, GroupConstants.CONTROL_PANEL);

            controlPanelPlid = LayoutLocalServiceUtil.getDefaultPlid(controlPanelGroup.getGroupId(), true);

            List<Portlet> siteContentPortlets = PortalUtil.getControlPanelPortlets(PortletCategoryKeys.CONTENT,
                    themeDisplay);

            Portlet groupPagesPortlet = PortletLocalServiceUtil.getPortletById(PortletKeys.GROUP_PAGES);

            siteContentPortlets.remove(groupPagesPortlet);

            Portlet siteMembershipsAdminPortlet = PortletLocalServiceUtil
                    .getPortletById(PortletKeys.SITE_MEMBERSHIPS_ADMIN);

            siteContentPortlets.remove(siteMembershipsAdminPortlet);

            Portlet siteSettingsPortlet = PortletLocalServiceUtil.getPortletById(PortletKeys.SITE_SETTINGS);

            siteContentPortlets.remove(siteSettingsPortlet);

            showSiteContentIcon = PortletPermissionUtil.contains(permissionChecker, scopeGroupId, controlPanelPlid,
                    siteContentPortlets, ActionKeys.VIEW);
        }

        themeDisplay.setShowSiteContentIcon(showSiteContentIcon);

        themeDisplay.setShowStagingIcon(false);

        // Session

        if (PropsValues.SESSION_ENABLE_URL_WITH_SESSION_ID && !CookieKeys.hasSessionId(request)) {

            themeDisplay.setAddSessionIdToURL(true);
            themeDisplay.setSessionId(session.getId());
        }

        // URLs

        String urlControlPanel = friendlyURLPrivateGroupPath.concat(GroupConstants.CONTROL_PANEL_FRIENDLY_URL);

        if (Validator.isNotNull(doAsUserId)) {
            urlControlPanel = HttpUtil.addParameter(urlControlPanel, "doAsUserId", doAsUserId);
        }

        if (scopeGroupId > 0) {
            urlControlPanel = HttpUtil.addParameter(urlControlPanel, "doAsGroupId", scopeGroupId);
        }

        if (refererPlid > 0) {
            urlControlPanel = HttpUtil.addParameter(urlControlPanel, "refererPlid", refererPlid);
        } else if (plid > 0) {
            urlControlPanel = HttpUtil.addParameter(urlControlPanel, "refererPlid", plid);
        }

        if (themeDisplay.isAddSessionIdToURL()) {
            urlControlPanel = PortalUtil.getURLWithSessionId(urlControlPanel, session.getId());
        }

        themeDisplay.setURLControlPanel(urlControlPanel);

        String siteContentURL = urlControlPanel;

        siteContentURL = HttpUtil.addParameter(siteContentURL, "controlPanelCategory", PortletCategoryKeys.CONTENT);

        themeDisplay.setURLSiteContent(siteContentURL);

        String currentURL = PortalUtil.getCurrentURL(request);

        themeDisplay.setURLCurrent(currentURL);

        String urlHome = PortalUtil.getHomeURL(request);

        themeDisplay.setURLHome(urlHome);

        if (layout != null) {
            if (layout.isTypePortlet()) {
                boolean freeformLayout = layoutTypePortlet.getLayoutTemplateId().equals("freeform");

                themeDisplay.setFreeformLayout(freeformLayout);

                if (hasUpdateLayoutPermission) {
                    themeDisplay.setShowAddContentIconPermission(true);

                    if (!LiferayWindowState.isMaximized(request)) {
                        themeDisplay.setShowAddContentIcon(true);
                    }

                    themeDisplay.setShowLayoutTemplatesIcon(true);

                    if (!group.isUser()) {
                        themeDisplay.setShowPageCustomizationIcon(true);
                    }

                    themeDisplay.setURLAddContent("Liferay.LayoutConfiguration.toggle('"
                            .concat(PortletKeys.LAYOUT_CONFIGURATION).concat("');"));

                    themeDisplay.setURLLayoutTemplates("Liferay.LayoutConfiguration.showTemplates();");
                }

                if (hasCustomizeLayoutPermission && customizedView) {
                    themeDisplay.setShowAddContentIconPermission(true);

                    if (!LiferayWindowState.isMaximized(request)) {
                        themeDisplay.setShowAddContentIcon(true);
                    }

                    themeDisplay.setURLAddContent("Liferay.LayoutConfiguration.toggle('"
                            .concat(PortletKeys.LAYOUT_CONFIGURATION).concat("');"));
                }
            }

            if (hasUpdateLayoutPermission) {
                themeDisplay.setShowPageSettingsIcon(true);

                LiferayPortletURL pageSettingsURL = new PortletURLImpl(request, PortletKeys.LAYOUTS_ADMIN,
                        controlPanelPlid, PortletRequest.RENDER_PHASE);

                pageSettingsURL.setControlPanelCategory(
                        _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + PortletKeys.LAYOUTS_ADMIN);
                pageSettingsURL.setDoAsGroupId(scopeGroupId);
                pageSettingsURL.setParameter("struts_action", "/layouts_admin/edit_layouts");

                if (layout.isPrivateLayout()) {
                    pageSettingsURL.setParameter("tabs1", "private-pages");
                } else {
                    pageSettingsURL.setParameter("tabs1", "public-pages");
                }

                pageSettingsURL.setParameter("closeRedirect", currentURL);
                pageSettingsURL.setParameter("groupId", String.valueOf(scopeGroupId));
                pageSettingsURL.setParameter("selPlid", String.valueOf(plid));
                pageSettingsURL.setPortletMode(PortletMode.VIEW);
                pageSettingsURL.setWindowState(LiferayWindowState.POP_UP);

                themeDisplay.setURLPageSettings(pageSettingsURL);

                boolean site = group.isSite();

                if (!site && group.isStagingGroup()) {
                    Group liveGroup = group.getLiveGroup();

                    site = liveGroup.isSite();
                }

                if (site && GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                        ActionKeys.ASSIGN_MEMBERS)) {

                    themeDisplay.setShowManageSiteMembershipsIcon(true);

                    LiferayPortletURL manageSiteMembershipsURL = new PortletURLImpl(request,
                            PortletKeys.SITE_MEMBERSHIPS_ADMIN, controlPanelPlid, PortletRequest.RENDER_PHASE);

                    manageSiteMembershipsURL.setControlPanelCategory(
                            _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + PortletKeys.SITE_MEMBERSHIPS_ADMIN);
                    manageSiteMembershipsURL.setDoAsGroupId(scopeGroupId);
                    manageSiteMembershipsURL.setParameter("struts_action", "/sites_admin/edit_site_assignments");
                    manageSiteMembershipsURL.setParameter("groupId", String.valueOf(scopeGroupId));
                    manageSiteMembershipsURL.setParameter("selPlid", String.valueOf(plid));
                    manageSiteMembershipsURL.setPortletMode(PortletMode.VIEW);
                    manageSiteMembershipsURL.setWindowState(LiferayWindowState.POP_UP);

                    themeDisplay.setURLManageSiteMemberships(manageSiteMembershipsURL);
                } else {
                    themeDisplay.setShowManageSiteMembershipsIcon(false);
                }
            }

            boolean hasAddLayoutGroupPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.ADD_LAYOUT);
            boolean hasAddLayoutLayoutPermission = LayoutPermissionUtil.contains(permissionChecker, layout,
                    ActionKeys.ADD_LAYOUT);
            boolean hasManageLayoutsGroupPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.MANAGE_LAYOUTS);
            boolean hasManageStagingPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.MANAGE_STAGING);
            boolean hasPublishStagingPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.PUBLISH_STAGING);
            boolean hasUpdateGroupPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.UPDATE);
            boolean hasViewStagingPermission = GroupPermissionUtil.contains(permissionChecker, scopeGroupId,
                    ActionKeys.VIEW_STAGING);

            if (!group.isControlPanel() && !group.isUser() && !group.isUserGroup() && hasUpdateGroupPermission) {

                themeDisplay.setShowSiteSettingsIcon(true);

                LiferayPortletURL siteSettingsURL = new PortletURLImpl(request, PortletKeys.SITE_SETTINGS,
                        controlPanelPlid, PortletRequest.RENDER_PHASE);

                siteSettingsURL.setControlPanelCategory(
                        _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + PortletKeys.SITE_SETTINGS);
                siteSettingsURL.setDoAsGroupId(scopeGroupId);
                siteSettingsURL.setParameter("struts_action", "/sites_admin/edit_site");
                siteSettingsURL.setParameter("closeRedirect", currentURL);
                siteSettingsURL.setParameter("groupId", String.valueOf(scopeGroupId));
                siteSettingsURL.setPortletMode(PortletMode.VIEW);
                siteSettingsURL.setWindowState(LiferayWindowState.POP_UP);

                themeDisplay.setURLSiteSettings(siteSettingsURL);
            }

            if (!group.isLayoutPrototype() && (hasAddLayoutGroupPermission || hasAddLayoutLayoutPermission
                    || hasManageLayoutsGroupPermission || hasUpdateGroupPermission)) {

                themeDisplay.setShowSiteMapSettingsIcon(true);

                LiferayPortletURL siteMapSettingsURL = new PortletURLImpl(request, PortletKeys.LAYOUTS_ADMIN,
                        controlPanelPlid, PortletRequest.RENDER_PHASE);

                siteMapSettingsURL.setControlPanelCategory(
                        _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX + PortletKeys.LAYOUTS_ADMIN);
                siteMapSettingsURL.setDoAsGroupId(scopeGroupId);
                siteMapSettingsURL.setParameter("struts_action", "/layouts_admin/edit_layouts");

                if (layout.isPrivateLayout()) {
                    siteMapSettingsURL.setParameter("tabs1", "private-pages");
                } else {
                    siteMapSettingsURL.setParameter("tabs1", "public-pages");
                }

                siteMapSettingsURL.setParameter("closeRedirect", currentURL);
                siteMapSettingsURL.setParameter("groupId", String.valueOf(scopeGroupId));
                siteMapSettingsURL.setPortletMode(PortletMode.VIEW);
                siteMapSettingsURL.setWindowState(LiferayWindowState.POP_UP);

                themeDisplay.setURLSiteMapSettings(siteMapSettingsURL);
            }

            if (group.hasStagingGroup() && !group.isStagingGroup()) {
                themeDisplay.setShowAddContentIcon(false);
                themeDisplay.setShowLayoutTemplatesIcon(false);
                themeDisplay.setShowPageSettingsIcon(false);
                themeDisplay.setURLPublishToLive(null);
            }

            if (group.isControlPanel()) {
                themeDisplay.setShowPageSettingsIcon(false);
                themeDisplay.setURLPublishToLive(null);
            }

            // LEP-4987

            if (group.isStaged() || group.isStagingGroup()) {
                if (hasManageStagingPermission || hasPublishStagingPermission || hasUpdateLayoutPermission
                        || hasViewStagingPermission) {

                    themeDisplay.setShowStagingIcon(true);
                }

                if (hasPublishStagingPermission) {
                    PortletURL publishToLiveURL = new PortletURLImpl(request, PortletKeys.LAYOUTS_ADMIN, plid,
                            PortletRequest.RENDER_PHASE);

                    publishToLiveURL.setParameter("struts_action", "/layouts_admin/publish_layouts");

                    if (layout.isPrivateLayout()) {
                        publishToLiveURL.setParameter("tabs1", "private-pages");
                    } else {
                        publishToLiveURL.setParameter("tabs1", "public-pages");
                    }

                    publishToLiveURL.setParameter("pagesRedirect", currentURL);
                    publishToLiveURL.setParameter("groupId", String.valueOf(scopeGroupId));
                    publishToLiveURL.setParameter("selPlid", String.valueOf(plid));
                    publishToLiveURL.setPortletMode(PortletMode.VIEW);
                    publishToLiveURL.setWindowState(LiferayWindowState.EXCLUSIVE);

                    themeDisplay.setURLPublishToLive(publishToLiveURL);
                }
            }

            PortletURLImpl myAccountURL = new PortletURLImpl(request, PortletKeys.MY_ACCOUNT, controlPanelPlid,
                    PortletRequest.RENDER_PHASE);

            if (scopeGroupId > 0) {
                myAccountURL.setDoAsGroupId(scopeGroupId);
            }

            myAccountURL.setParameter("struts_action", "/my_account/edit_user");
            myAccountURL.setPortletMode(PortletMode.VIEW);

            if (refererPlid > 0) {
                myAccountURL.setRefererPlid(refererPlid);
            } else {
                myAccountURL.setRefererPlid(plid);
            }

            myAccountURL.setWindowState(WindowState.MAXIMIZED);

            themeDisplay.setURLMyAccount(myAccountURL);
        }

        if (!user.isActive() || (PrefsPropsUtil.getBoolean(companyId, PropsKeys.TERMS_OF_USE_REQUIRED)
                && !user.isAgreedToTermsOfUse())) {

            themeDisplay.setShowAddContentIcon(false);
            themeDisplay.setShowMyAccountIcon(false);
            themeDisplay.setShowPageSettingsIcon(false);
        }

        if (layout.isLayoutPrototypeLinkActive()) {
            themeDisplay.setShowPageCustomizationIcon(false);
        }

        if (group.isLayoutPrototype()) {
            themeDisplay.setShowControlPanelIcon(false);
            themeDisplay.setShowHomeIcon(false);
            themeDisplay.setShowManageSiteMembershipsIcon(false);
            themeDisplay.setShowMyAccountIcon(false);
            themeDisplay.setShowPageCustomizationIcon(false);
            themeDisplay.setShowPageSettingsIcon(true);
            themeDisplay.setShowPortalIcon(false);
            themeDisplay.setShowSignInIcon(false);
            themeDisplay.setShowSignOutIcon(false);
            themeDisplay.setShowSiteContentIcon(false);
            themeDisplay.setShowSiteSettingsIcon(false);
            themeDisplay.setShowStagingIcon(false);
        }

        if (group.isLayoutSetPrototype()) {
            themeDisplay.setShowPageCustomizationIcon(false);
            themeDisplay.setShowSiteSettingsIcon(false);
        }

        if (group.hasStagingGroup() && !group.isStagingGroup()) {
            themeDisplay.setShowLayoutTemplatesIcon(false);
            themeDisplay.setShowPageCustomizationIcon(false);
            themeDisplay.setShowPageSettingsIcon(false);
            themeDisplay.setShowSiteContentIcon(false);
            themeDisplay.setShowSiteMapSettingsIcon(false);
            themeDisplay.setShowSiteSettingsIcon(false);
        }

        themeDisplay.setURLPortal(portalURL.concat(contextPath));

        String urlSignIn = mainPath.concat("/portal/login");

        urlSignIn = HttpUtil.addParameter(urlSignIn, "p_l_id", layout.getPlid());

        themeDisplay.setURLSignIn(urlSignIn);

        themeDisplay.setURLSignOut(mainPath.concat("/portal/logout"));

        PortletURL updateManagerURL = new PortletURLImpl(request, PortletKeys.UPDATE_MANAGER, plid,
                PortletRequest.RENDER_PHASE);

        updateManagerURL.setParameter("struts_action", "/update_manager/view");
        updateManagerURL.setPortletMode(PortletMode.VIEW);
        updateManagerURL.setWindowState(WindowState.MAXIMIZED);

        themeDisplay.setURLUpdateManager(updateManagerURL);

        return themeDisplay;
    }

    @Override
    public void run(HttpServletRequest request, HttpServletResponse response) throws ActionException {

        StopWatch stopWatch = null;

        if (_log.isDebugEnabled()) {
            stopWatch = new StopWatch();

            stopWatch.start();
        }

        try {
            servicePre(request, response);
        } catch (Exception e) {
            throw new ActionException(e);
        }

        if (_log.isDebugEnabled()) {
            _log.debug("Running takes " + stopWatch.getTime() + " ms");
        }
    }

    protected void addDefaultLayoutsByLAR(long userId, long groupId, boolean privateLayout, File larFile)
            throws PortalException, SystemException {

        Map<String, String[]> parameterMap = new HashMap<String, String[]>();

        parameterMap.put(PortletDataHandlerKeys.PERMISSIONS, new String[] { Boolean.TRUE.toString() });
        parameterMap.put(PortletDataHandlerKeys.PORTLET_DATA, new String[] { Boolean.TRUE.toString() });
        parameterMap.put(PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT,
                new String[] { Boolean.TRUE.toString() });
        parameterMap.put(PortletDataHandlerKeys.PORTLET_SETUP, new String[] { Boolean.TRUE.toString() });
        parameterMap.put(PortletDataHandlerKeys.USER_PERMISSIONS, new String[] { Boolean.FALSE.toString() });

        LayoutLocalServiceUtil.importLayouts(userId, groupId, privateLayout, parameterMap, larFile);
    }

    protected void addDefaultUserPrivateLayoutByProperties(long userId, long groupId)
            throws PortalException, SystemException {

        String friendlyURL = getFriendlyURL(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_FRIENDLY_URL);

        ServiceContext serviceContext = new ServiceContext();

        Layout layout = LayoutLocalServiceUtil.addLayout(userId, groupId, true,
                LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_NAME,
                StringPool.BLANK, StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL,
                serviceContext);

        LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();

        layoutTypePortlet.setLayoutTemplateId(0, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_TEMPLATE_ID, false);

        for (int i = 0; i < 10; i++) {
            String columnId = "column-" + i;
            String portletIds = PropsUtil.get(PropsKeys.DEFAULT_USER_PRIVATE_LAYOUT_COLUMN + i);

            String[] portletIdsArray = StringUtil.split(portletIds);

            layoutTypePortlet.addPortletIds(0, portletIdsArray, columnId, false);
        }

        LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
                layout.getTypeSettings());

        boolean updateLayoutSet = false;

        LayoutSet layoutSet = layout.getLayoutSet();

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID)) {

            layoutSet.setThemeId(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {

            layoutSet.setColorSchemeId(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID)) {

            layoutSet.setWapThemeId(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID)) {

            layoutSet.setWapColorSchemeId(PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID);

            updateLayoutSet = true;
        }

        if (updateLayoutSet) {
            LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
        }
    }

    protected synchronized void addDefaultUserPrivateLayouts(User user) throws PortalException, SystemException {

        Group userGroup = user.getGroup();

        if (privateLARFile != null) {
            addDefaultLayoutsByLAR(user.getUserId(), userGroup.getGroupId(), true, privateLARFile);
        } else {
            addDefaultUserPrivateLayoutByProperties(user.getUserId(), userGroup.getGroupId());
        }
    }

    protected void addDefaultUserPublicLayoutByProperties(long userId, long groupId)
            throws PortalException, SystemException {

        String friendlyURL = getFriendlyURL(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_FRIENDLY_URL);

        ServiceContext serviceContext = new ServiceContext();

        Layout layout = LayoutLocalServiceUtil.addLayout(userId, groupId, false,
                LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_NAME,
                StringPool.BLANK, StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL,
                serviceContext);

        LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();

        layoutTypePortlet.setLayoutTemplateId(0, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_TEMPLATE_ID, false);

        for (int i = 0; i < 10; i++) {
            String columnId = "column-" + i;
            String portletIds = PropsUtil.get(PropsKeys.DEFAULT_USER_PUBLIC_LAYOUT_COLUMN + i);

            String[] portletIdsArray = StringUtil.split(portletIds);

            layoutTypePortlet.addPortletIds(0, portletIdsArray, columnId, false);
        }

        LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
                layout.getTypeSettings());

        boolean updateLayoutSet = false;

        LayoutSet layoutSet = layout.getLayoutSet();

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID)) {

            layoutSet.setThemeId(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {

            layoutSet.setColorSchemeId(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID)) {

            layoutSet.setWapThemeId(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID);

            updateLayoutSet = true;
        }

        if (Validator.isNotNull(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID)) {

            layoutSet.setWapColorSchemeId(PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID);

            updateLayoutSet = true;
        }

        if (updateLayoutSet) {
            LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
        }
    }

    protected synchronized void addDefaultUserPublicLayouts(User user) throws PortalException, SystemException {

        Group userGroup = user.getGroup();

        if (publicLARFile != null) {
            addDefaultLayoutsByLAR(user.getUserId(), userGroup.getGroupId(), false, publicLARFile);
        } else {
            addDefaultUserPublicLayoutByProperties(user.getUserId(), userGroup.getGroupId());
        }
    }

    protected void deleteDefaultUserPrivateLayouts(User user) throws PortalException, SystemException {

        Group userGroup = user.getGroup();

        ServiceContext serviceContext = new ServiceContext();

        LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), true, serviceContext);
    }

    protected void deleteDefaultUserPublicLayouts(User user) throws PortalException, SystemException {

        Group userGroup = user.getGroup();

        ServiceContext serviceContext = new ServiceContext();

        LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), false, serviceContext);
    }

    protected Object[] getDefaultLayout(HttpServletRequest request, User user, boolean signedIn)
            throws PortalException, SystemException {

        // Check the virtual host

        LayoutSet layoutSet = (LayoutSet) request.getAttribute(WebKeys.VIRTUAL_HOST_LAYOUT_SET);

        if (layoutSet != null) {
            List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(layoutSet.getGroupId(),
                    layoutSet.isPrivateLayout(), LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

            if (layouts.size() > 0) {
                Layout layout = layouts.get(0);

                return new Object[] { layout, layouts };
            }
        }

        Layout layout = null;
        List<Layout> layouts = null;

        if (signedIn) {

            // Check the user's personal layouts

            Group userGroup = user.getGroup();

            layouts = LayoutLocalServiceUtil.getLayouts(userGroup.getGroupId(), true,
                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

            if (layouts.size() == 0) {
                layouts = LayoutLocalServiceUtil.getLayouts(userGroup.getGroupId(), false,
                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
            }

            if (layouts.size() > 0) {
                layout = layouts.get(0);
            }

            // Check the user's sites

            if (layout == null) {
                LinkedHashMap<String, Object> groupParams = new LinkedHashMap<String, Object>();

                groupParams.put("usersGroups", new Long(user.getUserId()));

                List<Group> groups = GroupLocalServiceUtil.search(user.getCompanyId(), null, null, groupParams,
                        QueryUtil.ALL_POS, QueryUtil.ALL_POS);

                for (Group group : groups) {
                    layouts = LayoutLocalServiceUtil.getLayouts(group.getGroupId(), true,
                            LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

                    if (layouts.size() == 0) {
                        layouts = LayoutLocalServiceUtil.getLayouts(group.getGroupId(), false,
                                LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
                    }

                    if (layouts.size() > 0) {
                        layout = layouts.get(0);

                        break;
                    }
                }
            }
        }

        if (layout == null) {

            // Check the Guest site

            Group guestGroup = GroupLocalServiceUtil.getGroup(user.getCompanyId(), GroupConstants.GUEST);

            layouts = LayoutLocalServiceUtil.getLayouts(guestGroup.getGroupId(), false,
                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

            if (layouts.size() > 0) {
                layout = layouts.get(0);
            }
        }

        return new Object[] { layout, layouts };
    }

    protected String getFriendlyURL(String friendlyURL) {
        friendlyURL = GetterUtil.getString(friendlyURL);

        return FriendlyURLNormalizerUtil.normalize(friendlyURL);
    }

    protected Object[] getViewableLayouts(HttpServletRequest request, User user,
            PermissionChecker permissionChecker, Layout layout, List<Layout> layouts)
            throws PortalException, SystemException {

        if ((layouts == null) || layouts.isEmpty()) {
            return new Object[] { layout, layouts };
        }

        Group group = layout.getGroup();

        boolean hasViewLayoutPermission = false;
        boolean hasViewStagingPermission = (group.isStagingGroup() || group.isStagedRemotely())
                && GroupPermissionUtil.contains(permissionChecker, group.getGroupId(), ActionKeys.VIEW_STAGING);

        if (LayoutPermissionUtil.contains(permissionChecker, layout, false, ActionKeys.VIEW)
                || hasViewStagingPermission) {

            hasViewLayoutPermission = true;
        }

        List<Layout> accessibleLayouts = new ArrayList<Layout>();
        if (_log.isDebugEnabled()) {
            _log.debug("Total layouts size: " + layouts.size());
        }
        for (int i = 0; i < layouts.size(); i++) {
            Layout curLayout = layouts.get(i);

            if (!curLayout.isHidden()
                    && (LayoutPermissionUtil.contains(permissionChecker, curLayout, false, ActionKeys.VIEW)
                            || hasViewStagingPermission)) {

                if (accessibleLayouts.isEmpty() && !hasViewLayoutPermission) {
                    layout = curLayout;
                }
                if (_log.isDebugEnabled()) {
                    _log.debug("Add layout. plid:" + curLayout.getPlid() + ", friendlyurl: "
                            + curLayout.getFriendlyURL());
                }
                accessibleLayouts.add(curLayout);
            } else {
                if (_log.isDebugEnabled()) {
                    _log.debug("Skip layout. plid:" + curLayout.getPlid() + ", friendlyurl: "
                            + curLayout.getFriendlyURL());
                }
            }
        }

        if (accessibleLayouts.isEmpty()) {
            layouts = null;

            if (!hasViewLayoutPermission) {
                SessionErrors.add(request, LayoutPermissionException.class.getName());
            }
        } else {
            layouts = accessibleLayouts;
        }

        return new Object[] { layout, layouts };
    }

    protected Boolean hasPowerUserRole(User user) throws Exception {
        return RoleLocalServiceUtil.hasUserRole(user.getUserId(), user.getCompanyId(), RoleConstants.POWER_USER,
                true);
    }

    protected void initImportLARFiles() {
        String privateLARFileName = PropsValues.DEFAULT_USER_PRIVATE_LAYOUTS_LAR;

        if (_log.isDebugEnabled()) {
            _log.debug("Reading private LAR file " + privateLARFileName);
        }

        if (Validator.isNotNull(privateLARFileName)) {
            privateLARFile = new File(privateLARFileName);

            if (!privateLARFile.exists()) {
                _log.error("Private LAR file " + privateLARFile + " does not exist");

                privateLARFile = null;
            } else {
                if (_log.isDebugEnabled()) {
                    _log.debug("Using private LAR file " + privateLARFileName);
                }
            }
        }

        String publicLARFileName = PropsValues.DEFAULT_USER_PUBLIC_LAYOUTS_LAR;

        if (_log.isDebugEnabled()) {
            _log.debug("Reading public LAR file " + publicLARFileName);
        }

        if (Validator.isNotNull(publicLARFileName)) {
            publicLARFile = new File(publicLARFileName);

            if (!publicLARFile.exists()) {
                _log.error("Public LAR file " + publicLARFile + " does not exist");

                publicLARFile = null;
            } else {
                if (_log.isDebugEnabled()) {
                    _log.debug("Using public LAR file " + publicLARFileName);
                }
            }
        }
    }

    protected boolean isLoginRequest(HttpServletRequest request) {
        String requestURI = request.getRequestURI();

        String mainPath = PortalUtil.getPathMain();

        if (requestURI.startsWith(mainPath.concat("/portal/login"))) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * @deprecated
     */
    protected boolean isViewableCommunity(User user, long groupId, boolean privateLayout,
            PermissionChecker permissionChecker) throws PortalException, SystemException {

        return LayoutPermissionUtil.contains(permissionChecker, groupId, privateLayout, 0, ActionKeys.VIEW);
    }

    /**
     * @deprecated
     */
    protected boolean isViewableGroup(User user, long groupId, boolean privateLayout, long layoutId,
            String controlPanelCategory, PermissionChecker permissionChecker)
            throws PortalException, SystemException {

        return LayoutPermissionUtil.contains(permissionChecker, groupId, privateLayout, layoutId,
                controlPanelCategory, ActionKeys.VIEW);
    }

    protected List<Layout> mergeAdditionalLayouts(HttpServletRequest request, User user,
            PermissionChecker permissionChecker, Layout layout, List<Layout> layouts)
            throws PortalException, SystemException {

        if ((layout == null) || layout.isPrivateLayout()) {
            return layouts;
        }

        long layoutGroupId = layout.getGroupId();

        Group guestGroup = GroupLocalServiceUtil.getGroup(user.getCompanyId(), GroupConstants.GUEST);

        if (layoutGroupId != guestGroup.getGroupId()) {
            Group layoutGroup = GroupLocalServiceUtil.getGroup(layoutGroupId);

            UnicodeProperties typeSettingsProperties = layoutGroup.getTypeSettingsProperties();

            boolean mergeGuestPublicPages = GetterUtil
                    .getBoolean(typeSettingsProperties.getProperty("mergeGuestPublicPages"));

            if (!mergeGuestPublicPages) {
                return layouts;
            }

            List<Layout> guestLayouts = LayoutLocalServiceUtil.getLayouts(guestGroup.getGroupId(), false,
                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

            Object[] viewableLayouts = getViewableLayouts(request, user, permissionChecker, layout, guestLayouts);

            guestLayouts = (List<Layout>) viewableLayouts[1];

            if (layouts == null) {
                return guestLayouts;
            }

            layouts.addAll(0, guestLayouts);
        } else {
            HttpSession session = request.getSession();

            Long previousGroupId = (Long) session.getAttribute(WebKeys.VISITED_GROUP_ID_PREVIOUS);

            if ((previousGroupId != null) && (previousGroupId.longValue() != layoutGroupId)) {

                Group previousGroup = null;

                try {
                    previousGroup = GroupLocalServiceUtil.getGroup(previousGroupId.longValue());
                } catch (NoSuchGroupException nsge) {
                    if (_log.isWarnEnabled()) {
                        _log.warn(nsge);
                    }

                    return layouts;
                }

                UnicodeProperties typeSettingsProperties = previousGroup.getTypeSettingsProperties();

                boolean mergeGuestPublicPages = GetterUtil
                        .getBoolean(typeSettingsProperties.getProperty("mergeGuestPublicPages"));

                if (!mergeGuestPublicPages) {
                    return layouts;
                }

                List<Layout> previousLayouts = LayoutLocalServiceUtil.getLayouts(previousGroupId.longValue(), false,
                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

                Object[] viewableLayouts = getViewableLayouts(request, user, permissionChecker, layout,
                        previousLayouts);

                previousLayouts = (List<Layout>) viewableLayouts[1];

                if (previousLayouts != null) {
                    layouts.addAll(previousLayouts);
                }
            }
        }

        return layouts;
    }

    protected void rememberVisitedGroupIds(HttpServletRequest request, long currentGroupId) {

        String requestURI = GetterUtil.getString(request.getRequestURI());

        if (!requestURI.endsWith(_PATH_PORTAL_LAYOUT)) {
            return;
        }

        HttpSession session = request.getSession();

        Long recentGroupId = (Long) session.getAttribute(WebKeys.VISITED_GROUP_ID_RECENT);

        Long previousGroupId = (Long) session.getAttribute(WebKeys.VISITED_GROUP_ID_PREVIOUS);

        if (recentGroupId == null) {
            recentGroupId = new Long(currentGroupId);

            session.setAttribute(WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);
        } else if (recentGroupId.longValue() != currentGroupId) {
            previousGroupId = new Long(recentGroupId.longValue());

            recentGroupId = new Long(currentGroupId);

            session.setAttribute(WebKeys.VISITED_GROUP_ID_RECENT, recentGroupId);

            session.setAttribute(WebKeys.VISITED_GROUP_ID_PREVIOUS, previousGroupId);
        }

        if (_log.isDebugEnabled()) {
            _log.debug("Current group id " + currentGroupId);
            _log.debug("Recent group id " + recentGroupId);
            _log.debug("Previous group id " + previousGroupId);
        }
    }

    protected void servicePre(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ThemeDisplay themeDisplay = initThemeDisplay(request, response);

        if (themeDisplay == null) {
            return;
        }

        request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);

        // Service context

        ServiceContext serviceContext = ServiceContextFactory.getInstance(request);

        ServiceContextThreadLocal.pushServiceContext(serviceContext);

        // Parallel render

        boolean parallelRenderEnable = true;

        Layout layout = themeDisplay.getLayout();

        if (layout != null) {
            LayoutTypePortlet layoutTypePortlet = themeDisplay.getLayoutTypePortlet();

            List<String> portletIds = layoutTypePortlet.getPortletIds();

            if (portletIds.size() == 1) {
                String portletId = portletIds.get(0);

                Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);

                if ((portlet != null) && !portlet.isAjaxable()) {
                    parallelRenderEnable = false;
                }
            }
        }

        Boolean parallelRenderEnableObj = Boolean
                .valueOf(ParamUtil.getBoolean(request, "p_p_parallel", parallelRenderEnable));

        request.setAttribute(WebKeys.PORTLET_PARALLEL_RENDER, parallelRenderEnableObj);

        // Main Journal article

        long mainJournalArticleId = ParamUtil.getLong(request, "p_j_a_id");

        if (mainJournalArticleId > 0) {
            try {
                JournalArticle mainJournalArticle = JournalArticleServiceUtil.getArticle(mainJournalArticleId);

                AssetEntry layoutAssetEntry = AssetEntryLocalServiceUtil.getEntry(JournalArticle.class.getName(),
                        mainJournalArticle.getResourcePrimKey());

                request.setAttribute(WebKeys.LAYOUT_ASSET_ENTRY, layoutAssetEntry);
            } catch (NoSuchArticleException nsae) {
                if (_log.isWarnEnabled()) {
                    _log.warn(nsae.getMessage());
                }
            }
        }
    }

    protected void updateUserLayouts(User user) throws Exception {
        Boolean hasPowerUserRole = null;

        // Private layouts

        boolean addDefaultUserPrivateLayouts = false;

        if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED
                && PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_AUTO_CREATE) {

            addDefaultUserPrivateLayouts = true;

            if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
                hasPowerUserRole = hasPowerUserRole(user);

                if (!hasPowerUserRole.booleanValue()) {
                    addDefaultUserPrivateLayouts = false;
                }
            }
        }

        Boolean hasPrivateLayouts = null;

        if (addDefaultUserPrivateLayouts) {
            hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts(user, true);

            if (!hasPrivateLayouts) {
                addDefaultUserPrivateLayouts(user);
            }
        }

        boolean deleteDefaultUserPrivateLayouts = false;

        if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) {
            deleteDefaultUserPrivateLayouts = true;
        } else if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
            if (hasPowerUserRole == null) {
                hasPowerUserRole = hasPowerUserRole(user);
            }

            if (!hasPowerUserRole.booleanValue()) {
                deleteDefaultUserPrivateLayouts = true;
            }
        }

        if (deleteDefaultUserPrivateLayouts) {
            if (hasPrivateLayouts == null) {
                //Modification start
                try {
                    hasPrivateLayouts = LayoutLocalServiceUtil.hasLayouts(user, true);
                } catch (NoSuchLayoutSetException e) {
                    hasPrivateLayouts = false;
                }
                //Modification end
            }
            if (hasPrivateLayouts) {
                deleteDefaultUserPrivateLayouts(user);
            }
        }

        // Public pages

        boolean addDefaultUserPublicLayouts = false;

        if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED && PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_AUTO_CREATE) {

            addDefaultUserPublicLayouts = true;

            if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
                if (hasPowerUserRole == null) {
                    hasPowerUserRole = hasPowerUserRole(user);
                }

                if (!hasPowerUserRole.booleanValue()) {
                    addDefaultUserPublicLayouts = false;
                }
            }
        }

        Boolean hasPublicLayouts = null;

        if (addDefaultUserPublicLayouts) {
            hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts(user, false);

            if (!hasPublicLayouts) {
                addDefaultUserPublicLayouts(user);
            }
        }

        boolean deleteDefaultUserPublicLayouts = false;

        if (!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
            deleteDefaultUserPublicLayouts = true;
        } else if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
            if (hasPowerUserRole == null) {
                hasPowerUserRole = hasPowerUserRole(user);
            }

            if (!hasPowerUserRole.booleanValue()) {
                deleteDefaultUserPublicLayouts = true;
            }
        }

        if (deleteDefaultUserPublicLayouts) {
            if (hasPublicLayouts == null) {
                //Modification start
                try {
                    hasPublicLayouts = LayoutLocalServiceUtil.hasLayouts(user, false);
                } catch (NoSuchLayoutSetException e) {
                    hasPublicLayouts = false;
                }
                //Modification end
            }

            if (hasPublicLayouts) {
                deleteDefaultUserPublicLayouts(user);
            }
        }
    }

    protected File privateLARFile;
    protected File publicLARFile;

    private static final String _CONTROL_PANEL_CATEGORY_PORTLET_PREFIX = "portlet_";

    private static final String _PATH_PORTAL_LAYOUT = "/portal/layout";

    private static Log _log = LogFactoryUtil.getLog(ServicePreAction.class);

}