001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
080     * @author Brian Wing Shun Chan
081     */
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                    // If the site/portal default language changes, there may not exist a
332                    // value for the new default language. In this situation, we will use
333                    // the value from the previous default language.
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    }