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