org.jtalks.poulpe.service.transactional.TransactionalGroupService.java Source code

Java tutorial

Introduction

Here is the source code for org.jtalks.poulpe.service.transactional.TransactionalGroupService.java

Source

/**
 * Copyright (C) 2011  JTalks.org Team
 * 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.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.jtalks.poulpe.service.transactional;

import org.jtalks.common.model.entity.Group;
import org.jtalks.common.model.entity.User;
import org.jtalks.common.security.acl.AclManager;
import org.jtalks.common.security.acl.sids.UserGroupSid;
import org.jtalks.common.security.acl.sids.UserSid;
import org.jtalks.common.service.exceptions.NotFoundException;
import org.jtalks.common.service.transactional.AbstractTransactionalEntityService;
import org.jtalks.poulpe.model.dao.GroupDao;
import org.jtalks.poulpe.model.dao.UserDao;
import org.jtalks.poulpe.model.dto.SecurityGroupList;
import org.jtalks.poulpe.model.entity.PoulpeBranch;
import org.jtalks.poulpe.model.entity.PoulpeUser;
import org.jtalks.poulpe.model.logic.UserBanner;
import org.jtalks.poulpe.service.GroupService;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import ru.javatalks.utils.general.Assert;

import java.util.List;

/**
 * @author alexander afanasiev
 * @author stanislav bashkirtsev
 */
public class TransactionalGroupService extends AbstractTransactionalEntityService<Group, GroupDao>
        implements GroupService {
    private final UserBanner userBanner;
    private final AclManager manager;
    private final UserDao userDao;

    /**
     * Create an instance of entity based service
     *
     * @param groupDao   - data access object, which should be able do all CRUD
     *                   operations.
     * @param userBanner - class for working with banning users instance
     * @param manager - ACL manager to operate with sids
     * @param userDao - to perform all CRUD operations with users
     * 
     */
    public TransactionalGroupService(GroupDao groupDao, UserBanner userBanner, AclManager manager,
            UserDao userDao) {
        this.dao = groupDao;
        this.userBanner = userBanner;
        this.manager = manager;
        this.userDao = userDao;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Group> getAll() {
        return dao.getAll();
    }

    @Override
    public SecurityGroupList getSecurityGroups() {
        return new SecurityGroupList(dao.getAll()).withAnonymousGroup();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Group> getByNameContains(String name) {
        return dao.getByNameContains(name);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Group> getByName(String name) {
        return dao.getByName(name);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void deleteGroup(Group group) throws NotFoundException {
        Assert.throwIfNull(group, "group");

        for (User user : group.getUsers()) {
            user.getGroups().remove(group);
            userDao.saveOrUpdate((PoulpeUser) user);
        }
        dao.delete(group);

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        User currentUser = (User) auth.getPrincipal();
        UserGroupSid sid = new UserGroupSid(group);
        UserSid sidHeier = new UserSid(currentUser);
        try {
            manager.deleteSid(sid, sidHeier);
        } catch (EmptyResultDataAccessException noSidError) {
            throw new NotFoundException();
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void saveGroup(Group group) {
        Assert.throwIfNull(group, "group");
        group.setName(group.getName().trim());
        dao.saveOrUpdate(group);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Group> getBannedUsersGroups() {
        return userBanner.getBannedUsersGroups();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<PoulpeBranch> getModeratedBranches(Group group) {
        return dao.getModeratingBranches(group);
    }
}