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.util.ArrayUtil;
019    import com.liferay.portal.kernel.util.CookieKeys;
020    import com.liferay.portal.kernel.util.HttpUtil;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portal.kernel.util.WebKeys;
024    import com.liferay.portal.model.Account;
025    import com.liferay.portal.model.Group;
026    import com.liferay.portal.model.GroupConstants;
027    import com.liferay.portal.model.Layout;
028    import com.liferay.portal.model.LayoutConstants;
029    import com.liferay.portal.model.LayoutSet;
030    import com.liferay.portal.model.Organization;
031    import com.liferay.portal.model.User;
032    import com.liferay.portal.service.GroupLocalServiceUtil;
033    import com.liferay.portal.service.LayoutLocalServiceUtil;
034    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
035    import com.liferay.portal.service.OrganizationLocalServiceUtil;
036    import com.liferay.portal.service.UserLocalServiceUtil;
037    import com.liferay.portal.theme.PortletDisplay;
038    import com.liferay.portal.theme.ThemeDisplay;
039    import com.liferay.portal.util.PortalUtil;
040    import com.liferay.portal.util.PortletKeys;
041    
042    import java.util.ArrayList;
043    import java.util.Collections;
044    import java.util.List;
045    
046    import javax.servlet.http.HttpServletRequest;
047    import javax.servlet.http.HttpSession;
048    
049    /**
050     * @author Jos?? Manuel Navarro
051     */
052    public class BreadcrumbUtil {
053    
054            public static final int ENTRY_TYPE_ANY = 0;
055    
056            public static final int ENTRY_TYPE_CURRENT_GROUP = 1;
057    
058            public static final int ENTRY_TYPE_GUEST_GROUP = 2;
059    
060            public static final int ENTRY_TYPE_LAYOUT = 3;
061    
062            public static final int ENTRY_TYPE_PARENT_GROUP = 4;
063    
064            public static final int ENTRY_TYPE_PORTLET = 5;
065    
066            public static List<BreadcrumbEntry> getBreadcrumbEntries(
067                            HttpServletRequest request, int[] types)
068                    throws Exception {
069    
070                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
071                            WebKeys.THEME_DISPLAY);
072    
073                    List<BreadcrumbEntry> breadcrumbEntries =
074                            new ArrayList<BreadcrumbEntry>();
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 =
150                            new ArrayList<BreadcrumbEntry>();
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 =
169                            new ArrayList<BreadcrumbEntry>();
170    
171                    Layout layout = themeDisplay.getLayout();
172    
173                    LayoutSet parentLayoutSet = _getParentLayoutSet(layout.getLayoutSet());
174    
175                    if (parentLayoutSet != null) {
176                            _addGroupsBreadcrumbEntries(
177                                    breadcrumbEntries, themeDisplay, parentLayoutSet, true);
178                    }
179    
180                    return breadcrumbEntries;
181            }
182    
183            public static List<BreadcrumbEntry> getPortletBreadcrumbEntries(
184                    HttpServletRequest request) {
185    
186                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
187                            WebKeys.THEME_DISPLAY);
188    
189                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
190    
191                    String portletName = portletDisplay.getPortletName();
192    
193                    String name = WebKeys.PORTLET_BREADCRUMBS;
194    
195                    if (Validator.isNotNull(portletDisplay.getId()) &&
196                            !portletName.equals(PortletKeys.BREADCRUMB) &&
197                            !portletDisplay.isFocused()) {
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 =
232                            new ArrayList<BreadcrumbEntry>();
233    
234                    Layout layout = themeDisplay.getLayout();
235    
236                    _addGroupsBreadcrumbEntries(
237                            breadcrumbEntries, themeDisplay, layout.getLayoutSet(), false);
238    
239                    if (breadcrumbEntries.isEmpty()) {
240                            return null;
241                    }
242    
243                    return breadcrumbEntries.get(0);
244            }
245    
246            private static void _addGroupsBreadcrumbEntries(
247                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
248                            LayoutSet layoutSet, boolean includeParentGroups)
249                    throws Exception {
250    
251                    Group group = layoutSet.getGroup();
252    
253                    if (group.isControlPanel()) {
254                            return;
255                    }
256    
257                    if (includeParentGroups) {
258                            LayoutSet parentLayoutSet = _getParentLayoutSet(layoutSet);
259    
260                            if (parentLayoutSet != null) {
261                                    _addGroupsBreadcrumbEntries(
262                                            breadcrumbEntries, themeDisplay, parentLayoutSet, true);
263                            }
264                    }
265    
266                    int layoutsPageCount = 0;
267    
268                    if (layoutSet.isPrivateLayout()) {
269                            layoutsPageCount = group.getPrivateLayoutsPageCount();
270                    }
271                    else {
272                            layoutsPageCount = group.getPublicLayoutsPageCount();
273                    }
274    
275                    if ((layoutsPageCount > 0) && !group.isGuest()) {
276                            String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
277                                    layoutSet, themeDisplay);
278    
279                            if (themeDisplay.isAddSessionIdToURL()) {
280                                    layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
281                                            layoutSetFriendlyURL, themeDisplay.getSessionId());
282                            }
283    
284                            BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
285    
286                            breadcrumbEntry.setTitle(
287                                    group.getDescriptiveName(themeDisplay.getLocale()));
288                            breadcrumbEntry.setURL(layoutSetFriendlyURL);
289    
290                            breadcrumbEntries.add(breadcrumbEntry);
291                    }
292            }
293    
294            private static void _addLayoutBreadcrumbEntries(
295                            List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
296                            Layout layout)
297                    throws Exception {
298    
299                    if (layout.getParentLayoutId() !=
300                                    LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
301    
302                            Layout parentLayout = LayoutLocalServiceUtil.getParentLayout(
303                                    layout);
304    
305                            _addLayoutBreadcrumbEntries(
306                                    breadcrumbEntries, themeDisplay, parentLayout);
307                    }
308    
309                    BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
310    
311                    breadcrumbEntry.setBaseModel(layout);
312    
313                    String layoutName = layout.getName(themeDisplay.getLocale());
314    
315                    if (layout.isTypeControlPanel()) {
316                            if (layoutName.equals(LayoutConstants.NAME_CONTROL_PANEL_DEFAULT)) {
317                                    layoutName = LanguageUtil.get(
318                                            themeDisplay.getLocale(), "control-panel");
319                            }
320                    }
321    
322                    breadcrumbEntry.setTitle(layoutName);
323    
324                    String layoutURL = PortalUtil.getLayoutFullURL(layout, themeDisplay);
325    
326                    if (themeDisplay.isAddSessionIdToURL()) {
327                            layoutURL = PortalUtil.getURLWithSessionId(
328                                    layoutURL, themeDisplay.getSessionId());
329                    }
330    
331                    if (layout.isTypeControlPanel()) {
332                            layoutURL = HttpUtil.removeParameter(
333                                    layoutURL, "controlPanelCategory");
334                    }
335    
336                    breadcrumbEntry.setURL(layoutURL);
337    
338                    breadcrumbEntries.add(breadcrumbEntry);
339            }
340    
341            private static LayoutSet _getParentLayoutSet(LayoutSet layoutSet)
342                    throws Exception {
343    
344                    Group group = layoutSet.getGroup();
345    
346                    if (group.isSite()) {
347                            Group parentGroup = group.getParentGroup();
348    
349                            if (parentGroup != null) {
350                                    return LayoutSetLocalServiceUtil.getLayoutSet(
351                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
352                            }
353                    }
354                    else if (group.isUser()) {
355                            User user = UserLocalServiceUtil.getUser(group.getClassPK());
356    
357                            List<Organization> organizations =
358                                    OrganizationLocalServiceUtil.getUserOrganizations(
359                                            user.getUserId());
360    
361                            if (!organizations.isEmpty()) {
362                                    Organization organization = organizations.get(0);
363    
364                                    Group parentGroup = organization.getGroup();
365    
366                                    return LayoutSetLocalServiceUtil.getLayoutSet(
367                                            parentGroup.getGroupId(), layoutSet.isPrivateLayout());
368                            }
369                    }
370    
371                    return null;
372            }
373    
374    }