/** * 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.impl; import com.liferay.knowledge.base.constants.AdminActivityKeys; import com.liferay.knowledge.base.exception.KBTemplateContentException; import com.liferay.knowledge.base.exception.KBTemplateTitleException; import com.liferay.knowledge.base.exception.NoSuchTemplateException; import com.liferay.knowledge.base.model.KBTemplate; import com.liferay.knowledge.base.service.base.KBTemplateLocalServiceBaseImpl; import com.liferay.knowledge.base.util.KnowledgeBaseUtil; import com.liferay.portal.kernel.dao.orm.Conjunction; import com.liferay.portal.kernel.dao.orm.Criterion; import com.liferay.portal.kernel.dao.orm.Disjunction; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil; import com.liferay.portal.kernel.dao.orm.Junction; import com.liferay.portal.kernel.dao.orm.Property; import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.model.ResourceConstants; import com.liferay.portal.kernel.model.SystemEventConstants; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.systemevent.SystemEvent; import com.liferay.portal.kernel.util.OrderByComparator; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author Peter Shin * @author Brian Wing Shun Chan */ public class KBTemplateLocalServiceImpl extends KBTemplateLocalServiceBaseImpl { @Override public KBTemplate addKBTemplate( long userId, String title, String content, ServiceContext serviceContext) throws PortalException { // KB template User user = userLocalService.getUser(userId); long groupId = serviceContext.getScopeGroupId(); Date now = new Date(); validate(title, content); long kbTemplateId = counterLocalService.increment(); KBTemplate kbTemplate = kbTemplatePersistence.create(kbTemplateId); kbTemplate.setUuid(serviceContext.getUuid()); kbTemplate.setGroupId(groupId); kbTemplate.setCompanyId(user.getCompanyId()); kbTemplate.setUserId(user.getUserId()); kbTemplate.setUserName(user.getFullName()); kbTemplate.setCreateDate(serviceContext.getCreateDate(now)); kbTemplate.setModifiedDate(serviceContext.getModifiedDate(now)); kbTemplate.setTitle(title); kbTemplate.setContent(content); kbTemplatePersistence.update(kbTemplate); // Resources resourceLocalService.addModelResources(kbTemplate, serviceContext); // Social JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject(); extraDataJSONObject.put("title", kbTemplate.getTitle()); socialActivityLocalService.addActivity( userId, groupId, KBTemplate.class.getName(), kbTemplateId, AdminActivityKeys.ADD_KB_TEMPLATE, extraDataJSONObject.toString(), 0); return kbTemplate; } @Override public void deleteGroupKBTemplates(long groupId) throws PortalException { List<KBTemplate> kbTemplates = kbTemplatePersistence.findByGroupId( groupId); for (KBTemplate kbTemplate : kbTemplates) { kbTemplateLocalService.deleteKBTemplate(kbTemplate); } } @Override @SystemEvent( action = SystemEventConstants.ACTION_SKIP, type = SystemEventConstants.TYPE_DELETE ) public KBTemplate deleteKBTemplate(KBTemplate kbTemplate) throws PortalException { // KB template kbTemplatePersistence.remove(kbTemplate); // Resources resourceLocalService.deleteResource( kbTemplate.getCompanyId(), KBTemplate.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL, kbTemplate.getKbTemplateId()); // KB Comments kbCommentLocalService.deleteKBComments( KBTemplate.class.getName(), kbTemplate.getKbTemplateId()); // Social socialActivityLocalService.deleteActivities( KBTemplate.class.getName(), kbTemplate.getKbTemplateId()); return kbTemplate; } @Override public KBTemplate deleteKBTemplate(long kbTemplateId) throws PortalException { KBTemplate kbTemplate = kbTemplatePersistence.findByPrimaryKey( kbTemplateId); return kbTemplateLocalService.deleteKBTemplate(kbTemplate); } @Override public void deleteKBTemplates(long[] kbTemplateIds) throws PortalException { for (long kbTemplateId : kbTemplateIds) { KBTemplate kbTemplate = null; try { kbTemplate = kbTemplatePersistence.findByPrimaryKey( kbTemplateId); } catch (NoSuchTemplateException nste) { continue; } kbTemplateLocalService.deleteKBTemplate(kbTemplate); } } @Override public List<KBTemplate> getGroupKBTemplates( long groupId, int start, int end, OrderByComparator<KBTemplate> orderByComparator) { return kbTemplatePersistence.findByGroupId( groupId, start, end, orderByComparator); } @Override public int getGroupKBTemplatesCount(long groupId) { return kbTemplatePersistence.countByGroupId(groupId); } @Override public List<KBTemplate> search( long groupId, String title, String content, Date startDate, Date endDate, boolean andOperator, int start, int end, OrderByComparator<KBTemplate> orderByComparator) { DynamicQuery dynamicQuery = buildDynamicQuery( groupId, title, content, startDate, endDate, andOperator); return dynamicQuery(dynamicQuery, start, end, orderByComparator); } @Override public KBTemplate updateKBTemplate( long kbTemplateId, String title, String content, ServiceContext serviceContext) throws PortalException { // KB template validate(title, content); KBTemplate kbTemplate = kbTemplatePersistence.findByPrimaryKey( kbTemplateId); kbTemplate.setModifiedDate(serviceContext.getModifiedDate(null)); kbTemplate.setTitle(title); kbTemplate.setContent(content); kbTemplatePersistence.update(kbTemplate); // Resources if ((serviceContext.getGroupPermissions() != null) || (serviceContext.getGuestPermissions() != null)) { updateKBTemplateResources( kbTemplate, serviceContext.getGroupPermissions(), serviceContext.getGuestPermissions()); } // Social JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject(); extraDataJSONObject.put("title", kbTemplate.getTitle()); socialActivityLocalService.addActivity( kbTemplate.getUserId(), kbTemplate.getGroupId(), KBTemplate.class.getName(), kbTemplateId, AdminActivityKeys.UPDATE_KB_TEMPLATE, extraDataJSONObject.toString(), 0); return kbTemplate; } @Override public void updateKBTemplateResources( KBTemplate kbTemplate, String[] groupPermissions, String[] guestPermissions) throws PortalException { resourceLocalService.updateResources( kbTemplate.getCompanyId(), kbTemplate.getGroupId(), KBTemplate.class.getName(), kbTemplate.getKbTemplateId(), groupPermissions, guestPermissions); } protected DynamicQuery buildDynamicQuery( long groupId, String title, String content, Date startDate, Date endDate, boolean andOperator) { Junction junction = null; if (andOperator) { junction = RestrictionsFactoryUtil.conjunction(); } else { junction = RestrictionsFactoryUtil.disjunction(); } Map<String, String> terms = new HashMap<>(); if (Validator.isNotNull(title)) { terms.put("title", title); } if (Validator.isNotNull(content)) { terms.put("content", content); } for (Map.Entry<String, String> entry : terms.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); Disjunction disjunction = RestrictionsFactoryUtil.disjunction(); for (String keyword : KnowledgeBaseUtil.splitKeywords(value)) { Criterion criterion = RestrictionsFactoryUtil.ilike( key, StringUtil.quote(keyword, StringPool.PERCENT)); disjunction.add(criterion); } junction.add(disjunction); } if ((endDate != null) && (startDate != null)) { Disjunction disjunction = RestrictionsFactoryUtil.disjunction(); String[] propertyNames = {"createDate", "modifiedDate"}; for (String propertyName : propertyNames) { Property property = PropertyFactoryUtil.forName(propertyName); Conjunction conjunction = RestrictionsFactoryUtil.conjunction(); conjunction.add(property.gt(startDate)); conjunction.add(property.lt(endDate)); disjunction.add(conjunction); } junction.add(disjunction); } DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass( KBTemplate.class, getClassLoader()); if (groupId > 0) { Property property = PropertyFactoryUtil.forName("groupId"); dynamicQuery.add(property.eq(groupId)); } return dynamicQuery.add(junction); } protected void validate(String title, String content) throws PortalException { if (Validator.isNull(title)) { throw new KBTemplateTitleException(); } if (Validator.isNull(content)) { throw new KBTemplateContentException(); } } }