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