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