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