com.liferay.layout.admin.web.internal.display.context.LayoutsAdminDisplayContext.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.layout.admin.web.internal.display.context.LayoutsAdminDisplayContext.java

Source

/**
 * 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.layout.admin.web.internal.display.context;

import com.liferay.exportimport.kernel.staging.LayoutStagingUtil;
import com.liferay.exportimport.kernel.staging.StagingUtil;
import com.liferay.frontend.taglib.clay.servlet.taglib.util.NavigationItem;
import com.liferay.layout.admin.constants.LayoutAdminPortletKeys;
import com.liferay.layout.admin.web.configuration.LayoutAdminWebConfiguration;
import com.liferay.layout.admin.web.constants.LayoutAdminDisplayStyleKeys;
import com.liferay.layout.admin.web.internal.constants.LayoutAdminWebKeys;
import com.liferay.layout.util.comparator.LayoutCreateDateComparator;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.search.EmptyOnClickRowChecker;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.language.LanguageUtil;
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.LayoutRevision;
import com.liferay.portal.kernel.model.LayoutSet;
import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.portlet.LiferayWindowState;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
import com.liferay.portal.kernel.service.LayoutSetLocalServiceUtil;
import com.liferay.portal.kernel.service.permission.GroupPermissionUtil;
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.ListUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.UnicodeProperties;
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.portlet.layoutsadmin.display.context.GroupDisplayContextHelper;
import com.liferay.taglib.security.PermissionsURLTag;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

import javax.portlet.ActionRequest;
import javax.portlet.PortletURL;

/**
 * @author Eudaldo Alonso
 */
public class LayoutsAdminDisplayContext {

    public LayoutsAdminDisplayContext(LiferayPortletRequest liferayPortletRequest,
            LiferayPortletResponse liferayPortletResponse) {

        _liferayPortletRequest = liferayPortletRequest;
        _liferayPortletResponse = liferayPortletResponse;

        _themeDisplay = (ThemeDisplay) liferayPortletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        _groupDisplayContextHelper = new GroupDisplayContextHelper(
                PortalUtil.getHttpServletRequest(liferayPortletRequest));

        _liferayPortletRequest.setAttribute(WebKeys.LAYOUT_DESCRIPTIONS, getLayoutDescriptions());
    }

    public String getAddLayoutURL() {
        return getAddLayoutURL(LayoutConstants.DEFAULT_PLID, isPrivatePages());
    }

    public String getAddLayoutURL(long selPlid, Boolean privateLayout) {
        PortletURL addLayoutURL = _liferayPortletResponse.createRenderURL();

        addLayoutURL.setParameter("mvcPath", "/add_layout.jsp");
        addLayoutURL.setParameter("redirect", _themeDisplay.getURLCurrent());
        addLayoutURL.setParameter("backURL", _themeDisplay.getURLCurrent());
        addLayoutURL.setParameter("groupId", String.valueOf(getSelGroupId()));

        PortletDisplay portletDisplay = _themeDisplay.getPortletDisplay();

        addLayoutURL.setParameter("portletResource", portletDisplay.getId());

        if (selPlid >= LayoutConstants.DEFAULT_PLID) {
            addLayoutURL.setParameter("selPlid", String.valueOf(selPlid));
        }

        if (privateLayout != null) {
            addLayoutURL.setParameter("privateLayout", String.valueOf(privateLayout));
        }

        return addLayoutURL.toString();
    }

    public JSONArray getBreadcrumbEntriesJSONArray() throws PortalException {
        JSONArray breadcrumbEntriesJSONArray = JSONFactoryUtil.createJSONArray();

        breadcrumbEntriesJSONArray.put(_getBreadcrumbEntryJSONObject(LayoutConstants.DEFAULT_PLID,
                LanguageUtil.get(_themeDisplay.getLocale(), "home")));

        if (getSelPlid() == LayoutConstants.DEFAULT_PLID) {
            return breadcrumbEntriesJSONArray;
        }

        Layout selLayout = getSelLayout();

        if (selLayout == null) {
            return breadcrumbEntriesJSONArray;
        }

        List<Layout> layouts = selLayout.getAncestors();

        Collections.reverse(layouts);

        for (Layout layout : layouts) {
            breadcrumbEntriesJSONArray.put(
                    _getBreadcrumbEntryJSONObject(layout.getPlid(), layout.getName(_themeDisplay.getLocale())));
        }

        breadcrumbEntriesJSONArray.put(
                _getBreadcrumbEntryJSONObject(selLayout.getPlid(), selLayout.getName(_themeDisplay.getLocale())));

        return breadcrumbEntriesJSONArray;
    }

    public String getConfigureLayoutURL(Layout layout) {
        PortletURL configureLayoutURL = _liferayPortletResponse.createRenderURL();

        configureLayoutURL.setParameter("mvcRenderCommandName", "/layout/edit_layout");
        configureLayoutURL.setParameter("redirect", _themeDisplay.getURLCurrent());
        configureLayoutURL.setParameter("backURL", _themeDisplay.getURLCurrent());

        PortletDisplay portletDisplay = _themeDisplay.getPortletDisplay();

        configureLayoutURL.setParameter("portletResource", portletDisplay.getId());

        configureLayoutURL.setParameter("groupId", String.valueOf(layout.getGroupId()));
        configureLayoutURL.setParameter("selPlid", String.valueOf(layout.getPlid()));
        configureLayoutURL.setParameter("privateLayout", String.valueOf(layout.isPrivateLayout()));

        return configureLayoutURL.toString();
    }

    public String getCopyApplicationsURL(Layout layout) {
        PortletURL copyApplicationsURL = _liferayPortletResponse.createRenderURL();

        copyApplicationsURL.setParameter("mvcPath", "/copy_applications.jsp");
        copyApplicationsURL.setParameter("redirect", _themeDisplay.getURLCurrent());
        copyApplicationsURL.setParameter("backURL", _themeDisplay.getURLCurrent());
        copyApplicationsURL.setParameter("groupId", String.valueOf(layout.getGroupId()));
        copyApplicationsURL.setParameter("selPlid", String.valueOf(layout.getPlid()));
        copyApplicationsURL.setParameter("privateLayout", String.valueOf(layout.isPrivateLayout()));

        return copyApplicationsURL.toString();
    }

    public String getDeleteLayoutURL(Layout layout) {
        PortletURL deleteLayoutURL = _liferayPortletResponse.createActionURL();

        deleteLayoutURL.setParameter(ActionRequest.ACTION_NAME, "/layout/delete_layout");
        deleteLayoutURL.setParameter("redirect", _themeDisplay.getURLCurrent());
        deleteLayoutURL.setParameter("selPlid", String.valueOf(layout.getPlid()));

        return deleteLayoutURL.toString();
    }

    public String getDisplayStyle() {
        if (Validator.isNotNull(_displayStyle)) {
            return _displayStyle;
        }

        PortalPreferences portalPreferences = PortletPreferencesFactoryUtil
                .getPortalPreferences(_liferayPortletRequest);

        _displayStyle = portalPreferences.getValue(LayoutAdminPortletKeys.GROUP_PAGES, "display-style", "list");

        return _displayStyle;
    }

    public String getEditLayoutURL(Layout layout) throws PortalException {
        return PortalUtil.getLayoutFullURL(layout, _themeDisplay);
    }

    public Group getGroup() {
        return _groupDisplayContextHelper.getGroup();
    }

    public Long getGroupId() {
        return _groupDisplayContextHelper.getGroupId();
    }

    public UnicodeProperties getGroupTypeSettings() {
        return _groupDisplayContextHelper.getGroupTypeSettings();
    }

    public JSONArray getLayoutColumnsJSONArray() throws Exception {
        JSONArray layoutColumnsJSONArray = _getLayoutColumnsJSONArray();

        while (layoutColumnsJSONArray.length() < 3) {
            layoutColumnsJSONArray.put(JSONFactoryUtil.createJSONArray());
        }

        return layoutColumnsJSONArray;
    }

    public List<LayoutDescription> getLayoutDescriptions() {
        if (_layoutDescriptions != null) {
            return _layoutDescriptions;
        }

        _layoutDescriptions = LayoutListUtil.getLayoutDescriptions(getGroupId(), isPrivateLayout(),
                getRootNodeName(), _themeDisplay.getLocale());

        return _layoutDescriptions;
    }

    public Long getLayoutId() {
        if (_layoutId != null) {
            return _layoutId;
        }

        _layoutId = LayoutConstants.DEFAULT_PARENT_LAYOUT_ID;

        Layout selLayout = getSelLayout();

        if (selLayout != null) {
            _layoutId = selLayout.getLayoutId();
        }

        return _layoutId;
    }

    public SearchContainer getLayoutsSearchContainer() throws PortalException {
        if (_layoutsSearchContainer != null) {
            return _layoutsSearchContainer;
        }

        String emptyResultMessage = "there-are-no-public-pages";

        if (isPrivatePages()) {
            emptyResultMessage = "there-are-no-private-pages";
        }

        SearchContainer layoutsSearchContainer = new SearchContainer(_liferayPortletRequest, getPortletURL(), null,
                emptyResultMessage);

        if (isShowAddRootLayoutButton()) {
            layoutsSearchContainer
                    .setEmptyResultsMessageCssClass("there-are-no-layouts.-you-can-add-a-layout-by-clicking-the-"
                            + "plus-button-on-the-bottom-right-corner");
            layoutsSearchContainer
                    .setEmptyResultsMessageCssClass("taglib-empty-result-message-header-has-plus-btn");
        }

        layoutsSearchContainer.setOrderByCol(getOrderByCol());

        OrderByComparator orderByComparator = _getOrderByComparator();

        layoutsSearchContainer.setOrderByComparator(orderByComparator);

        layoutsSearchContainer.setOrderByType(getOrderByType());

        EmptyOnClickRowChecker emptyOnClickRowChecker = new EmptyOnClickRowChecker(_liferayPortletResponse);

        layoutsSearchContainer.setRowChecker(emptyOnClickRowChecker);

        int layoutsCount = LayoutLocalServiceUtil.getLayoutsCount(getSelGroup(), isPrivatePages());
        List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(getSelGroupId(), isPrivatePages(),
                layoutsSearchContainer.getStart(), layoutsSearchContainer.getEnd(), orderByComparator);

        layoutsSearchContainer.setTotal(layoutsCount);
        layoutsSearchContainer.setResults(layouts);

        _layoutsSearchContainer = layoutsSearchContainer;

        return _layoutsSearchContainer;
    }

    public Group getLiveGroup() {
        return _groupDisplayContextHelper.getLiveGroup();
    }

    public Long getLiveGroupId() {
        return _groupDisplayContextHelper.getLiveGroupId();
    }

    public String getNavigation() {
        if (_navigation != null) {
            return _navigation;
        }

        String defaultNavigation = "public-pages";

        if (!isShowPublicPages()) {
            defaultNavigation = "private-pages";
        }

        _navigation = ParamUtil.getString(_liferayPortletRequest, "navigation", defaultNavigation);

        return _navigation;
    }

    public List<NavigationItem> getNavigationItems() {
        List<NavigationItem> navigationItems = new ArrayList<>();

        NavigationItem pagesNavigationItem = new NavigationItem();

        pagesNavigationItem.setActive(Objects.equals(getTabs1(), "pages"));

        PortletURL pagesURL = getPortletURL();

        pagesURL.setParameter("tabs1", "pages");

        pagesNavigationItem.setHref(pagesURL.toString());

        pagesNavigationItem.setLabel(LanguageUtil.get(_themeDisplay.getLocale(), "pages"));

        navigationItems.add(pagesNavigationItem);

        NavigationItem pageTemplatesNavigationItem = new NavigationItem();

        pageTemplatesNavigationItem.setActive(Objects.equals(getTabs1(), "page-templates"));

        PortletURL pageTemplatesURL = getPortletURL();

        pageTemplatesURL.setParameter("tabs1", "page-templates");

        pageTemplatesNavigationItem.setHref(pageTemplatesURL.toString());

        pageTemplatesNavigationItem.setLabel(LanguageUtil.get(_themeDisplay.getLocale(), "page-templates"));

        navigationItems.add(pageTemplatesNavigationItem);

        return navigationItems;
    }

    public String[] getNavigationKeys() {
        if (_navigationKeys != null) {
            return _navigationKeys;
        }

        _navigationKeys = new String[] { "public-pages", "private-pages" };

        if (!isShowPublicPages()) {
            _navigationKeys = new String[] { "private-pages" };
        }

        return _navigationKeys;
    }

    public String getOrderByCol() {
        if (Validator.isNotNull(_orderByCol)) {
            return _orderByCol;
        }

        _orderByCol = ParamUtil.getString(_liferayPortletRequest, "orderByCol", "create-date");

        return _orderByCol;
    }

    public String getOrderByType() {
        if (Validator.isNotNull(_orderByType)) {
            return _orderByType;
        }

        _orderByType = ParamUtil.getString(_liferayPortletRequest, "orderByType", "asc");

        return _orderByType;
    }

    public String[] getOrderColumns() {
        return new String[] { "create-date" };
    }

    public String getOrphanPortletsURL(Layout layout) {
        PortletURL orphanPortletsURL = _liferayPortletResponse.createRenderURL();

        orphanPortletsURL.setParameter("mvcPath", "/orphan_portlets.jsp");
        orphanPortletsURL.setParameter("backURL", _themeDisplay.getURLCurrent());
        orphanPortletsURL.setParameter("selPlid", String.valueOf(layout.getPlid()));

        return orphanPortletsURL.toString();
    }

    public String getPagesName() {
        if (_pagesName != null) {
            return _pagesName;
        }

        Group liveGroup = getLiveGroup();

        if (liveGroup.isLayoutPrototype() || liveGroup.isLayoutSetPrototype() || liveGroup.isUserGroup()) {

            _pagesName = "pages";
        } else if (isPrivateLayout()) {
            if (liveGroup.isUser()) {
                _pagesName = "my-dashboard";
            } else {
                _pagesName = "private-pages";
            }
        } else {
            if (liveGroup.isUser()) {
                _pagesName = "my-profile";
            } else {
                _pagesName = "public-pages";
            }
        }

        return _pagesName;
    }

    public String getPath(Layout layout, Locale locale) throws PortalException {
        List<Layout> layouts = layout.getAncestors();

        StringBundler sb = new StringBundler(layouts.size() * 4);

        for (Layout curLayout : layouts) {
            sb.append(curLayout.getName(locale));
            sb.append(StringPool.SPACE);
            sb.append(StringPool.GREATER_THAN);
            sb.append(StringPool.SPACE);
        }

        return sb.toString();
    }

    public String getPermissionsURL(Layout layout) throws Exception {
        return PermissionsURLTag.doTag(StringPool.BLANK, Layout.class.getName(),
                HtmlUtil.escape(layout.getName(_themeDisplay.getLocale())), null, String.valueOf(layout.getPlid()),
                LiferayWindowState.POP_UP.toString(), null, _themeDisplay.getRequest());
    }

    public PortletURL getPortletURL() {
        PortletURL portletURL = _liferayPortletResponse.createRenderURL();

        portletURL.setParameter("mvcPath", "/view.jsp");
        portletURL.setParameter("tabs1", getTabs1());
        portletURL.setParameter("navigation", getNavigation());
        portletURL.setParameter("orderByCol", getOrderByCol());
        portletURL.setParameter("orderByType", getOrderByType());

        return portletURL;
    }

    public String getRedirect() {
        if (_redirect != null) {
            return _redirect;
        }

        _redirect = ParamUtil.getString(_liferayPortletRequest, "redirect");

        return _redirect;
    }

    public PortletURL getRedirectURL() {
        PortletURL portletURL = _liferayPortletResponse.createRenderURL();

        portletURL.setParameter("mvcPath", "/view.jsp");
        portletURL.setParameter("redirect", getRedirect());
        portletURL.setParameter("groupId", String.valueOf(getSelGroupId()));

        return portletURL;
    }

    public String getRootNodeName() {
        if (_rootNodeName != null) {
            return _rootNodeName;
        }

        _rootNodeName = getRootNodeName(isPrivateLayout());

        return _rootNodeName;
    }

    public String getRootNodeName(boolean privateLayout) {
        Group liveGroup = getLiveGroup();

        return liveGroup.getLayoutRootNodeName(privateLayout, _themeDisplay.getLocale());
    }

    public String getSelectLayoutPageTemplateEntryURL() {
        return getSelectLayoutPageTemplateEntryURL(0);
    }

    public String getSelectLayoutPageTemplateEntryURL(long layoutPageTemplateCollectionId) {

        PortletURL selectLayoutPageTemplateEntryURL = _liferayPortletResponse.createRenderURL();

        selectLayoutPageTemplateEntryURL.setParameter("mvcPath", "/select_layout_page_template_entry.jsp");
        selectLayoutPageTemplateEntryURL.setParameter("redirect", _themeDisplay.getURLCurrent());
        selectLayoutPageTemplateEntryURL.setParameter("backURL", _themeDisplay.getURLCurrent());
        selectLayoutPageTemplateEntryURL.setParameter("groupId", String.valueOf(getSelGroupId()));
        selectLayoutPageTemplateEntryURL.setParameter("selPlid", String.valueOf(getSelPlid()));
        selectLayoutPageTemplateEntryURL.setParameter("privateLayout", String.valueOf(isPrivatePages()));

        if (layoutPageTemplateCollectionId > 0) {
            selectLayoutPageTemplateEntryURL.setParameter("layoutPageTemplateCollectionId",
                    String.valueOf(layoutPageTemplateCollectionId));
        }

        return selectLayoutPageTemplateEntryURL.toString();
    }

    public Group getSelGroup() {
        return _groupDisplayContextHelper.getSelGroup();
    }

    public long getSelGroupId() {
        Group selGroup = getSelGroup();

        if (selGroup != null) {
            return selGroup.getGroupId();
        }

        return 0;
    }

    public Layout getSelLayout() {
        if (_selLayout != null) {
            return _selLayout;
        }

        if (getSelPlid() != LayoutConstants.DEFAULT_PLID) {
            _selLayout = LayoutLocalServiceUtil.fetchLayout(getSelPlid());
        }

        return _selLayout;
    }

    public LayoutSet getSelLayoutSet() throws PortalException {
        if (_selLayoutSet != null) {
            return _selLayoutSet;
        }

        Group group = getStagingGroup();

        if (group == null) {
            group = getLiveGroup();
        }

        _selLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet(group.getGroupId(), isPrivateLayout());

        return _selLayoutSet;
    }

    public Long getSelPlid() {
        if (_selPlid != null) {
            return _selPlid;
        }

        _selPlid = ParamUtil.getLong(_liferayPortletRequest, "selPlid", LayoutConstants.DEFAULT_PLID);

        return _selPlid;
    }

    public Group getStagingGroup() {
        return _groupDisplayContextHelper.getStagingGroup();
    }

    public Long getStagingGroupId() {
        return _groupDisplayContextHelper.getStagingGroupId();
    }

    public String getTabs1() {
        if (_tabs1 != null) {
            return _tabs1;
        }

        _tabs1 = ParamUtil.getString(_liferayPortletRequest, "tabs1", "pages");

        return _tabs1;
    }

    public boolean isMillerColumnsEnabled() {
        if (_millerColumnsEnabled != null) {
            return _millerColumnsEnabled;
        }

        _millerColumnsEnabled = false;

        LayoutAdminWebConfiguration layoutAdminWebConfiguration = (LayoutAdminWebConfiguration) _liferayPortletRequest
                .getAttribute(LayoutAdminWebKeys.LAYOUT_ADMIN_CONFIGURATION);

        if (Objects.equals(layoutAdminWebConfiguration.layoutDisplayStyle(), LayoutAdminDisplayStyleKeys.MILLER)) {

            _millerColumnsEnabled = true;
        }

        return _millerColumnsEnabled;
    }

    public boolean isPageTemplates() {
        if (Objects.equals(getTabs1(), "page-templates")) {
            return true;
        }

        return false;
    }

    public boolean isPrivateLayout() {
        if (_privateLayout != null) {
            return _privateLayout;
        }

        Group selGroup = getSelGroup();

        if (selGroup.isLayoutSetPrototype() || selGroup.isLayoutSetPrototype()) {

            _privateLayout = true;

            return _privateLayout;
        }

        Layout selLayout = getSelLayout();

        if (getSelLayout() != null) {
            _privateLayout = selLayout.isPrivateLayout();

            return _privateLayout;
        }

        Layout layout = _themeDisplay.getLayout();

        if (!layout.isTypeControlPanel()) {
            _privateLayout = layout.isPrivateLayout();

            return _privateLayout;
        }

        _privateLayout = ParamUtil.getBoolean(_liferayPortletRequest, "privateLayout");

        return _privateLayout;
    }

    public boolean isPrivatePages() {
        if (Objects.equals(getNavigation(), "private-pages")) {
            return true;
        }

        return false;
    }

    public boolean isPublicPages() {
        if (Objects.equals(getNavigation(), "public-pages")) {
            return true;
        }

        return false;
    }

    public boolean isShowAddRootLayoutButton() throws PortalException {
        return GroupPermissionUtil.contains(_themeDisplay.getPermissionChecker(), getSelGroup(),
                ActionKeys.ADD_LAYOUT);
    }

    public boolean isShowPublicPages() {
        Group selGroup = getSelGroup();

        if (selGroup.isLayoutSetPrototype() || selGroup.isLayoutPrototype()) {
            return false;
        }

        return true;
    }

    public boolean showAddChildPageAction(Layout layout) throws PortalException {

        return LayoutPermissionUtil.contains(_themeDisplay.getPermissionChecker(), layout, ActionKeys.ADD_LAYOUT);
    }

    public boolean showConfigureAction(Layout layout) throws PortalException {
        return LayoutPermissionUtil.contains(_themeDisplay.getPermissionChecker(), layout, ActionKeys.UPDATE);
    }

    public boolean showCopyApplicationsAction(Layout layout) throws PortalException {

        // Check if layout is incomplete

        LayoutRevision layoutRevision = LayoutStagingUtil.getLayoutRevision(layout);

        boolean incomplete = false;

        if (layoutRevision != null) {
            long layoutSetBranchId = layoutRevision.getLayoutSetBranchId();

            incomplete = StagingUtil.isIncomplete(layout, layoutSetBranchId);
        }

        if (incomplete) {
            return false;
        }

        // Check if layout is a layout prototype

        Group group = layout.getGroup();

        if (group.isLayoutPrototype()) {
            return false;
        }

        return LayoutPermissionUtil.contains(_themeDisplay.getPermissionChecker(), layout, ActionKeys.UPDATE);
    }

    public boolean showDeleteAction(Layout layout) throws PortalException {
        if (StagingUtil.isIncomplete(layout)) {
            return false;
        }

        if (!LayoutPermissionUtil.contains(_themeDisplay.getPermissionChecker(), layout, ActionKeys.DELETE)) {

            return false;
        }

        Group group = layout.getGroup();

        int layoutsCount = LayoutLocalServiceUtil.getLayoutsCount(group, false,
                LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);

        if (group.isGuest() && !layout.isPrivateLayout() && layout.isRootLayout() && (layoutsCount == 1)) {

            return false;
        }

        return true;
    }

    public boolean showOrphanPortletsAction(Layout layout) {
        if (StagingUtil.isIncomplete(layout)) {
            return false;
        }

        if (!layout.isSupportsEmbeddedPortlets()) {
            return false;
        }

        OrphanPortletsDisplayContext orphanPortletsDisplayContext = new OrphanPortletsDisplayContext(
                _liferayPortletRequest, _liferayPortletResponse);

        if (ListUtil.isEmpty(orphanPortletsDisplayContext.getOrphanPortlets(layout))) {

            return false;
        }

        return true;
    }

    public boolean showPermissionsAction(Layout layout) throws PortalException {
        if (StagingUtil.isIncomplete(layout)) {
            return false;
        }

        Group selGroup = getSelGroup();

        if (selGroup.isLayoutPrototype()) {
            return false;
        }

        return LayoutPermissionUtil.contains(_themeDisplay.getPermissionChecker(), layout, ActionKeys.PERMISSIONS);
    }

    private JSONObject _getActionURLsJSONObject(Layout layout) throws Exception {

        JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

        if (showAddChildPageAction(layout)) {
            jsonObject.put("addURL", getAddLayoutURL(layout.getPlid(), layout.isPrivateLayout()));
        }

        if (showConfigureAction(layout)) {
            jsonObject.put("configureURL", getConfigureLayoutURL(layout));
        }

        if (showCopyApplicationsAction(layout)) {
            jsonObject.put("copyApplicationsURL", getCopyApplicationsURL(layout));
        }

        if (showDeleteAction(layout)) {
            jsonObject.put("deleteURL", getDeleteLayoutURL(layout));
        }

        jsonObject.put("editLayoutURL", getEditLayoutURL(layout));

        if (showOrphanPortletsAction(layout)) {
            jsonObject.put("orphanPortletsURL", getOrphanPortletsURL(layout));
        }

        if (showPermissionsAction(layout)) {
            jsonObject.put("permissionsURL", getPermissionsURL(layout));
        }

        return jsonObject;
    }

    private JSONObject _getBreadcrumbEntryJSONObject(long plid, String title) throws PortalException {

        JSONObject breadcrumbEntryJSONObject = JSONFactoryUtil.createJSONObject();

        breadcrumbEntryJSONObject.put("title", title);

        PortletURL portletURL = getPortletURL();

        portletURL.setParameter("selPlid", String.valueOf(plid));

        breadcrumbEntryJSONObject.put("url", portletURL.toString());

        return breadcrumbEntryJSONObject;
    }

    private JSONArray _getLayoutColumnsJSONArray() throws Exception {
        JSONArray layoutColumnsJSONArray = JSONFactoryUtil.createJSONArray();

        layoutColumnsJSONArray.put(_getLayoutsJSONArray(0));

        if (getSelPlid() == LayoutConstants.DEFAULT_PLID) {
            return layoutColumnsJSONArray;
        }

        Layout selLayout = getSelLayout();

        if (selLayout == null) {
            return layoutColumnsJSONArray;
        }

        List<Layout> layouts = selLayout.getAncestors();

        Collections.reverse(layouts);

        for (Layout layout : layouts) {
            layoutColumnsJSONArray.put(_getLayoutsJSONArray(layout.getLayoutId()));
        }

        layoutColumnsJSONArray.put(_getLayoutsJSONArray(selLayout.getLayoutId()));

        return layoutColumnsJSONArray;
    }

    private JSONArray _getLayoutsJSONArray(long parentLayoutId) throws Exception {

        JSONArray layoutsJSONArray = JSONFactoryUtil.createJSONArray();

        List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(getGroupId(), isPrivateLayout(), parentLayoutId,
                false, QueryUtil.ALL_POS, QueryUtil.ALL_POS, _getOrderByComparator());

        for (Layout layout : layouts) {
            JSONObject layoutJSONObject = JSONFactoryUtil.createJSONObject();

            layoutJSONObject.put("actionURLs", _getActionURLsJSONObject(layout));
            layoutJSONObject.put("active", _isActive(layout.getPlid()));

            int childLayoutsCount = LayoutLocalServiceUtil.getLayoutsCount(getGroup(), isPrivateLayout(),
                    layout.getLayoutId());

            layoutJSONObject.put("hasChild", childLayoutsCount > 0);

            layoutJSONObject.put("plid", layout.getPlid());

            if (childLayoutsCount > 0) {
                PortletURL portletURL = getPortletURL();

                portletURL.setParameter("selPlid", String.valueOf(layout.getPlid()));

                layoutJSONObject.put("url", portletURL.toString());
            }

            layoutJSONObject.put("title", layout.getName(_themeDisplay.getLocale()));

            layoutsJSONArray.put(layoutJSONObject);
        }

        return layoutsJSONArray;
    }

    private OrderByComparator _getOrderByComparator() {
        boolean orderByAsc = false;

        if (Objects.equals(getOrderByType(), "asc")) {
            orderByAsc = true;
        }

        OrderByComparator<Layout> orderByComparator = null;

        if (Objects.equals(getOrderByCol(), "create-date")) {
            orderByComparator = new LayoutCreateDateComparator(orderByAsc);
        }

        return orderByComparator;
    }

    private boolean _isActive(long plid) throws PortalException {
        if (plid == getSelPlid()) {
            return true;
        }

        Layout selLayout = getSelLayout();

        if (selLayout == null) {
            return false;
        }

        for (Layout layout : selLayout.getAncestors()) {
            if (plid == layout.getPlid()) {
                return true;
            }
        }

        return false;
    }

    private String _displayStyle;
    private final GroupDisplayContextHelper _groupDisplayContextHelper;
    private List<LayoutDescription> _layoutDescriptions;
    private Long _layoutId;
    private SearchContainer _layoutsSearchContainer;
    private final LiferayPortletRequest _liferayPortletRequest;
    private final LiferayPortletResponse _liferayPortletResponse;
    private Boolean _millerColumnsEnabled;
    private String _navigation;
    private String[] _navigationKeys;
    private String _orderByCol;
    private String _orderByType;
    private String _pagesName;
    private Boolean _privateLayout;
    private String _redirect;
    private String _rootNodeName;
    private Layout _selLayout;
    private LayoutSet _selLayoutSet;
    private Long _selPlid;
    private String _tabs1;
    private final ThemeDisplay _themeDisplay;

}