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