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