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