1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.events;
24  
25  import com.liferay.portal.LayoutPermissionException;
26  import com.liferay.portal.NoSuchGroupException;
27  import com.liferay.portal.NoSuchLayoutException;
28  import com.liferay.portal.PortalException;
29  import com.liferay.portal.SystemException;
30  import com.liferay.portal.kernel.dao.orm.QueryUtil;
31  import com.liferay.portal.kernel.events.Action;
32  import com.liferay.portal.kernel.events.ActionException;
33  import com.liferay.portal.kernel.language.LanguageUtil;
34  import com.liferay.portal.kernel.portlet.LiferayWindowState;
35  import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
36  import com.liferay.portal.kernel.servlet.ImageServletTokenUtil;
37  import com.liferay.portal.kernel.servlet.SessionErrors;
38  import com.liferay.portal.kernel.util.GetterUtil;
39  import com.liferay.portal.kernel.util.HttpUtil;
40  import com.liferay.portal.kernel.util.LocaleUtil;
41  import com.liferay.portal.kernel.util.ParamUtil;
42  import com.liferay.portal.kernel.util.StringPool;
43  import com.liferay.portal.kernel.util.StringUtil;
44  import com.liferay.portal.kernel.util.UnicodeProperties;
45  import com.liferay.portal.kernel.util.Validator;
46  import com.liferay.portal.lar.PortletDataHandlerKeys;
47  import com.liferay.portal.model.ColorScheme;
48  import com.liferay.portal.model.Company;
49  import com.liferay.portal.model.Group;
50  import com.liferay.portal.model.GroupConstants;
51  import com.liferay.portal.model.Image;
52  import com.liferay.portal.model.Layout;
53  import com.liferay.portal.model.LayoutConstants;
54  import com.liferay.portal.model.LayoutSet;
55  import com.liferay.portal.model.LayoutTypePortlet;
56  import com.liferay.portal.model.Role;
57  import com.liferay.portal.model.RoleConstants;
58  import com.liferay.portal.model.Theme;
59  import com.liferay.portal.model.User;
60  import com.liferay.portal.model.impl.ColorSchemeImpl;
61  import com.liferay.portal.model.impl.LayoutImpl;
62  import com.liferay.portal.model.impl.LayoutTypePortletImpl;
63  import com.liferay.portal.model.impl.ThemeImpl;
64  import com.liferay.portal.security.permission.ActionKeys;
65  import com.liferay.portal.security.permission.PermissionChecker;
66  import com.liferay.portal.security.permission.PermissionCheckerFactory;
67  import com.liferay.portal.security.permission.PermissionThreadLocal;
68  import com.liferay.portal.service.GroupLocalServiceUtil;
69  import com.liferay.portal.service.ImageLocalServiceUtil;
70  import com.liferay.portal.service.LayoutLocalServiceUtil;
71  import com.liferay.portal.service.LayoutSetLocalServiceUtil;
72  import com.liferay.portal.service.OrganizationLocalServiceUtil;
73  import com.liferay.portal.service.RoleLocalServiceUtil;
74  import com.liferay.portal.service.ThemeLocalServiceUtil;
75  import com.liferay.portal.service.UserLocalServiceUtil;
76  import com.liferay.portal.service.permission.GroupPermissionUtil;
77  import com.liferay.portal.service.permission.LayoutPermissionUtil;
78  import com.liferay.portal.service.permission.OrganizationPermissionUtil;
79  import com.liferay.portal.service.permission.UserPermissionUtil;
80  import com.liferay.portal.theme.ThemeDisplay;
81  import com.liferay.portal.theme.ThemeDisplayFactory;
82  import com.liferay.portal.util.CookieKeys;
83  import com.liferay.portal.util.LayoutClone;
84  import com.liferay.portal.util.LayoutCloneFactory;
85  import com.liferay.portal.util.PortalUtil;
86  import com.liferay.portal.util.PortletKeys;
87  import com.liferay.portal.util.PropsKeys;
88  import com.liferay.portal.util.PropsUtil;
89  import com.liferay.portal.util.PropsValues;
90  import com.liferay.portal.util.WebKeys;
91  import com.liferay.portlet.PortletURLImpl;
92  import com.liferay.util.Normalizer;
93  
94  import java.io.File;
95  
96  import java.util.ArrayList;
97  import java.util.HashMap;
98  import java.util.LinkedHashMap;
99  import java.util.List;
100 import java.util.Locale;
101 import java.util.Map;
102 import java.util.TimeZone;
103 
104 import javax.portlet.PortletMode;
105 import javax.portlet.PortletRequest;
106 import javax.portlet.PortletURL;
107 import javax.portlet.WindowState;
108 
109 import javax.servlet.http.HttpServletRequest;
110 import javax.servlet.http.HttpServletResponse;
111 import javax.servlet.http.HttpSession;
112 
113 import org.apache.commons.lang.time.StopWatch;
114 import org.apache.commons.logging.Log;
115 import org.apache.commons.logging.LogFactory;
116 import org.apache.struts.Globals;
117 
118 /**
119  * <a href="ServicePreAction.java.html"><b><i>View Source</i></b></a>
120  *
121  * @author Brian Wing Shun Chan
122  * @author Felix Ventero
123  *
124  */
125 public class ServicePreAction extends Action {
126 
127     public ServicePreAction() {
128         initImportLARFiles();
129     }
130 
131     public void run(HttpServletRequest request, HttpServletResponse response)
132         throws ActionException {
133 
134         StopWatch stopWatch = null;
135 
136         if (_log.isDebugEnabled()) {
137             stopWatch = new StopWatch();
138 
139             stopWatch.start();
140         }
141 
142         try {
143             servicePre(request, response);
144         }
145         catch (Exception e) {
146             throw new ActionException(e);
147         }
148 
149         if (_log.isDebugEnabled()) {
150             _log.debug("Running takes " + stopWatch.getTime() + " ms");
151         }
152     }
153 
154     protected void addDefaultLayoutsByLAR(
155             long userId, long groupId, boolean privateLayout, File larFile)
156         throws PortalException, SystemException {
157 
158         Map<String, String[]> parameterMap = new HashMap<String, String[]>();
159 
160         parameterMap.put(
161             PortletDataHandlerKeys.PERMISSIONS,
162             new String[] {Boolean.TRUE.toString()});
163         parameterMap.put(
164             PortletDataHandlerKeys.PORTLET_DATA,
165             new String[] {Boolean.TRUE.toString()});
166         parameterMap.put(
167             PortletDataHandlerKeys.PORTLET_DATA_CONTROL_DEFAULT,
168             new String[] {Boolean.TRUE.toString()});
169         parameterMap.put(
170             PortletDataHandlerKeys.PORTLET_SETUP,
171             new String[] {Boolean.TRUE.toString()});
172         parameterMap.put(
173             PortletDataHandlerKeys.USER_PERMISSIONS,
174             new String[] {Boolean.FALSE.toString()});
175 
176         LayoutLocalServiceUtil.importLayouts(
177             userId, groupId, privateLayout, parameterMap, larFile);
178     }
179 
180     protected void addDefaultUserPrivateLayoutByProperties(
181             long userId, long groupId)
182         throws PortalException, SystemException {
183 
184         String friendlyURL = getFriendlyURL(
185             PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_FRIENDLY_URL);
186 
187         Layout layout = LayoutLocalServiceUtil.addLayout(
188             userId, groupId, true, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
189             PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_NAME, StringPool.BLANK,
190             StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL);
191 
192         LayoutTypePortlet layoutTypePortlet =
193             (LayoutTypePortlet)layout.getLayoutType();
194 
195         layoutTypePortlet.setLayoutTemplateId(
196             0, PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_TEMPLATE_ID, false);
197 
198         for (int i = 0; i < 10; i++) {
199             String columnId = "column-" + i;
200             String portletIds = PropsUtil.get(
201                 PropsKeys.DEFAULT_USER_PRIVATE_LAYOUT_COLUMN + i);
202 
203             String[] portletIdsArray = StringUtil.split(portletIds);
204 
205             layoutTypePortlet.addPortletIds(
206                 0, portletIdsArray, columnId, false);
207         }
208 
209         LayoutLocalServiceUtil.updateLayout(
210             layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
211             layout.getTypeSettings());
212 
213         boolean updateLayoutSet = false;
214 
215         LayoutSet layoutSet = layout.getLayoutSet();
216 
217         if (Validator.isNotNull(
218                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID)) {
219 
220             layoutSet.setThemeId(
221                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_THEME_ID);
222 
223             updateLayoutSet = true;
224         }
225 
226         if (Validator.isNotNull(
227                 PropsValues.
228                     DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
229 
230             layoutSet.setColorSchemeId(
231                 PropsValues.
232                     DEFAULT_USER_PRIVATE_LAYOUT_REGULAR_COLOR_SCHEME_ID);
233 
234             updateLayoutSet = true;
235         }
236 
237         if (Validator.isNotNull(
238                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID)) {
239 
240             layoutSet.setWapThemeId(
241                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_THEME_ID);
242 
243             updateLayoutSet = true;
244         }
245 
246         if (Validator.isNotNull(
247                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID)) {
248 
249             layoutSet.setWapColorSchemeId(
250                 PropsValues.DEFAULT_USER_PRIVATE_LAYOUT_WAP_COLOR_SCHEME_ID);
251 
252             updateLayoutSet = true;
253         }
254 
255         if (updateLayoutSet) {
256             LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
257         }
258     }
259 
260     protected void addDefaultUserPrivateLayouts(User user)
261         throws PortalException, SystemException {
262 
263         Group userGroup = user.getGroup();
264 
265         if (privateLARFile != null) {
266             addDefaultLayoutsByLAR(
267                 user.getUserId(), userGroup.getGroupId(), true, privateLARFile);
268         }
269         else {
270             addDefaultUserPrivateLayoutByProperties(
271                 user.getUserId(), userGroup.getGroupId());
272         }
273     }
274 
275     protected void addDefaultUserPublicLayoutByProperties(
276             long userId, long groupId)
277         throws PortalException, SystemException {
278 
279         String friendlyURL = getFriendlyURL(
280             PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_FRIENDLY_URL);
281 
282         Layout layout = LayoutLocalServiceUtil.addLayout(
283             userId, groupId, false, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID,
284             PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_NAME, StringPool.BLANK,
285             StringPool.BLANK, LayoutConstants.TYPE_PORTLET, false, friendlyURL);
286 
287         LayoutTypePortlet layoutTypePortlet =
288             (LayoutTypePortlet)layout.getLayoutType();
289 
290         layoutTypePortlet.setLayoutTemplateId(
291             0, PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_TEMPLATE_ID, false);
292 
293         for (int i = 0; i < 10; i++) {
294             String columnId = "column-" + i;
295             String portletIds = PropsUtil.get(
296                 PropsKeys.DEFAULT_USER_PUBLIC_LAYOUT_COLUMN + i);
297 
298             String[] portletIdsArray = StringUtil.split(portletIds);
299 
300             layoutTypePortlet.addPortletIds(
301                 0, portletIdsArray, columnId, false);
302         }
303 
304         LayoutLocalServiceUtil.updateLayout(
305             layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
306             layout.getTypeSettings());
307 
308         boolean updateLayoutSet = false;
309 
310         LayoutSet layoutSet = layout.getLayoutSet();
311 
312         if (Validator.isNotNull(
313                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID)) {
314 
315             layoutSet.setThemeId(
316                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_THEME_ID);
317 
318             updateLayoutSet = true;
319         }
320 
321         if (Validator.isNotNull(
322                 PropsValues.
323                     DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID)) {
324 
325             layoutSet.setColorSchemeId(
326                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_REGULAR_COLOR_SCHEME_ID);
327 
328             updateLayoutSet = true;
329         }
330 
331         if (Validator.isNotNull(
332                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID)) {
333 
334             layoutSet.setWapThemeId(
335                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_THEME_ID);
336 
337             updateLayoutSet = true;
338         }
339 
340         if (Validator.isNotNull(
341                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID)) {
342 
343             layoutSet.setWapColorSchemeId(
344                 PropsValues.DEFAULT_USER_PUBLIC_LAYOUT_WAP_COLOR_SCHEME_ID);
345 
346             updateLayoutSet = true;
347         }
348 
349         if (updateLayoutSet) {
350             LayoutSetLocalServiceUtil.updateLayoutSet(layoutSet);
351         }
352     }
353 
354     protected void addDefaultUserPublicLayouts(User user)
355         throws PortalException, SystemException {
356 
357         Group userGroup = user.getGroup();
358 
359         if (publicLARFile != null) {
360             addDefaultLayoutsByLAR(
361                 user.getUserId(), userGroup.getGroupId(), false, publicLARFile);
362         }
363         else {
364             addDefaultUserPublicLayoutByProperties(
365                 user.getUserId(), userGroup.getGroupId());
366         }
367     }
368 
369     protected void deleteDefaultUserPrivateLayouts(User user)
370         throws PortalException, SystemException {
371 
372         Group userGroup = user.getGroup();
373 
374         LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), true);
375     }
376 
377     protected void deleteDefaultUserPublicLayouts(User user)
378         throws PortalException, SystemException {
379 
380         Group userGroup = user.getGroup();
381 
382         LayoutLocalServiceUtil.deleteLayouts(userGroup.getGroupId(), false);
383     }
384 
385     protected Object[] getDefaultLayout(
386             HttpServletRequest request, User user, boolean signedIn)
387         throws PortalException, SystemException {
388 
389         // Check the virtual host
390 
391         LayoutSet layoutSet = (LayoutSet)request.getAttribute(
392             WebKeys.VIRTUAL_HOST_LAYOUT_SET);
393 
394         if (layoutSet != null) {
395             List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
396                 layoutSet.getGroupId(), layoutSet.isPrivateLayout(),
397                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
398 
399             if (layouts.size() > 0) {
400                 Layout layout = layouts.get(0);
401 
402                 return new Object[] {layout, layouts};
403             }
404         }
405 
406         Layout layout = null;
407         List<Layout> layouts = null;
408 
409         if (signedIn) {
410 
411             // Check the user's personal layouts
412 
413             Group userGroup = user.getGroup();
414 
415             layouts = LayoutLocalServiceUtil.getLayouts(
416                 userGroup.getGroupId(), true,
417                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
418 
419             if (layouts.size() == 0) {
420                 layouts = LayoutLocalServiceUtil.getLayouts(
421                     userGroup.getGroupId(), false,
422                     LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
423             }
424 
425             if (layouts.size() > 0) {
426                 layout = layouts.get(0);
427             }
428 
429             // Check the user's communities
430 
431             if (layout == null) {
432                 LinkedHashMap<String, Object> groupParams =
433                     new LinkedHashMap<String, Object>();
434 
435                 groupParams.put("usersGroups", new Long(user.getUserId()));
436 
437                 List<Group> groups = GroupLocalServiceUtil.search(
438                     user.getCompanyId(), null, null, groupParams,
439                     QueryUtil.ALL_POS, QueryUtil.ALL_POS);
440 
441                 for (int i = 0; i < groups.size(); i++) {
442                     Group group = groups.get(i);
443 
444                     layouts = LayoutLocalServiceUtil.getLayouts(
445                         group.getGroupId(), true,
446                         LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
447 
448                     if (layouts.size() == 0) {
449                         layouts = LayoutLocalServiceUtil.getLayouts(
450                             group.getGroupId(), false,
451                             LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
452                     }
453 
454                     if (layouts.size() > 0) {
455                         layout = layouts.get(0);
456 
457                         break;
458                     }
459                 }
460             }
461         }
462         else {
463 
464             // Check the guest community
465 
466             Group guestGroup = GroupLocalServiceUtil.getGroup(
467                 user.getCompanyId(), GroupConstants.GUEST);
468 
469             layouts = LayoutLocalServiceUtil.getLayouts(
470                 guestGroup.getGroupId(), false,
471                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
472 
473             if (layouts.size() > 0) {
474                 layout = layouts.get(0);
475             }
476         }
477 
478         return new Object[] {layout, layouts};
479     }
480 
481     protected String getFriendlyURL(String friendlyURL) {
482         friendlyURL = GetterUtil.getString(friendlyURL);
483 
484         return Normalizer.normalizeToAscii(friendlyURL.trim().toLowerCase());
485     }
486 
487     protected Object[] getViewableLayouts(
488             HttpServletRequest request, User user,
489             PermissionChecker permissionChecker, Layout layout,
490             List<Layout> layouts)
491         throws PortalException, SystemException {
492 
493         if ((layouts == null) || (layouts.size() == 0)) {
494             return new Object[] {layout, layouts};
495         }
496 
497         boolean replaceLayout = true;
498 
499         if (LayoutPermissionUtil.contains(
500                 permissionChecker, layout, ActionKeys.VIEW)) {
501 
502             replaceLayout = false;
503         }
504 
505         List<Layout> accessibleLayouts = new ArrayList<Layout>();
506 
507         for (int i = 0; i < layouts.size(); i++) {
508             Layout curLayout = layouts.get(i);
509 
510             if (!curLayout.isHidden() &&
511                 LayoutPermissionUtil.contains(
512                     permissionChecker, curLayout, ActionKeys.VIEW)) {
513 
514                 if ((accessibleLayouts.size() == 0) && replaceLayout) {
515                     layout = curLayout;
516                 }
517 
518                 accessibleLayouts.add(curLayout);
519             }
520         }
521 
522         if (accessibleLayouts.size() == 0) {
523             layouts = null;
524 
525             SessionErrors.add(
526                 request, LayoutPermissionException.class.getName());
527         }
528         else {
529             layouts = accessibleLayouts;
530         }
531 
532         return new Object[] {layout, layouts};
533     }
534 
535     protected void initImportLARFiles() {
536         String privateLARFileName =
537             PropsValues.DEFAULT_USER_PRIVATE_LAYOUTS_LAR;
538 
539         if (_log.isDebugEnabled()) {
540             _log.debug("Reading private LAR file " + privateLARFileName);
541         }
542 
543         if (Validator.isNotNull(privateLARFileName)) {
544             privateLARFile = new File(privateLARFileName);
545 
546             if (!privateLARFile.exists()) {
547                 _log.error(
548                     "Private LAR file " + privateLARFile + " does not exist");
549 
550                 privateLARFile = null;
551             }
552             else {
553                 if (_log.isDebugEnabled()) {
554                     _log.debug("Using private LAR file " + privateLARFileName);
555                 }
556             }
557         }
558 
559         String publicLARFileName = PropsValues.DEFAULT_USER_PUBLIC_LAYOUTS_LAR;
560 
561         if (_log.isDebugEnabled()) {
562             _log.debug("Reading public LAR file " + publicLARFileName);
563         }
564 
565         if (Validator.isNotNull(publicLARFileName)) {
566             publicLARFile = new File(publicLARFileName);
567 
568             if (!publicLARFile.exists()) {
569                 _log.error(
570                     "Public LAR file " + publicLARFile + " does not exist");
571 
572                 publicLARFile = null;
573             }
574             else {
575                 if (_log.isDebugEnabled()) {
576                     _log.debug("Using public LAR file " + publicLARFileName);
577                 }
578             }
579         }
580     }
581 
582     protected boolean isViewableCommunity(
583             User user, long groupId, boolean privateLayout,
584             PermissionChecker permissionChecker)
585         throws PortalException, SystemException {
586 
587         Group group = GroupLocalServiceUtil.getGroup(groupId);
588 
589         // Inactive communities are not viewable
590 
591         if (!group.isActive()) {
592             return false;
593         }
594         else if (group.isStagingGroup()) {
595             Group liveGroup = group.getLiveGroup();
596 
597             if (!liveGroup.isActive()) {
598                 return false;
599             }
600         }
601 
602         // User private layouts are only viewable by the user and anyone who can
603         // update the user. The user must also be active.
604 
605         if (group.isUser()) {
606             long groupUserId = group.getClassPK();
607 
608             if (groupUserId == user.getUserId()) {
609                 return true;
610             }
611             else {
612                 User groupUser = UserLocalServiceUtil.getUserById(groupUserId);
613 
614                 if (!groupUser.isActive()) {
615                     return false;
616                 }
617 
618                 if (privateLayout) {
619                     if (UserPermissionUtil.contains(
620                             permissionChecker, groupUserId,
621                             groupUser.getOrganizationIds(),
622                             ActionKeys.UPDATE)) {
623 
624                         return true;
625                     }
626                     else {
627                         return false;
628                     }
629                 }
630             }
631         }
632 
633         // If the current group is staging, only users with editorial rights
634         // can access it
635 
636         if (group.isStagingGroup()) {
637             if (user.isDefaultUser()) {
638                 return false;
639             }
640 
641             if (GroupPermissionUtil.contains(
642                     permissionChecker, groupId, ActionKeys.APPROVE_PROPOSAL) ||
643                 GroupPermissionUtil.contains(
644                     permissionChecker, groupId, ActionKeys.ASSIGN_REVIEWER) ||
645                 GroupPermissionUtil.contains(
646                     permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS) ||
647                 GroupPermissionUtil.contains(
648                     permissionChecker, groupId, ActionKeys.MANAGE_STAGING) ||
649                 GroupPermissionUtil.contains(
650                     permissionChecker, groupId, ActionKeys.PUBLISH_STAGING)) {
651 
652                 return true;
653             }
654 
655             return false;
656         }
657 
658         // Most public layouts are viewable
659 
660         if (!privateLayout) {
661             return true;
662         }
663 
664         // Community or organization layouts are only viewable by users who
665         // belong to the community or organization, or by users who can update
666         // the community or organization
667 
668         if (group.isCommunity()) {
669             if (GroupLocalServiceUtil.hasUserGroup(user.getUserId(), groupId)) {
670                 return true;
671             }
672             else if (GroupPermissionUtil.contains(
673                         permissionChecker, groupId, ActionKeys.UPDATE)) {
674 
675                 return true;
676             }
677         }
678         else if (group.isOrganization()) {
679             long organizationId = group.getClassPK();
680 
681             if (OrganizationLocalServiceUtil.hasUserOrganization(
682                     user.getUserId(), organizationId)) {
683 
684                 return true;
685             }
686             else if (OrganizationPermissionUtil.contains(
687                         permissionChecker, organizationId, ActionKeys.UPDATE)) {
688 
689                 return true;
690             }
691         }
692         else if (group.isUserGroup()) {
693             if (GroupPermissionUtil.contains(
694                     permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS)) {
695 
696                 return true;
697             }
698         }
699 
700         return false;
701     }
702 
703     protected List<Layout> mergeAdditionalLayouts(
704             HttpServletRequest request, User user,
705             PermissionChecker permissionChecker, Layout layout,
706             List<Layout> layouts)
707         throws PortalException, SystemException {
708 
709         if ((layout == null) || layout.isPrivateLayout()) {
710             return layouts;
711         }
712 
713         long layoutGroupId = layout.getGroupId();
714 
715         Group guestGroup = GroupLocalServiceUtil.getGroup(
716             user.getCompanyId(), GroupConstants.GUEST);
717 
718         if (layoutGroupId != guestGroup.getGroupId()) {
719             Group layoutGroup = GroupLocalServiceUtil.getGroup(layoutGroupId);
720 
721             UnicodeProperties props = layoutGroup.getTypeSettingsProperties();
722 
723             boolean mergeGuestPublicPages = GetterUtil.getBoolean(
724                 props.getProperty("mergeGuestPublicPages"));
725 
726             if (!mergeGuestPublicPages) {
727                 return layouts;
728             }
729 
730             List<Layout> guestLayouts = LayoutLocalServiceUtil.getLayouts(
731                 guestGroup.getGroupId(), false,
732                 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
733 
734             Object[] viewableLayouts = getViewableLayouts(
735                 request, user, permissionChecker, layout, guestLayouts);
736 
737             guestLayouts = (List<Layout>)viewableLayouts[1];
738 
739             layouts.addAll(0, guestLayouts);
740         }
741         else {
742             HttpSession session = request.getSession();
743 
744             Long previousGroupId = (Long)session.getAttribute(
745                 WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_PREVIOUS);
746 
747             if ((previousGroupId != null) &&
748                 (previousGroupId.longValue() != layoutGroupId)) {
749 
750                 Group previousGroup = null;
751 
752                 try {
753                     previousGroup = GroupLocalServiceUtil.getGroup(
754                         previousGroupId.longValue());
755                 }
756                 catch (NoSuchGroupException nsge) {
757                     if (_log.isWarnEnabled()) {
758                         _log.warn(nsge);
759                     }
760 
761                     return layouts;
762                 }
763 
764                 UnicodeProperties props =
765                     previousGroup.getTypeSettingsProperties();
766 
767                 boolean mergeGuestPublicPages = GetterUtil.getBoolean(
768                     props.getProperty("mergeGuestPublicPages"));
769 
770                 if (!mergeGuestPublicPages) {
771                     return layouts;
772                 }
773 
774                 List<Layout> previousLayouts =
775                     LayoutLocalServiceUtil.getLayouts(
776                         previousGroupId.longValue(), false,
777                         LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
778 
779                 Object[] viewableLayouts = getViewableLayouts(
780                     request, user, permissionChecker, layout, previousLayouts);
781 
782                 previousLayouts = (List<Layout>)viewableLayouts[1];
783 
784                 layouts.addAll(previousLayouts);
785             }
786         }
787 
788         return layouts;
789     }
790 
791     protected void rememberVisitedGroupIds(
792         HttpServletRequest request, long currentGroupId) {
793 
794         String requestURI = GetterUtil.getString(request.getRequestURI());
795 
796         if (!requestURI.endsWith(_PATH_PORTAL_LAYOUT)) {
797             return;
798         }
799 
800         HttpSession session = request.getSession();
801 
802         Long recentGroupId = (Long)session.getAttribute(
803             WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_RECENT);
804 
805         Long previousGroupId = (Long)session.getAttribute(
806             WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_PREVIOUS);
807 
808         if (recentGroupId == null) {
809             recentGroupId = new Long(currentGroupId);
810 
811             session.setAttribute(
812                 WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_RECENT,
813                 recentGroupId);
814         }
815         else if (recentGroupId.longValue() != currentGroupId) {
816             previousGroupId = new Long(recentGroupId.longValue());
817 
818             recentGroupId = new Long(currentGroupId);
819 
820             session.setAttribute(
821                 WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_RECENT,
822                 recentGroupId);
823 
824             session.setAttribute(
825                 WebKeys.LIFERAY_SHARED_VISITED_GROUP_ID_PREVIOUS,
826                 previousGroupId);
827         }
828 
829         if (_log.isDebugEnabled()) {
830             _log.debug("Current group id " + currentGroupId);
831             _log.debug("Recent group id " + recentGroupId);
832             _log.debug("Previous group id " + previousGroupId);
833         }
834     }
835 
836     protected void servicePre(
837             HttpServletRequest request, HttpServletResponse response)
838         throws Exception {
839 
840         HttpSession session = request.getSession();
841 
842         // Company
843 
844         Company company = PortalUtil.getCompany(request);
845 
846         long companyId = company.getCompanyId();
847 
848         // CDN host
849 
850         String cdnHost = ParamUtil.getString(
851             request, "cdn_host", PortalUtil.getCDNHost());
852 
853         // Portal URL
854 
855         String portalURL = PortalUtil.getPortalURL(request);
856 
857         // Paths
858 
859         String contextPath = PortalUtil.getPathContext();
860         String friendlyURLPrivateGroupPath =
861             PortalUtil.getPathFriendlyURLPrivateGroup();
862         String friendlyURLPrivateUserPath =
863             PortalUtil.getPathFriendlyURLPrivateUser();
864         String friendlyURLPublicPath = PortalUtil.getPathFriendlyURLPublic();
865         String imagePath = PortalUtil.getPathImage();
866         String mainPath = PortalUtil.getPathMain();
867 
868         String i18nLanguageId = (String)request.getAttribute(
869             WebKeys.I18N_LANGUAGE_ID);
870 
871         if (Validator.isNotNull(i18nLanguageId)) {
872             if (Validator.isNotNull(contextPath)) {
873                 mainPath = StringUtil.replaceFirst(
874                     mainPath, contextPath,
875                     contextPath + StringPool.SLASH + i18nLanguageId);
876             }
877             else {
878                 mainPath = StringPool.SLASH + i18nLanguageId + mainPath;
879             }
880         }
881 
882         // Company logo
883 
884         String companyLogo =
885             imagePath + "/company_logo?img_id=" + company.getLogoId() + "&t=" +
886                 ImageServletTokenUtil.getToken(company.getLogoId());
887 
888         Image companyLogoImage = ImageLocalServiceUtil.getCompanyLogo(
889             company.getLogoId());
890 
891         int companyLogoHeight = companyLogoImage.getHeight();
892         int companyLogoWidth = companyLogoImage.getWidth();
893 
894         String realCompanyLogo = companyLogo;
895         int realCompanyLogoHeight = companyLogoHeight;
896         int realCompanyLogoWidth = companyLogoWidth;
897 
898         // User
899 
900         User user = PortalUtil.getUser(request);
901 
902         boolean signedIn = false;
903 
904         if (user == null) {
905             user = company.getDefaultUser();
906         }
907         else if (!user.isDefaultUser()) {
908             signedIn = true;
909         }
910 
911         User realUser = user;
912 
913         Long realUserId = (Long)session.getAttribute(WebKeys.USER_ID);
914 
915         if (realUserId != null) {
916             if (user.getUserId() != realUserId.longValue()) {
917                 realUser = UserLocalServiceUtil.getUserById(
918                     realUserId.longValue());
919             }
920         }
921 
922         String doAsUserId = ParamUtil.getString(request, "doAsUserId");
923 
924         // Permission checker
925 
926         PermissionChecker permissionChecker = PermissionCheckerFactory.create(
927             user, true);
928 
929         PermissionThreadLocal.setPermissionChecker(permissionChecker);
930 
931         // Locale
932 
933         Locale locale = (Locale)session.getAttribute(Globals.LOCALE_KEY);
934 
935         if (Validator.isNotNull(i18nLanguageId)) {
936             locale = LocaleUtil.fromLanguageId(i18nLanguageId);
937         }
938         else if (locale == null) {
939             if (signedIn) {
940                 locale = user.getLocale();
941             }
942             else {
943 
944                 // User previously set their preferred language
945 
946                 String languageId = CookieKeys.getCookie(
947                     request, CookieKeys.GUEST_LANGUAGE_ID);
948 
949                 if (Validator.isNotNull(languageId)) {
950                     locale = LocaleUtil.fromLanguageId(languageId);
951                 }
952 
953                 // Get locale from the request
954 
955                 if ((locale == null) && PropsValues.LOCALE_DEFAULT_REQUEST) {
956                     locale = request.getLocale();
957                 }
958 
959                 // Get locale from the default user
960 
961                 if (locale == null) {
962                     locale = user.getLocale();
963                 }
964 
965                 if (Validator.isNull(locale.getCountry())) {
966 
967                     // Locales must contain the country code
968 
969                     locale = LanguageUtil.getLocale(locale.getLanguage());
970                 }
971 
972                 if (!LanguageUtil.isAvailableLocale(locale)) {
973                     locale = user.getLocale();
974                 }
975             }
976 
977             session.setAttribute(Globals.LOCALE_KEY, locale);
978 
979             LanguageUtil.updateCookie(request, response, locale);
980         }
981 
982         // Cookie support
983 
984         try {
985 
986             // LEP-4069
987 
988             CookieKeys.validateSupportCookie(request);
989         }
990         catch (Exception e) {
991             CookieKeys.addSupportCookie(request, response);
992         }
993 
994         // Time zone
995 
996         TimeZone timeZone = user.getTimeZone();
997 
998         if (timeZone == null) {
999             timeZone = company.getTimeZone();
1000        }
1001
1002        // Layouts
1003
1004        if (signedIn) {
1005            updateUserLayouts(user);
1006        }
1007
1008        Layout layout = null;
1009        List<Layout> layouts = null;
1010
1011        long plid = ParamUtil.getLong(request, "p_l_id");
1012
1013        if (plid > 0) {
1014            layout = LayoutLocalServiceUtil.getLayout(plid);
1015        }
1016        else {
1017            long groupId = ParamUtil.getLong(request, "groupId");
1018            boolean privateLayout = ParamUtil.getBoolean(
1019                request, "privateLayout");
1020            long layoutId = ParamUtil.getLong(request, "layoutId");
1021
1022            if ((groupId > 0) && layoutId > 0) {
1023                layout = LayoutLocalServiceUtil.getLayout(
1024                    groupId, privateLayout, layoutId);
1025            }
1026        }
1027
1028        if (layout != null) {
1029            try {
1030                if (!signedIn && PropsValues.AUTH_FORWARD_BY_REDIRECT) {
1031                    request.setAttribute(WebKeys.REQUESTED_LAYOUT, layout);
1032                }
1033
1034                boolean isViewableCommunity = isViewableCommunity(
1035                    user, layout.getGroupId(), layout.isPrivateLayout(),
1036                    permissionChecker);
1037
1038                if (!isViewableCommunity) {
1039                    StringBuilder sb = new StringBuilder();
1040
1041                    sb.append("User ");
1042                    sb.append(user.getUserId());
1043                    sb.append(" is not allowed to access the ");
1044                    sb.append(layout.isPrivateLayout() ? "private": "public");
1045                    sb.append(" pages of group ");
1046                    sb.append(layout.getGroupId());
1047
1048                    _log.warn(sb.toString());
1049
1050                    layout = null;
1051                }
1052                else if (isViewableCommunity &&
1053                        !LayoutPermissionUtil.contains(
1054                            permissionChecker, layout, ActionKeys.VIEW)) {
1055
1056                    layout = null;
1057                }
1058                else {
1059                    layouts = LayoutLocalServiceUtil.getLayouts(
1060                        layout.getGroupId(), layout.isPrivateLayout(),
1061                        LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
1062                }
1063            }
1064            catch (NoSuchLayoutException nsle) {
1065            }
1066        }
1067
1068        if (layout == null) {
1069            Object[] defaultLayout = getDefaultLayout(request, user, signedIn);
1070
1071            layout = (Layout)defaultLayout[0];
1072            layouts = (List<Layout>)defaultLayout[1];
1073
1074            request.setAttribute(WebKeys.LAYOUT_DEFAULT, Boolean.TRUE);
1075        }
1076
1077        Object[] viewableLayouts = getViewableLayouts(
1078            request, user, permissionChecker, layout, layouts);
1079
1080        String layoutSetLogo = null;
1081
1082        layout = (Layout)viewableLayouts[0];
1083        layouts = (List<Layout>)viewableLayouts[1];
1084
1085        LayoutTypePortlet layoutTypePortlet = null;
1086
1087        long scopeGroupId = PortalUtil.getScopeGroupId(layout);
1088
1089        rememberVisitedGroupIds(request, scopeGroupId);
1090
1091        layouts = mergeAdditionalLayouts(
1092            request, user, permissionChecker, layout, layouts);
1093
1094        if (layout != null) {
1095            if (company.isCommunityLogo()) {
1096                LayoutSet layoutSet = layout.getLayoutSet();
1097
1098                if (layoutSet.isLogo()) {
1099                    long logoId = layoutSet.getLogoId();
1100
1101                    layoutSetLogo =
1102                        imagePath + "/layout_set_logo?img_id=" + logoId +
1103                            "&t=" + ImageServletTokenUtil.getToken(logoId);
1104
1105                    Image layoutSetLogoImage =
1106                        ImageLocalServiceUtil.getCompanyLogo(logoId);
1107
1108                    companyLogo = layoutSetLogo;
1109                    companyLogoHeight = layoutSetLogoImage.getHeight();
1110                    companyLogoWidth = layoutSetLogoImage.getWidth();
1111                }
1112            }
1113
1114            plid = layout.getPlid();
1115
1116            // Updates to shared layouts are not reflected until the next time
1117            // the user logs in because group layouts are cached in the session
1118
1119            layout = (Layout)((LayoutImpl)layout).clone();
1120
1121            layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
1122
1123            LayoutClone layoutClone = LayoutCloneFactory.getInstance();
1124
1125            if (layoutClone != null) {
1126                String typeSettings = layoutClone.get(request, plid);
1127
1128                if (typeSettings != null) {
1129                    UnicodeProperties props = new UnicodeProperties(true);
1130
1131                    props.load(typeSettings);
1132
1133                    String stateMax = props.getProperty(
1134                        LayoutTypePortletImpl.STATE_MAX);
1135                    String stateMin = props.getProperty(
1136                        LayoutTypePortletImpl.STATE_MIN);
1137                    String modeAbout = props.getProperty(
1138                        LayoutTypePortletImpl.MODE_ABOUT);
1139                    String modeConfig = props.getProperty(
1140                        LayoutTypePortletImpl.MODE_CONFIG);
1141                    String modeEdit = props.getProperty(
1142                        LayoutTypePortletImpl.MODE_EDIT);
1143                    String modeEditDefaults = props.getProperty(
1144                        LayoutTypePortletImpl.MODE_EDIT_DEFAULTS);
1145                    String modeEditGuest = props.getProperty(
1146                        LayoutTypePortletImpl.MODE_EDIT_GUEST);
1147                    String modeHelp = props.getProperty(
1148                        LayoutTypePortletImpl.MODE_HELP);
1149                    String modePreview = props.getProperty(
1150                        LayoutTypePortletImpl.MODE_PREVIEW);
1151                    String modePrint = props.getProperty(
1152                        LayoutTypePortletImpl.MODE_PRINT);
1153
1154                    layoutTypePortlet.setStateMax(stateMax);
1155                    layoutTypePortlet.setStateMin(stateMin);
1156                    layoutTypePortlet.setModeAbout(modeAbout);
1157                    layoutTypePortlet.setModeConfig(modeConfig);
1158                    layoutTypePortlet.setModeEdit(modeEdit);
1159                    layoutTypePortlet.setModeEditDefaults(modeEditDefaults);
1160                    layoutTypePortlet.setModeEditGuest(modeEditGuest);
1161                    layoutTypePortlet.setModeHelp(modeHelp);
1162                    layoutTypePortlet.setModePreview(modePreview);
1163                    layoutTypePortlet.setModePrint(modePrint);
1164                }
1165            }
1166
1167            request.setAttribute(WebKeys.LAYOUT, layout);
1168            request.setAttribute(WebKeys.LAYOUTS, layouts);
1169
1170            if (layout.isPrivateLayout()) {
1171                permissionChecker.setCheckGuest(false);
1172            }
1173        }
1174
1175        // Theme and color scheme
1176
1177        Theme theme = null;
1178        ColorScheme colorScheme = null;
1179
1180        boolean wapTheme = BrowserSnifferUtil.isWap(request);
1181
1182        if (layout != null) {
1183            if (wapTheme) {
1184                theme = layout.getWapTheme();
1185                colorScheme = layout.getWapColorScheme();
1186            }
1187            else {
1188                theme = layout.getTheme();
1189                colorScheme = layout.getColorScheme();
1190            }
1191        }
1192        else {
1193            String themeId = null;
1194            String colorSchemeId = null;
1195
1196            if (wapTheme) {
1197                themeId = ThemeImpl.getDefaultWapThemeId();
1198                colorSchemeId = ColorSchemeImpl.getDefaultWapColorSchemeId();
1199            }
1200            else {
1201                themeId = ThemeImpl.getDefaultRegularThemeId();
1202                colorSchemeId =
1203                    ColorSchemeImpl.getDefaultRegularColorSchemeId();
1204            }
1205
1206            theme = ThemeLocalServiceUtil.getTheme(
1207                companyId, themeId, wapTheme);
1208            colorScheme = ThemeLocalServiceUtil.getColorScheme(
1209                companyId, theme.getThemeId(), colorSchemeId, wapTheme);
1210        }
1211
1212        request.setAttribute(WebKeys.THEME, theme);
1213        request.setAttribute(WebKeys.COLOR_SCHEME, colorScheme);
1214
1215        boolean themeCssFastLoad = ParamUtil.getBoolean(
1216            request, "css_fast_load", PropsValues.THEME_CSS_FAST_LOAD);
1217
1218        boolean themeJsBarebone = PropsValues.JAVASCRIPT_BAREBONE_ENABLED;
1219
1220        if (themeJsBarebone) {
1221            if (signedIn) {
1222                themeJsBarebone = false;
1223            }
1224        }
1225
1226        boolean themeJsFastLoad = ParamUtil.getBoolean(
1227            request, "js_fast_load", PropsValues.JAVASCRIPT_FAST_LOAD);
1228
1229        String lifecycle = ParamUtil.getString(request, "p_p_lifecycle");
1230
1231        String facebookCanvasPageURL = (String)request.getAttribute(
1232            WebKeys.FACEBOOK_CANVAS_PAGE_URL);
1233
1234        boolean widget = false;
1235
1236        Boolean widgetObj = (Boolean)request.getAttribute(WebKeys.WIDGET);
1237
1238        if (widgetObj != null) {
1239            widget = widgetObj.booleanValue();
1240        }
1241
1242        // Theme display
1243
1244        ThemeDisplay themeDisplay = ThemeDisplayFactory.create();
1245
1246        // Set the CDN host, portal URL, and Facebook application ID first
1247        // because other methods (setLookAndFeel) depend on them being set
1248
1249        themeDisplay.setCDNHost(cdnHost);
1250        themeDisplay.setPortalURL(portalURL);
1251        themeDisplay.setFacebookCanvasPageURL(facebookCanvasPageURL);
1252        themeDisplay.setWidget(widget);
1253
1254        themeDisplay.setCompany(company);
1255        themeDisplay.setCompanyLogo(companyLogo);
1256        themeDisplay.setCompanyLogoHeight(companyLogoHeight);
1257        themeDisplay.setCompanyLogoWidth(companyLogoWidth);
1258        themeDisplay.setRealCompanyLogo(realCompanyLogo);
1259        themeDisplay.setRealCompanyLogoHeight(realCompanyLogoHeight);
1260        themeDisplay.setRealCompanyLogoWidth(realCompanyLogoWidth);
1261        themeDisplay.setUser(user);
1262        themeDisplay.setRealUser(realUser);
1263        themeDisplay.setDoAsUserId(doAsUserId);
1264        themeDisplay.setLayoutSetLogo(layoutSetLogo);
1265        themeDisplay.setLayout(layout);
1266        themeDisplay.setLayouts(layouts);
1267        themeDisplay.setPlid(plid);
1268        themeDisplay.setLayoutTypePortlet(layoutTypePortlet);
1269        themeDisplay.setScopeGroupId(scopeGroupId);
1270        themeDisplay.setSignedIn(signedIn);
1271        themeDisplay.setPermissionChecker(permissionChecker);
1272        themeDisplay.setLocale(locale);
1273        themeDisplay.setLanguageId(LocaleUtil.toLanguageId(locale));
1274        themeDisplay.setI18nLanguageId(i18nLanguageId);
1275        themeDisplay.setTimeZone(timeZone);
1276        themeDisplay.setLookAndFeel(contextPath, theme, colorScheme);
1277        themeDisplay.setThemeCssFastLoad(themeCssFastLoad);
1278        themeDisplay.setThemeJsBarebone(themeJsBarebone);
1279        themeDisplay.setThemeJsFastLoad(themeJsFastLoad);
1280        themeDisplay.setServerName(request.getServerName());
1281        themeDisplay.setServerPort(request.getServerPort());
1282        themeDisplay.setSecure(request.isSecure());
1283        themeDisplay.setLifecycle(lifecycle);
1284        themeDisplay.setLifecycleAction(lifecycle.equals("1"));
1285        themeDisplay.setLifecycleRender(lifecycle.equals("0"));
1286        themeDisplay.setLifecycleResource(lifecycle.equals("2"));
1287        themeDisplay.setStateExclusive(LiferayWindowState.isExclusive(request));
1288        themeDisplay.setStateMaximized(LiferayWindowState.isMaximized(request));
1289        themeDisplay.setStatePopUp(LiferayWindowState.isPopUp(request));
1290        themeDisplay.setPathApplet(contextPath + "/applets");
1291        themeDisplay.setPathCms(contextPath + "/cms");
1292        themeDisplay.setPathContext(contextPath);
1293        themeDisplay.setPathFlash(contextPath + "/flash");
1294        themeDisplay.setPathFriendlyURLPrivateGroup(
1295            friendlyURLPrivateGroupPath);
1296        themeDisplay.setPathFriendlyURLPrivateUser(friendlyURLPrivateUserPath);
1297        themeDisplay.setPathFriendlyURLPublic(friendlyURLPublicPath);
1298        themeDisplay.setPathImage(imagePath);
1299        themeDisplay.setPathJavaScript(cdnHost + contextPath + "/html/js");
1300        themeDisplay.setPathMain(mainPath);
1301        themeDisplay.setPathSound(contextPath + "/html/sound");
1302
1303        // URLs
1304
1305        themeDisplay.setShowAddContentIcon(false);
1306        themeDisplay.setShowHomeIcon(true);
1307        themeDisplay.setShowMyAccountIcon(signedIn);
1308        themeDisplay.setShowPageSettingsIcon(false);
1309        themeDisplay.setShowPortalIcon(true);
1310        themeDisplay.setShowSignInIcon(!signedIn);
1311        themeDisplay.setShowSignOutIcon(signedIn);
1312        themeDisplay.setShowStagingIcon(false);
1313
1314        PortletURL createAccountURL = new PortletURLImpl(
1315            request, PortletKeys.LOGIN, plid, PortletRequest.ACTION_PHASE);
1316
1317        createAccountURL.setWindowState(WindowState.MAXIMIZED);
1318        createAccountURL.setPortletMode(PortletMode.VIEW);
1319
1320        createAccountURL.setParameter("saveLastPath", "0");
1321        createAccountURL.setParameter(
1322            "struts_action", "/login/create_account");
1323
1324        themeDisplay.setURLCreateAccount(createAccountURL);
1325
1326        String currentURL = PortalUtil.getCurrentURL(request);
1327
1328        themeDisplay.setURLCurrent(currentURL);
1329
1330        String urlHome = portalURL + contextPath;
1331
1332        themeDisplay.setURLHome(urlHome);
1333
1334        if (layout != null) {
1335            Group group = layout.getGroup();
1336
1337            if (layout.getType().equals(LayoutConstants.TYPE_PORTLET)) {
1338                boolean freeformLayout =
1339                    layoutTypePortlet.getLayoutTemplateId().equals(
1340                        "freeform");
1341
1342                themeDisplay.setFreeformLayout(freeformLayout);
1343
1344                boolean hasUpdateLayoutPermission =
1345                    LayoutPermissionUtil.contains(
1346                        permissionChecker, layout, ActionKeys.UPDATE);
1347
1348                if (hasUpdateLayoutPermission) {
1349                    if (!LiferayWindowState.isMaximized(request)) {
1350                        themeDisplay.setShowAddContentIcon(true);
1351                    }
1352
1353                    themeDisplay.setShowLayoutTemplatesIcon(true);
1354
1355                    themeDisplay.setURLAddContent(
1356                        "LayoutConfiguration.toggle('" +
1357                            PortletKeys.LAYOUT_CONFIGURATION + "');");
1358
1359                    themeDisplay.setURLLayoutTemplates(
1360                        "Liferay.Layout.showTemplates();");
1361                }
1362            }
1363
1364            boolean hasManageLayoutsPermission =
1365                GroupPermissionUtil.contains(
1366                    permissionChecker, scopeGroupId, ActionKeys.MANAGE_LAYOUTS);
1367
1368            if (group.isUser()) {
1369                if ((layout.isPrivateLayout() &&
1370                     !PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE) ||
1371                    (layout.isPublicLayout() &&
1372                     !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE)) {
1373
1374                    hasManageLayoutsPermission = false;
1375                }
1376            }
1377
1378            if (hasManageLayoutsPermission) {
1379                themeDisplay.setShowPageSettingsIcon(true);
1380
1381                PortletURL pageSettingsURL = new PortletURLImpl(
1382                    request, PortletKeys.LAYOUT_MANAGEMENT, plid,
1383                    PortletRequest.RENDER_PHASE);
1384
1385                pageSettingsURL.setWindowState(WindowState.MAXIMIZED);
1386                pageSettingsURL.setPortletMode(PortletMode.VIEW);
1387
1388                pageSettingsURL.setParameter(
1389                    "struts_action", "/layout_management/edit_pages");
1390
1391                if (layout.isPrivateLayout()) {
1392                    pageSettingsURL.setParameter("tabs1", "private-pages");
1393                }
1394                else {
1395                    pageSettingsURL.setParameter("tabs1", "public-pages");
1396                }
1397
1398                pageSettingsURL.setParameter("redirect", currentURL);
1399                pageSettingsURL.setParameter(
1400                    "groupId", String.valueOf(scopeGroupId));
1401                pageSettingsURL.setParameter("selPlid", String.valueOf(plid));
1402
1403                themeDisplay.setURLPageSettings(pageSettingsURL);
1404
1405                PortletURL publishToLiveURL = new PortletURLImpl(
1406                    request, PortletKeys.LAYOUT_MANAGEMENT, plid,
1407                    PortletRequest.RENDER_PHASE);
1408
1409                publishToLiveURL.setWindowState(LiferayWindowState.EXCLUSIVE);
1410                publishToLiveURL.setPortletMode(PortletMode.VIEW);
1411
1412                publishToLiveURL.setParameter(
1413                    "struts_action", "/layout_management/export_pages");
1414
1415                if (layout.isPrivateLayout()) {
1416                    publishToLiveURL.setParameter("tabs1", "private-pages");
1417                }
1418                else {
1419                    publishToLiveURL.setParameter("tabs1", "public-pages");
1420                }
1421
1422                publishToLiveURL.setParameter("pagesRedirect", currentURL);
1423                publishToLiveURL.setParameter(
1424                    "groupId", String.valueOf(scopeGroupId));
1425                publishToLiveURL.setParameter("selPlid", String.valueOf(plid));
1426
1427                themeDisplay.setURLPublishToLive(publishToLiveURL);
1428            }
1429
1430            if (group.hasStagingGroup() && !group.isStagingGroup()) {
1431                themeDisplay.setShowAddContentIcon(false);
1432                themeDisplay.setShowLayoutTemplatesIcon(false);
1433                themeDisplay.setShowPageSettingsIcon(false);
1434                themeDisplay.setURLPublishToLive(null);
1435            }
1436
1437            // LEP-4987
1438
1439            if (group.hasStagingGroup() || group.isStagingGroup()) {
1440                boolean hasApproveProposalPermission =
1441                    GroupPermissionUtil.contains(
1442                        permissionChecker, scopeGroupId,
1443                        ActionKeys.APPROVE_PROPOSAL);
1444
1445                if (hasManageLayoutsPermission) {
1446                    themeDisplay.setShowStagingIcon(true);
1447                }
1448                else if (hasApproveProposalPermission) {
1449                    themeDisplay.setShowStagingIcon(true);
1450                }
1451            }
1452
1453            String myAccountNamespace = PortalUtil.getPortletNamespace(
1454                PortletKeys.MY_ACCOUNT);
1455
1456            String myAccountRedirect = ParamUtil.getString(
1457                request, myAccountNamespace + "backURL", currentURL);
1458
1459            PortletURL myAccountURL = new PortletURLImpl(
1460                request, PortletKeys.MY_ACCOUNT, plid,
1461                PortletRequest.RENDER_PHASE);
1462
1463            myAccountURL.setWindowState(WindowState.MAXIMIZED);
1464            myAccountURL.setPortletMode(PortletMode.VIEW);
1465
1466            myAccountURL.setParameter("struts_action", "/my_account/edit_user");
1467            myAccountURL.setParameter("backURL", myAccountRedirect);
1468
1469            themeDisplay.setURLMyAccount(myAccountURL);
1470        }
1471
1472        if ((!user.isActive()) ||
1473            (PropsValues.TERMS_OF_USE_REQUIRED &&
1474             !user.isAgreedToTermsOfUse())) {
1475
1476            themeDisplay.setShowAddContentIcon(false);
1477            themeDisplay.setShowMyAccountIcon(false);
1478            themeDisplay.setShowPageSettingsIcon(false);
1479        }
1480
1481        themeDisplay.setURLPortal(themeDisplay.getURLHome());
1482
1483        String urlSignIn = mainPath + "/portal/login";
1484
1485        if (layout != null) {
1486            urlSignIn = HttpUtil.addParameter(
1487                urlSignIn, "p_l_id", layout.getPlid());
1488        }
1489
1490        themeDisplay.setURLSignIn(urlSignIn);
1491
1492        themeDisplay.setURLSignOut(mainPath + "/portal/logout");
1493
1494        PortletURL updateManagerURL = new PortletURLImpl(
1495            request, PortletKeys.UPDATE_MANAGER, plid,
1496            PortletRequest.RENDER_PHASE);
1497
1498        updateManagerURL.setWindowState(WindowState.MAXIMIZED);
1499        updateManagerURL.setPortletMode(PortletMode.VIEW);
1500
1501        updateManagerURL.setParameter("struts_action", "/update_manager/view");
1502
1503        themeDisplay.setURLUpdateManager(updateManagerURL);
1504
1505        request.setAttribute(WebKeys.THEME_DISPLAY, themeDisplay);
1506
1507        // Parallel render
1508
1509        boolean parallelRenderEnable = true;
1510
1511        if (layout != null) {
1512            if (layoutTypePortlet.getPortletIds().size() == 1) {
1513                parallelRenderEnable = false;
1514            }
1515        }
1516
1517        Boolean parallelRenderEnableObj = Boolean.valueOf(ParamUtil.getBoolean(
1518            request, "p_p_parallel", parallelRenderEnable));
1519
1520        request.setAttribute(
1521            WebKeys.PORTLET_PARALLEL_RENDER, parallelRenderEnableObj);
1522    }
1523
1524    protected void updateUserLayouts(User user) throws Exception {
1525
1526        // Private layouts
1527
1528        boolean addDefaultUserPrivateLayouts = false;
1529
1530        if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED &&
1531            PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_AUTO_CREATE) {
1532
1533            addDefaultUserPrivateLayouts = true;
1534
1535            if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
1536                Role powerUserRole = RoleLocalServiceUtil.getRole(
1537                    user.getCompanyId(), RoleConstants.POWER_USER);
1538
1539                if (!UserLocalServiceUtil.hasRoleUser(
1540                        powerUserRole.getRoleId(), user.getUserId())) {
1541
1542                    addDefaultUserPrivateLayouts = false;
1543                }
1544            }
1545        }
1546
1547        if (addDefaultUserPrivateLayouts && !user.hasPrivateLayouts()) {
1548            addDefaultUserPrivateLayouts(user);
1549        }
1550
1551        boolean deleteDefaultUserPrivateLayouts = false;
1552
1553        if (!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) {
1554            deleteDefaultUserPrivateLayouts = true;
1555        }
1556        else if (PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED) {
1557            Role powerUserRole = RoleLocalServiceUtil.getRole(
1558                user.getCompanyId(), RoleConstants.POWER_USER);
1559
1560            if (!UserLocalServiceUtil.hasRoleUser(
1561                    powerUserRole.getRoleId(), user.getUserId())) {
1562
1563                deleteDefaultUserPrivateLayouts = true;
1564            }
1565        }
1566
1567        if (deleteDefaultUserPrivateLayouts && user.hasPrivateLayouts()) {
1568            deleteDefaultUserPrivateLayouts(user);
1569        }
1570
1571        // Public pages
1572
1573        boolean addDefaultUserPublicLayouts = false;
1574
1575        if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED &&
1576            PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_AUTO_CREATE) {
1577
1578            addDefaultUserPublicLayouts = true;
1579
1580            if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
1581                Role powerUserRole = RoleLocalServiceUtil.getRole(
1582                    user.getCompanyId(), RoleConstants.POWER_USER);
1583
1584                if (!UserLocalServiceUtil.hasRoleUser(
1585                        powerUserRole.getRoleId(), user.getUserId())) {
1586
1587                    addDefaultUserPublicLayouts = false;
1588                }
1589            }
1590        }
1591
1592        if (addDefaultUserPublicLayouts && !user.hasPublicLayouts()) {
1593            addDefaultUserPublicLayouts(user);
1594        }
1595
1596        boolean deleteDefaultUserPublicLayouts = false;
1597
1598        if (!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
1599            deleteDefaultUserPublicLayouts = true;
1600        }
1601        else if (PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED) {
1602            Role powerUserRole = RoleLocalServiceUtil.getRole(
1603                user.getCompanyId(), RoleConstants.POWER_USER);
1604
1605            if (!UserLocalServiceUtil.hasRoleUser(
1606                    powerUserRole.getRoleId(), user.getUserId())) {
1607
1608                deleteDefaultUserPublicLayouts = true;
1609            }
1610        }
1611
1612        if (deleteDefaultUserPublicLayouts && user.hasPublicLayouts()) {
1613            deleteDefaultUserPublicLayouts(user);
1614        }
1615    }
1616
1617    protected File privateLARFile;
1618    protected File publicLARFile;
1619
1620    private static final String _PATH_PORTAL_LAYOUT = "/portal/layout";
1621
1622    private static Log _log = LogFactory.getLog(ServicePreAction.class);
1623
1624}