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