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.kernel.servlet.taglib.ui;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.portlet.PortletProvider;
019    import com.liferay.portal.kernel.portlet.PortletProviderUtil;
020    import com.liferay.portal.kernel.util.ArrayUtil;
021    import com.liferay.portal.kernel.util.CookieKeys;
022    import com.liferay.portal.kernel.util.StringPool;
023    import com.liferay.portal.kernel.util.Validator;
024    import com.liferay.portal.kernel.util.WebKeys;
025    import com.liferay.portal.model.Account;
026    import com.liferay.portal.model.Group;
027    import com.liferay.portal.model.GroupConstants;
028    import com.liferay.portal.model.Layout;
029    import com.liferay.portal.model.LayoutConstants;
030    import com.liferay.portal.model.LayoutSet;
031    import com.liferay.portal.model.LayoutType;
032    import com.liferay.portal.model.Organization;
033    import com.liferay.portal.model.User;
034    import com.liferay.portal.service.GroupLocalServiceUtil;
035    import com.liferay.portal.service.LayoutLocalServiceUtil;
036    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
037    import com.liferay.portal.service.OrganizationLocalServiceUtil;
038    import com.liferay.portal.service.UserLocalServiceUtil;
039    import com.liferay.portal.theme.PortletDisplay;
040    import com.liferay.portal.theme.ThemeDisplay;
041    import com.liferay.portal.util.PortalUtil;
042    
043    import java.util.ArrayList;
044    import java.util.Collections;
045    import java.util.List;
046    
047    import javax.servlet.http.HttpServletRequest;
048    import javax.servlet.http.HttpSession;
049    
050    /**
051     * @author Jos?? Manuel Navarro
052     */
053    public class BreadcrumbUtil {
054    
055            public static final int ENTRY_TYPE_ANY = 0;
056    
057            public static final int ENTRY_TYPE_CURRENT_GROUP = 1;
058    
059            public static final int ENTRY_TYPE_GUEST_GROUP = 2;
060    
061            public static final int ENTRY_TYPE_LAYOUT = 3;
062    
063            public static final int ENTRY_TYPE_PARENT_GROUP = 4;
064    
065            public static final int ENTRY_TYPE_PORTLET = 5;
066    
067            public static List<BreadcrumbEntry> getBreadcrumbEntries(
068                            HttpServletRequest request, int[] types)
069                    throws Exception {
070    
071                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
072                            WebKeys.THEME_DISPLAY);
073    
074                    List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
075    
076                    boolean hasAll = ArrayUtil.contains(types, ENTRY_TYPE_ANY);
077    
078                    if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_GUEST_GROUP)) {
079                            BreadcrumbEntry breadcrumbEntry = getGuestGroupBreadcrumbEntry(
080                                    themeDisplay);
081    
082                            if (breadcrumbEntry != null) {
083                                    breadcrumbEntries.add(breadcrumbEntry);
084                            }
085                    }
086    
087                    if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_PARENT_GROUP)) {
088                            breadcrumbEntries.addAll(
089                                    getParentGroupBreadcrumbEntries(themeDisplay));
090                    }
091    
092                    if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_CURRENT_GROUP)) {
093                            BreadcrumbEntry breadcrumbEntry = getScopeGroupBreadcrumbEntry(
094                                    themeDisplay);
095    
096                            if (breadcrumbEntry != null) {
097                                    breadcrumbEntries.add(breadcrumbEntry);
098                            }
099                    }
100    
101                    if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_LAYOUT)) {
102                            breadcrumbEntries.addAll(getLayoutBreadcrumbEntries(themeDisplay));
103                    }
104    
105                    if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_PORTLET)) {
106                            breadcrumbEntries.addAll(getPortletBreadcrumbEntries(request));
107                    }
108    
109                    return breadcrumbEntries;
110            }
111    
112            public static BreadcrumbEntry getGuestGroupBreadcrumbEntry(
113                            ThemeDisplay themeDisplay)
114                    throws Exception {
115    
116                    Group group = GroupLocalServiceUtil.getGroup(
117                            themeDisplay.getCompanyId(), GroupConstants.GUEST);
118    
119                    if (group.getPublicLayoutsPageCount() == 0) {
120                            return null;
121                    }
122    
123                    LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
124                            group.getGroupId(), false);
125    
126                    BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
127    
128                    Account account = themeDisplay.getAccount();
129    
130                    breadcrumbEntry.setTitle(account.getName());
131    
132                    String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
133                            layoutSet, themeDisplay);
134    
135                    if (themeDisplay.isAddSessionIdToURL()) {
136                            layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
137                                    layoutSetFriendlyURL, themeDisplay.getSessionId());
138                    }
139    
140                    breadcrumbEntry.setURL(layoutSetFriendlyURL);
141    
142                    return breadcrumbEntry;
143            }
144    
145            public static List<BreadcrumbEntry> getLayoutBreadcrumbEntries(
146                            ThemeDisplay themeDisplay)
147                    throws Exception {
148    
149                    List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
150    
151                    Layout layout = themeDisplay.getLayout();
152    
153                    Group group = layout.getGroup();
154    
155                    if (!group.isLayoutPrototype()) {
156                            _addLayoutBreadcrumbEntries(
157                                    breadcrumbEntries, themeDisplay, layout);
158                    }
159    
160                    return breadcrumbEntries;
161            }
162    
163            public static List<BreadcrumbEntry> getParentGroupBreadcrumbEntries(
164                            ThemeDisplay themeDisplay)
165                    throws Exception {
166    
167                    List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
168    
169                    Layout layout = themeDisplay.getLayout();
170    
171                    LayoutSet parentLayoutSet = _getParentLayoutSet(layout.getLayoutSet());
172    
173                    if (parentLayoutSet != null) {
174                            _addGroupsBreadcrumbEntries(
175                                    breadcrumbEntries, themeDisplay, parentLayoutSet, true);
176                    }
177    
178                    return breadcrumbEntries;
179            }
180    
181            public static List<BreadcrumbEntry> getPortletBreadcrumbEntries(
182                    HttpServletRequest request) {
183    
184                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
185                            WebKeys.THEME_DISPLAY);
186    
187                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
188    
189                    String name = WebKeys.PORTLET_BREADCRUMBS;
190    
191                    List<BreadcrumbEntry> breadcrumbEntries =
192                            (List<BreadcrumbEntry>)request.getAttribute(name);
193    
194                    if (Validator.isNotNull(portletDisplay.getId()) &&
195                            !portletDisplay.isFocused() &&
196                            !Validator.equals(
197                                    portletDisplay.getId(),
198                                    PortletProviderUtil.getPortletId(
199                                            BreadcrumbEntry.class.getName(),
200                                            PortletProvider.Action.VIEW))) {
201    
202                            name = name.concat(
203                                    StringPool.UNDERLINE.concat(portletDisplay.getId()));
204    
205                            List<BreadcrumbEntry> portletBreadcrumbEntries =
206                                    (List<BreadcrumbEntry>)request.getAttribute(name);
207    
208                            if (portletBreadcrumbEntries != null) {
209                                    breadcrumbEntries = portletBreadcrumbEntries;
210                            }
211                    }
212    
213                    if (breadcrumbEntries == null) {
214                            return Collections.emptyList();
215                    }
216    
217                    for (int i = 0; i < breadcrumbEntries.size() - 1; i++) {
218                            BreadcrumbEntry portletBreadcrumbEntry = breadcrumbEntries.get(i);
219    
220                            String url = portletBreadcrumbEntry.getURL();
221    
222                            if (Validator.isNotNull(url) && !CookieKeys.hasSessionId(request)) {
223                                    HttpSession session = request.getSession();
224    
225                                    portletBreadcrumbEntry.setURL(
226                                            PortalUtil.getURLWithSessionId(url, session.getId()));
227                            }
228                    }
229    
230                    return breadcrumbEntries;
231            }
232    
233            public static BreadcrumbEntry getScopeGroupBreadcrumbEntry(
234                            ThemeDisplay themeDisplay)
235                    throws Exception {
236    
237                    List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
238    
239                    Layout layout = themeDisplay.getLayout();
240    
241                    _addGroupsBreadcrumbEntries(
242                            breadcrumbEntries, themeDisplay, layout.getLayoutSet(), false);
243    
244                    if (breadcrumbEntries.isEmpty()) {
245                            return null;
246                    }
247    
248                    return breadcrumbEntries.get(0);
249            }
250    
251            private static void _addGroupsBreadcrumbEntries(
252                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
253                            LayoutSet layoutSet, boolean includeParentGroups)
254                    throws Exception {
255    
256                    Group group = layoutSet.getGroup();
257    
258                    if (group.isControlPanel()) {
259                            return;
260                    }
261    
262                    if (includeParentGroups) {
263                            LayoutSet parentLayoutSet = _getParentLayoutSet(layoutSet);
264    
265                            if (parentLayoutSet != null) {
266                                    _addGroupsBreadcrumbEntries(
267                                            breadcrumbEntries, themeDisplay, parentLayoutSet, true);
268                            }
269                    }
270    
271                    int layoutsPageCount = 0;
272    
273                    if (layoutSet.isPrivateLayout()) {
274                            layoutsPageCount = group.getPrivateLayoutsPageCount();
275                    }
276                    else {
277                            layoutsPageCount = group.getPublicLayoutsPageCount();
278                    }
279    
280                    if ((layoutsPageCount > 0) && !group.isGuest()) {
281                            String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
282                                    layoutSet, themeDisplay);
283    
284                            if (themeDisplay.isAddSessionIdToURL()) {
285                                    layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
286                                            layoutSetFriendlyURL, themeDisplay.getSessionId());
287                            }
288    
289                            BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
290    
291                            breadcrumbEntry.setTitle(
292                                    group.getDescriptiveName(themeDisplay.getLocale()));
293                            breadcrumbEntry.setURL(layoutSetFriendlyURL);
294    
295                            breadcrumbEntries.add(breadcrumbEntry);
296                    }
297            }
298    
299            private static void _addLayoutBreadcrumbEntries(
300                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
301                            Layout layout)
302                    throws Exception {
303    
304                    if (layout.getParentLayoutId() !=
305                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
306    
307                            Layout parentLayout = LayoutLocalServiceUtil.getParentLayout(
308                                    layout);
309    
310                            _addLayoutBreadcrumbEntries(
311                                    breadcrumbEntries, themeDisplay, parentLayout);
312                    }
313    
314                    BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
315    
316                    breadcrumbEntry.setBaseModel(layout);
317    
318                    LayoutType layoutType = layout.getLayoutType();
319    
320                    if (!layoutType.isBrowsable()) {
321                            breadcrumbEntry.setBrowsable(false);
322                    }
323    
324                    String layoutName = layout.getName(themeDisplay.getLocale());
325    
326                    if (layout.isTypeControlPanel()) {
327                            if (layoutName.equals(LayoutConstants.NAME_CONTROL_PANEL_DEFAULT)) {
328                                    layoutName = LanguageUtil.get(
329                                            themeDisplay.getLocale(), "control-panel");
330                            }
331                    }
332    
333                    breadcrumbEntry.setTitle(layoutName);
334    
335                    String layoutURL = PortalUtil.getLayoutFullURL(layout, themeDisplay);
336    
337                    if (themeDisplay.isAddSessionIdToURL()) {
338                            layoutURL = PortalUtil.getURLWithSessionId(
339                                    layoutURL, themeDisplay.getSessionId());
340                    }
341    
342                    breadcrumbEntry.setURL(layoutURL);
343    
344                    breadcrumbEntries.add(breadcrumbEntry);
345            }
346    
347            private static LayoutSet _getParentLayoutSet(LayoutSet layoutSet)
348                    throws Exception {
349    
350                    Group group = layoutSet.getGroup();
351    
352                    if (group.isSite()) {
353                            Group parentGroup = group.getParentGroup();
354    
355                            if (parentGroup != null) {
356                                    return LayoutSetLocalServiceUtil.getLayoutSet(
357                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
358                            }
359                    }
360                    else if (group.isUser()) {
361                            User user = UserLocalServiceUtil.getUser(group.getClassPK());
362    
363                            List<Organization> organizations =
364                                    OrganizationLocalServiceUtil.getUserOrganizations(
365                                            user.getUserId());
366    
367                            if (!organizations.isEmpty()) {
368                                    Organization organization = organizations.get(0);
369    
370                                    Group parentGroup = organization.getGroup();
371    
372                                    return LayoutSetLocalServiceUtil.getLayoutSet(
373                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
374                            }
375                    }
376    
377                    return null;
378            }
379    
380    }