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