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.HttpUtil;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.kernel.util.WebKeys;
026    import com.liferay.portal.model.Account;
027    import com.liferay.portal.model.Group;
028    import com.liferay.portal.model.GroupConstants;
029    import com.liferay.portal.model.Layout;
030    import com.liferay.portal.model.LayoutConstants;
031    import com.liferay.portal.model.LayoutSet;
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                    if (Validator.isNotNull(portletDisplay.getId()) &&
192                            !portletDisplay.isFocused() &&
193                            !Validator.equals(
194                                    portletDisplay.getId(),
195                                    PortletProviderUtil.getPortletId(
196                                            BreadcrumbEntry.class.getName(),
197                                            PortletProvider.Action.VIEW))) {
198    
199                            name = name.concat(
200                                    StringPool.UNDERLINE.concat(portletDisplay.getId()));
201                    }
202    
203                    List<BreadcrumbEntry> portletBreadcrumbEntries =
204                            (List<BreadcrumbEntry>)request.getAttribute(name);
205    
206                    if (portletBreadcrumbEntries == null) {
207                            return Collections.emptyList();
208                    }
209    
210                    for (int i = 0; i < portletBreadcrumbEntries.size() - 1; i++) {
211                            BreadcrumbEntry portletBreadcrumbEntry =
212                                    portletBreadcrumbEntries.get(i);
213    
214                            String url = portletBreadcrumbEntry.getURL();
215    
216                            if (Validator.isNotNull(url) && !CookieKeys.hasSessionId(request)) {
217                                    HttpSession session = request.getSession();
218    
219                                    portletBreadcrumbEntry.setURL(
220                                            PortalUtil.getURLWithSessionId(url, session.getId()));
221                            }
222                    }
223    
224                    return portletBreadcrumbEntries;
225            }
226    
227            public static BreadcrumbEntry getScopeGroupBreadcrumbEntry(
228                            ThemeDisplay themeDisplay)
229                    throws Exception {
230    
231                    List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
232    
233                    Layout layout = themeDisplay.getLayout();
234    
235                    _addGroupsBreadcrumbEntries(
236                            breadcrumbEntries, themeDisplay, layout.getLayoutSet(), false);
237    
238                    if (breadcrumbEntries.isEmpty()) {
239                            return null;
240                    }
241    
242                    return breadcrumbEntries.get(0);
243            }
244    
245            private static void _addGroupsBreadcrumbEntries(
246                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
247                            LayoutSet layoutSet, boolean includeParentGroups)
248                    throws Exception {
249    
250                    Group group = layoutSet.getGroup();
251    
252                    if (group.isControlPanel() || group.isUserPersonalPanel()) {
253                            return;
254                    }
255    
256                    if (includeParentGroups) {
257                            LayoutSet parentLayoutSet = _getParentLayoutSet(layoutSet);
258    
259                            if (parentLayoutSet != null) {
260                                    _addGroupsBreadcrumbEntries(
261                                            breadcrumbEntries, themeDisplay, parentLayoutSet, true);
262                            }
263                    }
264    
265                    int layoutsPageCount = 0;
266    
267                    if (layoutSet.isPrivateLayout()) {
268                            layoutsPageCount = group.getPrivateLayoutsPageCount();
269                    }
270                    else {
271                            layoutsPageCount = group.getPublicLayoutsPageCount();
272                    }
273    
274                    if ((layoutsPageCount > 0) && !group.isGuest()) {
275                            String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
276                                    layoutSet, themeDisplay);
277    
278                            if (themeDisplay.isAddSessionIdToURL()) {
279                                    layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
280                                            layoutSetFriendlyURL, themeDisplay.getSessionId());
281                            }
282    
283                            BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
284    
285                            breadcrumbEntry.setTitle(
286                                    group.getDescriptiveName(themeDisplay.getLocale()));
287                            breadcrumbEntry.setURL(layoutSetFriendlyURL);
288    
289                            breadcrumbEntries.add(breadcrumbEntry);
290                    }
291            }
292    
293            private static void _addLayoutBreadcrumbEntries(
294                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
295                            Layout layout)
296                    throws Exception {
297    
298                    if (layout.getParentLayoutId() !=
299                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
300    
301                            Layout parentLayout = LayoutLocalServiceUtil.getParentLayout(
302                                    layout);
303    
304                            _addLayoutBreadcrumbEntries(
305                                    breadcrumbEntries, themeDisplay, parentLayout);
306                    }
307    
308                    BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
309    
310                    breadcrumbEntry.setBaseModel(layout);
311    
312                    String layoutName = layout.getName(themeDisplay.getLocale());
313    
314                    if (layout.isTypeControlPanel()) {
315                            if (layoutName.equals(LayoutConstants.NAME_CONTROL_PANEL_DEFAULT)) {
316                                    layoutName = LanguageUtil.get(
317                                            themeDisplay.getLocale(), "control-panel");
318                            }
319                    }
320    
321                    breadcrumbEntry.setTitle(layoutName);
322    
323                    String layoutURL = PortalUtil.getLayoutFullURL(layout, themeDisplay);
324    
325                    if (themeDisplay.isAddSessionIdToURL()) {
326                            layoutURL = PortalUtil.getURLWithSessionId(
327                                    layoutURL, themeDisplay.getSessionId());
328                    }
329    
330                    if (layout.isTypeControlPanel()) {
331                            layoutURL = HttpUtil.removeParameter(
332                                    layoutURL, "controlPanelCategory");
333                    }
334    
335                    breadcrumbEntry.setURL(layoutURL);
336    
337                    breadcrumbEntries.add(breadcrumbEntry);
338            }
339    
340            private static LayoutSet _getParentLayoutSet(LayoutSet layoutSet)
341                    throws Exception {
342    
343                    Group group = layoutSet.getGroup();
344    
345                    if (group.isSite()) {
346                            Group parentGroup = group.getParentGroup();
347    
348                            if (parentGroup != null) {
349                                    return LayoutSetLocalServiceUtil.getLayoutSet(
350                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
351                            }
352                    }
353                    else if (group.isUser()) {
354                            User user = UserLocalServiceUtil.getUser(group.getClassPK());
355    
356                            List<Organization> organizations =
357                                    OrganizationLocalServiceUtil.getUserOrganizations(
358                                            user.getUserId());
359    
360                            if (!organizations.isEmpty()) {
361                                    Organization organization = organizations.get(0);
362    
363                                    Group parentGroup = organization.getGroup();
364    
365                                    return LayoutSetLocalServiceUtil.getLayoutSet(
366                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
367                            }
368                    }
369    
370                    return null;
371            }
372    
373    }