com.liferay.knowledgebase.service.impl.KBFolderLocalServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.knowledgebase.service.impl.KBFolderLocalServiceImpl.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.knowledgebase.service.impl;

import aQute.bnd.annotation.ProviderType;

import com.liferay.knowledgebase.DuplicateKBFolderNameException;
import com.liferay.knowledgebase.InvalidKBFolderNameException;
import com.liferay.knowledgebase.NoSuchFolderException;
import com.liferay.knowledgebase.model.KBFolder;
import com.liferay.knowledgebase.model.KBFolderConstants;
import com.liferay.knowledgebase.service.base.KBFolderLocalServiceBaseImpl;
import com.liferay.knowledgebase.util.KnowledgeBaseUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.User;
import com.liferay.portal.service.ServiceContext;

import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author Brian Wing Shun Chan
 */
@ProviderType
public class KBFolderLocalServiceImpl extends KBFolderLocalServiceBaseImpl {

    @Override
    public KBFolder addKBFolder(long userId, long groupId, long parentResourceClassNameId,
            long parentResourcePrimKey, String name, String description, ServiceContext serviceContext)
            throws PortalException {

        // KB folder

        User user = userPersistence.findByPrimaryKey(userId);
        Date now = new Date();

        validateName(groupId, parentResourcePrimKey, name);
        validateParent(parentResourceClassNameId, parentResourcePrimKey);

        long kbFolderId = counterLocalService.increment();

        KBFolder kbFolder = kbFolderPersistence.create(kbFolderId);

        kbFolder.setUuid(serviceContext.getUuid());
        kbFolder.setGroupId(groupId);
        kbFolder.setCompanyId(user.getCompanyId());
        kbFolder.setUserId(userId);
        kbFolder.setUserName(user.getFullName());
        kbFolder.setCreateDate(now);
        kbFolder.setModifiedDate(now);
        kbFolder.setParentKBFolderId(parentResourcePrimKey);
        kbFolder.setName(name);
        kbFolder.setUrlTitle(getUniqueUrlTitle(groupId, parentResourcePrimKey, kbFolderId, name));
        kbFolder.setDescription(description);

        kbFolderPersistence.update(kbFolder);

        // Resources

        if (serviceContext.isAddGroupPermissions() || serviceContext.isAddGuestPermissions()) {

            addKBFolderResources(kbFolder, serviceContext.isAddGroupPermissions(),
                    serviceContext.isAddGuestPermissions());
        } else {
            addKBFolderResources(kbFolder, serviceContext.getGroupPermissions(),
                    serviceContext.getGuestPermissions());
        }

        return kbFolder;
    }

    @Override
    public KBFolder deleteKBFolder(long kbFolderId) throws PortalException {
        KBFolder kbFolder = kbFolderPersistence.findByPrimaryKey(kbFolderId);

        kbArticleLocalService.deleteKBArticles(kbFolder.getGroupId(), kbFolder.getKbFolderId());

        List<KBFolder> childKBFolders = kbFolderPersistence.findByG_P(kbFolder.getGroupId(),
                kbFolder.getKbFolderId());

        for (KBFolder childKBFolder : childKBFolders) {
            deleteKBFolder(childKBFolder.getKbFolderId());
        }

        return kbFolderPersistence.remove(kbFolder);
    }

    @Override
    public KBFolder fetchKBFolderByUrlTitle(long groupId, long parentKbFolderId, String urlTitle)
            throws PortalException {

        return kbFolderPersistence.fetchByG_P_UT(groupId, parentKbFolderId, urlTitle);
    }

    @Override
    public KBFolder getKBFolderByUrlTitle(long groupId, long parentKbFolderId, String urlTitle)
            throws PortalException {

        return kbFolderPersistence.findByG_P_UT(groupId, parentKbFolderId, urlTitle);
    }

    @Override
    public List<KBFolder> getKBFolders(long groupId, long parentKBFolderId, int start, int end)
            throws PortalException {

        return kbFolderPersistence.findByG_P(groupId, parentKBFolderId, start, end);
    }

    @Override
    public int getKBFoldersCount(long groupId, long parentKBFolderId) throws PortalException {

        return kbFolderPersistence.countByG_P(groupId, parentKBFolderId);
    }

    @Override
    public void moveKBFolder(long kbFolderId, long parentKBFolderId) throws PortalException {

        KBFolder kbFolder = kbFolderPersistence.findByPrimaryKey(kbFolderId);

        if (parentKBFolderId != KBFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
            KBFolder parentKBFolder = kbFolderPersistence.findByPrimaryKey(parentKBFolderId);

            validateParent(kbFolder, parentKBFolder);

            parentKBFolderId = parentKBFolder.getKbFolderId();
        }

        kbFolder.setParentKBFolderId(parentKBFolderId);

        kbFolderPersistence.update(kbFolder);
    }

    @Override
    public KBFolder updateKBFolder(long parentResourceClassNameId, long parentResourcePrimKey, long kbFolderId,
            String name, String description) throws PortalException {

        validateParent(parentResourceClassNameId, parentResourcePrimKey);

        KBFolder kbFolder = kbFolderPersistence.findByPrimaryKey(kbFolderId);

        kbFolder.setModifiedDate(new Date());
        kbFolder.setParentKBFolderId(parentResourcePrimKey);
        kbFolder.setName(name);
        kbFolder.setDescription(description);

        return kbFolderPersistence.update(kbFolder);
    }

    protected void addKBFolderResources(KBFolder kbFolder, boolean addGroupPermissions, boolean addGuestPermissions)
            throws PortalException {

        resourceLocalService.addResources(kbFolder.getCompanyId(), kbFolder.getGroupId(), kbFolder.getUserId(),
                KBFolder.class.getName(), kbFolder.getKbFolderId(), false, addGroupPermissions,
                addGuestPermissions);
    }

    protected void addKBFolderResources(KBFolder kbFolder, String[] groupPermissions, String[] guestPermissions)
            throws PortalException {

        resourceLocalService.addModelResources(kbFolder.getCompanyId(), kbFolder.getGroupId(), kbFolder.getUserId(),
                KBFolder.class.getName(), kbFolder.getKbFolderId(), groupPermissions, guestPermissions);
    }

    protected void getSubfolderIds(KBFolder parentKBFolder, Collection<Long> kbFolderIds) {

        Collection<KBFolder> kbFolders = kbFolderPersistence.findByG_P(parentKBFolder.getGroupId(),
                parentKBFolder.getKbFolderId());

        for (KBFolder kbFolder : kbFolders) {
            getSubfolderIds(kbFolder, kbFolderIds);
        }

        kbFolderIds.add(parentKBFolder.getKbFolderId());
    }

    protected String getUniqueUrlTitle(long groupId, long parentKbFolderId, long kbFolderId, String name) {

        String urlTitle = KnowledgeBaseUtil.getUrlTitle(kbFolderId, name);

        String uniqueUrlTitle = urlTitle;

        KBFolder kbFolder = null;

        for (int i = 1; kbFolder != null; i++) {
            uniqueUrlTitle = urlTitle + StringPool.DASH + i;

            kbFolder = kbFolderPersistence.fetchByG_P_UT(groupId, parentKbFolderId, uniqueUrlTitle);
        }

        return uniqueUrlTitle;
    }

    protected void validateName(long groupId, long parentKBFolderId, String name) throws PortalException {

        if (Validator.isNull(name)) {
            throw new InvalidKBFolderNameException("KB folder name is null");
        }

        KBFolder kbFolder = kbFolderPersistence.fetchByG_P_N(groupId, parentKBFolderId, name);

        if (kbFolder != null) {
            throw new DuplicateKBFolderNameException(
                    String.format("A KB folder with name %s already exists", name));
        }
    }

    protected void validateParent(KBFolder kbFolder, KBFolder parentKBFolder) throws PortalException {

        if (kbFolder.getGroupId() != parentKBFolder.getGroupId()) {
            throw new NoSuchFolderException(String.format("No KB folder with KB folder ID %s found in group %s",
                    parentKBFolder.getKbFolderId(), kbFolder.getGroupId()));
        }

        Set<Long> subfolderIds = new HashSet<Long>();

        getSubfolderIds(kbFolder, subfolderIds);

        if (subfolderIds.contains(parentKBFolder.getKbFolderId())) {
            throw new InvalidKBFolderNameException(
                    String.format("Cannot move KBFolder %s inside its descendant KBFolder %s",
                            kbFolder.getKbFolderId(), parentKBFolder.getKbFolderId()));
        }
    }

    protected void validateParent(long parentResourceClassNameId, long parentResourcePrimKey)
            throws PortalException {

        long kbFolderClassNameId = classNameLocalService.getClassNameId(KBFolderConstants.getClassName());

        KBFolder parentKBFolder = null;

        if (parentResourceClassNameId == kbFolderClassNameId) {
            if (parentResourcePrimKey == KBFolderConstants.DEFAULT_PARENT_FOLDER_ID) {

                return;
            }

            parentKBFolder = kbFolderPersistence.fetchByPrimaryKey(parentResourcePrimKey);
        }

        if (parentKBFolder == null) {
            throw new NoSuchFolderException(
                    String.format("No KB folder found with KB folder ID %", parentResourcePrimKey));
        }
    }

}