/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.servlet.taglib.ui;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.Account;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.GroupConstants;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.LayoutConstants;
import com.liferay.portal.kernel.model.LayoutSet;
import com.liferay.portal.kernel.model.LayoutType;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.portlet.PortletProvider;
import com.liferay.portal.kernel.portlet.PortletProviderUtil;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutSetLocalServiceUtil;
import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CookieKeys;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @author José Manuel Navarro
*/
public class BreadcrumbUtil {
public static final int ENTRY_TYPE_ANY = 0;
public static final int ENTRY_TYPE_CURRENT_GROUP = 1;
public static final int ENTRY_TYPE_GUEST_GROUP = 2;
public static final int ENTRY_TYPE_LAYOUT = 3;
public static final int ENTRY_TYPE_PARENT_GROUP = 4;
public static final int ENTRY_TYPE_PORTLET = 5;
public static List<BreadcrumbEntry> getBreadcrumbEntries(
HttpServletRequest request, int[] types)
throws Exception {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
boolean hasAll = ArrayUtil.contains(types, ENTRY_TYPE_ANY);
if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_GUEST_GROUP)) {
BreadcrumbEntry breadcrumbEntry = getGuestGroupBreadcrumbEntry(
themeDisplay);
if (breadcrumbEntry != null) {
breadcrumbEntries.add(breadcrumbEntry);
}
}
if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_PARENT_GROUP)) {
breadcrumbEntries.addAll(
getParentGroupBreadcrumbEntries(themeDisplay));
}
if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_CURRENT_GROUP)) {
BreadcrumbEntry breadcrumbEntry = getScopeGroupBreadcrumbEntry(
themeDisplay);
if (breadcrumbEntry != null) {
breadcrumbEntries.add(breadcrumbEntry);
}
}
if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_LAYOUT)) {
breadcrumbEntries.addAll(getLayoutBreadcrumbEntries(themeDisplay));
}
if (hasAll || ArrayUtil.contains(types, ENTRY_TYPE_PORTLET)) {
breadcrumbEntries.addAll(getPortletBreadcrumbEntries(request));
}
return breadcrumbEntries;
}
public static BreadcrumbEntry getGuestGroupBreadcrumbEntry(
ThemeDisplay themeDisplay)
throws Exception {
Group group = GroupLocalServiceUtil.getGroup(
themeDisplay.getCompanyId(), GroupConstants.GUEST);
if (group.getPublicLayoutsPageCount() == 0) {
return null;
}
LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
group.getGroupId(), false);
BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
Account account = themeDisplay.getAccount();
breadcrumbEntry.setTitle(account.getName());
String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
layoutSet, themeDisplay);
if (themeDisplay.isAddSessionIdToURL()) {
layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
layoutSetFriendlyURL, themeDisplay.getSessionId());
}
breadcrumbEntry.setURL(layoutSetFriendlyURL);
return breadcrumbEntry;
}
public static List<BreadcrumbEntry> getLayoutBreadcrumbEntries(
ThemeDisplay themeDisplay)
throws Exception {
List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
Layout layout = themeDisplay.getLayout();
Group group = layout.getGroup();
if (!group.isLayoutPrototype()) {
_addLayoutBreadcrumbEntries(
breadcrumbEntries, themeDisplay, layout);
}
return breadcrumbEntries;
}
public static List<BreadcrumbEntry> getParentGroupBreadcrumbEntries(
ThemeDisplay themeDisplay)
throws Exception {
List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
Layout layout = themeDisplay.getLayout();
LayoutSet parentLayoutSet = _getParentLayoutSet(layout.getLayoutSet());
if (parentLayoutSet != null) {
_addGroupsBreadcrumbEntries(
breadcrumbEntries, themeDisplay, parentLayoutSet, true);
}
return breadcrumbEntries;
}
public static List<BreadcrumbEntry> getPortletBreadcrumbEntries(
HttpServletRequest request) {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
String name = WebKeys.PORTLET_BREADCRUMBS;
List<BreadcrumbEntry> breadcrumbEntries =
(List<BreadcrumbEntry>)request.getAttribute(name);
if (Validator.isNotNull(portletDisplay.getId()) &&
!portletDisplay.isFocused() &&
!Objects.equals(
portletDisplay.getId(),
PortletProviderUtil.getPortletId(
BreadcrumbEntry.class.getName(),
PortletProvider.Action.VIEW))) {
name = name.concat(
StringPool.UNDERLINE.concat(portletDisplay.getId()));
List<BreadcrumbEntry> portletBreadcrumbEntries =
(List<BreadcrumbEntry>)request.getAttribute(name);
if (portletBreadcrumbEntries != null) {
breadcrumbEntries = portletBreadcrumbEntries;
}
}
if (breadcrumbEntries == null) {
return Collections.emptyList();
}
for (int i = 0; i < breadcrumbEntries.size() - 1; i++) {
BreadcrumbEntry portletBreadcrumbEntry = breadcrumbEntries.get(i);
String url = portletBreadcrumbEntry.getURL();
if (Validator.isNotNull(url) && !CookieKeys.hasSessionId(request)) {
HttpSession session = request.getSession();
portletBreadcrumbEntry.setURL(
PortalUtil.getURLWithSessionId(url, session.getId()));
}
}
return breadcrumbEntries;
}
public static BreadcrumbEntry getScopeGroupBreadcrumbEntry(
ThemeDisplay themeDisplay)
throws Exception {
List<BreadcrumbEntry> breadcrumbEntries = new ArrayList<>();
Layout layout = themeDisplay.getLayout();
_addGroupsBreadcrumbEntries(
breadcrumbEntries, themeDisplay, layout.getLayoutSet(), false);
if (breadcrumbEntries.isEmpty()) {
return null;
}
return breadcrumbEntries.get(0);
}
private static void _addGroupsBreadcrumbEntries(
List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
LayoutSet layoutSet, boolean includeParentGroups)
throws Exception {
Group group = layoutSet.getGroup();
if (group.isControlPanel()) {
return;
}
if (includeParentGroups) {
LayoutSet parentLayoutSet = _getParentLayoutSet(layoutSet);
if (parentLayoutSet != null) {
_addGroupsBreadcrumbEntries(
breadcrumbEntries, themeDisplay, parentLayoutSet, true);
}
}
int layoutsPageCount = 0;
if (layoutSet.isPrivateLayout()) {
layoutsPageCount = group.getPrivateLayoutsPageCount();
}
else {
layoutsPageCount = group.getPublicLayoutsPageCount();
}
if ((layoutsPageCount > 0) && !group.isGuest()) {
String layoutSetFriendlyURL = PortalUtil.getLayoutSetFriendlyURL(
layoutSet, themeDisplay);
if (themeDisplay.isAddSessionIdToURL()) {
layoutSetFriendlyURL = PortalUtil.getURLWithSessionId(
layoutSetFriendlyURL, themeDisplay.getSessionId());
}
BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
breadcrumbEntry.setTitle(
group.getDescriptiveName(themeDisplay.getLocale()));
breadcrumbEntry.setURL(layoutSetFriendlyURL);
breadcrumbEntries.add(breadcrumbEntry);
}
}
private static void _addLayoutBreadcrumbEntries(
List<BreadcrumbEntry> breadcrumbEntries, ThemeDisplay themeDisplay,
Layout layout)
throws Exception {
if (layout.getParentLayoutId() !=
LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
Layout parentLayout = LayoutLocalServiceUtil.getParentLayout(
layout);
_addLayoutBreadcrumbEntries(
breadcrumbEntries, themeDisplay, parentLayout);
}
BreadcrumbEntry breadcrumbEntry = new BreadcrumbEntry();
breadcrumbEntry.setBaseModel(layout);
LayoutType layoutType = layout.getLayoutType();
if (!layoutType.isBrowsable()) {
breadcrumbEntry.setBrowsable(false);
}
String layoutName = layout.getName(themeDisplay.getLocale());
if (layout.isTypeControlPanel()) {
if (layoutName.equals(LayoutConstants.NAME_CONTROL_PANEL_DEFAULT)) {
layoutName = LanguageUtil.get(
themeDisplay.getLocale(), "control-panel");
}
}
breadcrumbEntry.setTitle(layoutName);
String layoutURL = PortalUtil.getLayoutFullURL(layout, themeDisplay);
if (themeDisplay.isAddSessionIdToURL()) {
layoutURL = PortalUtil.getURLWithSessionId(
layoutURL, themeDisplay.getSessionId());
}
breadcrumbEntry.setURL(layoutURL);
breadcrumbEntries.add(breadcrumbEntry);
}
private static LayoutSet _getParentLayoutSet(LayoutSet layoutSet)
throws Exception {
Group group = layoutSet.getGroup();
if (group.isSite()) {
Group parentGroup = group.getParentGroup();
if (parentGroup != null) {
return LayoutSetLocalServiceUtil.getLayoutSet(
parentGroup.getGroupId(), layoutSet.isPrivateLayout());
}
}
else if (group.isUser()) {
User user = UserLocalServiceUtil.getUser(group.getClassPK());
List<Organization> organizations =
OrganizationLocalServiceUtil.getUserOrganizations(
user.getUserId());
if (!organizations.isEmpty()) {
Organization organization = organizations.get(0);
Group parentGroup = organization.getGroup();
return LayoutSetLocalServiceUtil.getLayoutSet(
parentGroup.getGroupId(), layoutSet.isPrivateLayout());
}
}
return null;
}
}