es.ucm.fdi.dalgs.group.service.GroupService.java Source code

Java tutorial

Introduction

Here is the source code for es.ucm.fdi.dalgs.group.service.GroupService.java

Source

/**
 * This file is part of D.A.L.G.S.
 *
 * D.A.L.G.S is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * D.A.L.G.S 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with D.A.L.G.S.  If not, see <http://www.gnu.org/licenses/>.
 */
package es.ucm.fdi.dalgs.group.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;

import org.apache.commons.fileupload.FileItem;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.supercsv.prefs.CsvPreference;

import es.ucm.fdi.dalgs.acl.service.AclObjectService;
import es.ucm.fdi.dalgs.activity.service.ActivityService;
import es.ucm.fdi.dalgs.classes.ResultClass;
import es.ucm.fdi.dalgs.classes.UploadForm;
import es.ucm.fdi.dalgs.course.service.CourseService;
import es.ucm.fdi.dalgs.domain.Activity;
import es.ucm.fdi.dalgs.domain.Course;
import es.ucm.fdi.dalgs.domain.Group;
import es.ucm.fdi.dalgs.domain.User;
import es.ucm.fdi.dalgs.group.repository.GroupRepository;
import es.ucm.fdi.dalgs.mailbox.service.MailBoxService;
import es.ucm.fdi.dalgs.user.service.UserCSV;
import es.ucm.fdi.dalgs.user.service.UserService;

@Service
public class GroupService {

    @Autowired
    private AclObjectService manageAclService;

    @Autowired
    private GroupRepository repositoryGroup;

    @Autowired
    private CourseService serviceCourse;

    @Autowired
    private ActivityService serviceActivity;

    @Autowired
    private UserService serviceUser;

    @Autowired
    private MailBoxService serviceMailBox;

    @Autowired
    private MessageSource messageSource;

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @Transactional(readOnly = false)
    public ResultClass<Group> addGroup(Group group, Long id_course, Long id_academic, Locale locale) {

        boolean success = false;

        Group groupExists = repositoryGroup.existInCourse(id_course, group.getName());
        ResultClass<Group> result = new ResultClass<>();

        if (groupExists != null) {
            result.setHasErrors(true);
            Collection<String> errors = new ArrayList<String>();
            errors.add(messageSource.getMessage("error.Code", null, locale));

            if (groupExists.getIsDeleted()) {
                result.setElementDeleted(true);
                errors.add(messageSource.getMessage("error.deleted", null, locale));
                result.setSingleElement(groupExists);
            } else
                result.setSingleElement(group);
            result.setErrorsList(errors);
        } else {
            group.setCourse(serviceCourse.getCourse(id_course, id_academic).getSingleElement());
            success = repositoryGroup.addGroup(group);

            if (success) {
                groupExists = repositoryGroup.existInCourse(id_course, group.getName());
                success = manageAclService.addACLToObject(groupExists.getId(), groupExists.getClass().getName());

                if (success && (groupExists.getCourse().getCoordinator() != null))
                    manageAclService.addPermissionCASCADE(groupExists.getCourse().getCoordinator(), groupExists,
                            id_academic, id_course, groupExists.getId());

                if (success)
                    result.setSingleElement(group);

            } else {
                throw new IllegalArgumentException("Cannot create ACL. Object not set.");

            }
        }
        return result;
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostFilter("hasPermission(filterObject, 'READ') or hasPermission(filterObject, 'ADMINISTRATION')")
    @Transactional(readOnly = true)
    public ResultClass<Group> getGroup(Long id_group, Long id_course, Long id_academic, Boolean show) {
        ResultClass<Group> result = new ResultClass<Group>();
        Group g = repositoryGroup.getGroup(id_group, id_course, id_academic);
        g.setActivities(serviceActivity.getActivitiesForGroup(id_group, show));
        result.setSingleElement(g);
        return result;
    }

    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> modifyGroup(Group group, Long id_group, Long id_course, Long id_academic,
            Locale locale) {
        ResultClass<Boolean> result = new ResultClass<Boolean>();

        Group modifyGroup = repositoryGroup.getGroup(id_group, id_course, id_academic);

        Group groupExists = repositoryGroup.existInCourse(id_course, group.getName());

        if (!group.getName().equalsIgnoreCase(modifyGroup.getName()) && groupExists != null) {
            result.setHasErrors(true);
            Collection<String> errors = new ArrayList<String>();
            errors.add(messageSource.getMessage("error.newCode", null, locale));

            if (groupExists.getIsDeleted()) {
                result.setElementDeleted(true);
                errors.add(messageSource.getMessage("error.deleted", null, locale));

            }
            result.setErrorsList(errors);
            result.setSingleElement(false);
        } else {
            modifyGroup.setName(group.getName());
            boolean r = repositoryGroup.saveGroup(modifyGroup);
            if (r) {
                result.setSingleElement(true);

            }
        }
        return result;
    }

    // -----
    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> modifyGroupActivities(Group group) {
        ResultClass<Boolean> result = new ResultClass<Boolean>();

        boolean r = repositoryGroup.saveGroup(group);
        if (r)
            result.setSingleElement(true);

        return result;
    }

    // ----

    @PreAuthorize("hasPermission(#group, 'DELETE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> deleteGroup(Group group) {

        ResultClass<Boolean> result = new ResultClass<Boolean>();

        if (serviceActivity.deleteActivitiesFromGroup(group).getSingleElement()) {
            manageAclService.removePermissionCollectionCASCADE(group.getStudents(), group,
                    group.getCourse().getAcademicTerm().getId(), group.getCourse().getId(), group.getId());
            manageAclService.removePermissionCollectionCASCADE(group.getProfessors(), group,
                    group.getCourse().getAcademicTerm().getId(), group.getCourse().getId(), group.getId());

            if (group.getCourse().getCoordinator() != null) {
                manageAclService.removePermissionGroupCoordinator(group.getCourse().getCoordinator(),
                        group.getId());
            }
            group.setProfessors(new ArrayList<User>());
            group.setStudents(new ArrayList<User>());
            result.setSingleElement(repositoryGroup.deleteGroup(group));

            return result;
        }
        result.setSingleElement(false);
        return result;
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostFilter("hasPermission(filterObject, 'READ') or hasPermission(filterObject, 'ADMINISTRATION')")
    @Transactional(readOnly = true)
    public ResultClass<Group> getGroupsForCourse(Long id, Boolean showAll) {
        ResultClass<Group> result = new ResultClass<>();
        result.addAll(repositoryGroup.getGroupsForCourse(id, showAll));
        return result;
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> deleteGroupsFromCourses(Collection<Course> coursesList) {
        ResultClass<Boolean> result = new ResultClass<Boolean>();
        for (Course course : coursesList) {
            for (Group group : course.getGroups()) {
                manageAclService.removePermissionCollectionCASCADE(group.getStudents(), group,
                        course.getAcademicTerm().getId(), course.getId(), group.getId());
                manageAclService.removePermissionCollectionCASCADE(group.getProfessors(), group,
                        course.getAcademicTerm().getId(), course.getId(), group.getId());
                group.setProfessors(new ArrayList<User>());
                group.setStudents(new ArrayList<User>());
            }
            if (course.getCoordinator() != null)
                manageAclService.removePermissionCASCADE(course.getCoordinator(), course,
                        course.getAcademicTerm().getId(), course.getId(), null);
        }

        result.setSingleElement(repositoryGroup.deleteGroupsFromCourses(coursesList));
        return result;
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @Transactional(readOnly = false)
    public ResultClass<Group> unDeleteGroup(Group group, Long id_course, Locale locale) {

        Group g = repositoryGroup.existInCourse(id_course, group.getName());

        ResultClass<Group> result = new ResultClass<>();
        if (g == null) {
            result.setHasErrors(true);
            Collection<String> errors = new ArrayList<String>();
            errors.add(messageSource.getMessage("error.ElementNoExists", null, locale));
            result.setErrorsList(errors);

        } else {
            if (!g.getIsDeleted()) {
                Collection<String> errors = new ArrayList<String>();
                errors.add(messageSource.getMessage("error.CodeNoDeleted", null, locale));
                result.setErrorsList(errors);
            } else {
                g.setDeleted(false);
                g.setName(group.getName());
                boolean r = repositoryGroup.saveGroup(g);
                if (r) {
                    result.setSingleElement(g);
                    if (group.getCourse().getCoordinator() != null) {
                        manageAclService.addPermissionGroupCoordinator(group.getCourse().getCoordinator(),
                                group.getId());
                    }

                }
            }

        }
        return result;
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostFilter("hasPermission(filterObject, 'READ') or hasPermission(filterObject, 'ADMINISTRATION')")
    @Transactional(readOnly = true)
    public ResultClass<Group> getGroupsForStudent(Long id_student) {
        ResultClass<Group> result = new ResultClass<>();
        Collection<Group> groups = repositoryGroup.getGroupsForStudent(id_student);

        if (groups != null)
            result.addAll(groups);
        return result;
    }

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostFilter("hasPermission(filterObject, 'READ') or hasPermission(filterObject, 'ADMINISTRATION')")
    @Transactional(readOnly = true)
    public ResultClass<Group> getGroupsForProfessor(Long id_professor) {
        ResultClass<Group> result = new ResultClass<>();

        Collection<Group> groups = repositoryGroup.getGroupsForProfessor(id_professor);
        if (groups != null)
            result.addAll(groups);
        return result;
    }

    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> setProfessors(Group group, Long id_group, Long id_course, Long id_academic,
            Collection<User> users) {
        ResultClass<Boolean> result = new ResultClass<>();

        Group modifyGroup = repositoryGroup.getGroup(id_group, id_course, id_academic);

        modifyGroup.setProfessors(users);

        result.setHasErrors(!repositoryGroup.saveGroup(modifyGroup));

        if (!result.hasErrors()) {
            manageAclService.addPermissionCollectionCASCADE(users, group, id_academic, id_course, id_group);
            result.setSingleElement(result.hasErrors());

        } else {
            result.getErrorsList().add("Error manageAclService");
            result.setHasErrors(true);
        }
        // }
        return result;
    }

    /*
     * // Delete the authorities to the old user list
     */
    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> removeUsersFromGroup(Group group, String typeOfUser, Long id_academic,
            Long id_course) {
        ResultClass<Boolean> result = new ResultClass<>();

        Collection<User> users = new ArrayList<User>();

        if (typeOfUser.equalsIgnoreCase("ROLE_PROFESSOR")) {
            users = group.getProfessors();
            if (!users.isEmpty()) {
                manageAclService.removePermissionCollectionCASCADE(users, group, id_academic, id_course,
                        group.getId());
                group.getProfessors().clear();

            }
        } else if (typeOfUser.equalsIgnoreCase("ROLE_STUDENT")) {
            users = group.getStudents();
            if (!users.isEmpty()) {
                manageAclService.removePermissionCollectionCASCADE(users, group, id_academic, id_course,
                        group.getId());
                group.getStudents().clear();

            }
        }

        result.setHasErrors(!repositoryGroup.saveGroup(group));

        return result;
    }

    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> setStudents(Group group, Long id_group, Long id_course, Long id_academic,
            Collection<User> users) {

        ResultClass<Boolean> result = new ResultClass<>();
        Group modifyGroup = repositoryGroup.getGroup(id_group, id_course, id_academic);

        modifyGroup.setStudents(users);
        result.setHasErrors(!repositoryGroup.saveGroup(modifyGroup));

        if (!result.hasErrors()) {
            manageAclService.addPermissionCollectionCASCADE(users, modifyGroup, id_academic, id_course, id_group);
        } else {
            result.getErrorsList().add("Error manageAclService");
            result.setHasErrors(true);
        }
        // }

        return result;
    }

    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> deleteUserGroup(Group group, Long id_group, Long id_user, Long id_course,
            Long id_academic, Locale locale) {
        ResultClass<Boolean> result = new ResultClass<Boolean>();
        Group g = repositoryGroup.getGroup(id_group, id_course, id_academic);

        User u = serviceUser.getUser(id_user).getSingleElement();
        if (serviceUser.hasRole(u, "ROLE_PROFESSOR") && !serviceUser.hasRole(u, "ROLE_COORDINATOR")) {

            g.getProfessors().remove(serviceUser.getUser(id_user));
            result = this.modifyGroup(g, id_group, id_course, id_academic, locale);
        } else if (serviceUser.hasRole(u, "ROLE_STUDENT")) {
            g.getStudents().remove(serviceUser.getUser(id_user));
            result = this.modifyGroup(g, id_group, id_course, id_academic, locale);
        }
        if (!result.hasErrors()) {
            // Removing the authorities to the student
            manageAclService.removePermissionCASCADE(u, g, id_academic, id_course, id_group);
        }
        return result;
    }

    @PreAuthorize("hasPermission(#group, 'WRITE') or hasPermission(#group, 'ADMINISTRATION')")
    @Transactional(readOnly = false)
    public ResultClass<Boolean> uploadUserCVS(Group group, UploadForm upload, String typeOfUser, Locale locale) {

        ResultClass<Boolean> result = new ResultClass<>();
        if (!upload.getFileData().isEmpty()) {
            CsvPreference prefers = new CsvPreference.Builder(upload.getQuoteChar().charAt(0),
                    upload.getDelimiterChar().charAt(0), upload.getEndOfLineSymbols()).build();

            List<User> list = null;
            try {
                FileItem fileItem = upload.getFileData().getFileItem();
                UserCSV userUpload = new UserCSV();
                list = userUpload.readCSVUserToBean(fileItem.getInputStream(), upload.getCharset(), prefers,
                        typeOfUser);
                if (list == null) {

                    result.setHasErrors(true);
                    result.getErrorsList().add(messageSource.getMessage("error.params", null, locale));

                } else {
                    if (serviceUser.persistListUsers(group, list).getSingleElement() && list != null) { // Added
                        list = (List<User>) serviceUser.getListUsersWithId(group, list); // correctly

                        //            ResultClass<Boolean> success = new ResultClass<Boolean>();
                        if (typeOfUser.equalsIgnoreCase("ROLE_PROFESSOR")) {

                            result = setProfessors(group, group.getId(), group.getCourse().getId(),
                                    group.getCourse().getAcademicTerm().getId(), list);
                        } else if (typeOfUser.equalsIgnoreCase("ROLE_STUDENT")) {
                            // group.setStudents(list);
                            result = setStudents(group, group.getId(), group.getCourse().getId(),
                                    group.getCourse().getAcademicTerm().getId(), list);

                        } else
                            result.setSingleElement(false);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                result.setSingleElement(false);
            } catch (final IllegalArgumentException e) {
                e.printStackTrace();
                result.setSingleElement(false);
            }
        } else {
            result.setHasErrors(true);
            result.getErrorsList().add(messageSource.getMessage("error.fileEmpty", null, locale));
        }
        return result;
    }

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public ResultClass<Group> copyGroup(Group group, Long id_course, Locale locale) {

        ResultClass<Group> result = new ResultClass<Group>();
        Group copy = group.depth_copy();

        if (copy == null) {
            result.setHasErrors(true);
            Collection<String> errors = new ArrayList<String>();
            errors.add("Copy doesn't work");
            result.setErrorsList(errors);

        } else {
            DateTime time = new DateTime();

            copy.setName(copy.getName() + "  " + time.getMillisOfSecond());

            for (Activity a : copy.getActivities()) {
                a.getInfo().setCode(a.getInfo().getCode() + "  " + time.getMillisOfSecond());

            }

            boolean success = repositoryGroup.addGroup(copy);
            if (success) {
                Group exists = repositoryGroup.existInCourse(id_course, copy.getName());

                if (exists != null) {
                    result.setSingleElement(exists);
                    manageAclService.addACLToObject(exists.getId(), exists.getClass().getName());

                    for (Activity a : exists.getActivities()) {
                        success = success && manageAclService.addACLToObject(a.getId(), a.getClass().getName());

                    }
                }
            }

            result.setHasErrors(!success);

        }
        return result;

    }

    public ResultClass<Boolean> updateGroup(Group group) {
        ResultClass<Boolean> result = new ResultClass<>();
        result.setSingleElement(repositoryGroup.saveGroup(group));
        return result;
    }

    public Group getGroupFormatter(Long id_group) {

        return repositoryGroup.getGroupFormatter(id_group);
    }

}