/**
* 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.site.navigation.site.map.web.internal.display.context;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.LayoutConstants;
import com.liferay.portal.kernel.model.LayoutType;
import com.liferay.portal.kernel.module.configuration.ConfigurationException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.permission.LayoutPermissionUtil;
import com.liferay.portal.kernel.theme.PortletDisplay;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.util.LayoutDescription;
import com.liferay.portal.util.LayoutListUtil;
import com.liferay.site.navigation.site.map.web.configuration.SiteNavigationSiteMapPortletInstanceConfiguration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
/**
* @author Juergen Kappler
*/
public class SiteNavigationSiteMapDisplayContext {
public SiteNavigationSiteMapDisplayContext(HttpServletRequest request)
throws ConfigurationException {
_request = request;
_themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
PortletDisplay portletDisplay = _themeDisplay.getPortletDisplay();
_siteNavigationSiteMapPortletInstanceConfiguration =
portletDisplay.getPortletInstanceConfiguration(
SiteNavigationSiteMapPortletInstanceConfiguration.class);
}
public String buildSiteMap() throws Exception {
StringBundler sb = new StringBundler();
_buildSiteMap(
_themeDisplay.getLayout(), getRootLayouts(), getRootLayout(),
isIncludeRootInTree(),
_siteNavigationSiteMapPortletInstanceConfiguration.displayDepth(),
_siteNavigationSiteMapPortletInstanceConfiguration.
showCurrentPage(),
_siteNavigationSiteMapPortletInstanceConfiguration.useHtmlTitle(),
_siteNavigationSiteMapPortletInstanceConfiguration.
showHiddenPages(),
1, _themeDisplay, sb);
return sb.toString();
}
public Long getDisplayStyleGroupId() {
if (_displayStyleGroupId != null) {
return _displayStyleGroupId;
}
_displayStyleGroupId =
_siteNavigationSiteMapPortletInstanceConfiguration.
displayStyleGroupId();
Group displayStyleGroup = GroupLocalServiceUtil.fetchGroup(
_displayStyleGroupId);
if (displayStyleGroup == null) {
_displayStyleGroupId = _themeDisplay.getSiteGroupId();
}
return _displayStyleGroupId;
}
public List<LayoutDescription> getLayoutDescriptions() {
Layout layout = _themeDisplay.getLayout();
String rootNodeName = StringPool.BLANK;
return LayoutListUtil.getLayoutDescriptions(
layout.getGroupId(), layout.isPrivateLayout(), rootNodeName,
_themeDisplay.getLocale());
}
public Layout getRootLayout() {
if (_rootLayout != null) {
return _rootLayout;
}
String rootLayoutUuid =
_siteNavigationSiteMapPortletInstanceConfiguration.rootLayoutUuid();
if (Validator.isNotNull(rootLayoutUuid)) {
Layout layout = _themeDisplay.getLayout();
_rootLayout = LayoutLocalServiceUtil.fetchLayoutByUuidAndGroupId(
rootLayoutUuid, _themeDisplay.getScopeGroupId(),
layout.isPrivateLayout());
}
return _rootLayout;
}
public long getRootLayoutId() {
if (_rootLayoutId != null) {
return _rootLayoutId;
}
Layout rootLayout = getRootLayout();
if (Validator.isNotNull(
_siteNavigationSiteMapPortletInstanceConfiguration.
rootLayoutUuid()) &&
Validator.isNotNull(rootLayout)) {
_rootLayoutId = rootLayout.getLayoutId();
}
else {
_rootLayoutId = LayoutConstants.DEFAULT_PARENT_LAYOUT_ID;
}
return _rootLayoutId;
}
public List<Layout> getRootLayouts() {
Layout layout = _themeDisplay.getLayout();
return LayoutLocalServiceUtil.getLayouts(
layout.getGroupId(), layout.isPrivateLayout(), getRootLayoutId());
}
public SiteNavigationSiteMapPortletInstanceConfiguration
getSiteNavigationSiteMapPortletInstanceConfiguration() {
return _siteNavigationSiteMapPortletInstanceConfiguration;
}
public Boolean isIncludeRootInTree() {
if (_includeRootInTree != null) {
return _includeRootInTree;
}
_includeRootInTree =
_siteNavigationSiteMapPortletInstanceConfiguration.
includeRootInTree();
if (Validator.isNull(
_siteNavigationSiteMapPortletInstanceConfiguration.
rootLayoutUuid()) ||
(getRootLayoutId() == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID)) {
_includeRootInTree = false;
}
return _includeRootInTree;
}
private void _buildLayoutView(
Layout layout, String cssClass, boolean useHtmlTitle,
ThemeDisplay themeDisplay, StringBundler sb)
throws Exception {
String layoutURL = PortalUtil.getLayoutURL(layout, themeDisplay);
String target = PortalUtil.getLayoutTarget(layout);
sb.append("<a");
LayoutType layoutType = layout.getLayoutType();
if (layoutType.isBrowsable()) {
sb.append(" href=\"");
sb.append(layoutURL);
sb.append("\" ");
sb.append(target);
}
if (Validator.isNotNull(cssClass)) {
sb.append(" class=\"");
sb.append(cssClass);
sb.append("\" ");
}
sb.append("> ");
String layoutName = HtmlUtil.escape(
layout.getName(themeDisplay.getLocale()));
if (useHtmlTitle) {
layoutName = HtmlUtil.escape(
layout.getHTMLTitle(themeDisplay.getLocale()));
}
sb.append(layoutName);
sb.append("</a>");
}
private void _buildSiteMap(
Layout layout, List<Layout> layouts, Layout rootLayout,
boolean includeRootInTree, int displayDepth,
boolean showCurrentPage, boolean useHtmlTitle,
boolean showHiddenPages, int curDepth, ThemeDisplay themeDisplay,
StringBundler sb)
throws Exception {
if (layouts.isEmpty()) {
return;
}
if ((rootLayout != null) &&
!LayoutPermissionUtil.contains(
themeDisplay.getPermissionChecker(), rootLayout,
ActionKeys.VIEW)) {
return;
}
sb.append("<ul>");
if (includeRootInTree && (rootLayout != null) && (curDepth == 1)) {
sb.append("<li>");
String cssClass = "root";
if (rootLayout.getPlid() == layout.getPlid()) {
cssClass += " current";
}
_buildLayoutView(
rootLayout, cssClass, useHtmlTitle, themeDisplay, sb);
_buildSiteMap(
layout, layouts, rootLayout, includeRootInTree, displayDepth,
showCurrentPage, useHtmlTitle, showHiddenPages, curDepth + 1,
themeDisplay, sb);
sb.append("</li>");
}
else {
for (Layout curLayout : layouts) {
if ((showHiddenPages || !curLayout.isHidden()) &&
LayoutPermissionUtil.contains(
themeDisplay.getPermissionChecker(), curLayout,
ActionKeys.VIEW)) {
sb.append("<li>");
String cssClass = StringPool.BLANK;
if (curLayout.getPlid() == layout.getPlid()) {
cssClass = "current";
}
_buildLayoutView(
curLayout, cssClass, useHtmlTitle, themeDisplay, sb);
if ((displayDepth == 0) || (displayDepth > curDepth)) {
if (showHiddenPages) {
_buildSiteMap(
layout, curLayout.getChildren(), rootLayout,
includeRootInTree, displayDepth,
showCurrentPage, useHtmlTitle, showHiddenPages,
curDepth + 1, themeDisplay, sb);
}
else {
_buildSiteMap(
layout,
curLayout.getChildren(
themeDisplay.getPermissionChecker()),
rootLayout, includeRootInTree, displayDepth,
showCurrentPage, useHtmlTitle, showHiddenPages,
curDepth + 1, themeDisplay, sb);
}
}
sb.append("</li>");
}
}
}
sb.append("</ul>");
}
private Long _displayStyleGroupId;
private Boolean _includeRootInTree;
private final HttpServletRequest _request;
private Layout _rootLayout;
private Long _rootLayoutId;
private final SiteNavigationSiteMapPortletInstanceConfiguration
_siteNavigationSiteMapPortletInstanceConfiguration;
private final ThemeDisplay _themeDisplay;
}