001
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
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 }