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