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