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