001
014
015 package com.liferay.portal.model.impl;
016
017 import com.liferay.portal.LayoutFriendlyURLException;
018 import com.liferay.portal.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.util.ArrayUtil;
025 import com.liferay.portal.kernel.util.CharPool;
026 import com.liferay.portal.kernel.util.CookieKeys;
027 import com.liferay.portal.kernel.util.GetterUtil;
028 import com.liferay.portal.kernel.util.HttpUtil;
029 import com.liferay.portal.kernel.util.ListUtil;
030 import com.liferay.portal.kernel.util.LocaleUtil;
031 import com.liferay.portal.kernel.util.LocalizationUtil;
032 import com.liferay.portal.kernel.util.PropsKeys;
033 import com.liferay.portal.kernel.util.StringPool;
034 import com.liferay.portal.kernel.util.StringUtil;
035 import com.liferay.portal.kernel.util.UnicodeProperties;
036 import com.liferay.portal.kernel.util.Validator;
037 import com.liferay.portal.model.ColorScheme;
038 import com.liferay.portal.model.Group;
039 import com.liferay.portal.model.Layout;
040 import com.liferay.portal.model.LayoutConstants;
041 import com.liferay.portal.model.LayoutFriendlyURL;
042 import com.liferay.portal.model.LayoutSet;
043 import com.liferay.portal.model.LayoutType;
044 import com.liferay.portal.model.LayoutTypePortlet;
045 import com.liferay.portal.model.LayoutTypePortletConstants;
046 import com.liferay.portal.model.Theme;
047 import com.liferay.portal.security.permission.ActionKeys;
048 import com.liferay.portal.security.permission.PermissionChecker;
049 import com.liferay.portal.service.GroupLocalServiceUtil;
050 import com.liferay.portal.service.LayoutFriendlyURLLocalServiceUtil;
051 import com.liferay.portal.service.LayoutLocalServiceUtil;
052 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
053 import com.liferay.portal.service.ThemeLocalServiceUtil;
054 import com.liferay.portal.service.permission.LayoutPermissionUtil;
055 import com.liferay.portal.theme.ThemeDisplay;
056 import com.liferay.portal.util.LayoutClone;
057 import com.liferay.portal.util.LayoutCloneFactory;
058 import com.liferay.portal.util.PortalUtil;
059 import com.liferay.portal.util.PropsValues;
060 import com.liferay.portal.util.WebKeys;
061 import com.liferay.portlet.PortletURLImpl;
062
063 import java.io.IOException;
064
065 import java.util.ArrayList;
066 import java.util.HashMap;
067 import java.util.Iterator;
068 import java.util.List;
069 import java.util.Locale;
070 import java.util.Map;
071
072 import javax.portlet.PortletException;
073 import javax.portlet.PortletMode;
074 import javax.portlet.PortletRequest;
075 import javax.portlet.WindowState;
076
077 import javax.servlet.http.HttpServletRequest;
078
079
082 public class LayoutImpl extends LayoutBaseImpl {
083
084 public static boolean hasFriendlyURLKeyword(String friendlyURL) {
085 String keyword = _getFriendlyURLKeyword(friendlyURL);
086
087 if (Validator.isNotNull(keyword)) {
088 return true;
089 }
090
091 return false;
092 }
093
094 public static int validateFriendlyURL(String friendlyURL) {
095 return validateFriendlyURL(friendlyURL, true);
096 }
097
098 public static int validateFriendlyURL(
099 String friendlyURL, boolean checkMaxLength) {
100
101 if (friendlyURL.length() < 2) {
102 return LayoutFriendlyURLException.TOO_SHORT;
103 }
104
105 if (checkMaxLength &&
106 (friendlyURL.length() > LayoutConstants.FRIENDLY_URL_MAX_LENGTH)) {
107
108 return LayoutFriendlyURLException.TOO_LONG;
109 }
110
111 if (!friendlyURL.startsWith(StringPool.SLASH)) {
112 return LayoutFriendlyURLException.DOES_NOT_START_WITH_SLASH;
113 }
114
115 if (friendlyURL.endsWith(StringPool.SLASH)) {
116 return LayoutFriendlyURLException.ENDS_WITH_SLASH;
117 }
118
119 if (friendlyURL.contains(StringPool.DOUBLE_SLASH)) {
120 return LayoutFriendlyURLException.ADJACENT_SLASHES;
121 }
122
123 for (char c : friendlyURL.toCharArray()) {
124 if (!Validator.isChar(c) && !Validator.isDigit(c) &&
125 (c != CharPool.DASH) && (c != CharPool.PERCENT) &&
126 (c != CharPool.PERIOD) && (c != CharPool.PLUS) &&
127 (c != CharPool.SLASH) && (c != CharPool.STAR) &&
128 (c != CharPool.UNDERLINE)) {
129
130 return LayoutFriendlyURLException.INVALID_CHARACTERS;
131 }
132 }
133
134 return -1;
135 }
136
137 public static void validateFriendlyURLKeyword(String friendlyURL)
138 throws LayoutFriendlyURLException {
139
140 String keyword = _getFriendlyURLKeyword(friendlyURL);
141
142 if (Validator.isNotNull(keyword)) {
143 LayoutFriendlyURLException lfurle = new LayoutFriendlyURLException(
144 LayoutFriendlyURLException.KEYWORD_CONFLICT);
145
146 lfurle.setKeywordConflict(keyword);
147
148 throw lfurle;
149 }
150 }
151
152 public LayoutImpl() {
153 }
154
155 @Override
156 public List<Layout> getAllChildren() throws SystemException {
157 List<Layout> layouts = new ArrayList<Layout>();
158
159 for (Layout layout : getChildren()) {
160 layouts.add(layout);
161 layouts.addAll(layout.getAllChildren());
162 }
163
164 return layouts;
165 }
166
167 @Override
168 public long getAncestorLayoutId() throws PortalException, SystemException {
169 long layoutId = 0;
170
171 Layout layout = this;
172
173 while (true) {
174 if (!layout.isRootLayout()) {
175 layout = LayoutLocalServiceUtil.getLayout(
176 layout.getGroupId(), layout.isPrivateLayout(),
177 layout.getParentLayoutId());
178 }
179 else {
180 layoutId = layout.getLayoutId();
181
182 break;
183 }
184 }
185
186 return layoutId;
187 }
188
189 @Override
190 public long getAncestorPlid() throws PortalException, SystemException {
191 long plid = 0;
192
193 Layout layout = this;
194
195 while (true) {
196 if (!layout.isRootLayout()) {
197 layout = LayoutLocalServiceUtil.getLayout(
198 layout.getGroupId(), layout.isPrivateLayout(),
199 layout.getParentLayoutId());
200 }
201 else {
202 plid = layout.getPlid();
203
204 break;
205 }
206 }
207
208 return plid;
209 }
210
211 @Override
212 public List<Layout> getAncestors() throws PortalException, SystemException {
213 List<Layout> layouts = new ArrayList<Layout>();
214
215 Layout layout = this;
216
217 while (!layout.isRootLayout()) {
218 layout = LayoutLocalServiceUtil.getLayout(
219 layout.getGroupId(), layout.isPrivateLayout(),
220 layout.getParentLayoutId());
221
222 layouts.add(layout);
223 }
224
225 return layouts;
226 }
227
228 @Override
229 public List<Layout> getChildren() throws SystemException {
230 return LayoutLocalServiceUtil.getLayouts(
231 getGroupId(), isPrivateLayout(), getLayoutId());
232 }
233
234 @Override
235 public List<Layout> getChildren(PermissionChecker permissionChecker)
236 throws PortalException, SystemException {
237
238 List<Layout> layouts = ListUtil.copy(getChildren());
239
240 Iterator<Layout> itr = layouts.iterator();
241
242 while (itr.hasNext()) {
243 Layout layout = itr.next();
244
245 if (layout.isHidden() ||
246 !LayoutPermissionUtil.contains(
247 permissionChecker, layout, ActionKeys.VIEW)) {
248
249 itr.remove();
250 }
251 }
252
253 return layouts;
254 }
255
256 @Override
257 public ColorScheme getColorScheme()
258 throws PortalException, SystemException {
259
260 if (isInheritLookAndFeel()) {
261 return getLayoutSet().getColorScheme();
262 }
263 else {
264 return ThemeLocalServiceUtil.getColorScheme(
265 getCompanyId(), getTheme().getThemeId(), getColorSchemeId(),
266 false);
267 }
268 }
269
270 @Override
271 public String getCssText() throws PortalException, SystemException {
272 if (isInheritLookAndFeel()) {
273 return getLayoutSet().getCss();
274 }
275 else {
276 return getCss();
277 }
278 }
279
280 @Override
281 public String getFriendlyURL(Locale locale) {
282 Layout layout = this;
283
284 String friendlyURL = layout.getFriendlyURL();
285
286 try {
287 Group group = layout.getGroup();
288
289 UnicodeProperties typeSettingsProperties =
290 group.getTypeSettingsProperties();
291
292 if (!GetterUtil.getBoolean(
293 typeSettingsProperties.getProperty("inheritLocales"),
294 true)) {
295
296 String[] locales = StringUtil.split(
297 typeSettingsProperties.getProperty(PropsKeys.LOCALES));
298
299 if (!ArrayUtil.contains(
300 locales, LanguageUtil.getLanguageId(locale))) {
301
302 return friendlyURL;
303 }
304 }
305
306 LayoutFriendlyURL layoutFriendlyURL =
307 LayoutFriendlyURLLocalServiceUtil.getLayoutFriendlyURL(
308 layout.getPlid(), LocaleUtil.toLanguageId(locale));
309
310 friendlyURL = layoutFriendlyURL.getFriendlyURL();
311 }
312 catch (Exception e) {
313 }
314
315 return friendlyURL;
316 }
317
318 @Override
319 public Map<Locale, String> getFriendlyURLMap() throws SystemException {
320 Map<Locale, String> friendlyURLMap = new HashMap<Locale, String>();
321
322 List<LayoutFriendlyURL> layoutFriendlyURLs =
323 LayoutFriendlyURLLocalServiceUtil.getLayoutFriendlyURLs(getPlid());
324
325 for (LayoutFriendlyURL layoutFriendlyURL : layoutFriendlyURLs) {
326 friendlyURLMap.put(
327 LocaleUtil.fromLanguageId(layoutFriendlyURL.getLanguageId()),
328 layoutFriendlyURL.getFriendlyURL());
329 }
330
331
332
333
334
335 Locale defaultSiteLocale = LocaleUtil.getSiteDefault();
336
337 if (Validator.isNull(friendlyURLMap.get(defaultSiteLocale))) {
338 Locale defaultLocale = LocaleUtil.fromLanguageId(
339 getDefaultLanguageId());
340
341 String defaultFriendlyURL = friendlyURLMap.get(defaultLocale);
342
343 friendlyURLMap.put(defaultSiteLocale, defaultFriendlyURL);
344 }
345
346 return friendlyURLMap;
347 }
348
349 @Override
350 public String getFriendlyURLsXML() throws SystemException {
351 Map<Locale, String> friendlyURLMap = getFriendlyURLMap();
352
353 return LocalizationUtil.updateLocalization(
354 friendlyURLMap, StringPool.BLANK, "FriendlyURL",
355 LocaleUtil.toLanguageId(LocaleUtil.getSiteDefault()));
356 }
357
358 @Override
359 public Group getGroup() throws PortalException, SystemException {
360 return GroupLocalServiceUtil.getGroup(getGroupId());
361 }
362
363 @Override
364 public String getHTMLTitle(Locale locale) {
365 String localeLanguageId = LocaleUtil.toLanguageId(locale);
366
367 return getHTMLTitle(localeLanguageId);
368 }
369
370 @Override
371 public String getHTMLTitle(String localeLanguageId) {
372 String htmlTitle = getTitle(localeLanguageId);
373
374 if (Validator.isNull(htmlTitle)) {
375 htmlTitle = getName(localeLanguageId);
376 }
377
378 return htmlTitle;
379 }
380
381 @Override
382 public LayoutSet getLayoutSet() throws PortalException, SystemException {
383 if (_layoutSet == null) {
384 _layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
385 getGroupId(), isPrivateLayout());
386 }
387
388 return _layoutSet;
389 }
390
391 @Override
392 public LayoutType getLayoutType() {
393 if (_layoutType == null) {
394 _layoutType = new LayoutTypePortletImpl(this);
395 }
396
397 return _layoutType;
398 }
399
400 @Override
401 public long getParentPlid() throws PortalException, SystemException {
402 if (getParentLayoutId() == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
403 return 0;
404 }
405
406 Layout layout = LayoutLocalServiceUtil.getLayout(
407 getGroupId(), isPrivateLayout(), getParentLayoutId());
408
409 return layout.getPlid();
410 }
411
412 @Override
413 public String getRegularURL(HttpServletRequest request)
414 throws PortalException, SystemException {
415
416 return _getURL(request, false, false);
417 }
418
419 @Override
420 public String getResetLayoutURL(HttpServletRequest request)
421 throws PortalException, SystemException {
422
423 return _getURL(request, true, true);
424 }
425
426 @Override
427 public String getResetMaxStateURL(HttpServletRequest request)
428 throws PortalException, SystemException {
429
430 return _getURL(request, true, false);
431 }
432
433 @Override
434 public Group getScopeGroup() throws PortalException, SystemException {
435 Group group = null;
436
437 try {
438 group = GroupLocalServiceUtil.getLayoutGroup(
439 getCompanyId(), getPlid());
440 }
441 catch (NoSuchGroupException nsge) {
442 }
443
444 return group;
445 }
446
447 @Override
448 public String getTarget() {
449 return PortalUtil.getLayoutTarget(this);
450 }
451
452 @Override
453 public Theme getTheme() throws PortalException, SystemException {
454 if (isInheritLookAndFeel()) {
455 return getLayoutSet().getTheme();
456 }
457 else {
458 return ThemeLocalServiceUtil.getTheme(
459 getCompanyId(), getThemeId(), false);
460 }
461 }
462
463 @Override
464 public String getThemeSetting(String key, String device) {
465 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
466
467 String value = typeSettingsProperties.getProperty(
468 ThemeSettingImpl.namespaceProperty(device, key));
469
470 if (value != null) {
471 return value;
472 }
473
474 if (!isInheritLookAndFeel()) {
475 try {
476 Theme theme = getTheme(device);
477
478 return theme.getSetting(key);
479 }
480 catch (Exception e) {
481 }
482 }
483
484 try {
485 LayoutSet layoutSet = getLayoutSet();
486
487 value = layoutSet.getThemeSetting(key, device);
488 }
489 catch (Exception e) {
490 }
491
492 return value;
493 }
494
495 @Override
496 public String getTypeSettings() {
497 if (_typeSettingsProperties == null) {
498 return super.getTypeSettings();
499 }
500 else {
501 return _typeSettingsProperties.toString();
502 }
503 }
504
505 @Override
506 public UnicodeProperties getTypeSettingsProperties() {
507 if (_typeSettingsProperties == null) {
508 _typeSettingsProperties = new UnicodeProperties(true);
509
510 _typeSettingsProperties.fastLoad(super.getTypeSettings());
511 }
512
513 return _typeSettingsProperties;
514 }
515
516 @Override
517 public String getTypeSettingsProperty(String key) {
518 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
519
520 return typeSettingsProperties.getProperty(key);
521 }
522
523 @Override
524 public String getTypeSettingsProperty(String key, String defaultValue) {
525 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
526
527 return typeSettingsProperties.getProperty(key, defaultValue);
528 }
529
530 @Override
531 public ColorScheme getWapColorScheme()
532 throws PortalException, SystemException {
533
534 if (isInheritLookAndFeel()) {
535 return getLayoutSet().getWapColorScheme();
536 }
537 else {
538 return ThemeLocalServiceUtil.getColorScheme(
539 getCompanyId(), getWapTheme().getThemeId(),
540 getWapColorSchemeId(), true);
541 }
542 }
543
544 @Override
545 public Theme getWapTheme() throws PortalException, SystemException {
546 if (isInheritWapLookAndFeel()) {
547 return getLayoutSet().getWapTheme();
548 }
549 else {
550 return ThemeLocalServiceUtil.getTheme(
551 getCompanyId(), getWapThemeId(), true);
552 }
553 }
554
555 @Override
556 public boolean hasAncestor(long layoutId)
557 throws PortalException, SystemException {
558
559 long parentLayoutId = getParentLayoutId();
560
561 while (parentLayoutId != LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
562 if (parentLayoutId == layoutId) {
563 return true;
564 }
565
566 Layout parentLayout = LayoutLocalServiceUtil.getLayout(
567 getGroupId(), isPrivateLayout(), parentLayoutId);
568
569 parentLayoutId = parentLayout.getParentLayoutId();
570 }
571
572 return false;
573 }
574
575 @Override
576 public boolean hasChildren() throws SystemException {
577 return LayoutLocalServiceUtil.hasLayouts(
578 getGroupId(), isPrivateLayout(), getLayoutId());
579 }
580
581 @Override
582 public boolean hasScopeGroup() throws PortalException, SystemException {
583 Group group = getScopeGroup();
584
585 if (group != null) {
586 return true;
587 }
588 else {
589 return false;
590 }
591 }
592
593 @Override
594 public boolean isChildSelected(boolean selectable, Layout layout)
595 throws PortalException, SystemException {
596
597 if (selectable) {
598 long plid = getPlid();
599
600 List<Layout> ancestors = layout.getAncestors();
601
602 for (Layout curLayout : ancestors) {
603 if (plid == curLayout.getPlid()) {
604 return true;
605 }
606 }
607 }
608
609 return false;
610 }
611
612 @Override
613 public boolean isContentDisplayPage() {
614 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
615
616 String defaultAssetPublisherPortletId =
617 typeSettingsProperties.getProperty(
618 LayoutTypePortletConstants.DEFAULT_ASSET_PUBLISHER_PORTLET_ID);
619
620 if (Validator.isNotNull(defaultAssetPublisherPortletId)) {
621 return true;
622 }
623
624 return false;
625 }
626
627 @Override
628 public boolean isFirstChild() {
629 if (getPriority() == 0) {
630 return true;
631 }
632
633 return false;
634 }
635
636 @Override
637 public boolean isFirstParent() {
638 if (isFirstChild() && isRootLayout()) {
639 return true;
640 }
641
642 return false;
643 }
644
645 @Override
646 public boolean isInheritLookAndFeel() {
647 if (Validator.isNull(getThemeId()) ||
648 Validator.isNull(getColorSchemeId())) {
649
650 return true;
651 }
652
653 return false;
654 }
655
656 @Override
657 public boolean isInheritWapLookAndFeel() {
658 if (Validator.isNull(getWapThemeId()) ||
659 Validator.isNull(getWapColorSchemeId())) {
660
661 return true;
662 }
663
664 return false;
665 }
666
667 @Override
668 public boolean isLayoutPrototypeLinkActive() {
669 if (isLayoutPrototypeLinkEnabled() &&
670 Validator.isNotNull(getLayoutPrototypeUuid())) {
671
672 return true;
673 }
674
675 return false;
676 }
677
678 @Override
679 public boolean isPublicLayout() {
680 return !isPrivateLayout();
681 }
682
683 @Override
684 public boolean isRootLayout() {
685 if (getParentLayoutId() == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
686 return true;
687 }
688
689 return false;
690 }
691
692 @Override
693 public boolean isSelected(
694 boolean selectable, Layout layout, long ancestorPlid) {
695
696 if (selectable) {
697 long plid = getPlid();
698
699 if ((plid == layout.getPlid()) || (plid == ancestorPlid)) {
700 return true;
701 }
702 }
703
704 return false;
705 }
706
707 @Override
708 public boolean isSupportsEmbeddedPortlets() {
709 if (isTypeArticle() || isTypeEmbedded() || isTypePanel() ||
710 isTypePortlet()) {
711
712 return true;
713 }
714
715 return false;
716 }
717
718 @Override
719 public boolean isTypeArticle() {
720 if (getType().equals(LayoutConstants.TYPE_ARTICLE)) {
721 return true;
722 }
723
724 return false;
725 }
726
727 @Override
728 public boolean isTypeControlPanel() {
729 if (getType().equals(LayoutConstants.TYPE_CONTROL_PANEL)) {
730 return true;
731 }
732
733 return false;
734 }
735
736 @Override
737 public boolean isTypeEmbedded() {
738 if (getType().equals(LayoutConstants.TYPE_EMBEDDED)) {
739 return true;
740 }
741
742 return false;
743 }
744
745 @Override
746 public boolean isTypeLinkToLayout() {
747 if (getType().equals(LayoutConstants.TYPE_LINK_TO_LAYOUT)) {
748 return true;
749 }
750
751 return false;
752 }
753
754 @Override
755 public boolean isTypePanel() {
756 if (getType().equals(LayoutConstants.TYPE_PANEL)) {
757 return true;
758 }
759
760 return false;
761 }
762
763 @Override
764 public boolean isTypePortlet() {
765 if (getType().equals(LayoutConstants.TYPE_PORTLET)) {
766 return true;
767 }
768
769 return false;
770 }
771
772 @Override
773 public boolean isTypeURL() {
774 if (getType().equals(LayoutConstants.TYPE_URL)) {
775 return true;
776 }
777
778 return false;
779 }
780
781 @Override
782 public void setGroupId(long groupId) {
783 super.setGroupId(groupId);
784
785 _layoutSet = null;
786 }
787
788 @Override
789 public void setLayoutSet(LayoutSet layoutSet) {
790 _layoutSet = layoutSet;
791 }
792
793 @Override
794 public void setPrivateLayout(boolean privateLayout) {
795 super.setPrivateLayout(privateLayout);
796
797 _layoutSet = null;
798 }
799
800 @Override
801 public void setTypeSettings(String typeSettings) {
802 _typeSettingsProperties = null;
803
804 super.setTypeSettings(typeSettings);
805 }
806
807 @Override
808 public void setTypeSettingsProperties(
809 UnicodeProperties typeSettingsProperties) {
810
811 _typeSettingsProperties = typeSettingsProperties;
812
813 super.setTypeSettings(_typeSettingsProperties.toString());
814 }
815
816 protected Theme getTheme(String device)
817 throws PortalException, SystemException {
818
819 if (device.equals("regular")) {
820 return getTheme();
821 }
822 else {
823 return getWapTheme();
824 }
825 }
826
827 private static String _getFriendlyURLKeyword(String friendlyURL) {
828 friendlyURL = StringUtil.toLowerCase(friendlyURL);
829
830 for (String keyword : _friendlyURLKeywords) {
831 if (friendlyURL.startsWith(keyword)) {
832 return keyword;
833 }
834
835 if (keyword.equals(friendlyURL + StringPool.SLASH)) {
836 return friendlyURL;
837 }
838 }
839
840 return null;
841 }
842
843 private static void _initFriendlyURLKeywords() {
844 _friendlyURLKeywords =
845 new String[PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS.length];
846
847 for (int i = 0; i < PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS.length;
848 i++) {
849
850 String keyword = PropsValues.LAYOUT_FRIENDLY_URL_KEYWORDS[i];
851
852 keyword = StringPool.SLASH + keyword;
853
854 if (!keyword.contains(StringPool.PERIOD)) {
855 if (keyword.endsWith(StringPool.STAR)) {
856 keyword = keyword.substring(0, keyword.length() - 1);
857 }
858 else {
859 keyword = keyword + StringPool.SLASH;
860 }
861 }
862
863 _friendlyURLKeywords[i] = StringUtil.toLowerCase(keyword);
864 }
865 }
866
867 private LayoutTypePortlet _getLayoutTypePortletClone(
868 HttpServletRequest request)
869 throws IOException {
870
871 LayoutTypePortlet layoutTypePortlet = null;
872
873 LayoutClone layoutClone = LayoutCloneFactory.getInstance();
874
875 if (layoutClone != null) {
876 String typeSettings = layoutClone.get(request, getPlid());
877
878 if (typeSettings != null) {
879 UnicodeProperties typeSettingsProperties =
880 new UnicodeProperties(true);
881
882 typeSettingsProperties.load(typeSettings);
883
884 String stateMax = typeSettingsProperties.getProperty(
885 LayoutTypePortletConstants.STATE_MAX);
886 String stateMin = typeSettingsProperties.getProperty(
887 LayoutTypePortletConstants.STATE_MIN);
888
889 Layout layout = (Layout)this.clone();
890
891 layoutTypePortlet = (LayoutTypePortlet)layout.getLayoutType();
892
893 layoutTypePortlet.setStateMax(stateMax);
894 layoutTypePortlet.setStateMin(stateMin);
895 }
896 }
897
898 if (layoutTypePortlet == null) {
899 layoutTypePortlet = (LayoutTypePortlet)getLayoutType();
900 }
901
902 return layoutTypePortlet;
903 }
904
905 private String _getURL(
906 HttpServletRequest request, boolean resetMaxState,
907 boolean resetRenderParameters)
908 throws PortalException, SystemException {
909
910 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
911 WebKeys.THEME_DISPLAY);
912
913 if (resetMaxState) {
914 Layout layout = themeDisplay.getLayout();
915
916 LayoutTypePortlet layoutTypePortlet = null;
917
918 if (layout.equals(this)) {
919 layoutTypePortlet = themeDisplay.getLayoutTypePortlet();
920 }
921 else {
922 try {
923 layoutTypePortlet = _getLayoutTypePortletClone(request);
924 }
925 catch (IOException ioe) {
926 _log.error("Unable to clone layout settings", ioe);
927
928 layoutTypePortlet = (LayoutTypePortlet)getLayoutType();
929 }
930 }
931
932 if (layoutTypePortlet.hasStateMax()) {
933 String portletId = StringUtil.split(
934 layoutTypePortlet.getStateMax())[0];
935
936 PortletURLImpl portletURLImpl = new PortletURLImpl(
937 request, portletId, getPlid(), PortletRequest.ACTION_PHASE);
938
939 try {
940 portletURLImpl.setWindowState(WindowState.NORMAL);
941 portletURLImpl.setPortletMode(PortletMode.VIEW);
942 }
943 catch (PortletException pe) {
944 throw new SystemException(pe);
945 }
946
947 portletURLImpl.setAnchor(false);
948
949 if (PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
950 !resetRenderParameters) {
951
952 portletURLImpl.setParameter("p_l_reset", "0");
953 }
954 else if (!PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
955 resetRenderParameters) {
956
957 portletURLImpl.setParameter("p_l_reset", "1");
958 }
959
960 return portletURLImpl.toString();
961 }
962 }
963
964 String portalURL = PortalUtil.getPortalURL(request);
965
966 String url = PortalUtil.getLayoutURL(this, themeDisplay);
967
968 if (!CookieKeys.hasSessionId(request) &&
969 (url.startsWith(portalURL) || url.startsWith(StringPool.SLASH))) {
970
971 url = PortalUtil.getURLWithSessionId(
972 url, request.getSession().getId());
973 }
974
975 if (!resetMaxState) {
976 return url;
977 }
978
979 if (PropsValues.LAYOUT_DEFAULT_P_L_RESET && !resetRenderParameters) {
980 url = HttpUtil.addParameter(url, "p_l_reset", 0);
981 }
982 else if (!PropsValues.LAYOUT_DEFAULT_P_L_RESET &&
983 resetRenderParameters) {
984
985 url = HttpUtil.addParameter(url, "p_l_reset", 1);
986 }
987
988 return url;
989 }
990
991 private static Log _log = LogFactoryUtil.getLog(LayoutImpl.class);
992
993 private static String[] _friendlyURLKeywords;
994
995 private LayoutSet _layoutSet;
996 private LayoutType _layoutType;
997 private UnicodeProperties _typeSettingsProperties;
998
999 static {
1000 _initFriendlyURLKeywords();
1001 }
1002
1003 }