/** * 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.service.util; import com.liferay.knowledge.base.constants.KBActionKeys; import com.liferay.knowledge.base.model.KBArticle; import com.liferay.knowledge.base.service.KBArticleLocalServiceUtil; import com.liferay.knowledge.base.service.permission.KBArticlePermission; import com.liferay.knowledge.base.util.KnowledgeBaseUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.Subscription; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.util.Function; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.SubscriptionSender; import com.liferay.portal.kernel.util.TextFormatter; import java.util.List; import java.util.Locale; /** * @author Peter Shin * @author Brian Wing Shun Chan */ public class AdminSubscriptionSender extends SubscriptionSender { public AdminSubscriptionSender( KBArticle kbArticle, ServiceContext serviceContext) { _kbArticle = kbArticle; _serviceContext = serviceContext; } @Override public void initialize() throws Exception { super.initialize(); String kbArticleURL = KnowledgeBaseUtil.getKBArticleURL( _serviceContext.getPlid(), _kbArticle.getResourcePrimKey(), _kbArticle.getStatus(), _serviceContext.getPortalURL(), false); setContextAttribute("[$ARTICLE_TITLE$]", _kbArticle.getTitle()); setContextAttribute("[$ARTICLE_URL$]", kbArticleURL); setLocalizedContextAttributeWithFunction( "[$ARTICLE_ATTACHMENTS$]", _getEmailKBArticleAttachmentsFunction()); setLocalizedContextAttributeWithFunction( "[$ARTICLE_VERSION$]", (locale) -> LanguageUtil.format( locale, "version-x", String.valueOf(_kbArticle.getVersion()), false)); setLocalizedContextAttributeWithFunction( "[$CATEGORY_TITLE$]", (locale) -> LanguageUtil.get(locale, "category.kb")); } @Override protected void deleteSubscription(Subscription subscription) throws Exception { // KB article subscription if (subscription.getClassPK() == _kbArticle.getResourcePrimKey()) { KBArticleLocalServiceUtil.unsubscribeKBArticle( subscription.getUserId(), _kbArticle.getResourcePrimKey()); } // Group subscription if (subscription.getClassPK() == _kbArticle.getGroupId()) { KBArticleLocalServiceUtil.unsubscribeGroupKBArticles( subscription.getUserId(), _kbArticle.getGroupId()); } } /** * @deprecated As of 1.1.0, with no direct replacement */ @Deprecated protected String getEmailKBArticleAttachments(Locale locale) throws Exception { Function<Locale, String> emailKBArticleAttachmentsFunction = _getEmailKBArticleAttachmentsFunction(); return emailKBArticleAttachmentsFunction.apply(locale); } @Override protected boolean hasPermission( Subscription subscription, String inferredClassName, long inferredClassPK, User user) throws Exception { String name = PrincipalThreadLocal.getName(); PermissionChecker contextPermissionChecker = PermissionThreadLocal.getPermissionChecker(); try { PrincipalThreadLocal.setName(user.getUserId()); PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(user); PermissionThreadLocal.setPermissionChecker(permissionChecker); return KBArticlePermission.contains( permissionChecker, _kbArticle, KBActionKeys.VIEW); } finally { PrincipalThreadLocal.setName(name); PermissionThreadLocal.setPermissionChecker( contextPermissionChecker); } } @Override protected String replaceContent(String content, Locale locale) throws Exception { return super.replaceContent(content, locale); } private Function<Locale, String> _getEmailKBArticleAttachmentsFunction() throws PortalException { List<FileEntry> attachmentsFileEntries = _kbArticle.getAttachmentsFileEntries(); if (attachmentsFileEntries.isEmpty()) { return (locale) -> StringPool.BLANK; } return (locale) -> { StringBundler sb = new StringBundler( attachmentsFileEntries.size() * 5); for (FileEntry fileEntry : attachmentsFileEntries) { sb.append(fileEntry.getTitle()); sb.append(" ("); sb.append( TextFormatter.formatStorageSize( fileEntry.getSize(), locale)); sb.append(")"); sb.append("<br />"); } return sb.toString(); }; } private final KBArticle _kbArticle; private final ServiceContext _serviceContext; }