es.caib.seycon.ng.model.RolAccountEntityDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for es.caib.seycon.ng.model.RolAccountEntityDaoImpl.java

Source

// license-header java merge-point
/**
 * This is only generated once! It will never be overwritten.
 * You can (and have to!) safely modify it by hand.
 */
package es.caib.seycon.ng.model;

import java.io.IOException;
import java.io.InputStreamReader;
import java.security.Principal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;

import org.hibernate.Hibernate;

import es.caib.seycon.ng.PrincipalStore;
import es.caib.seycon.ng.comu.AccountType;
import es.caib.seycon.ng.comu.AdministracioAplicacio;
import es.caib.seycon.ng.comu.Auditoria;
import es.caib.seycon.ng.comu.ContenidorRol;
import es.caib.seycon.ng.comu.Identitat;
import es.caib.seycon.ng.comu.Notificacio;
import es.caib.seycon.ng.comu.RolGrant;
import es.caib.seycon.ng.comu.RolAccount;
import es.caib.seycon.ng.comu.Tasca;
import es.caib.seycon.ng.comu.TipusDomini;
import es.caib.seycon.ng.comu.Usuari;
import es.caib.seycon.ng.comu.ValorDomini;
import es.caib.seycon.ng.exception.InternalErrorException;
import es.caib.seycon.ng.exception.SeyconException;
import es.caib.seycon.ng.sync.engine.TaskHandler;
import es.caib.seycon.ng.utils.DateUtils;
import es.caib.seycon.ng.utils.ExceptionTranslator;
import es.caib.seycon.ng.utils.MailUtils;
import es.caib.seycon.ng.utils.Security;
import es.caib.seycon.ng.utils.TipusContenidorRol;

/**
 * @see es.caib.seycon.ng.model.RolAccountEntity
 */
public class RolAccountEntityDaoImpl extends es.caib.seycon.ng.model.RolAccountEntityDaoBase {

    private void auditarRolAccount(String accio, RolAccountEntity grant) {
        String codiUsuari = Security.getCurrentAccount();
        if (grant.getAccount().getType().equals(AccountType.USER)) {
            for (UserAccountEntity ua : grant.getAccount().getUsers()) {
                Auditoria auditoria = new Auditoria();
                auditoria.setAccio(accio);
                auditoria.setRol(grant.getRol().getNom());
                auditoria.setUsuari(ua.getUser().getCodi());
                auditoria.setAccount(grant.getAccount().getName());
                auditoria.setBbdd(grant.getRol().getBaseDeDades().getCodi());
                auditoria.setAplicacio(grant.getRol().getAplicacio().getCodi());
                auditoria.setAutor(codiUsuari);
                if (grant.getRule() != null) {
                    auditoria.setRule(grant.getRule().getDescription());
                    auditoria.setAccio(accio.toLowerCase());
                }
                if (grant.getValorDominiAplicacio() != null) {
                    auditoria.setValorDomini(grant.getValorDominiAplicacio().getValor());
                    auditoria.setDomini(grant.getValorDominiAplicacio().getDescripcio());
                } else if (grant.getAplicacioAdministrada() != null) {
                    auditoria.setValorDomini(grant.getAplicacioAdministrada().getCodi());
                    auditoria.setDomini(grant.getAplicacioAdministrada().getNom());
                } else if (grant.getGrup() != null) {
                    auditoria.setValorDomini(grant.getGrup().getCodi());
                    auditoria.setDomini(grant.getGrup().getDescripcio());
                } else {
                    auditoria.setValorDomini(null);
                    auditoria.setDomini(null);
                }
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
                auditoria.setData(dateFormat.format(Calendar.getInstance().getTime()));
                auditoria.setObjecte("SC_ROLUSU"); //$NON-NLS-1$
                getAuditoriaEntityDao().create(getAuditoriaEntityDao().auditoriaToEntity(auditoria));
            }
        } else {
            Auditoria auditoria = new Auditoria();
            auditoria.setAccio(accio);
            auditoria.setRol(grant.getRol().getNom());
            auditoria.setBbdd(grant.getRol().getBaseDeDades().getCodi());
            auditoria.setAccount(grant.getAccount().getName());
            auditoria.setAplicacio(grant.getRol().getAplicacio().getCodi());
            auditoria.setAutor(codiUsuari);
            if (grant.getRule() != null) {
                auditoria.setRule(grant.getRule().getDescription());
                auditoria.setAccio(accio.toLowerCase());
            }
            if (grant.getValorDominiAplicacio() != null) {
                auditoria.setValorDomini(grant.getValorDominiAplicacio().getValor());
                auditoria.setDomini(grant.getValorDominiAplicacio().getDescripcio());
            } else if (grant.getAplicacioAdministrada() != null) {
                auditoria.setValorDomini(grant.getAplicacioAdministrada().getCodi());
                auditoria.setDomini(grant.getAplicacioAdministrada().getNom());
            } else if (grant.getGrup() != null) {
                auditoria.setValorDomini(grant.getGrup().getCodi());
                auditoria.setDomini(grant.getGrup().getDescripcio());
            } else {
                auditoria.setValorDomini(null);
                auditoria.setDomini(null);
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
            auditoria.setData(dateFormat.format(Calendar.getInstance().getTime()));
            auditoria.setObjecte("SC_ROLUSU"); //$NON-NLS-1$
            getAuditoriaEntityDao().create(getAuditoriaEntityDao().auditoriaToEntity(auditoria));
        }
    }

    public void update(RolAccountEntity rolsUsuaris) {
        // Aquest mtode s'empra noms en SC_RESPONSABLE de les aplicacions
        // Noms es pot tindre 1 responsable, i s'actualitza l'existent (si
        // existeix)
        // sino es crea un de nou
        try {
            // IMPORTANT: COM AQUI NO ES POT CANVIAR EL ROL, NO COMPROVEM
            // L'HERENCIA
            // DEL ROL ANTERIOR I EL ROL DESPRS DEL UPDATE (!!)
            // PERQUE SER EL MATEIX

            RolAccountEntity old = load(rolsUsuaris.getId());

            super.update(rolsUsuaris);
            getSession(false).flush();

            RolAccount rolsUsuarisVO = toRolAccount(rolsUsuaris);

            String codiAplicacio = null;
            codiAplicacio = rolsUsuarisVO.getCodiAplicacio();

            ValorDomini valorDomini = rolsUsuarisVO.getValorDomini();
            String nomDomini = null;
            String valorDominiString = null;
            if (valorDomini != null) {
                nomDomini = valorDomini.getNomDomini();
                if (valorDomini.getValor() != null) {
                    valorDominiString = valorDomini.getValor();
                }
            }

            // HERNCIA DE ROLS
            // Cerquem els rols que contenen (tenen atorgat) aquest rol per
            // propagar-los
            Collection rolsPropagar = getRolsContingutsPerPropagar(rolsUsuaris.getRol());
            // I si tenim cap... els propaguem
            if (rolsPropagar != null)
                propagarRols(rolsPropagar);

            // Enviem les notificacions de l'aplicaci (si estan activades)
            if (rolsUsuaris.getRol().getAplicacio() != null) {
                AplicacioEntity aplic = rolsUsuaris.getRol().getAplicacio();
                String correusNotificacio = aplic.getCorreusNotificacions();
                if (correusNotificacio != null) {
                    String correus[] = correusNotificacio.split(","); //$NON-NLS-1$
                    if (correus.length > 0) { // almeny existisca 1
                        // Hay que notificar: Creamos la notificacin
                        for (UserAccountEntity usu : rolsUsuaris.getAccount().getUsers()) {
                            String informacio = Messages.getString("RolsUsuarisEntityDaoImpl.0"); //$NON-NLS-1$
                            // Creem l'instncia de la notificaci
                            NotificacioEntity notif = getNotificacioEntityDao().newNotificacioEntity();
                            notif.setDataModificacio(new Date());
                            notif.setInformacio(informacio);
                            notif.setRol(rolsUsuaris.getRol());
                            notif.setAplicacio(aplic);
                            notif.setUsuari(usu.getUser());
                            getNotificacioEntityDao().create(notif);
                        }
                    }
                }
            }

            generateTasks(rolsUsuaris);
            generateTasks(old);

            auditarRolAccount("U", rolsUsuaris); //$NON-NLS-1$
        } catch (Throwable e) {
            String message = ExceptionTranslator.translate(e);
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.1"), rolsUsuaris.getRol().getNom(), //$NON-NLS-1$
                            rolsUsuaris.getAccount().getName(), message));
        }
    }

    private void generateTasks(RolAccountEntity grant) {
        TasqueEntity tasque = getTasqueEntityDao().newTasqueEntity();
        tasque.setData(new Timestamp(System.currentTimeMillis()));
        tasque.setTransa(TaskHandler.UPDATE_ROLE);
        tasque.setRole(grant.getRol().getNom());
        tasque.setBd(grant.getRol().getBaseDeDades().getCodi());
        getTasqueEntityDao().create(tasque);

        if (grant.getAccount().getType().equals(AccountType.USER)) {
            for (UserAccountEntity ua : grant.getAccount().getUsers()) {
                tasque = getTasqueEntityDao().newTasqueEntity();
                tasque.setData(new Timestamp(System.currentTimeMillis()));
                tasque.setTransa(TaskHandler.UPDATE_USER);
                tasque.setUsuari(ua.getUser().getCodi());
                getTasqueEntityDao().create(tasque);
            }
        } else {
            tasque = getTasqueEntityDao().newTasqueEntity();
            tasque.setData(new Timestamp(System.currentTimeMillis()));
            tasque.setTransa(TaskHandler.UPDATE_ACCOUNT);
            tasque.setCoddis(grant.getAccount().getDispatcher().getCodi());
            tasque.setBd(grant.getAccount().getDispatcher().getCodi());
            tasque.setUsuari(grant.getAccount().getName());
            getTasqueEntityDao().create(tasque);
        }
    }

    public void create(es.caib.seycon.ng.model.RolAccountEntity rolsUsuaris) throws RuntimeException {
        try {
            // Verificamos que no existe antes de crearlo:
            // - Si existe, no se crea, pero no se da ERROR (carga masiva)
            RolAccountEntity rolUsuariExistent = findExisteixRolUsuari(rolsUsuaris);
            if (rolUsuariExistent == null) { // Lo creamos si no existe

                rolsUsuaris.setCertificationDate(new Date());

                super.create(rolsUsuaris);
                getSession(false).flush();
                RolAccount rolsUsuarisVO = toRolAccount(rolsUsuaris);

                String codiAplicacio = null;
                codiAplicacio = rolsUsuarisVO.getCodiAplicacio();

                ValorDomini valorDomini = rolsUsuarisVO.getValorDomini();
                String nomDomini = null;
                String valorDominiString = null;
                if (valorDomini != null) {
                    nomDomini = valorDomini.getNomDomini();
                    if (valorDomini.getValor() != null) {
                        valorDominiString = valorDomini.getValor();
                    }
                }

                // HERNCIA DE ROLS
                // Cerquem els rols que contenen (tenen atorgat) aquest rol per
                // propagar-los
                Collection rolsPropagar = getRolsContingutsPerPropagar(rolsUsuaris.getRol());
                // I si tenim cap... els propaguem
                if (rolsPropagar != null)
                    propagarRols(rolsPropagar);

                // Enviem les notificacions de l'aplicaci (si estan activades)
                if (rolsUsuaris.getRol().getAplicacio() != null) {
                    AplicacioEntity aplic = rolsUsuaris.getRol().getAplicacio();
                    String correusNotificacio = aplic.getCorreusNotificacions();
                    if (correusNotificacio != null) {
                        String correus[] = correusNotificacio.split(","); //$NON-NLS-1$
                        if (correus.length > 0) {
                            for (UserAccountEntity usu : rolsUsuaris.getAccount().getUsers()) {
                                // Hay que notificar: Creamos la notificacin
                                String informacio = Messages.getString("RolsUsuarisEntityDaoImpl.2"); //$NON-NLS-1$
                                // Creem l'instncia de la notificaci
                                NotificacioEntity notif = getNotificacioEntityDao().newNotificacioEntity();
                                notif.setAplicacio(aplic);
                                notif.setDataModificacio(new Date());
                                notif.setInformacio(informacio);
                                notif.setRol(rolsUsuaris.getRol());
                                notif.setUsuari(usu.getUser());
                                getNotificacioEntityDao().create(notif);
                            }
                        }

                    }
                }

                generateTasks(rolsUsuaris);
                auditarRolAccount("C", rolsUsuaris); //$NON-NLS-1$

            } else {
                throw new SeyconException(Messages.getString("RolsUsuarisEntityDaoImpl.3")); //$NON-NLS-1$
            }
        } catch (Throwable e) {
            String message = ExceptionTranslator.translate(e);
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.4"), rolsUsuaris.getRol().getNom(), //$NON-NLS-1$
                            rolsUsuaris.getAccount().getName(), message));
        }
    }

    public void remove(es.caib.seycon.ng.model.RolAccountEntity rolsUsuaris) throws RuntimeException {
        try {
            RolAccount rolsUsuarisVO = toRolAccount(rolsUsuaris);
            ValorDomini valorDomini = rolsUsuarisVO.getValorDomini();

            String codiAplicacio = null;
            codiAplicacio = rolsUsuarisVO.getCodiAplicacio();

            String nomDomini = null;
            String valorDominiString = null;
            if (valorDomini != null) {
                nomDomini = valorDomini.getNomDomini();
                if (valorDomini.getValor() != null) {
                    valorDominiString = valorDomini.getValor();
                }
            }

            // HERNCIA DE ROLS
            // Cerquem els rols que contenen (tenen atorgat) aquest rol per
            // propagar-los
            Collection rolsPropagar = getRolsContingutsPerPropagar(rolsUsuaris.getRol());
            // I si tenim cap... els propaguem
            if (rolsPropagar != null)
                propagarRols(rolsPropagar);

            // Enviem les notificacions de l'aplicaci (si estan activades)
            if (rolsUsuaris.getRol().getAplicacio() != null) {
                AplicacioEntity aplic = rolsUsuaris.getRol().getAplicacio();
                String correusNotificacio = aplic.getCorreusNotificacions();
                if (correusNotificacio != null) {
                    String correus[] = correusNotificacio.split(","); //$NON-NLS-1$
                    if (correus.length > 0) {
                        for (UserAccountEntity usu : rolsUsuaris.getAccount().getUsers()) {
                            // Hay que notificar: Creamos la notificacin
                            String informacio = Messages.getString("RolsUsuarisEntityDaoImpl.5"); //$NON-NLS-1$
                            // Creem l'instncia de la notificaci
                            NotificacioEntity notif = getNotificacioEntityDao().newNotificacioEntity();
                            notif.setAplicacio(aplic);
                            notif.setDataModificacio(new Date());
                            notif.setInformacio(informacio);
                            notif.setRol(rolsUsuaris.getRol());
                            notif.setUsuari(usu.getUser());
                            getNotificacioEntityDao().create(notif);
                        }
                    }
                }
            }

            if (Hibernate.isInitialized(rolsUsuaris.getAccount())
                    && Hibernate.isInitialized(rolsUsuaris.getAccount().getRoles())) {
                rolsUsuaris.getAccount().getRoles().remove(rolsUsuaris);
            }

            generateTasks(rolsUsuaris);

            super.remove(rolsUsuaris);

            auditarRolAccount("D", rolsUsuaris); //$NON-NLS-1$
        } catch (Throwable e) {
            String message = ExceptionTranslator.translate(e);
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.6"), rolsUsuaris.getRol().getNom(), //$NON-NLS-1$
                            rolsUsuaris.getAccount().getName(), message));
        }
    }

    public void toRolAccount(es.caib.seycon.ng.model.RolAccountEntity sourceEntity,
            es.caib.seycon.ng.comu.RolAccount targetVO) {
        super.toRolAccount(sourceEntity, targetVO);
        toRolAccountCustom(sourceEntity, targetVO);
    }

    private void toRolAccountCustom(es.caib.seycon.ng.model.RolAccountEntity sourceEntity,
            es.caib.seycon.ng.comu.RolAccount targetVO) {
        UsuariEntity usuariEntity = null;
        if (sourceEntity.getAccount().getType().equals(AccountType.USER)) {
            for (UserAccountEntity usu : sourceEntity.getAccount().getUsers()) {
                usuariEntity = usu.getUser();
            }
        }

        String tipusDomini = sourceEntity.getTipusDomini();
        if (tipusDomini == null || tipusDomini.trim().compareTo("") == 0) { //$NON-NLS-1$
            tipusDomini = TipusDomini.SENSE_DOMINI;
        }
        if (tipusDomini.compareTo(TipusDomini.DOMINI_APLICACIO) == 0) {
            ValorDominiAplicacioEntity valorDominiEntity = sourceEntity.getValorDominiAplicacio();
            ValorDomini valorDomini = getValorDominiAplicacioEntityDao().toValorDomini(valorDominiEntity);
            targetVO.setValorDomini(valorDomini);
        } else if (tipusDomini.compareTo(TipusDomini.GRUPS) == 0
                || tipusDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
            ValorDomini valorDomini = new ValorDomini();
            valorDomini.setDescripcio(sourceEntity.getGrup().getDescripcio());
            if (tipusDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
                valorDomini.setCodiExternDomini(usuariEntity == null ? null : usuariEntity.getCodi());
                valorDomini.setNomDomini(TipusDomini.GRUPS_USUARI);
            } else {
                valorDomini.setCodiExternDomini(null);
                valorDomini.setNomDomini(TipusDomini.GRUPS);
            }
            valorDomini.setValor(sourceEntity.getGrup().getCodi());
            targetVO.setValorDomini(valorDomini);
        } else if (tipusDomini.compareTo(TipusDomini.APLICACIONS) == 0) {
            ValorDomini valorDomini = new ValorDomini();
            valorDomini.setCodiExternDomini(null);
            valorDomini.setDescripcio(sourceEntity.getAplicacioAdministrada().getNom());
            valorDomini.setNomDomini(TipusDomini.APLICACIONS);
            valorDomini.setValor(sourceEntity.getAplicacioAdministrada().getCodi());
            targetVO.setValorDomini(valorDomini);
        } else if (tipusDomini.compareTo(TipusDomini.SENSE_DOMINI) == 0) {
            ValorDomini valorDomini = new ValorDomini();
            valorDomini.setCodiExternDomini(null);
            valorDomini.setDescripcio(TipusDomini.Descripcio.SENSE_DOMINI);
            valorDomini.setNomDomini(TipusDomini.SENSE_DOMINI);
            valorDomini.setValor(""); //$NON-NLS-1$
            // targetVO.setValorDomini(valorDomini); // No se muestra
        }

        // Assign holder gorup
        if (sourceEntity.getHolderGroup() == null)
            targetVO.setHolderGroup(null);
        else
            targetVO.setHolderGroup(sourceEntity.getHolderGroup().getCodi());

        targetVO.setNomRol(sourceEntity.getRol().getNom());

        String nom;
        if (usuariEntity != null) {
            nom = usuariEntity.getNom();
            nom = nom != null ? nom : ""; //$NON-NLS-1$
            String primerCognom = usuariEntity.getPrimerLlinatge();
            primerCognom = primerCognom != null ? primerCognom : ""; //$NON-NLS-1$
            String segonCognom = usuariEntity.getSegonLlinatge();
            segonCognom = segonCognom != null ? segonCognom : ""; //$NON-NLS-1$
            targetVO.setNomComplertUsuari(nom + " " + primerCognom + " " + segonCognom); //$NON-NLS-1$ //$NON-NLS-2$
            targetVO.setCodiUsuari(usuariEntity == null ? null : usuariEntity.getCodi());
        } else {
            targetVO.setNomComplertUsuari(sourceEntity.getAccount().getDescription());
        }

        targetVO.setAccountName(sourceEntity.getAccount().getName());
        targetVO.setAccountDispatcher(sourceEntity.getAccount().getDispatcher().getCodi());
        targetVO.setDescripcioRol(sourceEntity.getRol().getDescripcio());
        targetVO.setAccountId(sourceEntity.getAccount().getId());
        DispatcherEntity dispatcher = sourceEntity.getRol().getBaseDeDades();
        targetVO.setBaseDeDades(dispatcher == null ? null : dispatcher.getCodi());

        AplicacioEntity aplicacio = sourceEntity.getRol().getAplicacio();
        if (aplicacio != null) {
            targetVO.setCodiAplicacio(aplicacio.getCodi());
        }

        if (usuariEntity != null && usuariEntity.getGrupPrimari() != null) {
            targetVO.setCodiGrupUsuari(usuariEntity.getGrupPrimari().getCodi());
        }

        targetVO.setGestionableWF(sourceEntity.getRol().getGestionableWF());

        if (sourceEntity.getRule() == null) {
            targetVO.setRuleId(null);
            targetVO.setRuleDescription(null);
        } else {
            targetVO.setRuleId(sourceEntity.getRule().getId());
            targetVO.setRuleDescription(sourceEntity.getRule().getDescription());
        }
    }

    /**
     * @see es.caib.seycon.ng.model.RolAccountEntityDao#toRolAccount(es.caib.seycon.ng.model.RolAccountEntity)
     */
    public es.caib.seycon.ng.comu.RolAccount toRolAccount(final es.caib.seycon.ng.model.RolAccountEntity entity) {
        RolAccount rolUsuari = super.toRolAccount(entity);
        toRolAccountCustom(entity, rolUsuari);
        return rolUsuari;
    }

    /**
     * Retrieves the entity object that is associated with the specified value
     * object from the object store. If no such entity object exists in the
     * object store, a new, blank entity is created
     */
    private es.caib.seycon.ng.model.RolAccountEntity loadRolAccountEntityFromRolAccount(
            es.caib.seycon.ng.comu.RolAccount rolsUsuaris) {
        RolAccountEntity rolsUsuarisEntity = null;
        if (rolsUsuaris.getId() != null) {
            rolsUsuarisEntity = load(rolsUsuaris.getId());
        }
        if (rolsUsuarisEntity == null) {
            rolsUsuarisEntity = newRolAccountEntity();
        }
        return rolsUsuarisEntity;
    }

    /**
     * @see es.caib.seycon.ng.model.RolAccountEntityDao#rolsUsuarisToEntity(es.caib.seycon.ng.comu.RolAccount)
     */
    public es.caib.seycon.ng.model.RolAccountEntity rolAccountToEntity(
            es.caib.seycon.ng.comu.RolAccount rolsUsuaris) {
        es.caib.seycon.ng.model.RolAccountEntity entity = this.loadRolAccountEntityFromRolAccount(rolsUsuaris);
        this.rolAccountToEntity(rolsUsuaris, entity, true);
        return entity;
    }

    private RolEntity findRolByNomAndCodiApliacio(String nom, String codiAplicacio, String bbdd) {
        String query = "select rol " //$NON-NLS-1$
                + "from es.caib.seycon.ng.model.RolEntity rol " //$NON-NLS-1$
                + "where " //$NON-NLS-1$
                + "rol.nom = :nom and " + " rol.baseDeDades.codi = :bbdd"; //$NON-NLS-1$ //$NON-NLS-2$
        Parameter nomParameter = new Parameter("nom", nom); //$NON-NLS-1$
        Parameter bbddParameter = new Parameter("bbdd", bbdd); //$NON-NLS-1$
        Parameter[] parameters = { nomParameter, bbddParameter };
        Collection rols = getRolEntityDao().query(query, parameters);
        if (rols != null && !rols.isEmpty()) {
            return (RolEntity) rols.iterator().next();
        }
        return null;
    }

    private void rolsUsuarisToEntityCustom(es.caib.seycon.ng.comu.RolAccount sourceVO,
            es.caib.seycon.ng.model.RolAccountEntity targetEntity) {
        AccountEntity account = null;
        AccountEntityDao accDao = getAccountEntityDao();

        if (targetEntity.getStartDate() != null)
            targetEntity.setStartDate(removeSeconds(targetEntity.getStartDate()));
        if (targetEntity.getEndDate() != null)
            targetEntity.setEndDate(removeSeconds(targetEntity.getEndDate()));

        if (sourceVO.getAccountId() != null)
            account = accDao.load(sourceVO.getAccountId().longValue());
        else if (sourceVO.getAccountName() != null && sourceVO.getAccountDispatcher() != null) {
            account = accDao.findByNameAndDispatcher(sourceVO.getAccountName(), sourceVO.getBaseDeDades());
        } else if (sourceVO.getCodiUsuari() != null) {
            List<AccountEntity> accounts = accDao.findByUsuariAndDispatcher(sourceVO.getCodiUsuari(),
                    sourceVO.getBaseDeDades());
            if (accounts.size() > 1)
                throw new IllegalArgumentException(
                        String.format(Messages.getString("RolAccountEntityDaoImpl.MoreThanOneUserAccount"), //$NON-NLS-1$
                                sourceVO.getCodiUsuari(), sourceVO.getBaseDeDades()));
            if (accounts.size() == 1)
                account = accounts.get(0);
        }
        if (account == null) {
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.7"), sourceVO.getCodiUsuari())); //$NON-NLS-1$
        }
        targetEntity.setAccount(account);

        String nomRolDomini = sourceVO.getNomRol();
        String codiAplicacioRol = sourceVO.getCodiAplicacio();
        String codiBBDD = sourceVO.getBaseDeDades();
        RolEntity rol = null;
        if (nomRolDomini != null) {
            rol = findRolByNomAndCodiApliacio(nomRolDomini, codiAplicacioRol, codiBBDD);
        }
        if (rol == null) {
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.8"), nomRolDomini)); //$NON-NLS-1$
        }

        targetEntity.setRol(rol);

        ValorDomini valorDomini = sourceVO.getValorDomini();
        if (valorDomini == null) {
            valorDomini = new ValorDomini();
            valorDomini.setCodiExternDomini(null);
            valorDomini.setNomDomini(TipusDomini.SENSE_DOMINI);
            valorDomini.setValor(TipusDomini.SENSE_DOMINI);
        }
        String nomDomini = rol.getTipusDomini();
        if (nomDomini.compareTo(TipusDomini.GRUPS) == 0 || nomDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0
                || nomDomini.compareTo(TipusDomini.APLICACIONS) == 0
                || nomDomini.compareTo(TipusDomini.SENSE_DOMINI) == 0) {
            if (nomDomini.compareTo(TipusDomini.GRUPS) == 0 || nomDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
                String codiGrup = valorDomini.getValor();
                GrupEntity grup = null;
                if (codiGrup != null && codiGrup.trim().compareTo("") != 0) { //$NON-NLS-1$
                    grup = getGrupEntityDao().findByCodi(codiGrup);
                    if (grup != null) {
                        if (nomDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
                            String codiUsuari = sourceVO.getCodiUsuari();
                            if (codiUsuari != null) {
                                if (!grupPertanyAUsuari(codiGrup, codiUsuari)) {
                                    throw new SeyconException(
                                            String.format(Messages.getString("RolsUsuarisEntityDaoImpl.9"), //$NON-NLS-1$
                                                    codiGrup, codiUsuari));
                                }
                            } else {
                                throw new SeyconException(Messages.getString("RolsUsuarisEntityDaoImpl.10")); //$NON-NLS-1$
                            }
                        }
                    } else {
                        throw new SeyconException(
                                String.format(Messages.getString("RolsUsuarisEntityDaoImpl.11"), codiGrup)); //$NON-NLS-1$
                    }
                } else {
                    throw new SeyconException(Messages.getString("RolsUsuarisEntityDaoImpl.12")); //$NON-NLS-1$

                }
                targetEntity.setGrup(grup);
                targetEntity.setValorDominiAplicacio(null);
                targetEntity.setTipusDomini(nomDomini);
                targetEntity.setAplicacioAdministrada(null);
            } else if (nomDomini.compareTo(TipusDomini.APLICACIONS) == 0) {
                String valor = valorDomini.getValor();
                AplicacioEntity aplicacioEntity = getAplicacioEntityDao().findByCodi(valor);
                if (aplicacioEntity == null) {
                    throw new SeyconException(
                            String.format(Messages.getString("RolsUsuarisEntityDaoImpl.13"), valor)); //"Aplicaci amb codi '" + valor + "' no trobada."); //$NON-NLS-1$
                }
                targetEntity.setAplicacioAdministrada(aplicacioEntity);
                targetEntity.setGrup(null);
                targetEntity.setValorDominiAplicacio(null);
                targetEntity.setTipusDomini(TipusDomini.APLICACIONS);
            } else if (nomDomini.compareTo(TipusDomini.SENSE_DOMINI) == 0) {
                targetEntity.setAplicacioAdministrada(null);
                targetEntity.setGrup(null);
                targetEntity.setValorDominiAplicacio(null);
                targetEntity.setTipusDomini(TipusDomini.SENSE_DOMINI);
            }
        } else if (rol.getDominiAplicacio() != null) {
            /*
             * Domini d'aplicaci
             */
            nomDomini = rol.getDominiAplicacio().getNom();
            String codiAplicacio = rol.getAplicacio().getCodi();
            String valor = valorDomini.getValor();
            ValorDominiAplicacioEntity valorDominiAplicacioEntity = findValorDominiByNomDominiAndCodiAplicacioDominiAndValor(
                    nomDomini, codiAplicacio, valor);
            if (valorDominiAplicacioEntity != null) {
                targetEntity.setValorDominiAplicacio(valorDominiAplicacioEntity);
                targetEntity.setTipusDomini(TipusDomini.DOMINI_APLICACIO);
                targetEntity.setGrup(null);
                targetEntity.setAplicacioAdministrada(null);
            } else {
                throw new SeyconException(String.format(Messages.getString("RolsUsuarisEntityDaoImpl.14"), //$NON-NLS-1$
                        nomDomini, codiAplicacio, valor));
            }
        }

        if (sourceVO.getRuleId() == null)
            targetEntity.setRule(null);
        else
            targetEntity.setRule(getRuleEntityDao().load(sourceVO.getRuleId()));

        if (sourceVO.getHolderGroup() == null)
            targetEntity.setHolderGroup(null);
        else {
            GrupEntity grup = getGrupEntityDao().findByCodi(sourceVO.getHolderGroup());
            if (grup == null)
                throw new SeyconException(String.format("Unknown group %s", sourceVO.getHolderGroup()));
            targetEntity.setHolderGroup(grup);
        }
    }

    private ValorDominiAplicacioEntity findValorDominiByNomDominiAndCodiAplicacioDominiAndValor(String nomDomini,
            String codiAplicacio, String valor) {
        String query = "select valorDominiAplicacio " //$NON-NLS-1$
                + "from " //$NON-NLS-1$
                + "es.caib.seycon.ng.model.ValorDominiAplicacioEntity valorDominiAplicacio " //$NON-NLS-1$
                + "left join valorDominiAplicacio.domini domini " //$NON-NLS-1$
                + "left join domini.aplicacio aplicacio " //$NON-NLS-1$
                + "where " //$NON-NLS-1$
                + "domini.nom = :nomDomini and " //$NON-NLS-1$
                + "((:codiAplicacio is null and aplicacio is null) or (aplicacio.codi = :codiAplicacio)) and " //$NON-NLS-1$
                + "valorDominiAplicacio.valor = :valor"; //$NON-NLS-1$

        Parameter nomDominiParameter = new Parameter("nomDomini", nomDomini); //$NON-NLS-1$
        Parameter codiAplicacioParameter = new Parameter("codiAplicacio", codiAplicacio); //$NON-NLS-1$
        Parameter valorParameter = new Parameter("valor", valor); //$NON-NLS-1$
        Parameter[] parametres = { nomDominiParameter, codiAplicacioParameter, valorParameter };

        Collection valorsDomini = getValorDominiAplicacioEntityDao().query(query, parametres);
        if (valorsDomini != null) {
            Iterator valorsDominiIterator = valorsDomini.iterator();
            if (valorsDominiIterator != null) {
                if (valorsDominiIterator.hasNext()) {
                    ValorDominiAplicacioEntity valorDominiEntity = (ValorDominiAplicacioEntity) valorsDominiIterator
                            .next();
                    return valorDominiEntity;
                }
            }
        }
        return null;
    }

    private RolAccountEntity findExisteixRolUsuari(RolAccountEntity rolUsuari) {
        String query = "select rolsUsuaris " //$NON-NLS-1$
                + "from " //$NON-NLS-1$
                + "es.caib.seycon.ng.model.RolAccountEntity rolsUsuaris " //$NON-NLS-1$
                + "left join rolsUsuaris.grup grup " //$NON-NLS-1$
                + "left join rolsUsuaris.aplicacioAdministrada aplicacio " //$NON-NLS-1$
                + "left join rolsUsuaris.valorDominiAplicacio valorDominiAplicacio " //$NON-NLS-1$
                + "where " //$NON-NLS-1$
                + "rolsUsuaris.account.id = :usuID and " //$NON-NLS-1$
                + "rolsUsuaris.rol.id = :rolID and " //$NON-NLS-1$
                + "(rolsUsuaris.tipusDomini = :tipusDomini) and " //$NON-NLS-1$
                + "((:grupCodi is null and grup is null) or (grup.codi = :grupCodi)) and " //$NON-NLS-1$
                + "((:codiAplicacio is null and aplicacio is null) or (aplicacio.codi = :codiAplicacio)) and " //$NON-NLS-1$
                + "((:valorDomini is null and valorDominiAplicacio is null) or (valorDominiAplicacio.valor = :valorDomini)) "; //$NON-NLS-1$

        // Comparamos el usuario y el rol por ID (siempre tiene ambos)
        Parameter p_usuID = new Parameter("usuID", rolUsuari.getAccount().getId()); //$NON-NLS-1$
        Parameter p_rolID = new Parameter("rolID", rolUsuari.getRol().getId()); //$NON-NLS-1$
        Parameter p_tipusDomini = new Parameter("tipusDomini", rolUsuari.getTipusDomini()); //$NON-NLS-1$
        // Estos pueden ser nulos
        String grupCodi = rolUsuari.getGrup() != null ? rolUsuari.getGrup().getCodi() : null;
        Parameter p_grupCodi = new Parameter("grupCodi", grupCodi); //$NON-NLS-1$
        String aplicacioAdministrada = rolUsuari.getAplicacioAdministrada() != null
                ? rolUsuari.getAplicacioAdministrada().getCodi()
                : null;
        Parameter p_codiAplicacio = new Parameter("codiAplicacio", aplicacioAdministrada); //$NON-NLS-1$
        String valorDomini = rolUsuari.getValorDominiAplicacio() != null
                ? rolUsuari.getValorDominiAplicacio().getValor()
                : null;
        Parameter p_valorDomini = new Parameter("valorDomini", valorDomini); //$NON-NLS-1$

        Collection rolsUsu = find(query,
                new Parameter[] { p_usuID, p_rolID, p_tipusDomini, p_grupCodi, p_codiAplicacio, p_valorDomini });

        if (rolsUsu != null && rolsUsu.size() != 0) {
            return (RolAccountEntity) ((java.util.List) rolsUsu).get(0);
        }

        return null;
    }

    private boolean grupPertanyAUsuari(String codiGrup, String codiUsuari) {
        Collection grups = getUsuariEntityDao().findGrupsByCodi(codiUsuari);
        Iterator iterator = grups.iterator();
        while (iterator.hasNext()) {
            GrupEntity grupEntity = (GrupEntity) iterator.next();
            if (grupEntity.getCodi().compareTo(codiGrup) == 0) {
                return true;
            }
        }
        UsuariEntity usuari = getUsuariEntityDao().findByCodi(codiUsuari);
        GrupEntity grupPrimariEntity = usuari.getGrupPrimari();
        if (grupPrimariEntity != null) {
            return grupPrimariEntity.getCodi().compareTo(codiGrup) == 0;
        }
        return false;
    }

    private Date removeSeconds(Date d) {
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        c.set(Calendar.HOUR, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * @see es.caib.seycon.ng.model.RolAccountEntityDao#rolsUsuarisToEntity(es.caib.seycon.ng.comu.RolAccount,
     *      es.caib.seycon.ng.model.RolAccountEntity)
     */
    public void rolAccountToEntity(es.caib.seycon.ng.comu.RolAccount sourceVO,
            es.caib.seycon.ng.model.RolAccountEntity targetEntity, boolean copyIfNull) {
        super.rolAccountToEntity(sourceVO, targetEntity, copyIfNull);

        rolsUsuarisToEntityCustom(sourceVO, targetEntity);
    }

    /**
     * @see es.caib.seycon.ng.model.UsuariEntityDao#find(int, java.lang.String,
     *      es.caib.seycon.ng.model.Parameter[])
     */
    public List<RolAccountEntity> find(final java.lang.String queryString,
            final es.caib.seycon.ng.model.Parameter[] parameters) {
        try {
            java.util.List results = new QueryBuilder().query(this, queryString, parameters);
            return results;
        } catch (org.hibernate.HibernateException ex) {
            throw super.convertHibernateAccessException(ex);
        }
    }

    private es.caib.seycon.ng.model.RolAccountEntity loadRolAccountEntityFromAdministracioAplicacio(
            es.caib.seycon.ng.comu.AdministracioAplicacio administracioAplicacio) {
        RolAccountEntity rolsUsuarisEntity = null;
        if (administracioAplicacio.getId() != null) {
            rolsUsuarisEntity = load(administracioAplicacio.getId());
        }
        if (rolsUsuarisEntity == null) {
            rolsUsuarisEntity = newRolAccountEntity();
        }
        return rolsUsuarisEntity;
    }

    public RolAccountEntity administracioAplicacioToEntity(AdministracioAplicacio administracioAplicacio) {
        es.caib.seycon.ng.model.RolAccountEntity entity = this
                .loadRolAccountEntityFromAdministracioAplicacio(administracioAplicacio);
        this.administracioAplicacioToEntity(administracioAplicacio, entity);
        return entity;
    }

    public void toAdministracioAplicacio(RolAccountEntity source, AdministracioAplicacio target) {
        super.toAdministracioAplicacio(source, target);
        target.setCodiAplicacio(source.getAplicacioAdministrada().getCodi());
        UsuariEntity usuariEntity = source.getAccount().getUsers().iterator().next().getUser();
        target.setCodiUsuari(usuariEntity.getCodi());
        String nom = usuariEntity.getNom();
        nom = nom != null ? nom : ""; //$NON-NLS-1$
        String primerCognom = usuariEntity.getPrimerLlinatge();
        primerCognom = primerCognom != null ? primerCognom : ""; //$NON-NLS-1$
        String segonCognom = usuariEntity.getSegonLlinatge();
        segonCognom = segonCognom != null ? segonCognom : ""; //$NON-NLS-1$
        target.setNomComplertUsuari(nom + " " + primerCognom + " " + segonCognom); //$NON-NLS-1$ //$NON-NLS-2$
        target.setNomRol(source.getRol().getNom());
        target.setCodiAplicacioRol(source.getRol().getAplicacio().getCodi());
        target.setCodiBaseDeDadesRol(source.getRol().getBaseDeDades().getCodi());
    }

    public AdministracioAplicacio toAdministracioAplicacio(final RolAccountEntity entity) {
        return super.toAdministracioAplicacio(entity);
    }

    public void administracioAplicacioToEntity(AdministracioAplicacio administracioAplicacio,
            RolAccountEntity targetEntity) {
        String aplicacioAdministrada = administracioAplicacio.getCodiAplicacio();
        AplicacioEntity aplicacioEntity = getAplicacioEntityDao().findByCodi(aplicacioAdministrada);
        if (aplicacioEntity == null) {
            throw new SeyconException(
                    String.format(Messages.getString("RolsUsuarisEntityDaoImpl.15"), aplicacioAdministrada)); //$NON-NLS-1$
        }
        targetEntity.setAplicacioAdministrada(aplicacioEntity);
        targetEntity.setGrup(null);
        targetEntity.setValorDominiAplicacio(null);
        targetEntity.setTipusDomini(TipusDomini.APLICACIONS);

        RolEntity rolEntity = getRolEntityDao().findByNomRolAndCodiAplicacioAndCodiDispatcher(
                administracioAplicacio.getNomRol(), administracioAplicacio.getCodiAplicacioRol(),
                administracioAplicacio.getCodiBaseDeDadesRol());
        if (rolEntity == null) {
            throw new SeyconException(String.format(Messages.getString("RolsUsuarisEntityDaoImpl.16"), //$NON-NLS-1$
                    administracioAplicacio.getNomRol()));
        }
        targetEntity.setRol(rolEntity);

        List<AccountEntity> accs = getAccountEntityDao().findByUsuariAndDispatcher(
                administracioAplicacio.getCodiUsuari(), administracioAplicacio.getCodiBaseDeDadesRol());
        if (accs.size() != 1) {
            throw new SeyconException(String.format(Messages.getString("RolsUsuarisEntityDaoImpl.17"), //$NON-NLS-1$
                    administracioAplicacio.getCodiUsuari()));
        }
        targetEntity.setAccount(accs.get(0));
    }

    public RolAccountEntity contenidorRolToEntity(ContenidorRol contenidorRol) {
        // TODO Auto-generated method stub
        return null;
    }

    public ContenidorRol toContenidorRol(RolAccountEntity entity) {
        ContenidorRol contenidorRol = super.toContenidorRol(entity); // Pasamos
                                                                     // el id
        contenidorRol.setTipus(TipusContenidorRol.ROL_USUARI);
        // Informacin especfica:
        RolEntity rol = entity.getRol();
        ValorDomini valorDomini = null;

        String tipusDomini = rol.getTipusDomini();
        if (tipusDomini == null || tipusDomini.trim().compareTo("") == 0) { //$NON-NLS-1$
            tipusDomini = TipusDomini.SENSE_DOMINI;
        }
        if (tipusDomini.compareTo(TipusDomini.DOMINI_APLICACIO) == 0) {
            ValorDominiAplicacioEntity valorDominiEntity = entity.getValorDominiAplicacio();
            valorDomini = getValorDominiAplicacioEntityDao().toValorDomini(valorDominiEntity);
        } else if (tipusDomini.compareTo(TipusDomini.GRUPS) == 0
                || tipusDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
            valorDomini = new ValorDomini();
            valorDomini.setDescripcio(entity.getGrup().getDescripcio());
            if (tipusDomini.compareTo(TipusDomini.GRUPS_USUARI) == 0) {
                valorDomini
                        .setCodiExternDomini(entity.getAccount().getUsers().iterator().next().getUser().getCodi());
                valorDomini.setNomDomini(TipusDomini.GRUPS_USUARI);
            } else {
                valorDomini.setCodiExternDomini(null);
                valorDomini.setNomDomini(TipusDomini.GRUPS);
            }
            valorDomini.setValor(entity.getGrup().getCodi());
        } else if (tipusDomini.compareTo(TipusDomini.APLICACIONS) == 0) {
            valorDomini = new ValorDomini();
            valorDomini.setCodiExternDomini(null);
            valorDomini.setDescripcio(entity.getAplicacioAdministrada().getNom());
            valorDomini.setNomDomini(TipusDomini.APLICACIONS);
            valorDomini.setValor(entity.getAplicacioAdministrada().getCodi());
        } else if (tipusDomini.compareTo(TipusDomini.SENSE_DOMINI) == 0) {
            /*
             * valorDomini = new ValorDomini();
             * valorDomini.setCodiExternDomini(null);
             * valorDomini.setDescripcio(TipusDomini.Descripcio.SENSE_DOMINI);
             * valorDomini.setNomDomini(TipusDomini.SENSE_DOMINI);
             * valorDomini.setValor(""); //targetVO.setValorDomini(valorDomini);
             * // No se muestra
             */
        }

        // Asignamos el cdigo:
        String sValorDomini = ""; //$NON-NLS-1$
        if (valorDomini != null) {
            sValorDomini = " {" + valorDomini.getNomDomini() + "  -  " //$NON-NLS-1$ //$NON-NLS-2$
                    + valorDomini.getDescripcio() + "}"; //$NON-NLS-1$
        }
        contenidorRol.setInfoContenidor(rol.getNom() + "@" + rol.getBaseDeDades().getCodi() + ">" //$NON-NLS-1$ //$NON-NLS-2$
                + rol.getAplicacio().getCodi() + sValorDomini);

        return contenidorRol;
    }

    /**
     * Obtenim els rols continguts en el rol (per propagar-los)
     * 
     * @param rol
     * @return rols pares
     */
    private Collection getRolsContingutsPerPropagar(RolEntity rol) {
        // Si rol t atorgats d'altres rols (s conetnidor dele rols)
        // s'han de propagar tots els rols que cont (per assignar-lo a
        // l'usuari)
        HashSet rolsPropagar = new HashSet();
        // Slo hemos de propagar a los usuarios que tienen el rol contenedor
        // con valor de dominio correspondiente (o si es SENSE_DOMINI o a
        // qualque valor)
        // Montamos un FIFO De roles (puede haber cadena de
        // herencia A atorgat B[sense domini] atorgat C ... atorgat Z[amb
        // domini]
        LinkedList rolsAnalitzar = new LinkedList(); // FIFO
        rolsAnalitzar.add(rol);
        RolEntity rolActual = null;
        while ((rolActual = (RolEntity) rolsAnalitzar.poll()) != null) {
            Collection socContenidor = rolActual.getRolAssociacioRolSocContenidor();

            if (socContenidor != null)
                for (Iterator it = socContenidor.iterator(); it.hasNext();) {
                    RolAssociacioRolEntity associacio = (RolAssociacioRolEntity) it.next();
                    // Obtenemos el rol contenido
                    RolEntity rolContingut = associacio.getRolContingut();
                    // Guardamos el rol para propagarlo
                    rolsPropagar.add(rolContingut);
                    // Aadimos el rol contenido para analizar si a su vez es
                    // contenido en otro (atorgat)
                    rolsAnalitzar.add(rolContingut);
                }
        }
        return rolsPropagar;
    }

    private void propagarRols(Collection rolsPropagar) {
        // Propaguem els rols
        if (rolsPropagar != null)
            for (Iterator it = rolsPropagar.iterator(); it.hasNext();) {
                Object obj = it.next();
                if (obj != null) {
                    RolEntity role = (RolEntity) obj;
                    // insert into sc_tasque
                    // (tas_id,tas_role,tas_bd,tas_status,tas_data,tas_transa)
                    // values
                    // (sc_tas_seq.nextval,codi_role,codi_bd,'P',sysdate,'UpdateRole');
                    Tasca updateRole = new Tasca();
                    updateRole.setTransa("UpdateRole");// Actualitzaci del rol //$NON-NLS-1$
                    updateRole.setDataTasca(Calendar.getInstance());
                    updateRole.setStatus("P");// Posem com a pendent //$NON-NLS-1$
                    updateRole.setRole(role.getNom());
                    updateRole.setBd(role.getBaseDeDades().getCodi());
                    TasqueEntity tasca = getTasqueEntityDao().tascaToEntity(updateRole);
                    getTasqueEntityDao().create(tasca);
                }
            }
    }

    public void create(Collection entities) {
        if (entities != null)
            for (Iterator it = entities.iterator(); it.hasNext();) {
                Object obj = it.next();
                if (obj instanceof RolAccountEntity) {
                    RolAccountEntity entity = (RolAccountEntity) obj;
                    this.create(entity); // cridem al mtode 1 per 1
                }
            }
    }

    public void update(Collection entities) {
        if (entities != null)
            for (Iterator it = entities.iterator(); it.hasNext();) {
                Object obj = it.next();
                if (obj instanceof RolAccountEntity) {
                    RolAccountEntity entity = (RolAccountEntity) obj;
                    this.update(entity);// cridem al mtode 1 per 1
                }
            }
    }

    public void remove(Collection entities) {
        if (entities != null)
            for (Iterator it = entities.iterator(); it.hasNext();) {
                Object obj = it.next();
                if (obj instanceof RolAccountEntity) {
                    RolAccountEntity entity = (RolAccountEntity) obj;
                    this.remove(entity);// cridem al mtode 1 per 1
                }
            }
    }

    public RolAccountEntity rolGrantToEntity(RolGrant rolGrant) {
        return load(rolGrant.getId());
    }

    @Override
    public void toRolGrant(RolAccountEntity source, RolGrant target) {
        String tipus = source.getRol().getTipusDomini();
        if (TipusDomini.APLICACIONS.equals(tipus) && source.getAplicacioAdministrada() != null) {
            target.setDomainValue(source.getAplicacioAdministrada().getCodi());
            target.setHasDomain(true);
        } else if ((TipusDomini.GRUPS.equals(tipus) || TipusDomini.GRUPS_USUARI.equals(tipus))
                && source.getGrup() != null) {
            target.setDomainValue(source.getGrup().getCodi());
            target.setHasDomain(true);
        } else if (TipusDomini.DOMINI_APLICACIO.equals(tipus) && source.getValorDominiAplicacio() != null) {
            target.setDomainValue(source.getValorDominiAplicacio().getValor());
            target.setHasDomain(true);
        } else if (TipusDomini.QUALQUE_VALOR_DOMINI.equals(tipus)) {
            target.setHasDomain(true);
            target.setDomainValue(null);
        } else {
            target.setHasDomain(false);
            target.setDomainValue(null);
        }
        target.setOwnerRol(null);
        target.setOwnerRolName(null);
        target.setOwnerGroup(null);
        target.setOwnerAccountName(source.getAccount().getName());
        target.setOwnerDispatcher(source.getAccount().getDispatcher().getCodi());
        target.setId(source.getId());
        target.setIdRol(source.getRol().getId());
        target.setRolName(source.getRol().getNom());
        target.setDispatcher(source.getRol().getBaseDeDades().getCodi());
        for (UserAccountEntity ua : source.getAccount().getUsers()) {
            target.setUser(ua.getUser().getCodi());
        }
        if (source.getHolderGroup() == null)
            target.setHolderGroup(null);
        else
            target.setHolderGroup(source.getHolderGroup().getCodi());
    }

}