org.cgiar.ccafs.marlo.action.crp.admin.CrpPpaPartnersAction.java Source code

Java tutorial

Introduction

Here is the source code for org.cgiar.ccafs.marlo.action.crp.admin.CrpPpaPartnersAction.java

Source

/*****************************************************************
 * \ * This file is part of Managing Agricultural Research for Learning &
 * Outcomes Platform (MARLO).
 * MARLO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * at your option) any later version.
 * MARLO 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 General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with MARLO. If not, see <http://www.gnu.org/licenses/>.
 *****************************************************************/

package org.cgiar.ccafs.marlo.action.crp.admin;

import org.cgiar.ccafs.marlo.action.BaseAction;
import org.cgiar.ccafs.marlo.config.APConstants;
import org.cgiar.ccafs.marlo.data.manager.CrpPpaPartnerManager;
import org.cgiar.ccafs.marlo.data.manager.CrpUserManager;
import org.cgiar.ccafs.marlo.data.manager.GlobalUnitManager;
import org.cgiar.ccafs.marlo.data.manager.InstitutionManager;
import org.cgiar.ccafs.marlo.data.manager.LiaisonInstitutionManager;
import org.cgiar.ccafs.marlo.data.manager.LiaisonUserManager;
import org.cgiar.ccafs.marlo.data.manager.RoleManager;
import org.cgiar.ccafs.marlo.data.manager.UserManager;
import org.cgiar.ccafs.marlo.data.manager.UserRoleManager;
import org.cgiar.ccafs.marlo.data.model.CrpPpaPartner;
import org.cgiar.ccafs.marlo.data.model.CrpUser;
import org.cgiar.ccafs.marlo.data.model.GlobalUnit;
import org.cgiar.ccafs.marlo.data.model.Institution;
import org.cgiar.ccafs.marlo.data.model.LiaisonInstitution;
import org.cgiar.ccafs.marlo.data.model.LiaisonUser;
import org.cgiar.ccafs.marlo.data.model.Role;
import org.cgiar.ccafs.marlo.data.model.User;
import org.cgiar.ccafs.marlo.data.model.UserRole;
import org.cgiar.ccafs.marlo.security.Permission;
import org.cgiar.ccafs.marlo.utils.APConfig;
import org.cgiar.ccafs.marlo.utils.SendMailS;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.inject.Inject;

import org.apache.commons.lang.RandomStringUtils;

/**
 * CrpPpaPartnersAction:
 * 
 * @author Hermes Jimnez - CIAT/CCAFS
 * @author avalencia - CCAFS
 * @date Oct 26, 2017
 * @time 11:24:16 AM Add cpRole as a flag to avoid contact points
 */
public class CrpPpaPartnersAction extends BaseAction {

    private static final long serialVersionUID = -8561096521514225205L;

    /**
     * Helper method to read a stream into memory.
     * 
     * @param stream
     * @return
     * @throws IOException
     */
    public static byte[] readFully(InputStream stream) throws IOException {
        byte[] buffer = new byte[8192];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        int bytesRead;
        while ((bytesRead = stream.read(buffer)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }
        return baos.toByteArray();
    }

    // Managers
    private InstitutionManager institutionManager;

    private GlobalUnitManager crpManager;

    private CrpPpaPartnerManager crpPpaPartnerManager;
    private LiaisonUserManager liaisonUserManager;
    private LiaisonInstitutionManager liaisonInstitutionManager;
    private UserRoleManager userRoleManager;
    private RoleManager roleManager;
    private Role cpRole;
    private CrpUserManager crpUserManager;
    private UserManager userManager;
    // Variables
    private List<Institution> institutions;

    private List<Institution> crpInstitutions;
    private GlobalUnit loggedCrp;
    // Util
    private SendMailS sendMail;

    @Inject
    public CrpPpaPartnersAction(APConfig config, InstitutionManager institutionManager,
            GlobalUnitManager crpManager, CrpPpaPartnerManager crpPpaPartnerManager,
            LiaisonUserManager liaisonUserManager, LiaisonInstitutionManager liaisonInstitutionManager,
            UserRoleManager userRoleManager, RoleManager roleManager, UserManager userManager,
            CrpUserManager crpUserManager, SendMailS sendMail) {
        super(config);
        this.institutionManager = institutionManager;
        this.crpManager = crpManager;
        this.crpPpaPartnerManager = crpPpaPartnerManager;
        this.liaisonUserManager = liaisonUserManager;
        this.liaisonInstitutionManager = liaisonInstitutionManager;
        this.userRoleManager = userRoleManager;
        this.roleManager = roleManager;
        this.userManager = userManager;
        this.crpUserManager = crpUserManager;
        this.sendMail = sendMail;
    }

    /**
     * Add Crp User if there is not any active.
     * 
     * @author avalencia - CCAFS
     * @date Dec 20, 2017
     * @time 9:56:52 AM
     * @param user
     */
    private void addCrpUserIfNotExist(User user) {
        if (!crpUserManager.existActiveCrpUser(user.getId(), loggedCrp.getId())) {
            CrpUser crpUser = new CrpUser(loggedCrp, user);
            crpUserManager.saveCrpUser(crpUser);
        }
    }

    /**
     * Add cpRole as a flag to avoid contact points
     * 
     * @author avalencia - CCAFS
     * @date Oct 26, 2017
     * @time 11:22:37 AM
     * @param partnerDB
     */
    private void checkChangesCrpPpaPartnerContactPoints(CrpPpaPartner partnerDB) {
        for (CrpPpaPartner crpPpaPartner : loggedCrp.getCrpInstitutionsPartners().stream()
                .filter(c -> c.getId().longValue() == (partnerDB.getId().longValue()))
                .collect(Collectors.toList())) {
            // fill contactPoints
            if (cpRole != null) {
                this.fillContactPoints(partnerDB);
            }
            // Check disabled contact points
            if (cpRole != null) {
                for (LiaisonUser liaisonUser : partnerDB.getContactPoints()) {
                    if (crpPpaPartner.getContactPoints() == null || crpPpaPartner.getContactPoints().isEmpty()
                            || !crpPpaPartner.getContactPoints().contains(liaisonUser)) {
                        // Disable liaisonUser, liaisonInstitution and 1 UserRole
                        if (liaisonUser.getUser() != null && liaisonUser.getUser().getId() != null
                                && cpRole != null) {
                            List<UserRole> userRoles = userRoleManager
                                    .getUserRolesByUserId(liaisonUser.getUser().getId()).stream()
                                    .filter(ur -> ur.getRole().equals(cpRole)).collect(Collectors.toList());
                            if (userRoles != null && userRoles.size() > 0) {
                                UserRole userRole = userRoles.get(0);
                                userRoleManager.deleteUserRole(userRole.getId());
                                this.notifyRoleContactPointUnassigned(userRole, partnerDB);
                            }
                        }
                        // Disable LiaisonUser
                        liaisonUserManager.deleteLiaisonUser(liaisonUser.getId());
                    }
                }
            }
            // Check Added liaisonUsers
            if (cpRole != null) {
                if (crpPpaPartner.getContactPoints() != null && !crpPpaPartner.getContactPoints().isEmpty()) {
                    for (LiaisonUser liaisonUser : crpPpaPartner.getContactPoints()) {
                        // new User?
                        if (liaisonUser.getId() == null || !partnerDB.getContactPoints().contains(liaisonUser)) {
                            LiaisonInstitution liaisonInstitution = liaisonInstitutionManager
                                    .getLiasonInstitutionByInstitutionId(crpPpaPartner.getInstitution().getId(),
                                            loggedCrp.getId());
                            Institution institution = institutionManager
                                    .getInstitutionById(crpPpaPartner.getInstitution().getId());
                            // Add LiaisonInstitution if don't exists
                            if (liaisonInstitution == null && institution != null) {
                                liaisonInstitution = new LiaisonInstitution();
                                liaisonInstitution.setInstitution(institution);
                                liaisonInstitution.setCrp(loggedCrp);
                                liaisonInstitution.setActive(true);
                                liaisonInstitution.setName(institution.getName());
                                liaisonInstitution.setAcronym(institution.getAcronym());
                                liaisonInstitutionManager.saveLiaisonInstitution(liaisonInstitution);
                            }
                            // Add liaisonUser
                            LiaisonUser liaisonUserSave = new LiaisonUser(liaisonInstitution,
                                    userManager.getUser(liaisonUser.getUser().getId()));
                            liaisonUserSave.setCrp(loggedCrp);
                            liaisonUserSave.setActive(true);
                            liaisonUserManager.saveLiaisonUser(liaisonUserSave);
                            // If is new user active it
                            if (!liaisonUser.getUser().isActive()) {
                                this.notifyNewUserCreated(liaisonUser.getUser());
                            }
                            this.addCrpUserIfNotExist(liaisonUser.getUser());
                            // add userRole
                            if (cpRole != null) {
                                UserRole userRole = new UserRole(cpRole, liaisonUserSave.getUser());
                                userRoleManager.saveUserRole(userRole);
                                this.notifyRoleContactPointAssigned(userRole, crpPpaPartner);
                            }
                            partnerDB.getContactPoints().add(liaisonUserSave);
                        }
                    }
                }
            }
        }
    }

    /**
     * Add cpRole as a flag to avoid contact points
     * 
     * @author avalencia - CCAFS
     * @date Oct 26, 2017
     * @time 11:23:00 AM
     * @param partner
     */
    private void disableCrpPpaPartnerContactPoints(CrpPpaPartner partner) {
        // Disable liaisonUser, liaisonInstitution and UserRoles
        LiaisonInstitution liaisonInstitution = liaisonInstitutionManager
                .getLiasonInstitutionByInstitutionId(partner.getInstitution().getId(), loggedCrp.getId());
        // Disable liaisonInstitution
        if (liaisonInstitution != null && liaisonInstitution.isActive()) {
            liaisonInstitutionManager.deleteLiaisonInstitution(liaisonInstitution.getId());
            // Disable LiaisonUsers
            if (cpRole != null && liaisonInstitution.getLiaisonUsers() != null
                    && !liaisonInstitution.getLiaisonUsers().isEmpty()) {
                for (LiaisonUser liaisonUser : liaisonInstitution.getLiaisonUsers().stream()
                        .filter(lu -> lu.isActive()).collect(Collectors.toList())) {
                    // Delete CP UserRole
                    if (liaisonUser.getUser() != null && liaisonUser.getUser().getId() != null && cpRole != null) {
                        List<UserRole> userRoles = userRoleManager
                                .getUserRolesByUserId(liaisonUser.getUser().getId()).stream()
                                .filter(ur -> ur.getRole().equals(cpRole)).collect(Collectors.toList());
                        for (UserRole userRole : userRoles) {
                            userRoleManager.deleteUserRole(userRole.getId());
                            this.notifyRoleContactPointUnassigned(userRole, partner);
                        }
                    }
                    // Disable LiaisonUser
                    liaisonUserManager.deleteLiaisonUser(liaisonUser.getId());
                }
            }
        }

    }

    /**
     * Add cpRole as a flag to avoid contact points
     * 
     * @author avalencia - CCAFS
     * @date Oct 26, 2017
     * @time 11:23:44 AM
     * @param crpPpaPartner
     */
    private void fillContactPoints(CrpPpaPartner crpPpaPartner) {

        LiaisonInstitution liaisonInstitution = liaisonInstitutionManager
                .getLiasonInstitutionByInstitutionId(crpPpaPartner.getInstitution().getId(), loggedCrp.getId());
        if (cpRole != null && liaisonInstitution != null && liaisonInstitution.isActive()) {
            crpPpaPartner.setContactPoints(liaisonInstitution.getLiaisonUsers().stream()
                    .filter(lu -> lu.isActive() && lu.getUser() != null && lu.getUser().isActive()
                            && lu.getCrp() != null && lu.getCrp().equals(loggedCrp))
                    .sorted((lu1, lu2) -> lu1.getUser().getLastName().compareTo(lu2.getUser().getLastName()))
                    .collect(Collectors.toList()));
        } else {
            crpPpaPartner.setContactPoints(new ArrayList<LiaisonUser>());
        }
    }

    public Role getCpRole() {
        return cpRole;
    }

    public List<Institution> getCrpInstitutions() {
        return crpInstitutions;
    }

    public List<Institution> getInstitutions() {
        return institutions;
    }

    public GlobalUnit getLoggedCrp() {
        return loggedCrp;
    }

    /**
     * This method will validate if the user is deactivated. If so, it will send an email indicating the credentials to
     * access.
     * 
     * @param user is a User object that could be the leader.
     */
    private void notifyNewUserCreated(User user) {
        user = userManager.getUser(user.getId());

        if (!user.isActive()) {
            String toEmail = user.getEmail();
            String ccEmail = null;
            String bbcEmails = this.config.getEmailNotification();
            String subject = this.getText("email.newUser.subject", new String[] { user.getFirstName() });
            // Setting the password
            String password = this.getText("email.outlookPassword");
            if (!user.isCgiarUser()) {
                // Generating a random password.

                password = RandomStringUtils.randomNumeric(6);
                // Applying the password to the user.

            }

            // Building the Email message:
            StringBuilder message = new StringBuilder();
            message.append(this.getText("email.dear", new String[] { user.getFirstName() }));

            // get CRPAdmin contacts
            String crpAdmins = "";
            long adminRol = Long.parseLong((String) this.getSession().get(APConstants.CRP_ADMIN_ROLE));
            Role roleAdmin = roleManager.getRoleById(adminRol);
            List<UserRole> userRoles = roleAdmin.getUserRoles().stream()
                    .filter(ur -> ur.getUser() != null && ur.getUser().isActive()).collect(Collectors.toList());
            for (UserRole userRole : userRoles) {
                if (crpAdmins.isEmpty()) {
                    crpAdmins += userRole.getUser().getComposedCompleteName() + " (" + userRole.getUser().getEmail()
                            + ")";
                } else {
                    crpAdmins += ", " + userRole.getUser().getComposedCompleteName() + " ("
                            + userRole.getUser().getEmail() + ")";
                }
            }

            message.append(this.getText("email.newUser.part1",
                    new String[] { this.getText("email.newUser.listRoles"), config.getBaseUrl(), user.getEmail(),
                            password, this.getText("email.support", new String[] { crpAdmins }) }));
            message.append(this.getText("email.bye"));

            // Saving crpUser
            Map<String, Object> mapUser = new HashMap<>();
            mapUser.put("user", user);
            mapUser.put("password", password);
            this.getUsersToActive().add(mapUser);
            this.addCrpUserIfNotExist(user);

            // Send UserManual.pdf
            String contentType = "application/pdf";
            String fileName = "Introduction_To_MARLO_v2.2.pdf";
            byte[] buffer = null;
            InputStream inputStream = null;

            try {
                inputStream = this.getClass().getResourceAsStream("/manual/Introduction_To_MARLO_v2.2.pdf");
                buffer = readFully(inputStream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            if (buffer != null && fileName != null && contentType != null) {
                sendMail.send(toEmail, ccEmail, bbcEmails, subject, message.toString(), buffer, contentType,
                        fileName, true);
            } else {
                sendMail.send(toEmail, ccEmail, bbcEmails, subject, message.toString(), null, null, null, true);
            }
        }
    }

    /**
     * This method notify the user that is been assigned as Contact Point for an specific PPA / Managing Partner
     * 
     * @author avalencia - CCAFS
     * @date Oct 30, 2017
     * @time 9:33:38 AM
     * @param userRoleAssigned is the user and role been assigned
     * @param crpPpaPartner is the PPA / Managing Partner where is assigned
     */
    private void notifyRoleContactPointAssigned(UserRole userRoleAssigned, CrpPpaPartner crpPpaPartner) {
        crpPpaPartner = crpPpaPartnerManager.getCrpPpaPartnerById(crpPpaPartner.getId());
        // Email send to the user assigned
        String toEmail = userRoleAssigned.getUser().getEmail();
        // CC will be the user who is making the modification and the CRP Admins
        String ccEmail = "";
        if (this.getCurrentUser() != null) {
            ccEmail = this.getCurrentUser().getEmail();
        }

        // Adding CRP Admins to CC
        String crpAdmins = "";
        String crpAdminsEmail = "";
        long adminRol = Long.parseLong((String) this.getSession().get(APConstants.CRP_ADMIN_ROLE));
        Role roleAdmin = roleManager.getRoleById(adminRol);
        List<UserRole> userRoles = roleAdmin.getUserRoles().stream()
                .filter(ur -> ur.getUser() != null && ur.getUser().isActive()).collect(Collectors.toList());
        for (UserRole userRole : userRoles) {
            if (crpAdmins.isEmpty()) {
                crpAdmins += userRole.getUser().getComposedCompleteName() + " (" + userRole.getUser().getEmail()
                        + ")";
                crpAdminsEmail += userRole.getUser().getEmail();
            } else {
                crpAdmins += ", " + userRole.getUser().getComposedCompleteName() + " ("
                        + userRole.getUser().getEmail() + ")";
                crpAdminsEmail += ", " + userRole.getUser().getEmail();
            }
        }
        if (!crpAdminsEmail.isEmpty()) {
            if (ccEmail.isEmpty()) {
                ccEmail += crpAdminsEmail;
            } else {
                ccEmail += ", " + crpAdminsEmail;
            }
        }

        // BBC will be our gmail notification email.
        String bbcEmails = this.config.getEmailNotification();
        String crp = loggedCrp.getAcronym() != null && !loggedCrp.getAcronym().isEmpty() ? loggedCrp.getAcronym()
                : loggedCrp.getName();
        String ppaPartner = crpPpaPartner.getInstitution().getAcronym() != null
                && !crpPpaPartner.getInstitution().getAcronym().isEmpty()
                        ? crpPpaPartner.getInstitution().getAcronym()
                        : crpPpaPartner.getInstitution().getName();

        String subject = this.getText("email.contactpoint.assigned.subject", new String[] { ppaPartner, crp });

        StringBuilder message = new StringBuilder();
        // Building the Email message:
        message.append(this.getText("email.dear", new String[] { userRoleAssigned.getUser().getFirstName() }));
        message.append(this.getText("email.contactpoint.assigned",
                new String[] { ppaPartner, crp, this.getText("email.contactpoint.responsabilities") }));

        message.append(this.getText("email.support", new String[] { crpAdmins }));
        message.append(this.getText("email.getStarted"));
        message.append(this.getText("email.bye"));

        sendMail.send(toEmail, ccEmail, bbcEmails, subject, message.toString(), null, null, null, true);
    }

    /**
     * This method notify the user that is been unassigned as Contact Point for an specific PPA / Managing Partner
     * 
     * @author avalencia - CCAFS
     * @date Oct 30, 2017
     * @time 9:34:14 AM
     * @param userRoleUnassigned is the user and role been unassigned
     * @param crpPpaPartner is the PPA / Managing Partner where is assigned
     */
    private void notifyRoleContactPointUnassigned(UserRole userRoleUnassigned, CrpPpaPartner crpPpaPartner) {
        // Email send to the user unassigned
        String toEmail = userRoleUnassigned.getUser().getEmail();
        // CC will be the user who is making the modification and the CRP Admins
        String ccEmail = "";
        if (this.getCurrentUser() != null) {
            ccEmail = this.getCurrentUser().getEmail();
        }

        // Adding CRP Admins to CC
        String crpAdmins = "";
        String crpAdminsEmail = "";
        long adminRol = Long.parseLong((String) this.getSession().get(APConstants.CRP_ADMIN_ROLE));
        Role roleAdmin = roleManager.getRoleById(adminRol);
        List<UserRole> userRoles = roleAdmin.getUserRoles().stream()
                .filter(ur -> ur.getUser() != null && ur.getUser().isActive()).collect(Collectors.toList());
        for (UserRole userRole : userRoles) {
            if (crpAdmins.isEmpty()) {
                crpAdmins += userRole.getUser().getComposedCompleteName() + " (" + userRole.getUser().getEmail()
                        + ")";
                crpAdminsEmail += userRole.getUser().getEmail();
            } else {
                crpAdmins += ", " + userRole.getUser().getComposedCompleteName() + " ("
                        + userRole.getUser().getEmail() + ")";
                crpAdminsEmail += ", " + userRole.getUser().getEmail();
            }
        }
        if (!crpAdminsEmail.isEmpty()) {
            if (ccEmail.isEmpty()) {
                ccEmail += crpAdminsEmail;
            } else {
                ccEmail += ", " + crpAdminsEmail;
            }
        }

        // BBC will be our gmail notification email.
        String bbcEmails = this.config.getEmailNotification();
        Institution institution = institutionManager.getInstitutionById(crpPpaPartner.getInstitution().getId());

        String crp = loggedCrp.getAcronym() != null && !loggedCrp.getAcronym().isEmpty() ? loggedCrp.getAcronym()
                : loggedCrp.getName();
        String ppaPartner = institution.getAcronym() != null && !institution.getAcronym().isEmpty()
                ? institution.getAcronym()
                : institution.getName();

        String subject = this.getText("email.contactpoint.unassigned.subject", new String[] { crp, ppaPartner });

        StringBuilder message = new StringBuilder();
        // Building the Email message:
        message.append(this.getText("email.dear", new String[] { userRoleUnassigned.getUser().getFirstName() }));
        message.append(this.getText("email.contactpoint.unassigned", new String[] { crp, ppaPartner }));

        message.append(this.getText("email.support", new String[] { crpAdmins }));
        message.append(this.getText("email.bye"));

        sendMail.send(toEmail, ccEmail, bbcEmails, subject, message.toString(), null, null, null, true);
    }

    /**
     * Add cpRole as a flag to avoid contact points
     * 
     * @author avalencia - CCAFS
     * @date Oct 26, 2017
     * @time 11:23:59 AM
     * @throws Exception
     */
    @Override
    public void prepare() throws Exception {
        super.prepare();
        loggedCrp = (GlobalUnit) this.getSession().get(APConstants.SESSION_CRP);
        loggedCrp = crpManager.getGlobalUnitById(loggedCrp.getId());

        String params[] = { loggedCrp.getAcronym() };

        // Check if the CRP has Contact Point and ContactPointRole, if not cpRole will be null (it will be used as a flag)
        if (this.hasSpecificities(APConstants.CRP_HAS_CP) && roleManager
                .getRoleById(Long.parseLong((String) this.getSession().get(APConstants.CRP_CP_ROLE))) != null) {
            cpRole = roleManager
                    .getRoleById(Long.parseLong((String) this.getSession().get(APConstants.CRP_CP_ROLE)));
        }

        if (loggedCrp.getCrpPpaPartners() != null) {
            loggedCrp.setCrpInstitutionsPartners(new ArrayList<CrpPpaPartner>(loggedCrp.getCrpPpaPartners().stream()
                    .filter(ppa -> ppa.isActive() && ppa.getPhase().equals(this.getActualPhase()))
                    .collect(Collectors.toList())));
            loggedCrp.getCrpInstitutionsPartners()
                    .sort((p1, p2) -> p1.getInstitution().getName().compareTo(p2.getInstitution().getName()));
            // Fill Managing/PPA Partners with contact persons
            if (cpRole != null) {
                Set<CrpPpaPartner> crpPpaPartners = new HashSet<CrpPpaPartner>(0);
                for (CrpPpaPartner crpPpaPartner : loggedCrp.getCrpInstitutionsPartners()) {
                    this.fillContactPoints(crpPpaPartner);
                    crpPpaPartners.add(crpPpaPartner);
                }
                loggedCrp.setCrpPpaPartners(crpPpaPartners);
            }
        }
        institutions = institutionManager.findAll().stream().filter(c -> c.isActive()).collect(Collectors.toList());
        institutions.sort((i1, i2) -> i1.getName().compareTo(i2.getName()));

        this.setBasePermission(this.getText(Permission.CRP_ADMIN_BASE_PERMISSION, params));
        if (this.isHttpPost()) {
            if (loggedCrp.getCrpInstitutionsPartners() != null) {
                loggedCrp.getCrpInstitutionsPartners().clear();
            }
        }
    }

    @Override
    public String save() {
        if (this.hasPermission("*")) {
            this.setUsersToActive(new ArrayList<>());
            List<CrpPpaPartner> ppaPartnerReview = new ArrayList<>(crpPpaPartnerManager.findAll().stream()
                    .filter(ppa -> ppa.isActive() && ppa.getCrp().getId() == loggedCrp.getId()
                            && ppa.getPhase().equals(this.getActualPhase()))
                    .collect(Collectors.toList()));
            if (ppaPartnerReview != null) {

                for (CrpPpaPartner partner : ppaPartnerReview.stream().filter(
                        ppa -> ppa.getCrp().equals(loggedCrp) && ppa.getPhase().equals(this.getActualPhase()))
                        .collect(Collectors.toList())) {
                    if (!loggedCrp.getCrpInstitutionsPartners().contains(partner)) {
                        crpPpaPartnerManager.deleteCrpPpaPartner(partner.getId());

                        this.disableCrpPpaPartnerContactPoints(partner);
                    }
                }
            }

            for (CrpPpaPartner partner : loggedCrp.getCrpInstitutionsPartners()) {
                if (partner.getId() == null) {
                    partner.setCrp(loggedCrp);
                    Institution institution = institutionManager
                            .getInstitutionById(partner.getInstitution().getId());
                    partner.setInstitution(institution);
                    partner.setPhase(this.getActualPhase());
                    partner = crpPpaPartnerManager.saveCrpPpaPartner(partner);
                    // save liaison institution if don't exists

                    LiaisonInstitution liaisonInstitution = liaisonInstitutionManager
                            .getLiasonInstitutionByInstitutionId(partner.getInstitution().getId(),
                                    loggedCrp.getId());
                    // Add LiaisonInstitution if don't exists
                    if (liaisonInstitution == null) {
                        liaisonInstitution = new LiaisonInstitution();
                        liaisonInstitution.setInstitution(institution);
                        liaisonInstitution.setCrp(loggedCrp);
                        liaisonInstitution.setActive(true);
                        liaisonInstitution.setName(partner.getInstitution().getName());
                        liaisonInstitution.setAcronym(partner.getInstitution().getAcronym());
                        liaisonInstitution = liaisonInstitutionManager.saveLiaisonInstitution(liaisonInstitution);
                    }

                } else {
                    LiaisonInstitution liaisonInstitution = liaisonInstitutionManager
                            .getLiasonInstitutionByInstitutionId(partner.getInstitution().getId(),
                                    loggedCrp.getId());

                    if (liaisonInstitution == null) {
                        partner.setInstitution(
                                institutionManager.getInstitutionById(partner.getInstitution().getId()));
                        liaisonInstitution = new LiaisonInstitution();
                        liaisonInstitution.setInstitution(partner.getInstitution());
                        liaisonInstitution.setCrp(loggedCrp);
                        liaisonInstitution.setActive(true);
                        liaisonInstitution.setName(partner.getInstitution().getName());
                        liaisonInstitution.setAcronym(partner.getInstitution().getAcronym());
                        liaisonInstitution = liaisonInstitutionManager.saveLiaisonInstitution(liaisonInstitution);
                    }
                    if (liaisonInstitution != null) {

                        List<LiaisonUser> usersDB = liaisonInstitution.getLiaisonUsers().stream()
                                .filter(c -> c.isActive()).collect(Collectors.toList());
                        if (partner.getContactPoints() == null) {
                            partner.setContactPoints(new ArrayList<>());
                        }
                        for (LiaisonUser liaisonUser : usersDB) {
                            List<LiaisonUser> liaisonUsersResult = partner
                                    .getContactPoints().stream().filter(c -> c.getUser().getId()
                                            .longValue() == liaisonUser.getUser().getId().longValue())
                                    .collect(Collectors.toList());
                            if (liaisonUsersResult.isEmpty()) {
                                liaisonUserManager.deleteLiaisonUser(liaisonUser.getId());
                                // Disable LiaisonUsers
                                if (liaisonUser.getUser() != null && liaisonUser.getUser().getId() != null
                                        && cpRole != null) {
                                    List<UserRole> userRoles = userRoleManager
                                            .getUserRolesByUserId(liaisonUser.getUser().getId()).stream()
                                            .filter(ur -> ur.getRole().equals(cpRole)).collect(Collectors.toList());
                                    for (UserRole userRole : userRoles) {
                                        userRoleManager.deleteUserRole(userRole.getId());
                                        this.notifyRoleContactPointUnassigned(userRole, partner);
                                    }
                                }
                            }
                        }
                        if (partner.getContactPoints() != null && partner.getContactPoints().size() > 0) {

                            for (LiaisonUser liaisonUser : partner.getContactPoints()) {
                                // new User?
                                if (liaisonUser.getId() == null
                                        || !partner.getContactPoints().contains(liaisonUser)) {
                                    // Add liaisonUser
                                    LiaisonUser liaisonUserSave = new LiaisonUser(liaisonInstitution,
                                            userManager.getUser(liaisonUser.getUser().getId()));
                                    liaisonUserSave.setCrp(loggedCrp);
                                    liaisonUserSave.setActive(true);
                                    liaisonUserSave.setLiaisonInstitution(liaisonInstitution);
                                    if (liaisonInstitution != null) {
                                        liaisonUserManager.saveLiaisonUser(liaisonUserSave);
                                        // If is new user active it
                                        if (!liaisonUser.getUser().isActive()) {
                                            this.notifyNewUserCreated(liaisonUser.getUser());
                                        }
                                        this.addCrpUserIfNotExist(liaisonUser.getUser());
                                        // add userRole
                                        if (cpRole != null) {
                                            UserRole userRole = new UserRole(cpRole, liaisonUserSave.getUser());
                                            userRoleManager.saveUserRole(userRole);
                                            this.notifyRoleContactPointAssigned(userRole, partner);
                                        }
                                    }

                                }
                            }
                        }
                    }

                }
            }

            this.addUsers();

            Collection<String> messages = this.getActionMessages();
            if (!messages.isEmpty()) {
                String validationMessage = messages.iterator().next();
                this.setActionMessages(null);
                this.addActionWarning(this.getText("saving.saved") + validationMessage);
            } else {
                this.addActionMessage("message:" + this.getText("saving.saved"));
            }
            messages = this.getActionMessages();
            return SUCCESS;
        } else {
            return NOT_AUTHORIZED;
        }
    }

    public void setCpRole(Role cpRole) {
        this.cpRole = cpRole;
    }

    public void setCrpInstitutions(List<Institution> crpInstitutions) {
        this.crpInstitutions = crpInstitutions;
    }

    public void setInstitutions(List<Institution> institutions) {
        this.institutions = institutions;
    }

    public void setLoggedCrp(GlobalUnit loggedCrp) {
        this.loggedCrp = loggedCrp;
    }

}