All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.knowledge.base.web.internal.display.context.KBArticleNavigationFragmentDisplayContext Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.knowledge.base.web.internal.display.context;

import com.liferay.friendly.url.info.item.provider.InfoItemFriendlyURLProvider;
import com.liferay.knowledge.base.model.KBArticle;
import com.liferay.knowledge.base.service.KBArticleLocalServiceUtil;
import com.liferay.knowledge.base.service.KBArticleServiceUtil;
import com.liferay.knowledge.base.util.comparator.KBArticlePriorityComparator;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.portlet.FriendlyURLResolver;
import com.liferay.portal.kernel.portlet.FriendlyURLResolverRegistryUtil;
import com.liferay.portal.kernel.portlet.constants.FriendlyURLResolverConstants;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;

import java.util.Collections;
import java.util.List;

/**
 * @author Adolfo Pérez
 */
public class KBArticleNavigationFragmentDisplayContext {

	public KBArticleNavigationFragmentDisplayContext(
		InfoItemFriendlyURLProvider infoItemFriendlyURLProvider,
		KBArticle kbArticle, int maxNestingLevel) {

		_infoItemFriendlyURLProvider = infoItemFriendlyURLProvider;
		_kbArticle = kbArticle;
		_maxNestingLevel = maxNestingLevel;
	}

	public String getKBArticleCssClass(KBArticle kbArticle, int level)
		throws PortalException {

		if (isSelected(kbArticle)) {
			return "kb-article-selected";
		}

		if (_isKBArticleExpanded(level) && !_isMaxNestingLevelReached(level)) {
			return "kb-article-expanded";
		}

		return StringPool.BLANK;
	}

	public String getKBArticleFriendlyURL(KBArticle kbArticle) {
		String friendlyURL = _infoItemFriendlyURLProvider.getFriendlyURL(
			kbArticle, LanguageUtil.getLanguageId(LocaleUtil.getDefault()));

		return _getFriendlyURLSeparator() + friendlyURL;
	}

	public long getKBArticleRootResourcePrimKey() {
		return _kbArticle.getRootResourcePrimKey();
	}

	public List getKBArticles(long parentResourcePrimKey, int level)
		throws PortalException {

		if (level == 0) {
			return KBArticleServiceUtil.getKBArticles(
				_kbArticle.getGroupId(), _kbArticle.getKbFolderId(),
				WorkflowConstants.STATUS_APPROVED, QueryUtil.ALL_POS,
				QueryUtil.ALL_POS,
				KBArticlePriorityComparator.getInstance(true));
		}

		if (_isMaxNestingLevelReached(level)) {
			return KBArticleServiceUtil.getAllDescendantKBArticles(
				_kbArticle.getGroupId(), parentResourcePrimKey,
				WorkflowConstants.STATUS_APPROVED,
				KBArticlePriorityComparator.getInstance(true));
		}

		return KBArticleServiceUtil.getKBArticles(
			_kbArticle.getGroupId(), parentResourcePrimKey,
			WorkflowConstants.STATUS_APPROVED, QueryUtil.ALL_POS,
			QueryUtil.ALL_POS, KBArticlePriorityComparator.getInstance(true));
	}

	public boolean isFurtherExpansionRequired(KBArticle kbArticle, int level)
		throws PortalException {

		List kbArticleAncestorResourcePrimaryKeys =
			_getKBArticleAncestorResourcePrimaryKeys();

		if (!_isMaxNestingLevelReached(level) &&
			kbArticleAncestorResourcePrimaryKeys.contains(
				kbArticle.getResourcePrimKey())) {

			return true;
		}

		return false;
	}

	public boolean isSelected(KBArticle kbArticle) {
		if (kbArticle.getResourcePrimKey() == _kbArticle.getResourcePrimKey()) {
			return true;
		}

		return false;
	}

	private String _getFriendlyURLSeparator() {
		FriendlyURLResolver friendlyURLResolver =
			FriendlyURLResolverRegistryUtil.
				getFriendlyURLResolverByDefaultURLSeparator(
					FriendlyURLResolverConstants.
						URL_SEPARATOR_KNOWLEDGE_BASE_ARTICLE);

		if (friendlyURLResolver != null) {
			return friendlyURLResolver.getURLSeparator();
		}

		return FriendlyURLResolverConstants.
			URL_SEPARATOR_KNOWLEDGE_BASE_ARTICLE;
	}

	private List _getKBArticleAncestorResourcePrimaryKeys()
		throws PortalException {

		if (_kbArticleAncestorResourcePrimKeys != null) {
			return _kbArticleAncestorResourcePrimKeys;
		}

		KBArticle latestKBArticle =
			KBArticleLocalServiceUtil.getLatestKBArticle(
				_kbArticle.getResourcePrimKey(),
				WorkflowConstants.STATUS_APPROVED);

		List ancestorResourcePrimaryKeys =
			latestKBArticle.getAncestorResourcePrimaryKeys();

		Collections.reverse(ancestorResourcePrimaryKeys);

		_kbArticleAncestorResourcePrimKeys = ancestorResourcePrimaryKeys;

		return _kbArticleAncestorResourcePrimKeys;
	}

	private boolean _isKBArticleExpanded(int level) throws PortalException {
		List kbArticleAncestorResourcePrimaryKeys =
			_getKBArticleAncestorResourcePrimaryKeys();

		if ((kbArticleAncestorResourcePrimaryKeys.size() > 1) &&
			(level < kbArticleAncestorResourcePrimaryKeys.size())) {

			return true;
		}

		return false;
	}

	private boolean _isMaxNestingLevelReached(int level) {
		if ((_maxNestingLevel - level) < 1) {
			return true;
		}

		return false;
	}

	private final InfoItemFriendlyURLProvider
		_infoItemFriendlyURLProvider;
	private final KBArticle _kbArticle;
	private List _kbArticleAncestorResourcePrimKeys;
	private final int _maxNestingLevel;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy