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