001
014
015 package com.liferay.portal.model.impl;
016
017 import com.liferay.portal.kernel.exception.LayoutFriendlyURLException;
018 import com.liferay.portal.kernel.exception.NoSuchGroupException;
019 import com.liferay.portal.kernel.exception.PortalException;
020 import com.liferay.portal.kernel.exception.SystemException;
021 import com.liferay.portal.kernel.language.LanguageUtil;
022 import com.liferay.portal.kernel.log.Log;
023 import com.liferay.portal.kernel.log.LogFactoryUtil;
024 import com.liferay.portal.kernel.model.ColorScheme;
025 import com.liferay.portal.kernel.model.Group;
026 import com.liferay.portal.kernel.model.GroupConstants;
027 import com.liferay.portal.kernel.model.Layout;
028 import com.liferay.portal.kernel.model.LayoutConstants;
029 import com.liferay.portal.kernel.model.LayoutFriendlyURL;
030 import com.liferay.portal.kernel.model.LayoutSet;
031 import com.liferay.portal.kernel.model.LayoutType;
032 import com.liferay.portal.kernel.model.LayoutTypeController;
033 import com.liferay.portal.kernel.model.LayoutTypePortlet;
034 import com.liferay.portal.kernel.model.LayoutTypePortletConstants;
035 import com.liferay.portal.kernel.model.Portlet;
036 import com.liferay.portal.kernel.model.PortletPreferences;
037 import com.liferay.portal.kernel.model.Theme;
038 import com.liferay.portal.kernel.portlet.PortalPreferences;
039 import com.liferay.portal.kernel.security.permission.ActionKeys;
040 import com.liferay.portal.kernel.security.permission.PermissionChecker;
041 import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
042 import com.liferay.portal.kernel.service.LayoutFriendlyURLLocalServiceUtil;
043 import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
044 import com.liferay.portal.kernel.service.LayoutSetLocalServiceUtil;
045 import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
046 import com.liferay.portal.kernel.service.PortletPreferencesLocalServiceUtil;
047 import com.liferay.portal.kernel.service.ThemeLocalServiceUtil;
048 import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil;
049 import com.liferay.portal.kernel.theme.ThemeDisplay;
050 import com.liferay.portal.kernel.util.ArrayUtil;
051 import com.liferay.portal.kernel.util.CharPool;
052 import com.liferay.portal.kernel.util.CookieKeys;
053 import com.liferay.portal.kernel.util.GetterUtil;
054 import com.liferay.portal.kernel.util.HttpUtil;
055 import com.liferay.portal.kernel.util.LayoutTypePortletFactoryUtil;
056 import com.liferay.portal.kernel.util.ListUtil;
057 import com.liferay.portal.kernel.util.LocaleUtil;
058 import com.liferay.portal.kernel.util.LocalizationUtil;
059 import com.liferay.portal.kernel.util.PortalUtil;
060 import com.liferay.portal.kernel.util.PortletKeys;
061 import com.liferay.portal.kernel.util.PropsKeys;
062 import com.liferay.portal.kernel.util.StringPool;
063 import com.liferay.portal.kernel.util.StringUtil;
064 import com.liferay.portal.kernel.util.UnicodeProperties;
065 import com.liferay.portal.kernel.util.Validator;
066 import com.liferay.portal.kernel.util.WebKeys;
067 import com.liferay.portal.util.LayoutClone;
068 import com.liferay.portal.util.LayoutCloneFactory;
069 import com.liferay.portal.util.PropsValues;
070 import com.liferay.portlet.PortletURLImpl;
071
072 import java.io.IOException;
073
074 import java.util.ArrayList;
075 import java.util.Collections;
076 import java.util.HashMap;
077 import java.util.Iterator;
078 import java.util.List;
079 import java.util.Locale;
080 import java.util.Map;
081
082 import javax.portlet.PortletException;
083 import javax.portlet.PortletMode;
084 import javax.portlet.PortletRequest;
085 import javax.portlet.WindowState;
086
087 import javax.servlet.http.HttpServletRequest;
088 import javax.servlet.http.HttpServletResponse;
089 import javax.servlet.http.HttpSession;
090
091
104 public class LayoutImpl extends LayoutBaseImpl {
105
106 public static boolean hasFriendlyURLKeyword(String friendlyURL) {
107 String keyword = _getFriendlyURLKeyword(friendlyURL);
108
109 if (Validator.isNotNull(keyword)) {
110 return true;
111 }
112
113 return false;
114 }
115
116 public static int validateFriendlyURL(String friendlyURL) {
117 return validateFriendlyURL(friendlyURL, true);
118 }
119
120
131 public static int validateFriendlyURL(
132 String friendlyURL, boolean checkMaxLength) {
133
134 if (friendlyURL.length() < 2) {
135 return LayoutFriendlyURLException.TOO_SHORT;
136 }
137
138 if (checkMaxLength &&
139 (friendlyURL.length() > LayoutConstants.FRIENDLY_URL_MAX_LENGTH)) {
140
141 return LayoutFriendlyURLException.TOO_LONG;
142 }
143
144 if (!friendlyURL.startsWith(StringPool.SLASH)) {
145 return LayoutFriendlyURLException.DOES_NOT_START_WITH_SLASH;
146 }
147
148 if (friendlyURL.endsWith(StringPool.SLASH)) {
149 return LayoutFriendlyURLException.ENDS_WITH_SLASH;
150 }
151
152 if (friendlyURL.contains(StringPool.DOUBLE_SLASH)) {
153 return LayoutFriendlyURLException.ADJACENT_SLASHES;
154 }
155
156 for (char c : friendlyURL.toCharArray()) {
157 if (!Validator.isChar(c) && !Validator.isDigit(c) &&
158 (c != CharPool.DASH) && (c != CharPool.PERCENT) &&
159 (c != CharPool.PERIOD) && (c != CharPool.PLUS) &&
160 (c != CharPool.SLASH) && (c != CharPool.STAR) &&
161 (c != CharPool.UNDERLINE)) {
162
163 return LayoutFriendlyURLException.INVALID_CHARACTERS;
164 }
165 }
166
167 return -1;
168 }
169
170 public static void validateFriendlyURLKeyword(String friendlyURL)
171 throws LayoutFriendlyURLException {
172
173 String keyword = _getFriendlyURLKeyword(friendlyURL);
174
175 if (Validator.isNotNull(keyword)) {
176 LayoutFriendlyURLException lfurle = new LayoutFriendlyURLException(
177 LayoutFriendlyURLException.KEYWORD_CONFLICT);
178
179 lfurle.setKeywordConflict(keyword);
180
181 throw lfurle;
182 }
183 }
184
185
192 @Override
193 public List<Layout> getAllChildren() {
194 List<Layout> layouts = new ArrayList<>();
195
196 for (Layout layout : getChildren()) {
197 layouts.add(layout);
198 layouts.addAll(layout.getAllChildren());
199 }
200
201 return layouts;
202 }
203
204
210 @Override
211 public long getAncestorLayoutId() throws PortalException {
212 long layoutId = 0;
213
214 Layout layout = this;
215
216 while (true) {
217 if (!layout.isRootLayout()) {
218 layout = LayoutLocalServiceUtil.getLayout(
219 layout.getGroupId(), layout.isPrivateLayout(),
220 layout.getParentLayoutId());
221 }
222 else {
223 layoutId = layout.getLayoutId();
224
225 break;
226 }
227 }
228
229 return layoutId;
230 }
231
232
238 @Override
239 public long getAncestorPlid() throws PortalException {
240 long plid = 0;
241
242 Layout layout = this;
243
244 while (true) {
245 if (!layout.isRootLayout()) {
246 layout = LayoutLocalServiceUtil.getLayout(
247 layout.getGroupId(), layout.isPrivateLayout(),
248 layout.getParentLayoutId());
249 }
250 else {
251 plid = layout.getPlid();
252
253 break;
254 }
255 }
256
257 return plid;
258 }
259
260
267 @Override
268 public List<Layout> getAncestors() throws PortalException {
269 List<Layout> layouts = new ArrayList<>();
270
271 Layout layout = this;
272
273 while (!layout.isRootLayout()) {
274 layout = LayoutLocalServiceUtil.getLayout(
275 layout.getGroupId(), layout.isPrivateLayout(),
276 layout.getParentLayoutId());
277
278 layouts.add(layout);
279 }
280
281 return layouts;
282 }
283
284
290 @Override
291 public List<Layout> getChildren() {
292 return LayoutLocalServiceUtil.getLayouts(
293 getGroupId(), isPrivateLayout(), getLayoutId());
294 }
295
296
304 @Override
305 public List<Layout> getChildren(PermissionChecker permissionChecker)
306 throws PortalException {
307
308 List<Layout> layouts = ListUtil.copy(getChildren());
309
310 Iterator<Layout> itr = layouts.iterator();
311
312 while (itr.hasNext()) {
313 Layout layout = itr.next();
314
315 if (layout.isHidden() ||
316 !LayoutPermissionUtil.contains(
317 permissionChecker, layout, ActionKeys.VIEW)) {
318
319 itr.remove();
320 }
321 }
322
323 return layouts;
324 }
325
326
335 @Override
336 public ColorScheme getColorScheme() throws PortalException {
337 if (isInheritLookAndFeel()) {
338 LayoutSet layoutSet = getLayoutSet();
339
340 return layoutSet.getColorScheme();
341 }
342 else {
343 Theme theme = getTheme();
344
345 return ThemeLocalServiceUtil.getColorScheme(
346 getCompanyId(), theme.getThemeId(), getColorSchemeId());
347 }
348 }
349
350
362 @Override
363 public String getCssText() throws PortalException {
364 if (isInheritLookAndFeel()) {
365 LayoutSet layoutSet = getLayoutSet();
366
367 return layoutSet.getCss();
368 }
369 else {
370 return getCss();
371 }
372 }
373
374 @Override
375 public String getDefaultThemeSetting(
376 String key, String device, boolean inheritLookAndFeel) {
377
378 if (!inheritLookAndFeel) {
379 try {
380 Theme theme = getTheme();
381
382 return theme.getSetting(key);
383 }
384 catch (Exception e) {
385 }
386 }
387
388 try {
389 LayoutSet layoutSet = getLayoutSet();
390
391 return layoutSet.getThemeSetting(key, device);
392 }
393 catch (Exception e) {
394 }
395
396 return StringPool.BLANK;
397 }
398
399 @Override
400 public List<Portlet> getEmbeddedPortlets() {
401 return getEmbeddedPortlets(getGroupId());
402 }
403
404 @Override
405 public List<Portlet> getEmbeddedPortlets(long groupId) {
406 List<PortletPreferences> portletPreferences = _getPortletPreferences(
407 groupId);
408
409 if (portletPreferences.isEmpty()) {
410 return Collections.emptyList();
411 }
412
413 List<Portlet> portlets = new ArrayList<>(portletPreferences.size());
414
415 for (PortletPreferences portletPreference : portletPreferences) {
416 String portletId = portletPreference.getPortletId();
417
418 Portlet portlet = PortletLocalServiceUtil.getPortletById(
419 getCompanyId(), portletId);
420
421 if ((portlet == null) || !portlet.isReady() ||
422 portlet.isUndeployedPortlet() || !portlet.isActive()) {
423
424 continue;
425 }
426
427 Portlet embeddedPortlet = portlet;
428
429 if (portlet.isInstanceable()) {
430
431
432
433
434
435
436 }
437 else {
438 embeddedPortlet = (Portlet)embeddedPortlet.clone();
439 }
440
441
442
443
444 embeddedPortlet.setStatic(true);
445
446 portlets.add(embeddedPortlet);
447 }
448
449 return portlets;
450 }
451
452
458 @Override
459 public String getFriendlyURL(Locale locale) {
460 Layout layout = this;
461
462 String friendlyURL = layout.getFriendlyURL();
463
464 try {
465 Group group = layout.getGroup();
466
467 UnicodeProperties typeSettingsProperties =
468 group.getTypeSettingsProperties();
469
470 if (!GetterUtil.getBoolean(
471 typeSettingsProperties.getProperty(
472 GroupConstants.TYPE_SETTINGS_KEY_INHERIT_LOCALES),
473 true)) {
474
475 String[] locales = StringUtil.split(
476 typeSettingsProperties.getProperty(PropsKeys.LOCALES));
477
478 if (!ArrayUtil.contains(
479 locales, LanguageUtil.getLanguageId(locale))) {
480
481 return friendlyURL;
482 }
483 }
484
485 LayoutFriendlyURL layoutFriendlyURL =
486 LayoutFriendlyURLLocalServiceUtil.getLayoutFriendlyURL(
487 layout.getPlid(), LocaleUtil.toLanguageId(locale));
488
489 friendlyURL = layoutFriendlyURL.getFriendlyURL();
490 }
491 catch (Exception e) {
492 }
493
494 return friendlyURL;
495 }
496
497
502 @Override
503 public Map<Locale, String> getFriendlyURLMap() {
504 Map<Locale, String> friendlyURLMap = new HashMap<>();
505
506 List<LayoutFriendlyURL> layoutFriendlyURLs =
507 LayoutFriendlyURLLocalServiceUtil.getLayoutFriendlyURLs(getPlid());
508
509 for (LayoutFriendlyURL layoutFriendlyURL : layoutFriendlyURLs) {
510 friendlyURLMap.put(
511 LocaleUtil.fromLanguageId(layoutFriendlyURL.getLanguageId()),
512 layoutFriendlyURL.getFriendlyURL());
513 }
514
515
516
517
518
519 Locale defaultSiteLocale = LocaleUtil.getSiteDefault();
520
521 if (Validator.isNull(friendlyURLMap.get(defaultSiteLocale))) {
522 Locale defaultLocale = LocaleUtil.fromLanguageId(
523 getDefaultLanguageId());
524
525 String defaultFriendlyURL = friendlyURLMap.get(defaultLocale);
526
527 friendlyURLMap.put(defaultSiteLocale, defaultFriendlyURL);
528 }
529
530 return friendlyURLMap;
531 }
532
533 @Override
534 public String getFriendlyURLsXML() {
535 Map<Locale, String> friendlyURLMap = getFriendlyURLMap();
536
537 return LocalizationUtil.updateLocalization(
538 friendlyURLMap, StringPool.BLANK, "FriendlyURL",
539 LocaleUtil.toLanguageId(LocaleUtil.getSiteDefault()));
540 }
541
542
551 @Override
552 public Group getGroup() throws PortalException {
553 return GroupLocalServiceUtil.getGroup(getGroupId());
554 }
555
556
566 @Override
567 public String getHTMLTitle(Locale locale) {
568 String localeLanguageId = LocaleUtil.toLanguageId(locale);
569
570 return getHTMLTitle(localeLanguageId);
571 }
572
573
582 @Override
583 public String getHTMLTitle(String localeLanguageId) {
584 String htmlTitle = getTitle(localeLanguageId);
585
586 if (Validator.isNull(htmlTitle)) {
587 htmlTitle = getName(localeLanguageId);
588 }
589
590 return htmlTitle;
591 }
592
593
599 @Override
600 public boolean getIconImage() {
601 if (getIconImageId() > 0) {
602 return true;
603 }
604
605 return false;
606 }
607
608
613 @Override
614 public LayoutSet getLayoutSet() throws PortalException {
615 if (_layoutSet == null) {
616 _layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
617 getGroupId(), isPrivateLayout());
618 }
619
620 return _layoutSet;
621 }
622
623
628 @Override
629 public LayoutType getLayoutType() {
630 if (_layoutType == null) {
631 _layoutType = LayoutTypePortletFactoryUtil.create(this);
632 }
633
634 return _layoutType;
635 }
636
637
643 @Override
644 public Layout getLinkedToLayout() {
645 long linkToLayoutId = GetterUtil.getLong(
646 getTypeSettingsProperty("linkToLayoutId"));
647
648 if (linkToLayoutId <= 0) {
649 return null;
650 }
651
652 return LayoutLocalServiceUtil.fetchLayout(
653 getGroupId(), isPrivateLayout(), linkToLayoutId);
654 }
655
656
662 @Override
663 public long getParentPlid() throws PortalException {
664 if (getParentLayoutId() == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
665 return 0;
666 }
667
668 Layout layout = LayoutLocalServiceUtil.getLayout(
669 getGroupId(), isPrivateLayout(), getParentLayoutId());
670
671 return layout.getPlid();
672 }
673
674 @Override
675 public String getRegularURL(HttpServletRequest request)
676 throws PortalException {
677
678 return _getURL(request, false, false);
679 }
680
681 @Override
682 public String getResetLayoutURL(HttpServletRequest request)
683 throws PortalException {
684
685 return _getURL(request, true, true);
686 }
687
688 @Override
689 public String getResetMaxStateURL(HttpServletRequest request)
690 throws PortalException {
691
692 return _getURL(request, true, false);
693 }
694
695 @Override
696 public Group getScopeGroup() throws PortalException {
697 Group group = null;
698
699 try {
700 group = GroupLocalServiceUtil.getLayoutGroup(
701 getCompanyId(), getPlid());
702 }
703 catch (NoSuchGroupException nsge) {
704 }
705
706 return group;
707 }
708
709 @Override
710 public String getTarget() {
711 return PortalUtil.getLayoutTarget(this);
712 }
713
714
721 @Override
722 public Theme getTheme() throws PortalException {
723 if (isInheritLookAndFeel()) {
724 LayoutSet layoutSet = getLayoutSet();
725
726 return layoutSet.getTheme();
727 }
728 else {
729 return ThemeLocalServiceUtil.getTheme(getCompanyId(), getThemeId());
730 }
731 }
732
733 @Override
734 public String getThemeSetting(String key, String device) {
735 return getThemeSetting(key, device, isInheritLookAndFeel());
736 }
737
738 @Override
739 public String getThemeSetting(
740 String key, String device, boolean inheritLookAndFeel) {
741
742 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
743
744 String value = typeSettingsProperties.getProperty(
745 ThemeSettingImpl.namespaceProperty(device, key));
746
747 if (value != null) {
748 return value;
749 }
750
751 return getDefaultThemeSetting(key, device, inheritLookAndFeel);
752 }
753
754 @Override
755 public String getTypeSettings() {
756 if (_typeSettingsProperties == null) {
757 return super.getTypeSettings();
758 }
759 else {
760 return _typeSettingsProperties.toString();
761 }
762 }
763
764 @Override
765 public UnicodeProperties getTypeSettingsProperties() {
766 if (_typeSettingsProperties == null) {
767 _typeSettingsProperties = new UnicodeProperties(true);
768
769 _typeSettingsProperties.fastLoad(super.getTypeSettings());
770 }
771
772 return _typeSettingsProperties;
773 }
774
775 @Override
776 public String getTypeSettingsProperty(String key) {
777 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
778
779 return typeSettingsProperties.getProperty(key);
780 }
781
782 @Override
783 public String getTypeSettingsProperty(String key, String defaultValue) {
784 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
785
786 return typeSettingsProperties.getProperty(key, defaultValue);
787 }
788
789
799 @Override
800 public boolean hasAncestor(long layoutId) throws PortalException {
801 long parentLayoutId = getParentLayoutId();
802
803 while (parentLayoutId != LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
804 if (parentLayoutId == layoutId) {
805 return true;
806 }
807
808 Layout parentLayout = LayoutLocalServiceUtil.getLayout(
809 getGroupId(), isPrivateLayout(), parentLayoutId);
810
811 parentLayoutId = parentLayout.getParentLayoutId();
812 }
813
814 return false;
815 }
816
817
823 @Override
824 public boolean hasChildren() {
825 return LayoutLocalServiceUtil.hasLayouts(
826 getGroupId(), isPrivateLayout(), getLayoutId());
827 }
828
829 @Override
830 public boolean hasScopeGroup() throws PortalException {
831 Group group = getScopeGroup();
832
833 if (group != null) {
834 return true;
835 }
836 else {
837 return false;
838 }
839 }
840
841 @Override
842 public boolean hasSetModifiedDate() {
843 return true;
844 }
845
846 @Override
847 public boolean includeLayoutContent(
848 HttpServletRequest request, HttpServletResponse response)
849 throws Exception {
850
851 LayoutType layoutType = getLayoutType();
852
853 LayoutTypeController layoutTypeController =
854 layoutType.getLayoutTypeController();
855
856 return layoutTypeController.includeLayoutContent(
857 request, response, this);
858 }
859
860 @Override
861 public boolean isChildSelected(boolean selectable, Layout layout)
862 throws PortalException {
863
864 if (selectable) {
865 long plid = getPlid();
866
867 List<Layout> ancestors = layout.getAncestors();
868
869 for (Layout curLayout : ancestors) {
870 if (plid == curLayout.getPlid()) {
871 return true;
872 }
873 }
874 }
875
876 return false;
877 }
878
879
891 @Override
892 public boolean isContentDisplayPage() {
893 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
894
895 String defaultAssetPublisherPortletId =
896 typeSettingsProperties.getProperty(
897 LayoutTypePortletConstants.DEFAULT_ASSET_PUBLISHER_PORTLET_ID);
898
899 if (Validator.isNotNull(defaultAssetPublisherPortletId)) {
900 return true;
901 }
902
903 return false;
904 }
905
906 @Override
907 public boolean isCustomizable() {
908 if (!isTypePortlet()) {
909 return false;
910 }
911
912 if (GetterUtil.getBoolean(
913 getTypeSettingsProperty(LayoutConstants.CUSTOMIZABLE_LAYOUT))) {
914
915 return true;
916 }
917
918 LayoutTypePortlet layoutTypePortlet =
919 (LayoutTypePortlet)getLayoutType();
920
921 if (layoutTypePortlet.isCustomizable()) {
922 return true;
923 }
924
925 return false;
926 }
927
928
936 @Override
937 public boolean isFirstChild() {
938 if (getPriority() == 0) {
939 return true;
940 }
941
942 return false;
943 }
944
945
952 @Override
953 public boolean isFirstParent() {
954 if (isFirstChild() && isRootLayout()) {
955 return true;
956 }
957
958 return false;
959 }
960
961 @Override
962 public boolean isIconImage() {
963 return getIconImage();
964 }
965
966
973 @Override
974 public boolean isInheritLookAndFeel() {
975 if (Validator.isNull(getThemeId()) ||
976 Validator.isNull(getColorSchemeId())) {
977
978 return true;
979 }
980
981 return false;
982 }
983
984
992 @Override
993 public boolean isLayoutPrototypeLinkActive() {
994 if (isLayoutPrototypeLinkEnabled() &&
995 Validator.isNotNull(getLayoutPrototypeUuid())) {
996
997 return true;
998 }
999
1000 return false;
1001 }
1002
1003 @Override
1004 public boolean isPortletEmbedded(String portletId, long groupId) {
1005 List<PortletPreferences> portletPreferences = _getPortletPreferences(
1006 groupId);
1007
1008 if (portletPreferences.isEmpty()) {
1009 return false;
1010 }
1011
1012 for (PortletPreferences portletPreference : portletPreferences) {
1013 String currentPortletId = portletPreference.getPortletId();
1014
1015 if (!portletId.equals(currentPortletId)) {
1016 continue;
1017 }
1018
1019 Portlet portlet = PortletLocalServiceUtil.getPortletById(
1020 getCompanyId(), currentPortletId);
1021
1022 if ((portlet != null) && portlet.isReady() &&
1023 !portlet.isUndeployedPortlet() && portlet.isActive()) {
1024
1025 return true;
1026 }
1027 }
1028
1029 return false;
1030 }
1031
1032
1044 @Override
1045 public boolean isPublicLayout() {
1046 return !isPrivateLayout();
1047 }
1048
1049
1055 @Override
1056 public boolean isRootLayout() {
1057 if (getParentLayoutId() == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
1058 return true;
1059 }
1060
1061 return false;
1062 }
1063
1064 @Override
1065 public boolean isSelected(
1066 boolean selectable, Layout layout, long ancestorPlid) {
1067
1068 if (selectable) {
1069 long plid = getPlid();
1070
1071 if ((plid == layout.getPlid()) || (plid == ancestorPlid)) {
1072 return true;
1073 }
1074 }
1075
1076 return false;
1077 }
1078
1079
1086 @Override
1087 public boolean isSupportsEmbeddedPortlets() {
1088 if (isTypeEmbedded() || isTypePanel() || isTypePortlet()) {
1089 return true;
1090 }
1091
1092 return false;
1093 }
1094
1095
1098 @Deprecated
1099 @Override
1100 public boolean isTypeArticle() {
1101 return false;
1102 }
1103
1104 @Override
1105 public boolean isTypeControlPanel() {
1106 if (Validator.equals(getType(), LayoutConstants.TYPE_CONTROL_PANEL) ||
1107 Validator.equals(
1108 _getLayoutTypeControllerType(),
1109 LayoutConstants.TYPE_CONTROL_PANEL)) {
1110
1111 return true;
1112 }
1113
1114 return false;
1115 }
1116
1117 @Override
1118 public boolean isTypeEmbedded() {
1119 if (Validator.equals(getType(), LayoutConstants.TYPE_EMBEDDED) ||
1120 Validator.equals(
1121 _getLayoutTypeControllerType(),
1122 LayoutConstants.TYPE_EMBEDDED)) {
1123
1124 return true;
1125 }
1126
1127 return false;
1128 }
1129
1130 @Override
1131 public boolean isTypeLinkToLayout() {
1132 if (Validator.equals(getType(), LayoutConstants.TYPE_LINK_TO_LAYOUT) ||
1133 Validator.equals(
1134 _getLayoutTypeControllerType(),
1135 LayoutConstants.TYPE_LINK_TO_LAYOUT)) {
1136
1137 return true;
1138 }
1139
1140 return false;
1141 }
1142
1143 @Override
1144 public boolean isTypePanel() {
1145 if (Validator.equals(getType(), LayoutConstants.TYPE_PANEL) ||
1146 Validator.equals(
1147 _getLayoutTypeControllerType(), LayoutConstants.TYPE_PANEL)) {
1148
1149 return true;
1150 }
1151
1152 return false;
1153 }
1154
1155 @Override
1156 public boolean isTypePortlet() {
1157 if (Validator.equals(getType(), LayoutConstants.TYPE_PORTLET) ||
1158 Validator.equals(
1159 _getLayoutTypeControllerType(), LayoutConstants.TYPE_PORTLET)) {
1160
1161 return true;
1162 }
1163
1164 return false;
1165 }
1166
1167 @Override
1168 public boolean isTypeSharedPortlet() {
1169 if (Validator.equals(getType(), LayoutConstants.TYPE_SHARED_PORTLET)) {
1170 return true;
1171 }
1172
1173 return false;
1174 }
1175
1176 @Override
1177 public boolean isTypeURL() {
1178 if (Validator.equals(getType(), LayoutConstants.TYPE_URL)) {
1179 return true;
1180 }
1181
1182 return false;
1183 }
1184
1185 @Override
1186 public boolean matches(HttpServletRequest request, String friendlyURL) {
1187 LayoutType layoutType = getLayoutType();
1188
1189 LayoutTypeController layoutTypeController =
1190 layoutType.getLayoutTypeController();
1191
1192 return layoutTypeController.matches(request, friendlyURL, this);
1193 }
1194
1195 @Override
1196 public void setGroupId(long groupId) {
1197 super.setGroupId(groupId);
1198
1199 _layoutSet = null;
1200 }
1201
1202 @Override
1203 public void setLayoutSet(LayoutSet layoutSet) {
1204 _layoutSet = layoutSet;
1205 }
1206
1207 @Override
1208 public void setPrivateLayout(boolean privateLayout) {
1209 super.setPrivateLayout(privateLayout);
1210
1211 _layoutSet = null;
1212 }
1213
1214 @Override
1215 public void setTypeSettings(String typeSettings) {
1216 _typeSettingsProperties = null;
1217
1218 super.setTypeSettings(typeSettings);
1219 }
1220
1221 @Override
1222 public void setTypeSettingsProperties(
1223 UnicodeProperties typeSettingsProperties) {
1224
1225 _typeSettingsProperties = typeSettingsProperties;
1226
1227 super.setTypeSettings(_typeSettingsProperties.toString());
1228 }
1229
1230 private static String _getFriendlyURLKeyword(String friendlyURL) {
1231 friendlyURL = StringUtil.toLowerCase(friendlyURL);
1232
1233 for (String keyword : _friendlyURLKeywords) {
1234 if (friendlyURL.startsWith(keyword)) {
1235 return keyword;
1236 }
1237
1238 if (keyword.equals(friendlyURL + StringPool.SLASH)) {
1239 return friendlyURL;
1240 }
1241 }
1242
1243 return null;
1244 }
1245
1246 private static void _initFriendlyURLKeywords() {
1247 _friendlyURLKeywords =
1248 new String[PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS.length];
1249
1250 for (int i = 0; i < PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS.length;
1251 i++) {
1252
1253 String keyword = PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS[i];
1254
1255 keyword = StringPool.SLASH + keyword;
1256
1257 if (!keyword.contains(StringPool.PERIOD)) {
1258 if (keyword.endsWith(StringPool.STAR)) {
1259 keyword = keyword.substring(0, keyword.length() - 1);
1260 }
1261 else {
1262 keyword = keyword + StringPool.SLASH;
1263 }
1264 }
1265
1266 _friendlyURLKeywords[i] = StringUtil.toLowerCase(keyword);
1267 }
1268 }
1269
1270 private String _getLayoutTypeControllerType() {
1271 LayoutType layoutType = getLayoutType();
1272
1273 LayoutTypeController layoutTypeController =
1274 layoutType.getLayoutTypeController();
1275
1276 return layoutTypeController.getType();
1277 }
1278
1279 private LayoutTypePortlet _getLayoutTypePortletClone(
1280 HttpServletRequest request)
1281 throws IOException {
1282
1283 LayoutTypePortlet layoutTypePortlet = null;
1284
1285 LayoutClone layoutClone = LayoutCloneFactory.getInstance();
1286
1287 if (layoutClone != null) {
1288 String typeSettings = layoutClone.get(request, getPlid());
1289
1290 if (typeSettings != null) {
1291 UnicodeProperties typeSettingsProperties =
1292 new UnicodeProperties(true);
1293
1294 typeSettingsProperties.load(typeSettings);
1295
1296 String stateMax = typeSettingsProperties.getProperty(
1297 LayoutTypePortletConstants.STATE_MAX);
1298 String stateMin = typeSettingsProperties.getProperty(
1299 LayoutTypePortletConstants.STATE_MIN);
1300
1301 Layout layout = (Layout)this.clone();
1302
1303 layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
1304
1305 layoutTypePortlet.setStateMax(stateMax);
1306 layoutTypePortlet.setStateMin(stateMin);
1307 }
1308 }
1309
1310 if (layoutTypePortlet == null) {
1311 layoutTypePortlet = (LayoutTypePortlet)getLayoutType();
1312 }
1313
1314 return layoutTypePortlet;
1315 }
1316
1317 private List<PortletPreferences> _getPortletPreferences(long groupId) {
1318 List<PortletPreferences> portletPreferences =
1319 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1320 groupId, PortletKeys.PREFS_OWNER_TYPE_LAYOUT,
1321 PortletKeys.PREFS_PLID_SHARED);
1322
1323 if (isTypePortlet()) {
1324 LayoutTypePortlet layoutTypePortlet =
1325 (LayoutTypePortlet)getLayoutType();
1326
1327 PortalPreferences portalPreferences =
1328 layoutTypePortlet.getPortalPreferences();
1329
1330 if ((portalPreferences != null) &&
1331 layoutTypePortlet.isCustomizable()) {
1332
1333 portletPreferences = ListUtil.copy(portletPreferences);
1334
1335 portletPreferences.addAll(
1336 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1337 portalPreferences.getUserId(),
1338 PortletKeys.PREFS_OWNER_TYPE_USER, getPlid()));
1339 }
1340 }
1341
1342 return portletPreferences;
1343 }
1344
1345 private String _getURL(
1346 HttpServletRequest request, boolean resetMaxState,
1347 boolean resetRenderParameters)
1348 throws PortalException {
1349
1350 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
1351 WebKeys.THEME_DISPLAY);
1352
1353 if (resetMaxState) {
1354 Layout layout = themeDisplay.getLayout();
1355
1356 LayoutTypePortlet layoutTypePortlet = null;
1357
1358 if (layout.equals(this)) {
1359 layoutTypePortlet = themeDisplay.getLayoutTypePortlet();
1360 }
1361 else {
1362 try {
1363 layoutTypePortlet = _getLayoutTypePortletClone(request);
1364 }
1365 catch (IOException ioe) {
1366 _log.error("Unable to clone layout settings", ioe);
1367
1368 layoutTypePortlet = (LayoutTypePortlet)getLayoutType();
1369 }
1370 }
1371
1372 if (layoutTypePortlet.hasStateMax()) {
1373 String portletId = StringUtil.split(
1374 layoutTypePortlet.getStateMax())[0];
1375
1376 PortletURLImpl portletURLImpl = new PortletURLImpl(
1377 request, portletId, getPlid(), PortletRequest.ACTION_PHASE);
1378
1379 try {
1380 portletURLImpl.setWindowState(WindowState.NORMAL);
1381 portletURLImpl.setPortletMode(PortletMode.VIEW);
1382 }
1383 catch (PortletException pe) {
1384 throw new SystemException(pe);
1385 }
1386
1387 portletURLImpl.setAnchor(false);
1388
1389 if (PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
1390 !resetRenderParameters) {
1391
1392 portletURLImpl.setParameter("p_l_reset", "0");
1393 }
1394 else if (!PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
1395 resetRenderParameters) {
1396
1397 portletURLImpl.setParameter("p_l_reset", "1");
1398 }
1399
1400 return portletURLImpl.toString();
1401 }
1402 }
1403
1404 String portalURL = PortalUtil.getPortalURL(request);
1405
1406 String url = PortalUtil.getLayoutURL(this, themeDisplay);
1407
1408 if (!CookieKeys.hasSessionId(request) &&
1409 (url.startsWith(portalURL) || url.startsWith(StringPool.SLASH))) {
1410
1411 HttpSession session = request.getSession();
1412
1413 url = PortalUtil.getURLWithSessionId(url, session.getId());
1414 }
1415
1416 if (!resetMaxState) {
1417 return url;
1418 }
1419
1420 if (PropsValues.LAYOUT_DEFAULT_P_L_RESET && !resetRenderParameters) {
1421 url = HttpUtil.addParameter(url, "p_l_reset", 0);
1422 }
1423 else if (!PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
1424 resetRenderParameters) {
1425
1426 url = HttpUtil.addParameter(url, "p_l_reset", 1);
1427 }
1428
1429 return url;
1430 }
1431
1432 private static final Log _log = LogFactoryUtil.getLog(LayoutImpl.class);
1433
1434 private static String[] _friendlyURLKeywords;
1435
1436 static {
1437 _initFriendlyURLKeywords();
1438 }
1439
1440 private LayoutSet _layoutSet;
1441 private transient LayoutType _layoutType;
1442 private UnicodeProperties _typeSettingsProperties;
1443
1444 }