/**
* 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.knowledge.base.web.internal;
import com.liferay.knowledge.base.constants.KBCommentConstants;
import com.liferay.knowledge.base.constants.KBFolderConstants;
import com.liferay.knowledge.base.constants.KBPortletKeys;
import com.liferay.knowledge.base.model.KBComment;
import com.liferay.knowledge.base.model.KBFolder;
import com.liferay.knowledge.base.model.KBTemplate;
import com.liferay.knowledge.base.service.KBFolderServiceUtil;
import com.liferay.knowledge.base.util.KnowledgeBaseUtil;
import com.liferay.knowledge.base.util.comparator.KBArticleCreateDateComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleModifiedDateComparator;
import com.liferay.knowledge.base.util.comparator.KBArticlePriorityComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleStatusComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleTitleComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleUserNameComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleVersionComparator;
import com.liferay.knowledge.base.util.comparator.KBArticleViewCountComparator;
import com.liferay.knowledge.base.util.comparator.KBCommentCreateDateComparator;
import com.liferay.knowledge.base.util.comparator.KBCommentModifiedDateComparator;
import com.liferay.knowledge.base.util.comparator.KBCommentStatusComparator;
import com.liferay.knowledge.base.util.comparator.KBCommentUserNameComparator;
import com.liferay.knowledge.base.util.comparator.KBFolderNameComparator;
import com.liferay.knowledge.base.util.comparator.KBObjectsModifiedDateComparator;
import com.liferay.knowledge.base.util.comparator.KBObjectsPriorityComparator;
import com.liferay.knowledge.base.util.comparator.KBObjectsTitleComparator;
import com.liferay.knowledge.base.util.comparator.KBObjectsViewCountComparator;
import com.liferay.knowledge.base.util.comparator.KBTemplateCreateDateComparator;
import com.liferay.knowledge.base.util.comparator.KBTemplateModifiedDateComparator;
import com.liferay.knowledge.base.util.comparator.KBTemplateTitleComparator;
import com.liferay.knowledge.base.util.comparator.KBTemplateUserNameComparator;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.json.JSONException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.Sort;
import com.liferay.portal.kernel.search.SortFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
/**
* @author Roberto Díaz
*/
public class KBUtil {
public static List<KBFolder> getAlternateRootKBFolders(
long groupId, long kbFolderId)
throws PortalException {
List<KBFolder> kbFolders = KBFolderServiceUtil.getKBFolders(
groupId, kbFolderId, QueryUtil.ALL_POS, QueryUtil.ALL_POS);
kbFolders = new ArrayList<>(kbFolders);
Iterator<KBFolder> itr = kbFolders.iterator();
while (itr.hasNext()) {
KBFolder kbFolder = itr.next();
if (kbFolder.isEmpty()) {
itr.remove();
}
}
return ListUtil.sort(kbFolders, new KBFolderNameComparator(false));
}
public static OrderByComparator getKBArticleOrderByComparator(
String orderByCol, String orderByType) {
if (Validator.isNull(orderByCol) || Validator.isNull(orderByType)) {
return null;
}
boolean ascending = false;
if (orderByType.equals("asc")) {
ascending = true;
}
if (orderByCol.equals("create-date")) {
return new KBArticleCreateDateComparator(ascending);
}
else if (orderByCol.equals("modified-date")) {
return new KBArticleModifiedDateComparator(ascending);
}
else if (orderByCol.equals("priority")) {
return new KBArticlePriorityComparator(ascending);
}
else if (orderByCol.equals("status")) {
return new KBArticleStatusComparator(ascending);
}
else if (orderByCol.equals("title")) {
return new KBArticleTitleComparator(ascending);
}
else if (orderByCol.equals("user-name")) {
return new KBArticleUserNameComparator(ascending);
}
else if (orderByCol.equals("version")) {
return new KBArticleVersionComparator(ascending);
}
else if (orderByCol.equals("view-count")) {
return new KBArticleViewCountComparator(ascending);
}
return null;
}
public static Sort[] getKBArticleSorts(
String orderByCol, String orderByType) {
if (Validator.isNull(orderByCol) || Validator.isNull(orderByType)) {
return SortFactoryUtil.getDefaultSorts();
}
boolean reverse = true;
if (orderByType.equals("asc")) {
reverse = false;
}
if (orderByCol.equals("create-date")) {
String fieldName = Field.CREATE_DATE;
return new Sort[] {
SortFactoryUtil.create(fieldName, Sort.LONG_TYPE, reverse),
SortFactoryUtil.create(null, Sort.SCORE_TYPE, false)
};
}
else if (orderByCol.equals("modified-date")) {
String fieldName = Field.MODIFIED_DATE;
return new Sort[] {
SortFactoryUtil.create(fieldName, Sort.LONG_TYPE, reverse),
SortFactoryUtil.create(null, Sort.SCORE_TYPE, false)
};
}
else if (orderByCol.equals("score")) {
String fieldName = null;
return new Sort[] {
SortFactoryUtil.create(fieldName, Sort.SCORE_TYPE, !reverse),
SortFactoryUtil.create(
Field.MODIFIED_DATE, Sort.LONG_TYPE, true)
};
}
else if (orderByCol.equals("title")) {
String fieldName = "titleKeyword";
return new Sort[] {
SortFactoryUtil.create(fieldName, Sort.STRING_TYPE, reverse),
SortFactoryUtil.create(null, Sort.SCORE_TYPE, false)
};
}
else if (orderByCol.equals("user-name")) {
String fieldName = Field.USER_NAME;
return new Sort[] {
SortFactoryUtil.create(fieldName, Sort.STRING_TYPE, reverse),
SortFactoryUtil.create(null, Sort.SCORE_TYPE, false)
};
}
return SortFactoryUtil.getDefaultSorts();
}
public static OrderByComparator<KBComment> getKBCommentOrderByComparator(
String orderByCol, String orderByType) {
if (Validator.isNull(orderByCol) || Validator.isNull(orderByType)) {
return new KBCommentStatusComparator();
}
boolean ascending = false;
if (orderByType.equals("asc")) {
ascending = true;
}
if (orderByCol.equals("create-date")) {
return new KBCommentCreateDateComparator(ascending);
}
else if (orderByCol.equals("modified-date")) {
return new KBCommentModifiedDateComparator(ascending);
}
else if (orderByCol.equals("status")) {
return new KBCommentStatusComparator(ascending);
}
else if (orderByCol.equals("user-name")) {
return new KBCommentUserNameComparator(ascending);
}
return null;
}
public static OrderByComparator<Object> getKBObjectsOrderByComparator(
String orderByCol, String orderByType) {
if (Validator.isNull(orderByCol) || Validator.isNull(orderByType)) {
return null;
}
boolean ascending = false;
if (orderByType.equals("asc")) {
ascending = true;
}
if (orderByCol.equals("modified-date")) {
return new KBObjectsModifiedDateComparator<>(ascending, true);
}
else if (orderByCol.equals("priority")) {
return new KBObjectsPriorityComparator<>(ascending);
}
else if (orderByCol.equals("title")) {
return new KBObjectsTitleComparator<>(ascending, true);
}
else if (orderByCol.equals("view-count")) {
return new KBObjectsViewCountComparator<>(ascending);
}
return null;
}
public static OrderByComparator<KBTemplate> getKBTemplateOrderByComparator(
String orderByCol, String orderByType) {
if (Validator.isNull(orderByCol) || Validator.isNull(orderByType)) {
return null;
}
boolean ascending = false;
if (orderByType.equals("asc")) {
ascending = true;
}
if (orderByCol.equals("create-date")) {
return new KBTemplateCreateDateComparator(ascending);
}
else if (orderByCol.equals("modified-date")) {
return new KBTemplateModifiedDateComparator(ascending);
}
else if (orderByCol.equals("title")) {
return new KBTemplateTitleComparator(ascending);
}
else if (orderByCol.equals("user-name")) {
return new KBTemplateUserNameComparator(ascending);
}
return null;
}
public static final int getNextStatus(int status) {
if (status == KBCommentConstants.STATUS_IN_PROGRESS) {
return KBCommentConstants.STATUS_COMPLETED;
}
else if (status == KBCommentConstants.STATUS_NEW) {
return KBCommentConstants.STATUS_IN_PROGRESS;
}
else {
return KBCommentConstants.STATUS_NONE;
}
}
public static String getPreferredKBFolderURLTitle(
PortalPreferences portalPreferences, String contentRootPrefix)
throws JSONException {
String preferredKBFolderURLTitle = portalPreferences.getValue(
KBPortletKeys.KNOWLEDGE_BASE_DISPLAY, "preferredKBFolderURLTitle",
"{}");
JSONObject jsonObject = JSONFactoryUtil.createJSONObject(
preferredKBFolderURLTitle);
return jsonObject.getString(contentRootPrefix, StringPool.BLANK);
}
public static final int getPreviousStatus(int status) {
if (status == KBCommentConstants.STATUS_COMPLETED) {
return KBCommentConstants.STATUS_IN_PROGRESS;
}
else if (status == KBCommentConstants.STATUS_IN_PROGRESS) {
return KBCommentConstants.STATUS_NEW;
}
else {
return KBCommentConstants.STATUS_NONE;
}
}
public static long getRootResourcePrimKey(
PortletRequest portletRequest, long groupId,
long resourceClassNameId, long resourcePrimKey)
throws PortalException {
long kbFolderClassNameId = PortalUtil.getClassNameId(
KBFolderConstants.getClassName());
if (resourceClassNameId == kbFolderClassNameId) {
return _getCurrentRootKBFolder(
portletRequest, groupId, resourcePrimKey);
}
return KnowledgeBaseUtil.getKBFolderId(
resourceClassNameId, resourcePrimKey);
}
public static final String getStatusLabel(int status) {
if (status == KBCommentConstants.STATUS_COMPLETED) {
return "resolved";
}
else if (status == KBCommentConstants.STATUS_IN_PROGRESS) {
return "in-progress";
}
else if (status == KBCommentConstants.STATUS_NEW) {
return "new";
}
else {
throw new IllegalArgumentException(
String.format("Invalid suggestion status %s", status));
}
}
public static final String getStatusTransitionLabel(int status) {
if (status == KBCommentConstants.STATUS_COMPLETED) {
return "resolve";
}
else if (status == KBCommentConstants.STATUS_IN_PROGRESS) {
return "move-to-in-progress";
}
else if (status == KBCommentConstants.STATUS_NEW) {
return "move-to-new";
}
else {
throw new IllegalArgumentException(
String.format("Invalid suggestion status %s", status));
}
}
private static long _getCurrentRootKBFolder(
PortletRequest portletRequest, long groupId, long kbFolderId)
throws PortalException {
PortalPreferences portalPreferences =
PortletPreferencesFactoryUtil.getPortalPreferences(portletRequest);
PortletPreferences portletPreferences = portletRequest.getPreferences();
String contentRootPrefix = GetterUtil.getString(
portletPreferences.getValue("contentRootPrefix", null));
String kbFolderURLTitle = getPreferredKBFolderURLTitle(
portalPreferences, contentRootPrefix);
long childKbFolderId = KBFolderConstants.DEFAULT_PARENT_FOLDER_ID;
if (kbFolderURLTitle == null) {
List<KBFolder> kbFolders = getAlternateRootKBFolders(
groupId, kbFolderId);
if (!kbFolders.isEmpty()) {
KBFolder kbFolder = kbFolders.get(0);
childKbFolderId = kbFolder.getKbFolderId();
}
}
else {
KBFolder kbFolder = KBFolderServiceUtil.fetchKBFolderByUrlTitle(
groupId, kbFolderId, kbFolderURLTitle);
if (kbFolder != null) {
childKbFolderId = kbFolder.getKbFolderId();
}
}
return childKbFolderId;
}
}