001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.model.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.language.LanguageUtil;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.staging.StagingConstants;
022    import com.liferay.portal.kernel.staging.StagingUtil;
023    import com.liferay.portal.kernel.util.GetterUtil;
024    import com.liferay.portal.kernel.util.HtmlUtil;
025    import com.liferay.portal.kernel.util.LocaleUtil;
026    import com.liferay.portal.kernel.util.OrderByComparator;
027    import com.liferay.portal.kernel.util.StringBundler;
028    import com.liferay.portal.kernel.util.StringPool;
029    import com.liferay.portal.kernel.util.StringUtil;
030    import com.liferay.portal.kernel.util.UnicodeProperties;
031    import com.liferay.portal.kernel.util.Validator;
032    import com.liferay.portal.model.Company;
033    import com.liferay.portal.model.Group;
034    import com.liferay.portal.model.GroupConstants;
035    import com.liferay.portal.model.GroupWrapper;
036    import com.liferay.portal.model.Layout;
037    import com.liferay.portal.model.LayoutConstants;
038    import com.liferay.portal.model.LayoutPrototype;
039    import com.liferay.portal.model.LayoutSet;
040    import com.liferay.portal.model.LayoutSetPrototype;
041    import com.liferay.portal.model.Organization;
042    import com.liferay.portal.model.Portlet;
043    import com.liferay.portal.model.PortletConstants;
044    import com.liferay.portal.model.RoleConstants;
045    import com.liferay.portal.model.User;
046    import com.liferay.portal.model.UserGroup;
047    import com.liferay.portal.model.UserPersonalSite;
048    import com.liferay.portal.security.permission.ActionKeys;
049    import com.liferay.portal.security.permission.PermissionChecker;
050    import com.liferay.portal.service.GroupLocalServiceUtil;
051    import com.liferay.portal.service.LayoutLocalServiceUtil;
052    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
053    import com.liferay.portal.service.PortletLocalServiceUtil;
054    import com.liferay.portal.service.RoleLocalServiceUtil;
055    import com.liferay.portal.service.permission.LayoutPermissionUtil;
056    import com.liferay.portal.theme.ThemeDisplay;
057    import com.liferay.portal.util.PortalUtil;
058    import com.liferay.portal.util.PropsValues;
059    
060    import java.io.IOException;
061    
062    import java.util.ArrayList;
063    import java.util.LinkedHashSet;
064    import java.util.List;
065    import java.util.Locale;
066    import java.util.Map;
067    import java.util.Set;
068    
069    /**
070     * Represents either a site or a generic resource container.
071     *
072     * <p>
073     * Groups are most used in Liferay as a resource container for permissioning and
074     * content scoping purposes. For instance, an site is group, meaning that it can
075     * contain layouts, web content, wiki entries, etc. However, a single layout can
076     * also be a group containing its own unique set of resources. An example of
077     * this would be a site that has several distinct wikis on different layouts.
078     * Each of these layouts would have its own group, and all of the nodes in the
079     * wiki for a certain layout would be associated with that layout's group. This
080     * allows users to be given different permissions on each of the wikis, even
081     * though they are all within the same site. In addition to sites and layouts,
082     * users and organizations are also groups.
083     * </p>
084     *
085     * <p>
086     * Groups also have a second, partially conflicting purpose in Liferay. For
087     * legacy reasons, groups are also the model used to represent sites (known as
088     * communities before Liferay v6.1). Confusion may arise from the fact that a
089     * site group is both the resource container and the site itself, whereas a
090     * layout or organization would have both a primary model and an associated
091     * group.
092     * </p>
093     *
094     * @author Brian Wing Shun Chan
095     */
096    public class GroupImpl extends GroupBaseImpl {
097    
098            public GroupImpl() {
099            }
100    
101            @Override
102            public void clearStagingGroup() {
103                    _stagingGroup = null;
104            }
105    
106            @Override
107            public List<Group> getAncestors() throws PortalException {
108                    Group group = null;
109    
110                    if (isStagingGroup()) {
111                            group = getLiveGroup();
112                    }
113                    else {
114                            group = this;
115                    }
116    
117                    List<Group> groups = new ArrayList<Group>();
118    
119                    while (!group.isRoot()) {
120                            group = group.getParentGroup();
121    
122                            groups.add(group);
123                    }
124    
125                    return groups;
126            }
127    
128            @Override
129            public List<Group> getChildren(boolean site) {
130                    return GroupLocalServiceUtil.getGroups(
131                            getCompanyId(), getGroupId(), site);
132            }
133    
134            /**
135             * @deprecated As of 7.0.0, replaced by {@link
136             *             #getChildrenWithLayouts(boolean, int, int, OrderByComparator}
137             */
138            @Deprecated
139            @Override
140            public List<Group> getChildrenWithLayouts(
141                    boolean site, int start, int end) {
142    
143                    return getChildrenWithLayouts(site, start, end, null);
144            }
145    
146            @Override
147            public List<Group> getChildrenWithLayouts(
148                    boolean site, int start, int end, OrderByComparator<Group> obc) {
149    
150                    return GroupLocalServiceUtil.getLayoutsGroups(
151                            getCompanyId(), getGroupId(), site, start, end, obc);
152            }
153    
154            @Override
155            public int getChildrenWithLayoutsCount(boolean site) {
156                    return GroupLocalServiceUtil.getLayoutsGroupsCount(
157                            getCompanyId(), getGroupId(), site);
158            }
159    
160            @Override
161            public long getDefaultPrivatePlid() {
162                    return getDefaultPlid(true);
163            }
164    
165            @Override
166            public long getDefaultPublicPlid() {
167                    return getDefaultPlid(false);
168            }
169    
170            @Override
171            public List<Group> getDescendants(boolean site) {
172                    Set<Group> descendants = new LinkedHashSet<Group>();
173    
174                    for (Group group : getChildren(site)) {
175                            descendants.add(group);
176                            descendants.addAll(group.getDescendants(site));
177                    }
178    
179                    return new ArrayList<Group>(descendants);
180            }
181    
182            @Override
183            public String getDescriptiveName() throws PortalException {
184                    return getDescriptiveName(LocaleUtil.getMostRelevantLocale());
185            }
186    
187            @Override
188            public String getDescriptiveName(Locale locale) throws PortalException {
189                    return GroupLocalServiceUtil.getGroupDescriptiveName(this, locale);
190            }
191    
192            @Override
193            public String getIconCssClass() {
194                    String iconCss = "icon-globe";
195    
196                    if (isCompany()) {
197                            iconCss = "icon-globe";
198                    }
199                    else if (isLayout()) {
200                            iconCss = "icon-file";
201                    }
202                    else if (isOrganization()) {
203                            iconCss = "icon-globe";
204                    }
205                    else if (isUser()) {
206                            iconCss = "icon-user";
207                    }
208    
209                    return iconCss;
210            }
211    
212            @Override
213            public String getIconURL(ThemeDisplay themeDisplay) {
214                    String iconURL = StringPool.BLANK;
215    
216                    if (isCompany()) {
217                            iconURL = "../aui/globe";
218                    }
219                    else if (isLayout()) {
220                            iconURL = "../aui/file";
221                    }
222                    else if (isOrganization()) {
223                            iconURL = "../aui/globe";
224                    }
225                    else if (isUser()) {
226                            iconURL = "../aui/user";
227                    }
228                    else {
229                            iconURL = "../aui/globe";
230                    }
231    
232                    return iconURL;
233            }
234    
235            @Override
236            public String getLayoutRootNodeName(boolean privateLayout, Locale locale) {
237                    String pagesName = null;
238    
239                    if (isLayoutPrototype() || isLayoutSetPrototype() || isUserGroup()) {
240                            pagesName = "pages";
241                    }
242                    else if (privateLayout) {
243                            if (isUser()) {
244                                    pagesName = "my-dashboard";
245                            }
246                            else {
247                                    pagesName = "private-pages";
248                            }
249                    }
250                    else {
251                            if (isUser()) {
252                                    pagesName = "my-profile";
253                            }
254                            else {
255                                    pagesName = "public-pages";
256                            }
257                    }
258    
259                    return LanguageUtil.get(locale, pagesName);
260            }
261    
262            @Override
263            public Group getLiveGroup() {
264                    if (!isStagingGroup()) {
265                            return null;
266                    }
267    
268                    try {
269                            if (_liveGroup == null) {
270                                    _liveGroup = GroupLocalServiceUtil.getGroup(getLiveGroupId());
271    
272                                    if (_liveGroup instanceof GroupImpl) {
273                                            GroupImpl groupImpl = (GroupImpl)_liveGroup;
274    
275                                            groupImpl._stagingGroup = this;
276                                    }
277                                    else {
278                                            _liveGroup = new GroupWrapper(_liveGroup) {
279    
280                                                    @Override
281                                                    public Group getStagingGroup() {
282                                                            return GroupImpl.this;
283                                                    }
284    
285                                            };
286                                    }
287                            }
288    
289                            return _liveGroup;
290                    }
291                    catch (Exception e) {
292                            _log.error("Error getting live group for " + getLiveGroupId(), e);
293    
294                            return null;
295                    }
296            }
297    
298            @Override
299            public String getLiveParentTypeSettingsProperty(String key) {
300                    UnicodeProperties typeSettingsProperties =
301                            getParentLiveGroupTypeSettingsProperties();
302    
303                    return typeSettingsProperties.getProperty(key);
304            }
305    
306            @Override
307            public long getOrganizationId() {
308                    if (isOrganization()) {
309                            if (isStagingGroup()) {
310                                    Group liveGroup = getLiveGroup();
311    
312                                    return liveGroup.getClassPK();
313                            }
314                            else {
315                                    return getClassPK();
316                            }
317                    }
318    
319                    return 0;
320            }
321    
322            @Override
323            public Group getParentGroup() throws PortalException {
324                    long parentGroupId = getParentGroupId();
325    
326                    if (parentGroupId <= 0) {
327                            return null;
328                    }
329    
330                    return GroupLocalServiceUtil.getGroup(parentGroupId);
331            }
332    
333            @Override
334            public UnicodeProperties getParentLiveGroupTypeSettingsProperties() {
335                    try {
336                            if (isLayout()) {
337                                    Group parentGroup = GroupLocalServiceUtil.getGroup(
338                                            getParentGroupId());
339    
340                                    return parentGroup.getParentLiveGroupTypeSettingsProperties();
341                            }
342    
343                            if (isStagingGroup()) {
344                                    Group liveGroup = getLiveGroup();
345    
346                                    return liveGroup.getTypeSettingsProperties();
347                            }
348                    }
349                    catch (Exception e) {
350                    }
351    
352                    return getTypeSettingsProperties();
353            }
354    
355            @Override
356            public String getPathFriendlyURL(
357                    boolean privateLayout, ThemeDisplay themeDisplay) {
358    
359                    if (privateLayout) {
360                            if (isUser()) {
361                                    return themeDisplay.getPathFriendlyURLPrivateUser();
362                            }
363                            else {
364                                    return themeDisplay.getPathFriendlyURLPrivateGroup();
365                            }
366                    }
367                    else {
368                            return themeDisplay.getPathFriendlyURLPublic();
369                    }
370            }
371    
372            @Override
373            public LayoutSet getPrivateLayoutSet() {
374                    LayoutSet layoutSet = null;
375    
376                    try {
377                            layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
378                                    getGroupId(), true);
379                    }
380                    catch (Exception e) {
381                            _log.error(e, e);
382                    }
383    
384                    return layoutSet;
385            }
386    
387            @Override
388            public int getPrivateLayoutsPageCount() {
389                    try {
390                            return LayoutLocalServiceUtil.getLayoutsCount(this, true);
391                    }
392                    catch (Exception e) {
393                            _log.error(e, e);
394                    }
395    
396                    return 0;
397            }
398    
399            @Override
400            public LayoutSet getPublicLayoutSet() {
401                    LayoutSet layoutSet = null;
402    
403                    try {
404                            layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
405                                    getGroupId(), false);
406                    }
407                    catch (Exception e) {
408                            _log.error(e, e);
409                    }
410    
411                    return layoutSet;
412            }
413    
414            @Override
415            public int getPublicLayoutsPageCount() {
416                    try {
417                            return LayoutLocalServiceUtil.getLayoutsCount(this, false);
418                    }
419                    catch (Exception e) {
420                            _log.error(e, e);
421                    }
422    
423                    return 0;
424            }
425    
426            @Override
427            public long getRemoteLiveGroupId() {
428                    if (!isStagedRemotely()) {
429                            return GroupConstants.DEFAULT_LIVE_GROUP_ID;
430                    }
431    
432                    return GetterUtil.getLong(getTypeSettingsProperty("remoteGroupId"));
433            }
434    
435            @Override
436            public String getScopeDescriptiveName(ThemeDisplay themeDisplay)
437                    throws PortalException {
438    
439                    if (getGroupId() == themeDisplay.getScopeGroupId()) {
440                            StringBundler sb = new StringBundler(5);
441    
442                            sb.append(themeDisplay.translate("current-site"));
443                            sb.append(StringPool.SPACE);
444                            sb.append(StringPool.OPEN_PARENTHESIS);
445                            sb.append(
446                                    HtmlUtil.escape(getDescriptiveName(themeDisplay.getLocale())));
447                            sb.append(StringPool.CLOSE_PARENTHESIS);
448    
449                            return sb.toString();
450                    }
451                    else if (isLayout() && (getClassPK() == themeDisplay.getPlid())) {
452                            StringBundler sb = new StringBundler(5);
453    
454                            sb.append(themeDisplay.translate("current-page"));
455                            sb.append(StringPool.SPACE);
456                            sb.append(StringPool.OPEN_PARENTHESIS);
457                            sb.append(
458                                    HtmlUtil.escape(getDescriptiveName(themeDisplay.getLocale())));
459                            sb.append(StringPool.CLOSE_PARENTHESIS);
460    
461                            return sb.toString();
462                    }
463                    else if (isLayoutPrototype()) {
464                            return themeDisplay.translate("default");
465                    }
466                    else {
467                            return HtmlUtil.escape(
468                                    getDescriptiveName(themeDisplay.getLocale()));
469                    }
470            }
471    
472            @Override
473            public String getScopeLabel(ThemeDisplay themeDisplay) {
474                    String label = "site";
475    
476                    if (getGroupId() == themeDisplay.getScopeGroupId()) {
477                            label = "current-site";
478                    }
479                    else if (getGroupId() == themeDisplay.getCompanyGroupId()) {
480                            label = "global";
481                    }
482                    else if (isLayout()) {
483                            label = "page";
484                    }
485                    else {
486                            Group scopeGroup = themeDisplay.getScopeGroup();
487    
488                            if (scopeGroup.hasAncestor(getGroupId())) {
489                                    label = "parent-site";
490                            }
491                            else if (hasAncestor(scopeGroup.getGroupId())) {
492                                    label = "child-site";
493                            }
494                    }
495    
496                    return label;
497            }
498    
499            @Override
500            public Group getStagingGroup() {
501                    if (isStagingGroup()) {
502                            return null;
503                    }
504    
505                    try {
506                            if (_stagingGroup == null) {
507                                    _stagingGroup = GroupLocalServiceUtil.getStagingGroup(
508                                            getGroupId());
509    
510                                    if (_stagingGroup instanceof GroupImpl) {
511                                            GroupImpl groupImpl = (GroupImpl)_stagingGroup;
512    
513                                            groupImpl._liveGroup = this;
514                                    }
515                                    else {
516                                            _stagingGroup = new GroupWrapper(_stagingGroup) {
517    
518                                                    @Override
519                                                    public Group getLiveGroup() {
520                                                            return GroupImpl.this;
521                                                    }
522    
523                                            };
524                                    }
525                            }
526    
527                            return _stagingGroup;
528                    }
529                    catch (Exception e) {
530                            _log.error("Error getting staging group for " + getGroupId(), e);
531    
532                            return null;
533                    }
534            }
535    
536            @Override
537            public String getTypeLabel() {
538                    return GroupConstants.getTypeLabel(getType());
539            }
540    
541            @Override
542            public String getTypeSettings() {
543                    if (_typeSettingsProperties == null) {
544                            return super.getTypeSettings();
545                    }
546                    else {
547                            return _typeSettingsProperties.toString();
548                    }
549            }
550    
551            @Override
552            public UnicodeProperties getTypeSettingsProperties() {
553                    if (_typeSettingsProperties == null) {
554                            _typeSettingsProperties = new UnicodeProperties(true);
555    
556                            try {
557                                    _typeSettingsProperties.load(super.getTypeSettings());
558                            }
559                            catch (IOException ioe) {
560                                    _log.error(ioe, ioe);
561                            }
562                    }
563    
564                    return _typeSettingsProperties;
565            }
566    
567            @Override
568            public String getTypeSettingsProperty(String key) {
569                    UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
570    
571                    return typeSettingsProperties.getProperty(key);
572            }
573    
574            @Override
575            public String getUnambiguousName(String name, Locale locale) {
576                    try {
577                            StringBundler sb = new StringBundler(5);
578    
579                            sb.append(name);
580                            sb.append(StringPool.SPACE);
581                            sb.append(StringPool.OPEN_PARENTHESIS);
582                            sb.append(getDescriptiveName(locale));
583                            sb.append(StringPool.CLOSE_PARENTHESIS);
584    
585                            return sb.toString();
586                    }
587                    catch (Exception e) {
588                            return name;
589                    }
590            }
591    
592            @Override
593            public boolean hasAncestor(long groupId) {
594                    Group group = null;
595    
596                    if (isStagingGroup()) {
597                            group = getLiveGroup();
598                    }
599                    else {
600                            group = this;
601                    }
602    
603                    String treePath = group.getTreePath();
604    
605                    if ((groupId != group.getGroupId()) &&
606                            treePath.contains(StringPool.SLASH + groupId + StringPool.SLASH)) {
607    
608                            return true;
609                    }
610    
611                    return false;
612            }
613    
614            @Override
615            public boolean hasLocalOrRemoteStagingGroup() {
616                    if (hasRemoteStagingGroup() || hasStagingGroup()) {
617                            return true;
618                    }
619    
620                    return false;
621            }
622    
623            @Override
624            public boolean hasPrivateLayouts() {
625                    if (getPrivateLayoutsPageCount() > 0) {
626                            return true;
627                    }
628                    else {
629                            return false;
630                    }
631            }
632    
633            @Override
634            public boolean hasPublicLayouts() {
635                    if (getPublicLayoutsPageCount() > 0) {
636                            return true;
637                    }
638                    else {
639                            return false;
640                    }
641            }
642    
643            @Override
644            public boolean hasRemoteStagingGroup() {
645                    if (getRemoteStagingGroupCount() > 0) {
646                            return true;
647                    }
648    
649                    return false;
650            }
651    
652            @Override
653            public boolean hasStagingGroup() {
654                    if (isStagingGroup()) {
655                            return false;
656                    }
657    
658                    if (_stagingGroup != null) {
659                            return true;
660                    }
661    
662                    try {
663                            return GroupLocalServiceUtil.hasStagingGroup(getGroupId());
664                    }
665                    catch (Exception e) {
666                            return false;
667                    }
668            }
669    
670            /**
671             * @deprecated As of 7.0.0, replaced by {@link #hasAncestor}
672             */
673            @Deprecated
674            @Override
675            public boolean isChild(long groupId) {
676                    return hasAncestor(groupId);
677            }
678    
679            /**
680             * @deprecated As of 6.1.0, renamed to {@link #isRegularSite}
681             */
682            @Deprecated
683            @Override
684            public boolean isCommunity() {
685                    return isRegularSite();
686            }
687    
688            @Override
689            public boolean isCompany() {
690                    return hasClassName(Company.class) || isCompanyStagingGroup();
691            }
692    
693            @Override
694            public boolean isCompanyStagingGroup() {
695                    Group liveGroup = getLiveGroup();
696    
697                    if (liveGroup == null) {
698                            return false;
699                    }
700    
701                    return liveGroup.isCompany();
702            }
703    
704            @Override
705            public boolean isControlPanel() {
706                    String name = getName();
707    
708                    if (name.equals(GroupConstants.CONTROL_PANEL)) {
709                            return true;
710                    }
711                    else {
712                            return false;
713                    }
714            }
715    
716            @Override
717            public boolean isGuest() {
718                    String name = getName();
719    
720                    if (name.equals(GroupConstants.GUEST)) {
721                            return true;
722                    }
723                    else {
724                            return false;
725                    }
726            }
727    
728            @Override
729            public boolean isInStagingPortlet(String portletId) {
730                    Group liveGroup = getLiveGroup();
731    
732                    if (liveGroup == null) {
733                            return false;
734                    }
735    
736                    return liveGroup.isStagedPortlet(portletId);
737            }
738    
739            @Override
740            public boolean isLayout() {
741                    return hasClassName(Layout.class);
742            }
743    
744            @Override
745            public boolean isLayoutPrototype() {
746                    return hasClassName(LayoutPrototype.class);
747            }
748    
749            @Override
750            public boolean isLayoutSetPrototype() {
751                    return hasClassName(LayoutSetPrototype.class);
752            }
753    
754            @Override
755            public boolean isLimitedToParentSiteMembers() {
756                    if ((getParentGroupId() != GroupConstants.DEFAULT_PARENT_GROUP_ID) &&
757                            (getMembershipRestriction() ==
758                                    GroupConstants.MEMBERSHIP_RESTRICTION_TO_PARENT_SITE_MEMBERS)) {
759    
760                            return true;
761                    }
762    
763                    return false;
764            }
765    
766            @Override
767            public boolean isOrganization() {
768                    return hasClassName(Organization.class);
769            }
770    
771            @Override
772            public boolean isRegularSite() {
773                    return hasClassName(Group.class);
774            }
775    
776            @Override
777            public boolean isRoot() {
778                    if (getParentGroupId() ==
779                                    GroupConstants.DEFAULT_PARENT_GROUP_ID) {
780    
781                            return true;
782                    }
783    
784                    return false;
785            }
786    
787            @Override
788            public boolean isShowSite(
789                            PermissionChecker permissionChecker, boolean privateSite)
790                    throws PortalException {
791    
792                    if (!isControlPanel() && !isSite() && !isUser()) {
793                            return false;
794                    }
795    
796                    boolean showSite = true;
797    
798                    Layout defaultLayout = null;
799    
800                    int siteLayoutsCount = LayoutLocalServiceUtil.getLayoutsCount(
801                            this, privateSite);
802    
803                    if (siteLayoutsCount == 0) {
804                            boolean hasPowerUserRole = RoleLocalServiceUtil.hasUserRole(
805                                    permissionChecker.getUserId(), permissionChecker.getCompanyId(),
806                                    RoleConstants.POWER_USER, true);
807    
808                            if (isSite()) {
809                                    if (privateSite) {
810                                            showSite =
811                                                    PropsValues.MY_SITES_SHOW_PRIVATE_SITES_WITH_NO_LAYOUTS;
812                                    }
813                                    else {
814                                            showSite =
815                                                    PropsValues.MY_SITES_SHOW_PUBLIC_SITES_WITH_NO_LAYOUTS;
816                                    }
817                            }
818                            else if (isOrganization()) {
819                                    showSite = false;
820                            }
821                            else if (isUser()) {
822                                    if (privateSite) {
823                                            showSite =
824                                                    PropsValues.
825                                                            MY_SITES_SHOW_USER_PRIVATE_SITES_WITH_NO_LAYOUTS;
826    
827                                            if (PropsValues.
828                                                            LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED &&
829                                                    !hasPowerUserRole) {
830    
831                                                    showSite = false;
832                                            }
833                                    }
834                                    else {
835                                            showSite =
836                                                    PropsValues.
837                                                            MY_SITES_SHOW_USER_PUBLIC_SITES_WITH_NO_LAYOUTS;
838    
839                                            if (PropsValues.
840                                                            LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED &&
841                                                    !hasPowerUserRole) {
842    
843                                                    showSite = false;
844                                            }
845                                    }
846                            }
847                    }
848                    else {
849                            defaultLayout = LayoutLocalServiceUtil.fetchFirstLayout(
850                                    getGroupId(), privateSite,
851                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
852    
853                            if ((defaultLayout != null ) &&
854                                    !LayoutPermissionUtil.contains(
855                                            permissionChecker, defaultLayout, true, ActionKeys.VIEW)) {
856    
857                                    showSite = false;
858                            }
859                            else if (isOrganization() && !isSite()) {
860                                    _log.error(
861                                            "Group " + getGroupId() +
862                                                    " is an organization site that does not have pages");
863                            }
864                    }
865    
866                    return showSite;
867            }
868    
869            @Override
870            public boolean isStaged() {
871                    return GetterUtil.getBoolean(
872                            getLiveParentTypeSettingsProperty("staged"));
873            }
874    
875            @Override
876            public boolean isStagedPortlet(String portletId) {
877                    UnicodeProperties typeSettingsProperties =
878                            getParentLiveGroupTypeSettingsProperties();
879    
880                    portletId = PortletConstants.getRootPortletId(portletId);
881    
882                    String typeSettingsProperty = typeSettingsProperties.getProperty(
883                            StagingUtil.getStagedPortletId(portletId));
884    
885                    if (Validator.isNotNull(typeSettingsProperty)) {
886                            return GetterUtil.getBoolean(typeSettingsProperty);
887                    }
888    
889                    try {
890                            Portlet portlet = PortletLocalServiceUtil.getPortletById(portletId);
891    
892                            String portletDataHandlerClass =
893                                    portlet.getPortletDataHandlerClass();
894    
895                            for (Map.Entry<String, String> entry :
896                                            typeSettingsProperties.entrySet()) {
897    
898                                    String key = entry.getKey();
899    
900                                    if (!key.contains(StagingConstants.STAGED_PORTLET)) {
901                                            continue;
902                                    }
903    
904                                    String stagedPortletId = StringUtil.replace(
905                                            key, StagingConstants.STAGED_PORTLET, StringPool.BLANK);
906    
907                                    Portlet stagedPortlet = PortletLocalServiceUtil.getPortletById(
908                                            stagedPortletId);
909    
910                                    if (portletDataHandlerClass.equals(
911                                                    stagedPortlet.getPortletDataHandlerClass())) {
912    
913                                            return GetterUtil.getBoolean(entry.getValue());
914                                    }
915                            }
916                    }
917                    catch (Exception e) {
918                    }
919    
920                    return true;
921            }
922    
923            @Override
924            public boolean isStagedRemotely() {
925                    return GetterUtil.getBoolean(
926                            getLiveParentTypeSettingsProperty("stagedRemotely"));
927            }
928    
929            @Override
930            public boolean isStagingGroup() {
931                    if (getLiveGroupId() == GroupConstants.DEFAULT_LIVE_GROUP_ID) {
932                            return false;
933                    }
934                    else {
935                            return true;
936                    }
937            }
938    
939            @Override
940            public boolean isUser() {
941                    return hasClassName(User.class);
942            }
943    
944            @Override
945            public boolean isUserGroup() {
946                    return hasClassName(UserGroup.class);
947            }
948    
949            @Override
950            public boolean isUserPersonalSite() {
951                    return hasClassName(UserPersonalSite.class);
952            }
953    
954            @Override
955            public void setTypeSettings(String typeSettings) {
956                    _typeSettingsProperties = null;
957    
958                    super.setTypeSettings(typeSettings);
959            }
960    
961            @Override
962            public void setTypeSettingsProperties(
963                    UnicodeProperties typeSettingsProperties) {
964    
965                    _typeSettingsProperties = typeSettingsProperties;
966    
967                    super.setTypeSettings(_typeSettingsProperties.toString());
968            }
969    
970            protected long getDefaultPlid(boolean privateLayout) {
971                    try {
972                            Layout firstLayout = LayoutLocalServiceUtil.fetchFirstLayout(
973                                    getGroupId(), privateLayout,
974                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
975    
976                            if (firstLayout != null) {
977                                    return firstLayout.getPlid();
978                            }
979                    }
980                    catch (Exception e) {
981                            if (_log.isWarnEnabled()) {
982                                    _log.warn(e.getMessage());
983                            }
984                    }
985    
986                    return LayoutConstants.DEFAULT_PLID;
987            }
988    
989            protected boolean hasClassName(Class<?> clazz) {
990                    long classNameId = getClassNameId();
991    
992                    if (classNameId == PortalUtil.getClassNameId(clazz)) {
993                            return true;
994                    }
995                    else {
996                            return false;
997                    }
998            }
999    
1000            private static final Log _log = LogFactoryUtil.getLog(GroupImpl.class);
1001    
1002            private Group _liveGroup;
1003            private Group _stagingGroup;
1004            private UnicodeProperties _typeSettingsProperties;
1005    
1006    }