es.caib.seycon.ng.servei.XarxaServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for es.caib.seycon.ng.servei.XarxaServiceImpl.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.servei;

import java.net.InetAddress;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
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.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.LogFactoryImpl;

import com.soffid.iam.reconcile.model.ReconcileAccountEntityDao;
import com.soffid.iam.reconcile.model.ReconcileAssignmentEntityDao;

import es.caib.seycon.ng.exception.InternalErrorException;
import es.caib.seycon.ng.exception.UnknownHostException;
import es.caib.seycon.ng.exception.UnknownNetworkException;
import es.caib.seycon.ng.comu.AliasMaquina;
import es.caib.seycon.ng.comu.Aplicacio;
import es.caib.seycon.ng.comu.Auditoria;
import es.caib.seycon.ng.comu.AutoritzacioAccesHostComAdministrador;
import es.caib.seycon.ng.comu.Grup;
import es.caib.seycon.ng.comu.Identitat;
import es.caib.seycon.ng.comu.Maquina;
import es.caib.seycon.ng.comu.NetworkAuthorization;
import es.caib.seycon.ng.comu.OsType;
import es.caib.seycon.ng.comu.Password;
import es.caib.seycon.ng.comu.Rol;
import es.caib.seycon.ng.comu.Sessio;
import es.caib.seycon.ng.comu.Usuari;
import es.caib.seycon.ng.comu.Xarxa;
import es.caib.seycon.ng.exception.SeyconException;
import es.caib.seycon.ng.model.AliasMaquinaEntity;
import es.caib.seycon.ng.model.AuditoriaEntity;
import es.caib.seycon.ng.model.AutoritzacioAccesHostComAdministradorEntity;
import es.caib.seycon.ng.model.GrupEntity;
import es.caib.seycon.ng.model.MaquinaEntity;
import es.caib.seycon.ng.model.OsTypeEntity;
import es.caib.seycon.ng.model.OsTypeEntityDao;
import es.caib.seycon.ng.model.Parameter;
import es.caib.seycon.ng.model.RolEntity;
import es.caib.seycon.ng.model.SessioEntity;
import es.caib.seycon.ng.model.UsuariEntity;
import es.caib.seycon.ng.model.XarxaACEntity;
import es.caib.seycon.ng.model.XarxaEntity;
import es.caib.seycon.ng.model.XarxaEntityDao;
import es.caib.seycon.ng.model.criteria.CriteriaSearchConfiguration;
import es.caib.seycon.ng.utils.AutoritzacionsUsuari;
import es.caib.seycon.ng.utils.DateUtils;
import es.caib.seycon.ng.utils.Security;
import es.caib.seycon.util.TimedOutException;
import es.caib.seycon.util.TimedProcess;

/**
 * @see es.caib.seycon.ng.servei.XarxaService
 */
public class XarxaServiceImpl extends es.caib.seycon.ng.servei.XarxaServiceBase {

    private Log log;

    public XarxaServiceImpl() {
        log = LogFactoryImpl.getLog(getClass());
    }

    public static final int SENSE_PERMISOS = -1;
    public static final int CONSULTA = 0;
    public static final int SUPORT = 1;
    public static final int ADMINISTRACIO = 2;

    protected Boolean handleTeXarxaAdministrada() throws Exception {
        Usuari usuari = getUsuariService().getCurrentUsuari();
        Collection codisXarxa = getCodiXarxesAmbAccesAdministracio(usuari.getCodi());
        return new Boolean(codisXarxa.size() > 0);
    }

    protected Boolean handleEsXarxaAdministrada(String codiXarxa) throws Exception {
        Usuari usuari = getUsuariService().getCurrentUsuari();
        if (usuari == null)
            return false;
        Collection codisXarxa = getCodiXarxesAmbAccesAdministracio(usuari.getCodi());
        for (Iterator iterator = codisXarxa.iterator(); iterator.hasNext();) {
            String currentCodiXarxa = (String) iterator.next();
            if (currentCodiXarxa.compareTo(codiXarxa) == 0) {
                return new Boolean(true);
            }
        }
        return new Boolean(false);
    }

    protected Collection<Sessio> handleFindSessionsByNomMaquina(String nomMaquina) {
        Collection<SessioEntity> sessions = getSessioEntityDao().findSessionsByCriteri(null, null, nomMaquina,
                null);
        if (sessions != null) {
            return getSessioEntityDao().toSessioList(sessions);
        }
        return new Vector();
    }

    protected Long handleFindNivellAccesByNomMaquinaAndCodiXarxa(String nomMaquina, String codiXarxa)
            throws Exception {
        String codiUsuari = Security.getCurrentUser();
        if (codiUsuari == null)
            return new Long(SENSE_PERMISOS);

        Collection networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(codiUsuari);

        Long level = getAccessLevel(networkAuthorizations, nomMaquina, codiXarxa);
        if (level == null || level.longValue() < SUPORT) {
            Date longAgo = new Date(0);
            for (AutoritzacioAccesHostComAdministradorEntity aut : getAutoritzacioAccesHostComAdministradorEntityDao()
                    .findByNomHostIDataPeticio(nomMaquina, longAgo, new Date(), longAgo)) {
                if (aut.getUsuari().getCodi().equals(codiUsuari))
                    level = new Long(SUPORT);
            }
        }
        return level;
    }

    protected Usuari handleFindUsuariByIdSessio(java.lang.Long idSessio) throws Exception {
        SessioEntity sessioEntity = getSessioEntityDao().findById(idSessio);
        if (sessioEntity != null) {
            UsuariEntity usuariEntity = sessioEntity.getUsuari();
            Usuari usuari = getUsuariEntityDao().toUsuari(usuariEntity);
            return usuari;
        } else {
            throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.SessionIDNotFound"), //$NON-NLS-1$
                    idSessio.longValue()));
        }
    }

    protected Boolean handleTeAccesAXarxa(String codiUsuari, String codiXarxa) throws Exception {
        Collection codiXarxes = getCodiXarxesAmbAcces(codiUsuari);
        return new Boolean(codiXarxes.contains(codiXarxa));
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#getXarxes()
     */
    protected java.util.Collection<Xarxa> handleGetXarxes() throws java.lang.Exception {
        return getXarxaEntityDao().toXarxaList(getXarxaEntityDao().loadAll());
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#create(es.caib.seycon.ng.comu.Xarxa)
     */
    protected es.caib.seycon.ng.comu.Xarxa handleCreate(es.caib.seycon.ng.comu.Xarxa xarxa)
            throws java.lang.Exception {
        // network:create [SENSE_DOMINI]
        if (AutoritzacionsUsuari.canCreateAllNetworks()) {
            Parameter parameters[] = new Parameter[] { new Parameter("code", xarxa.getCodi()) }; //$NON-NLS-1$
            Parameter param[] = new Parameter[] { new Parameter("adrip", xarxa.getAdreca()) }; //$NON-NLS-1$
            Collection networksSameCode = getXarxaEntityDao()
                    .query("select codi from es.caib.seycon.ng.model.XarxaEntity where codi=:code", parameters); //$NON-NLS-1$
            if (networksSameCode != null && !networksSameCode.isEmpty())
                throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.CodeNetworkExists"), //$NON-NLS-1$
                        xarxa.getCodi()));
            networksSameCode = getXarxaEntityDao()
                    .query("select adreca from es.caib.seycon.ng.model.XarxaEntity where adreca=:adrip", param); //$NON-NLS-1$
            if (networksSameCode != null && !networksSameCode.isEmpty())
                throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.IpNetworkExists"), //$NON-NLS-1$
                        xarxa.getAdreca()));
            XarxaEntity entity = getXarxaEntityDao().xarxaToEntity(xarxa);
            getXarxaEntityDao().create(entity);
            xarxa.setId(entity.getId());
            return getXarxaEntityDao().toXarxa(entity);
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedMakeNet")); //$NON-NLS-1$
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#update(es.caib.seycon.ng.comu.Xarxa)
     */
    protected void handleUpdate(es.caib.seycon.ng.comu.Xarxa xarxa) throws java.lang.Exception {
        if (AutoritzacionsUsuari.canUpdateAllNetworks() || hasNetworkAuthorizations(Security.getCurrentUser(),
                xarxa.getCodi(), new int[] { ADMINISTRACIO })) {

            @SuppressWarnings("rawtypes")
            Collection maquines = findMaquinaByFiltre(null, null, null, null, null, null, null, null, null,
                    xarxa.getCodi(), null, new Boolean(false));
            for (Iterator iterator = maquines.iterator(); iterator.hasNext();) {
                Maquina maquina = (Maquina) (iterator.next());
                if (!maquinaCompatibleAmbXarxa(maquina.getAdreca(), xarxa.getAdreca(), xarxa.getMascara())) {
                    throw new SeyconException(
                            String.format(Messages.getString("XarxaServiceImpl.IncompatibleIPMessage"), //$NON-NLS-1$
                                    xarxa.getAdreca(), xarxa.getMascara(), maquina.getAdreca()));
                }
            }

            getXarxaEntityDao().update(getXarxaEntityDao().xarxaToEntity(xarxa));
        } else {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedUpdateNet")); //$NON-NLS-1$
        }
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#delete(es.caib.seycon.ng.comu.Xarxa)
     */
    protected void handleDelete(es.caib.seycon.ng.comu.Xarxa xarxa) throws java.lang.Exception {
        if (AutoritzacionsUsuari.canDeleteAllNetworks() /*
                                                         * ||
                                                         * hasNetworkAuthorizations
                                                         * (
                                                         * Security.getPrincipal
                                                         * (
                                                         * ).getName(),xarxa.getCodi
                                                         * (), new
                                                         * int[]{ADMINISTRACIO})
                                                         */) {
            XarxaEntity xarxaEntity = getXarxaEntityDao().xarxaToEntity(xarxa);
            if (!xarxaEntity.getMaquines().isEmpty() || xarxaEntity.getAutoritzacions().isEmpty())
                throw new SeyconException(
                        String.format(Messages.getString("XarxaServiceImpl.IntegrityViolationHosts"), //$NON-NLS-1$
                                new Object[] { xarxaEntity.getCodi() }));
            getXarxaEntityDao().remove(xarxaEntity);
        } else {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedDeleteNet")); //$NON-NLS-1$
        }
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#revoke(es.caib.seycon.ng.comu.XarxaAC)
     */
    protected void handleRevoke(es.caib.seycon.ng.comu.NetworkAuthorization xarxaAC) throws java.lang.Exception {
        // Abans tenia esAdministrador()
        if (AutoritzacionsUsuari.canCreateAllNetworks() || AutoritzacionsUsuari.canUpdateAllNetworks()
                || hasNetworkAuthorizations(Security.getCurrentUser(), xarxaAC.getCodiXarxa(),
                        new int[] { ADMINISTRACIO })) {
            XarxaACEntity entity = getXarxaACEntityDao().networkAuthorizationToEntity(xarxaAC);
            getXarxaACEntityDao().remove(entity);
        } else {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedDeleteAuthorizations")); //$NON-NLS-1$
        }
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#getACL(es.caib.seycon.ng.comu.Xarxa)
     */
    protected java.util.Collection<NetworkAuthorization> handleGetACL(es.caib.seycon.ng.comu.Xarxa xarxa)
            throws java.lang.Exception {
        if (AutoritzacionsUsuari.canCreateAllNetworks() || AutoritzacionsUsuari.canQueryAllNetworks()
                || AutoritzacionsUsuari.canUpdateAllNetworks() || AutoritzacionsUsuari.canSupportAllNetworks_VNC()
                || hasNetworkAuthorizations(Security.getCurrentUser(), xarxa.getCodi(),
                        new int[] { ADMINISTRACIO, CONSULTA, SUPORT })) {
            XarxaEntity entity = getXarxaEntityDao().xarxaToEntity(xarxa);
            Collection<XarxaACEntity> acls = getXarxaACEntityDao().findByXarxa(entity);
            if (acls != null) {
                return getXarxaACEntityDao().toNetworkAuthorizationList(acls);
            }
            return new LinkedList<NetworkAuthorization>();
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedViewListAccess")); //$NON-NLS-1$
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#findXarxaByCodi(String)
     */
    protected Xarxa handleFindXarxaByCodi(String codi) throws java.lang.Exception {
        XarxaEntity xarxaEntity = getXarxaEntityDao().findByCodi(codi);
        if (xarxaEntity != null) {
            Xarxa xarxa = getXarxaEntityDao().toXarxa(xarxaEntity);
            // if (teAccesLecturaXarxa(xarxa)) {
            return xarxa;

            // }
            // throw new SeyconException(
            // "L'usuari no t accs a la xarxa amb codi '" + codi + "'");
        }
        return null;
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#create(es.caib.seycon.ng.comu.Maquina)
     */
    protected es.caib.seycon.ng.comu.Maquina handleCreate(es.caib.seycon.ng.comu.Maquina maquina)
            throws java.lang.Exception {
        if (AutoritzacionsUsuari.canCreateAllHosts() || maquinaPermesa(maquina, ADMINISTRACIO)) {
            MaquinaEntity entity = getMaquinaEntityDao().maquinaToEntity(maquina);
            entity.setDeleted(new Boolean(false));
            getMaquinaEntityDao().create(entity);
            maquina.setId(entity.getId());
            return getMaquinaEntityDao().toMaquina(entity);
        }
        throw new SeyconException(
                String.format(Messages.getString("XarxaServiceImpl.NotAuthorizedMakeMachine"), maquina.getNom())); //$NON-NLS-1$
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#update(es.caib.seycon.ng.comu.Maquina)
     */
    protected void handleUpdate(es.caib.seycon.ng.comu.Maquina maquina) throws java.lang.Exception {
        if (teAccesEscripturaMaquina(maquina)) {
            getMaquinaEntityDao().update(getMaquinaEntityDao().maquinaToEntity(maquina));
        } else {
            // Comprovem perms per actualitzar el SO de la mquina
            if (AutoritzacionsUsuari.canUpdateHostOS()) {
                // Fem el canvi del SO a la maquina de la base de dades
                // per verificar que noms s'ha canviat el SO (jur jur)
                // Cerquem per ID de la mquina (ja existeix !!)
                Maquina maquinaTrobada = null;
                if (maquina.getId() != null)
                    maquinaTrobada = findMaquinaById(maquina.getId());
                else
                    maquinaTrobada = findMaquinaByNom(maquina.getNom());

                if (maquinaTrobada == null) {
                    throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.MachineNotFound"), //$NON-NLS-1$
                            maquina.getNom()));
                }
                // Fem els canvis permesos a la mquina original
                // perqu la comparaci dne OK (noms permet aquestos canvis)
                // SO
                maquinaTrobada.setSistemaOperatiu(maquina.getSistemaOperatiu());
                // La marquem com a servidor d'impressores
                if (maquina.getServidorImpressores() != null)
                    maquinaTrobada.setServidorImpressores(maquina.getServidorImpressores());
                // I les comparem
                if (maquinesIguals(maquinaTrobada, maquina)) {
                    getMaquinaEntityDao().update(getMaquinaEntityDao().maquinaToEntity(maquinaTrobada));
                } else {
                    throw new SeyconException(
                            String.format(Messages.getString("XarxaServiceImpl.OnlyChangeSOMachine"), //$NON-NLS-1$
                                    maquina.getNom()));
                }
            } else {
                throw new SeyconException(
                        String.format(Messages.getString("XarxaServiceImpl.NotAuthorizedToUpdateMachine"), //$NON-NLS-1$
                                maquina.getNom()));
            }
        }
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#delete(es.caib.seycon.ng.comu.Maquina)
     */
    protected void handleDelete(es.caib.seycon.ng.comu.Maquina maquina) throws java.lang.Exception {
        if (AutoritzacionsUsuari.canDeleteAllHosts() || maquinaPermesa(maquina, ADMINISTRACIO)) {
            CriteriaSearchConfiguration csc = new CriteriaSearchConfiguration();
            csc.setMaximumResultSize(1);

            // Check access logs
            if (getRegistreAccesEntityDao().query("from es.caib.seycon.ng.model.RegistreAccesEntity rac " + //$NON-NLS-1$
                    "where rac.servidor.id=:id or rac.client.id=:id", //$NON-NLS-1$
                    new Parameter[] { new Parameter("id", maquina.getId()) }, //$NON-NLS-1$
                    csc).isEmpty()) {
                // Check associated printers
                if (getImpressoraService().findImpressoresByCriteri(null, null, null, maquina.getNom()).isEmpty()) {
                    getMaquinaEntityDao().remove(getMaquinaEntityDao().maquinaToEntity(maquina));
                }

                else {
                    throw new InternalErrorException(
                            Messages.getString("XarxaServiceImpl.UnableDeleteHostMessage")); //$NON-NLS-1$
                }
            } else {
                MaquinaEntity entity = getMaquinaEntityDao().maquinaToEntity(maquina);
                entity.setDeleted(true);
                getMaquinaEntityDao().update(entity);
            }
        } else {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedToDeleteMachine")); //$NON-NLS-1$
        }
    }

    protected Collection<Maquina> handleGetServidorsCorreu() throws java.lang.Exception {
        return findMaquinaByFiltre(null, null, null, null, "S", null, null, null, null, null, null, //$NON-NLS-1$
                new Boolean(false));
    }

    protected Collection<Maquina> handleGetServidorsPerfil() throws java.lang.Exception {
        return findMaquinaByFiltre(null, null, null, null, null, "S", null, null, null, null, null, //$NON-NLS-1$
                new Boolean(false));
    }

    protected Collection<Maquina> handleGetServidorsHome() throws java.lang.Exception {
        return findMaquinaByFiltre(null, null, null, null, null, "S", null, null, null, null, null, //$NON-NLS-1$
                new Boolean(false));
    }

    protected Maquina handleFindMaquinaByNom(java.lang.String nom) throws java.lang.Exception {
        MaquinaEntity maquinaEntity = getMaquinaEntityDao().findByNom(nom);
        if (maquinaEntity != null) {
            Maquina maquina = getMaquinaEntityDao().toMaquina(maquinaEntity);
            if (this.teAccesLecturaMaquina(maquina)) {
                return maquina;
            }
            throw new SeyconException(
                    String.format(Messages.getString("XarxaServiceImpl.NotAuthorizedSearchMachine"), nom)); //$NON-NLS-1$
        }
        return null;
    }

    // Emprat des de xarxesllista.zul (parametres.zul) i xarxes.zul
    protected java.util.Collection<Xarxa> handleFindXarxaByFiltre(java.lang.String codi, java.lang.String adreca,
            java.lang.String descripcio, java.lang.String mascara, java.lang.String normalitzada,
            java.lang.String dhcp, String maquina) throws java.lang.Exception {
        Collection xarxes = localFindXarxaByFiltre(codi, adreca, descripcio, mascara, normalitzada, dhcp, maquina);
        int limitResults = Integer.parseInt(System.getProperty("soffid.ui.maxrows")); //$NON-NLS-1$

        if (xarxes != null && xarxes.size() != 0) {
            Collection<Xarxa> xarxesTrobades = filtraXarxes(getXarxaEntityDao().toXarxaList(xarxes));
            Collection<Xarxa> res = filtraPerMaquina(xarxesTrobades, maquina);

            // Check maximum number of results
            if (res.size() > limitResults) {
                return new LinkedList<Xarxa>(res).subList(0, limitResults);
                //            throw new SeyconException(
                //               Messages.getString("XarxaServiceImpl.BigSearchResults")); //$NON-NLS-1$
            }

            return res;
        }

        return new LinkedList<Xarxa>();
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#getMaquines()
     */
    protected java.util.Collection<Maquina> handleGetMaquines() throws java.lang.Exception {
        return getMaquinaEntityDao().toMaquinaList(getMaquinaEntityDao().loadAll());
    }

    /**
     * @see es.caib.seycon.ng.servei.XarxaService#findMaquinaByXarxa(es.caib.seycon.ng.comu.Xarxa)
     */
    @SuppressWarnings("rawtypes")
    protected java.util.Collection<Maquina> handleFindMaquinesByXarxa(es.caib.seycon.ng.comu.Xarxa xarxa)
            throws java.lang.Exception {
        Collection<Maquina> maquines = findMaquinaByFiltre(null, null, null, null, null, null, null, null, null,
                xarxa.getCodi(), null, new Boolean(false));
        return maquines;
    }

    protected Collection<Maquina> handleFindMaquinaByFiltreSenseRestriccions(String nom, String sistemaOperatiu,
            String adreca, String dhcp, String correu, String ofimatica, String alias, String mac,
            String descripcio, String xarxa, String codiUsuari, Boolean filtra) throws Exception {
        if (nom != null && (nom.trim().compareTo("") == 0 || nom.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            nom = null;
        }
        if (sistemaOperatiu != null
                && (sistemaOperatiu.trim().compareTo("") == 0 || sistemaOperatiu.trim().compareTo( //$NON-NLS-1$
                        "%") == 0)) { //$NON-NLS-1$
            sistemaOperatiu = null;
        }
        if (adreca != null && (adreca.trim().compareTo("") == 0 || adreca.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            adreca = null;
        }
        if (dhcp != null && (dhcp.trim().compareTo("") == 0 || dhcp.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            dhcp = null;
        }
        if (correu != null && (correu.trim().compareTo("") == 0 || correu.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            correu = null;
        }
        if (ofimatica != null && (ofimatica.trim().compareTo("") == 0 || ofimatica.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            ofimatica = null;
        }
        if (alias != null && (alias.trim().compareTo("") == 0 || alias.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            alias = null;
        }
        if (mac != null && (mac.trim().compareTo("") == 0 || mac.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            mac = null;
        }
        if (descripcio != null && (descripcio.trim().compareTo("") == 0 || descripcio.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            descripcio = null;
        }
        if (xarxa != null && (xarxa.trim().compareTo("") == 0 || xarxa.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            xarxa = null;
        }

        if (codiUsuari != null && (codiUsuari.trim().compareTo("") == 0 || codiUsuari.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            codiUsuari = null;
        }

        Collection<MaquinaEntity> maquines = null;

        LinkedList<Parameter> params = new LinkedList<Parameter>();
        // Realizamos la siguiente consulta (sin tener cuenta el alias)
        String query = "select distinct maquina from " //$NON-NLS-1$
                + " es.caib.seycon.ng.model.SessioEntity sessio " //$NON-NLS-1$
                + " right outer join sessio.maquina as maquina " //$NON-NLS-1$
                + " left outer join sessio.usuari as usuari" + //$NON-NLS-1$
                " where maquina.deleted = false "; //$NON-NLS-1$
        if (nom != null) {
            query = query + "and maquina.nom like :nom "; //$NON-NLS-1$
            params.add(new Parameter("nom", nom)); //$NON-NLS-1$
        }
        if (sistemaOperatiu != null) {
            //            query = query + "and maquina.oldSistemaOperatiu like :sistemaOperatiu "
            //            + "or maquina.operatingSystem = :operatingSystem ";
            //            params.add(new Parameter("sistemaOperatiu", sistemaOperatiu)); //$NON-NLS-1$
            query = query + "and maquina.operatingSystem.name = :operatingSystem "; //$NON-NLS-1$
            params.add(new Parameter("operatingSystem", sistemaOperatiu)); //$NON-NLS-1$
        }
        if (adreca != null) {
            query = query + "and maquina.adreca like :adreca "; //$NON-NLS-1$
            params.add(new Parameter("adreca", adreca)); //$NON-NLS-1$
        }
        if (dhcp != null) {
            query = query + "and maquina.dhcp like :dhcp "; //$NON-NLS-1$
            params.add(new Parameter("adreca", adreca)); //$NON-NLS-1$
        }
        if (correu != null) {
            query = query + "and maquina.correu like :correu "; //$NON-NLS-1$
            params.add(new Parameter("correu", correu)); //$NON-NLS-1$
        }
        if (ofimatica != null) {
            query = query + "and maquina.ofimatica like :ofimatica) "; //$NON-NLS-1$
            params.add(new Parameter("ofimatica", ofimatica)); //$NON-NLS-1$
        }
        if (mac != null) {
            query = query + "and maquina.mac like :mac "; //$NON-NLS-1$
            params.add(new Parameter("mac", mac)); //$NON-NLS-1$
        }
        if (descripcio != null) {
            query = query + "and maquina.descripcio like :descripcio "; //$NON-NLS-1$
            params.add(new Parameter("descripcio", descripcio)); //$NON-NLS-1$
        }
        if (xarxa != null) {
            query = query + "and maquina.xarxa.codi like :xarxa "; //$NON-NLS-1$
            params.add(new Parameter("xarxa", xarxa)); //$NON-NLS-1$
        }
        if (codiUsuari != null) {
            query = query + "and usuari.codi like :codiUsuari "; //$NON-NLS-1$
            params.add(new Parameter("codiUsuari", codiUsuari)); //$NON-NLS-1$
        }
        query = query + "order by maquina.nom "; //$NON-NLS-1$

        maquines = getMaquinaEntityDao().query(query, params.toArray(new Parameter[0]));

        // Filtramos por alias (si se ha especificado algn valor)
        if (alias != null) {
            Collection<AliasMaquinaEntity> maquinesAlias = getAliasMaquinaEntityDao().findMaquinaByAlias(alias);
            HashSet<Long> h_maquinesAlias = new HashSet(maquinesAlias.size());
            for (Iterator it = maquinesAlias.iterator(); it.hasNext();) {
                MaquinaEntity maqAlias = (MaquinaEntity) it.next();
                h_maquinesAlias.add(maqAlias.getId());
            }
            // Nos quedamos slo con las mquinas de la bsqueda que tengan el
            // alias indicado
            for (Iterator it = maquines.iterator(); it.hasNext();) {
                MaquinaEntity maq = (MaquinaEntity) it.next();
                if (!h_maquinesAlias.contains(maq.getId()))
                    it.remove(); // Lo eliminamos (no tiene el alias buscado)
            }

        }
        return getMaquinaEntityDao().toMaquinaList(maquines);
    }

    // Emprar des de maquines.zul per cercar
    protected Collection<Maquina> handleFindMaquinaByFiltre(String nom, String sistemaOperatiu, String adreca,
            String dhcp, String correu, String ofimatica, String alias, String mac, String descripcio, String xarxa,
            String codiUsuari, Boolean filtra) throws Exception {
        Collection<Maquina> maquines = null;
        int limitResults = Integer.parseInt(System.getProperty("soffid.ui.maxrows")); //$NON-NLS-1$

        // Cridem al "nou" mtode i desprs restringim
        // NOTA: El mtode ens torna Maquina (VO), si llevem la crida
        // desprs hem de transformar les entity a VO
        maquines = handleFindMaquinaByFiltreSenseRestriccions(nom, sistemaOperatiu, adreca, dhcp, correu, ofimatica,
                alias, mac, descripcio, xarxa, codiUsuari, filtra);

        if (maquines != null) {
            if ((filtra != null) && filtra.booleanValue() && (maquines.size() > limitResults)) {
                maquines = new LinkedList<Maquina>(maquines).subList(0, limitResults);
                //                throw new SeyconException(
                //                        Messages.getString("XarxaServiceImpl.BigSearchResults")); //$NON-NLS-1$
            }

            // getMaquinaEntityDao().toMaquinaCollection(maquines);
            maquines = filtraMaquines(maquines, CONSULTA);
            return new LinkedList<Maquina>(maquines);
        }

        return new LinkedList<Maquina>();
    }

    protected NetworkAuthorization handleCreate(NetworkAuthorization accessList) throws Exception {
        String u = Security.getCurrentUser();
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canCreateAllNetworks() || AutoritzacionsUsuari.canUpdateAllNetworks()
                || hasNetworkAuthorizations(u, accessList.getCodiXarxa(), new int[] { ADMINISTRACIO })) {
            XarxaACEntity entity = getXarxaACEntityDao().networkAuthorizationToEntity(accessList);
            if (entity.getUsuari() != null) {
                if (entity.getUsuari().getCodi().compareTo(u) == 0) {
                    throw new SeyconException(Messages.getString("XarxaServiceImpl.NoAutoassignNetLists")); //$NON-NLS-1$
                }
            }
            Identitat identity = accessList.getIdentitat();
            if (identity.getCodiIdentitat() != null && !identity.getCodiIdentitat().isEmpty())
                getXarxaACEntityDao().create(entity);
            else
                throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.IdentityValidation"), //$NON-NLS-1$
                        entity.getXarxa().getCodi()));
            return getXarxaACEntityDao().toNetworkAuthorization(entity);
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NotAuthorizedAdminNet")); //$NON-NLS-1$
    }

    protected void handleDelete(NetworkAuthorization accessList) throws Exception {
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canCreateAllNetworks() || AutoritzacionsUsuari.canUpdateAllNetworks()
                || hasNetworkAuthorizations(Security.getCurrentUser(), accessList.getCodiXarxa(),
                        new int[] { ADMINISTRACIO })) {
            XarxaACEntity entity = getXarxaACEntityDao().networkAuthorizationToEntity(accessList);
            getXarxaACEntityDao().remove(entity);
        } else {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NoAdminNets")); //$NON-NLS-1$
        }
    }

    protected NetworkAuthorization handleUpdate(NetworkAuthorization accessList) throws Exception {
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canCreateAllNetworks() || AutoritzacionsUsuari.canUpdateAllNetworks()
                || hasNetworkAuthorizations(Security.getCurrentUser(), accessList.getCodiXarxa(),
                        new int[] { ADMINISTRACIO })) {
            XarxaACEntity entity = getXarxaACEntityDao().networkAuthorizationToEntity(accessList);
            getXarxaACEntityDao().update(entity);
            return getXarxaACEntityDao().toNetworkAuthorization(entity);
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NoAdminNets")); //$NON-NLS-1$
    }

    protected Collection<Identitat> handleFindIdentitatsByCodi(String codi) throws Exception {
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canCreateAllNetworks()
                || AutoritzacionsUsuari.canUpdateAllNetworks()) {
            if (codi != null && (codi.trim().compareTo("") == 0 || codi.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
                codi = null;
            }

            Collection<Identitat> identitats = new LinkedList<Identitat>();

            Collection<Usuari> usuaris = this.getUsuariService().findUsuariByCriteri(codi, null, null, null, null,
                    null, null, null, null, null, null, null, null, null, null, null, null, null,
                    new Boolean(false));
            if (usuaris != null && usuaris.size() > 0) {
                List<UsuariEntity> usuariEntities = getUsuariEntityDao().usuariToEntityList(usuaris);
                identitats = getUsuariEntityDao().toIdentitatList(usuariEntities);
            }

            Collection<RolEntity> rols = getRolEntityDao().findRolsByFiltre(codi, null, null, null, null, null);
            if (rols != null) {
                identitats.addAll(getRolEntityDao().toIdentitatList(rols));
            }

            Collection<GrupEntity> grups = getGrupEntityDao().findByFiltre(codi, null, null, null, null, null);
            if (grups != null) {
                identitats.addAll(getGrupEntityDao().toIdentitatList(grups));
            }

            return identitats;
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.AdminNet")); //$NON-NLS-1$
    }

    protected Identitat handleFindIdentitatByCodi(String codi) throws Exception {
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canCreateAllNetworks()
                || AutoritzacionsUsuari.canUpdateAllNetworks()) {
            if (codi != null && (codi.trim().compareTo("") == 0 || codi.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
                return null;
            }

            UsuariEntity usuari = getUsuariEntityDao().findByCodi(codi);
            if (usuari != null) {
                Identitat identitat = getUsuariEntityDao().toIdentitat(usuari);
                return identitat;
            }

            RolEntity rol = null;
            String[] partsCodi = codi.split("@"); //$NON-NLS-1$
            String[] partsCodi2 = partsCodi[1].split(">"); //$NON-NLS-1$
            rol = getRolEntityDao().findByNomRolAndCodiAplicacioAndCodiDispatcher(partsCodi[0], partsCodi2[1],
                    partsCodi2[0]);
            if (rol != null) {
                Identitat identitat = getRolEntityDao().toIdentitat(rol);
                return identitat;
            }

            GrupEntity grup = getGrupEntityDao().findByCodi(codi);
            if (grup != null) {
                Identitat identitat = getGrupEntityDao().toIdentitat(grup);
                return identitat;
            }

            return null;
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NoAdminNets")); //$NON-NLS-1$
    }

    protected NetworkAuthorization handleFindNetworkAuthorizationByCodiXarxaAndCodiIdentitat(String codiXarxa,
            String codiIdentitat) throws Exception {
        // Si pot crear qualsevol xarxa o actualitzar qualsevol xarxa
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canCreateAllNetworks()
                || AutoritzacionsUsuari.canUpdateAllNetworks()) {
            XarxaACEntity xarxaACEntity = getXarxaACEntityDao().findByCodiXarxaAndCodiIdentiat(codiXarxa,
                    codiIdentitat);
            if (xarxaACEntity != null) {
                NetworkAuthorization networkAuthorization = getXarxaACEntityDao()
                        .toNetworkAuthorization(xarxaACEntity);
                return networkAuthorization;
            }
            return null;
        }
        throw new SeyconException(Messages.getString("XarxaServiceImpl.NoAdminNets")); //$NON-NLS-1$
    }

    /*
     * Obt les autoritzacions DIRECTES de Xarxa a aquest grup (non-Javadoc)
     * 
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#
     * handleFindNetworkAuthorizationsByCodiGrup(java.lang.String)
     */
    protected Collection<NetworkAuthorization> handleFindNetworkAuthorizationsByCodiGrup(String codiGrup)
            throws Exception {
        Collection<XarxaACEntity> xarxesAC = getXarxaACEntityDao().findByCodiGrup(codiGrup);
        if (xarxesAC != null) {
            return getXarxaACEntityDao().toNetworkAuthorizationList(xarxesAC);
        }
        return new LinkedList<NetworkAuthorization>();
    }

    // Antic mtode getNetworkAuthorizations(codiUsuari)
    protected Collection<NetworkAuthorization> handleFindALLNetworkAuthorizationsByCodiUsuari(String codiUsuari)
            throws Exception {
        Collection<NetworkAuthorization> xarxes = new LinkedList();
        // acces list per codi d'usuari
        UsuariEntity usuariEntity = getUsuariEntityDao().findByCodi(codiUsuari);
        if (usuariEntity != null) {
            Collection<NetworkAuthorization> networkAuthorizations = findNetworkAuthorizationsByCodiUsuari(
                    codiUsuari);
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                xarxes.add(newtworkAuthorization);
            }
        } else {
            throw new SeyconException(
                    String.format(Messages.getString("XarxaServiceImpl.UserNotFound"), codiUsuari)); //$NON-NLS-1$
        }
        // llistes d'acces per grups
        Collection<Grup> grups = getGrupService().findGrupsByCodiUsuari(codiUsuari);
        Iterator grupIterator = grups.iterator();
        while (grupIterator.hasNext()) {
            Grup grup = (Grup) grupIterator.next();
            Collection networkAuthorizations = findNetworkAuthorizationsByCodiGrup(grup.getCodi());
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                xarxes.add(newtworkAuthorization);
            }
        }
        // llistes d'acces per rols: filtra els rols
        Collection<Rol> rols = getAplicacioService().findRolsByCodiUsuari(codiUsuari);

        Iterator rolsIterator = rols.iterator();
        while (rolsIterator.hasNext()) {
            Rol rol = (Rol) rolsIterator.next();
            Collection networkAuthorizations = findNetworkAuthorizationsByRol(rol);
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                xarxes.add(newtworkAuthorization);
            }
        }
        return xarxes;
    }

    /*
     * Obt les autoritzacions DIRECTES de Xarxa a aquest usuari (non-Javadoc)
     * 
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#
     * handleFindNetworkAuthorizationsByCodiUsuari(java.lang.String)
     */
    protected Collection<NetworkAuthorization> handleFindNetworkAuthorizationsByCodiUsuari(String codiUsuari)
            throws Exception {
        Collection<XarxaACEntity> xarxesAC = getXarxaACEntityDao().findByCodiUsuari(codiUsuari);
        if (xarxesAC != null) {
            return getXarxaACEntityDao().toNetworkAuthorizationList(xarxesAC);
        }
        return new Vector();
    }

    /*
     * Obt les autoritzacions DIRECTES de Xarxa a aquest ROL (non-Javadoc)
     * 
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#
     * handleFindNetworkAuthorizationsByNomRol(java.lang.String)
     */
    protected Collection<NetworkAuthorization> handleFindNetworkAuthorizationsByNomRol(String nomRol)
            throws Exception {
        Collection<XarxaACEntity> xarxesAC = getXarxaACEntityDao().findByNomRol(nomRol);
        if (xarxesAC != null) {
            return getXarxaACEntityDao().toNetworkAuthorizationList(xarxesAC);
        }
        return new Vector();
    }

    protected String handleGetPrimeraIPLliure(String codiXarxa) throws Exception {
        XarxaEntity xarxa = getXarxaEntityDao().findByCodi(codiXarxa);
        if (xarxa != null) {
            String ipLliure = getXarxaEntityDao().getPrimeraIPLliure(xarxa.getAdreca(), xarxa.getMascara());
            return ipLliure;
        }
        throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.NetNotFound"), codiXarxa)); //$NON-NLS-1$
    }

    protected Long handleGetIPsOcupades(String codiXarxa) throws Exception {
        XarxaEntity xarxaEntity = getXarxaEntityDao().findByCodi(codiXarxa);
        if (xarxaEntity != null) {
            Xarxa xarxa = getXarxaEntityDao().toXarxa(xarxaEntity);
            if (teAccesLecturaXarxa(xarxa)) {
                Long count = getXarxaEntityDao().getIPsOcupades(xarxaEntity.getAdreca(), xarxaEntity.getMascara());
                return count;
            }
            throw new SeyconException(
                    String.format(Messages.getString("XarxaServiceImpl.NoReadNetPermission"), codiXarxa)); //$NON-NLS-1$
        }
        throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.NetNotFound"), codiXarxa)); //$NON-NLS-1$
    }

    protected Long handleGetIPsBuides(String codiXarxa) throws Exception {
        XarxaEntity xarxaEntity = getXarxaEntityDao().findByCodi(codiXarxa);
        if (xarxaEntity != null) {
            Xarxa xarxa = getXarxaEntityDao().toXarxa(xarxaEntity);
            if (teAccesLecturaXarxa(xarxa)) {
                Long count = getXarxaEntityDao().getIPsBuides(xarxaEntity.getAdreca(), xarxaEntity.getMascara());
                return count;
            }
            throw new SeyconException(
                    String.format(Messages.getString("XarxaServiceImpl.NoReadNetPermission"), codiXarxa)); //$NON-NLS-1$
        }
        throw new SeyconException(String.format(Messages.getString("XarxaServiceImpl.NetNotFound"), codiXarxa)); //$NON-NLS-1$
    }

    protected Maquina handleFindMaquinaById(Long idMaquina) throws Exception {
        MaquinaEntity maquinaEntity = getMaquinaEntityDao().findById(idMaquina);
        if (maquinaEntity != null) {
            return getMaquinaEntityDao().toMaquina(maquinaEntity);
        }
        return null;
    }

    protected Maquina handleFindMaquinaByIp(String ip) throws Exception {
        Collection coll = getMaquinaEntityDao().query(
                "select maquina from es.caib.seycon.ng.model.MaquinaEntity as maquina " //$NON-NLS-1$
                        + "where maquina.adreca=:adreca", //$NON-NLS-1$
                new Parameter[] { new Parameter("adreca", ip) }); //$NON-NLS-1$
        if (coll == null || coll.size() == 0)
            return null;
        else {
            MaquinaEntity maq = (MaquinaEntity) coll.iterator().next();
            return getMaquinaEntityDao().toMaquina(maq);
        }
    }

    protected String[] handleGetTasques(String nomMaquina) throws Exception {
        String[] resultats = getMaquinaEntityDao().getTasques(nomMaquina);
        return resultats;
    }

    protected Collection<AliasMaquina> handleFindAliasByNomMaquina(String nomMaquina) throws Exception {
        Collection<AliasMaquinaEntity> alias = getAliasMaquinaEntityDao().findAliasByNomMaquina(nomMaquina);
        return getAliasMaquinaEntityDao().toAliasMaquinaList(alias);
    }

    protected AliasMaquina handleCreate(AliasMaquina aliasMaquina) throws Exception {
        AliasMaquinaEntity entity = getAliasMaquinaEntityDao().aliasMaquinaToEntity(aliasMaquina);
        Maquina maquina = getMaquinaEntityDao().toMaquina(entity.getMaquina());
        if (teAccesEscripturaMaquina(maquina)) {
            getAliasMaquinaEntityDao().create(entity);
            return getAliasMaquinaEntityDao().toAliasMaquina(entity);
        } else
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NoMakeAliasPermission")); //$NON-NLS-1$

    }

    protected void handleDelete(AliasMaquina aliasMaquina) throws Exception {
        AliasMaquinaEntity entity = getAliasMaquinaEntityDao().aliasMaquinaToEntity(aliasMaquina);
        Maquina maquina = getMaquinaEntityDao().toMaquina(entity.getMaquina());
        if (teAccesEscripturaMaquina(maquina)) {

            getAliasMaquinaEntityDao().remove(entity);
        } else
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NoDeleteAliasPermission")); //$NON-NLS-1$
    }

    protected void handleUpdate(AliasMaquina aliasMaquina) throws Exception {
        AliasMaquinaEntity entity = getAliasMaquinaEntityDao().aliasMaquinaToEntity(aliasMaquina);
        Maquina maquina = getMaquinaEntityDao().toMaquina(entity.getMaquina());
        if (teAccesEscripturaMaquina(maquina)) {
            getAliasMaquinaEntityDao().update(entity);
        } else
            throw new SeyconException(Messages.getString("XarxaServiceImpl.NoUpdateAliasPermission")); //$NON-NLS-1$

    }

    protected AutoritzacioAccesHostComAdministrador handleCreate(
            AutoritzacioAccesHostComAdministrador autoritzacioAccesComAdministrador) throws Exception {
        AutoritzacioAccesHostComAdministradorEntity entity = getAutoritzacioAccesHostComAdministradorEntityDao()
                .autoritzacioAccesHostComAdministradorToEntity(autoritzacioAccesComAdministrador);
        getAutoritzacioAccesHostComAdministradorEntityDao().create(entity);
        // auditem la petici (ara es fa des del workflow)
        auditaPeticioAdministrarHost(autoritzacioAccesComAdministrador.getNomHost(),
                autoritzacioAccesComAdministrador.getCodiUsuari(), "C"); //$NON-NLS-1$
        return getAutoritzacioAccesHostComAdministradorEntityDao().toAutoritzacioAccesHostComAdministrador(entity);
    }

    protected Collection<AutoritzacioAccesHostComAdministrador> handleFindAutoritzacionsAccesMaquinaComAdministradorByHostAndDataPeticio(
            String nomHost, String dataPeticio, String dataCaducitat) throws Exception {

        Date d_dataPeticio = DateUtils.nullDate;
        Date d_dataCaducitat = DateUtils.nullDate;

        if (dataPeticio != null && !"".equals(dataPeticio)) //$NON-NLS-1$
            d_dataPeticio = DateUtils.stringToDate(dataPeticio, false);

        if (dataCaducitat != null && !"".equals(dataCaducitat)) { //$NON-NLS-1$
            if ("hui".equals(dataCaducitat)) { //$NON-NLS-1$
                d_dataCaducitat = new Date(); // posem la data de hui
            } else
                d_dataCaducitat = DateUtils.stringToDate(dataCaducitat, false);
        }

        Collection<AutoritzacioAccesHostComAdministradorEntity> res = getAutoritzacioAccesHostComAdministradorEntityDao()
                .findByNomHostIDataPeticio(nomHost, d_dataPeticio, d_dataCaducitat, DateUtils.nullDate);
        return getAutoritzacioAccesHostComAdministradorEntityDao().toAutoritzacioAccesHostComAdministradorList(res);
    }

    protected String[] handleGetUsuariAndContrasenyaAdministradorHost(String nomMaquina) throws Exception {

        // Aadimos auditora de la peticin
        auditaSolicitudDadesAdministradorHost(nomMaquina); // AUDITORIA

        MaquinaEntity host = getMaquinaEntityDao().findByNom(nomMaquina);

        String dataEstabliment = DateUtils.dataToStringFull(host.getDataContrasenyaAdministrador());

        Password p = Password.decode(host.getContrasenyaAdministrador()); // desencriptem
                                                                          // el
                                                                          // passwd

        return new String[] { host.getUsuariAdministrador(), p.getPassword(), dataEstabliment };
    }

    private Collection<String> getCodiXarxesAmbAccesAdministracio(String codiUsuari) throws Exception {
        Collection<NetworkAuthorization> networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(
                codiUsuari);
        Collection<String> codiXarxes = new LinkedList();
        Iterator iterator = networkAuthorizations.iterator();
        while (iterator.hasNext()) {
            NetworkAuthorization netAuth = (NetworkAuthorization) iterator.next();
            if (netAuth.getNivell() == ADMINISTRACIO) {
                codiXarxes.add(netAuth.getCodiXarxa());
            }
        }
        return codiXarxes;
    }

    private static boolean teAcces(String codiMaquina, String expresio) {
        Pattern pattern = Pattern.compile("^" + expresio + "$"); //$NON-NLS-1$ //$NON-NLS-2$
        Matcher matcher = pattern.matcher(codiMaquina);
        boolean matches = matcher.find();
        return matches;
    }

    private boolean teAccesLecturaXarxa(Xarxa xarxa) throws InternalErrorException {
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canCreateAllHosts()
                || AutoritzacionsUsuari.canUpdateAllHosts() || AutoritzacionsUsuari.canCreateAllNetworks()
                || AutoritzacionsUsuari.canUpdateAllNetworks() || AutoritzacionsUsuari.canSupportAllNetworks_VNC()
                || hasNetworkAuthorizations(Security.getCurrentUser(), xarxa.getCodi(),
                        new int[] { ADMINISTRACIO, CONSULTA, SUPORT })) {
            return true;
        }
        return false;
    }

    private boolean teAccesEscripturaMaquina(Maquina maquina) throws InternalErrorException {
        if (AutoritzacionsUsuari.canUpdateAllHosts() || AutoritzacionsUsuari.canCreateAllHosts()) {
            return true;
        }
        if (maquinaPermesa(maquina, ADMINISTRACIO)) {
            return true;
        }
        return false;
    }

    private boolean teAccesLecturaMaquina(Maquina maquina) throws InternalErrorException {
        if (AutoritzacionsUsuari.canQueryAllHosts()) {
            return true;
        }
        if (maquinaPermesa(maquina, CONSULTA)) {
            return true;
        }
        return false;
    }

    private Collection<Xarxa> filtraXarxes(Collection<Xarxa> xarxes) throws Exception {
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canSupportAllNetworks_VNC()) {
            return xarxes;
        }
        String codiUsuari = Security.getCurrentUser();
        Collection xarxesPermeses = new LinkedList();
        if (codiUsuari != null) {
            Collection codiXarxes = getCodiXarxesAmbAcces(codiUsuari);
            Iterator iterator = xarxes.iterator();
            while (iterator.hasNext()) {
                Xarxa xarxa = (Xarxa) iterator.next();
                if (codiXarxes.contains(xarxa.getCodi())) {
                    xarxesPermeses.add(xarxa);
                }
            }
        }
        return xarxesPermeses;
    }

    private boolean maquinaPermesa(Maquina maquina, int accessLevel) throws InternalErrorException {
        String codiUsuari = Security.getCurrentUser();
        if (codiUsuari != null) {
            Collection networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(codiUsuari);
            if (maquinaPermesa(networkAuthorizations, maquina, accessLevel)) {
                return true;
            }
        }
        return false;
    }

    private Long getAccessLevel(Collection networkAuthorizations, String nomMaquina, String codiXarxa) {
        Iterator iterator = networkAuthorizations.iterator();
        // obtenim el mxim nivell d'accs
        int maximNivell = SENSE_PERMISOS;
        while (iterator.hasNext()) {
            NetworkAuthorization networkAuthorization = (NetworkAuthorization) iterator.next();
            if (codiXarxa.compareTo(networkAuthorization.getCodiXarxa()) == 0) {
                if (teAcces(nomMaquina, networkAuthorization.getMascara())) {
                    int nivell = networkAuthorization.getNivell();
                    if (nivell > maximNivell)
                        maximNivell = nivell;
                }
            }
        }
        return new Long(maximNivell);
    }

    private Collection<Maquina> filtraMaquines(Collection maquines, int accessLevel) throws InternalErrorException {
        // if (esAdministrador() || esOperador() || teAccesMaquinesVNC() ) {
        // Mirem si t permis per veure totes les xarxes o per fer VNC
        if (AutoritzacionsUsuari.canQueryAllNetworks() || AutoritzacionsUsuari.canQueryAllHosts()
                || AutoritzacionsUsuari.canSupportAllNetworks_VNC()) {
            return maquines;
        }
        String codiUsuari = Security.getCurrentUser();
        Collection<Maquina> maquinesPermeses = new LinkedList();
        if (codiUsuari != null) {
            Collection<NetworkAuthorization> networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(
                    codiUsuari);
            Iterator iterator = maquines.iterator();
            while (iterator.hasNext()) {
                Maquina maquina = (Maquina) iterator.next();
                if (maquinaPermesa(networkAuthorizations, maquina, accessLevel)) {
                    maquinesPermeses.add(maquina);
                }
            }
        }
        return maquinesPermeses;
    }

    private boolean maquinaPermesa(Collection networkAuthorizations, Maquina maquina, int accessLevel) {
        if (maquina.getCodiXarxa() == null)
            return false;
        Iterator iterator = networkAuthorizations.iterator();
        while (iterator.hasNext()) {
            NetworkAuthorization networkAuthorization = (NetworkAuthorization) iterator.next();
            if (maquina.getCodiXarxa().compareTo(networkAuthorization.getCodiXarxa()) == 0) {
                if (teAcces(maquina.getNom(), networkAuthorization.getMascara())) {
                    // Si s >= accessLevel ja hem trobat una autoritzaci..
                    if (networkAuthorization.getNivell() >= accessLevel)
                        return true;
                }
            }
        }
        return false;
    }

    private Collection<String> getCodiXarxesAmbAcces(String codiUsuari) throws Exception {
        Collection<NetworkAuthorization> networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(
                codiUsuari);
        Collection<String> codiXarxes = new LinkedHashSet(); // perqu no es
                                                             // repetisquen
        Iterator iterator = networkAuthorizations.iterator();
        while (iterator.hasNext()) {
            NetworkAuthorization netAuth = (NetworkAuthorization) iterator.next();
            codiXarxes.add(netAuth.getCodiXarxa());
        }
        return codiXarxes;
    }

    /**
     * Busca entre las autorizaciones de red hasta encontrar las que se le pasan
     * como parmetro. Permite acelerar la bsqueda de autorizaciones
     * 
     * @param codiUsuari
     * @param autoritzacions
     * @return
     * @throws InternalErrorException
     */
    private boolean hasNetworkAuthorizations(String codiUsuari, String codiXarxa, int autoritzacions[])
            throws InternalErrorException {
        if (codiUsuari == null)
            return false;

        // Su cdigo es igual al de getNetworkAuthorizations, pero no devuelve
        // la lista
        // acces list per codi d'usuari
        es.caib.seycon.ng.model.UsuariEntityDao usuariEntityDao = getUsuariEntityDao();
        UsuariEntity usuariEntity = usuariEntityDao.findByCodi(codiUsuari);
        if (usuariEntity != null) {
            Collection networkAuthorizations = findNetworkAuthorizationsByCodiUsuari(codiUsuari);
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                if (codiXarxa == null || newtworkAuthorization.getCodiXarxa().equals(codiXarxa)) {
                    for (int i = 0; i < autoritzacions.length; i++) {
                        if (newtworkAuthorization.getNivell() == autoritzacions[i])
                            return true; // La hemos encontrado
                    }
                }
            }
        } else {
            throw new SeyconException(
                    String.format(Messages.getString("XarxaServiceImpl.UserNotFound"), codiUsuari)); //$NON-NLS-1$
        }
        // llistes d'acces per rols
        Collection rols = getAplicacioService().findRolsByCodiUsuari(codiUsuari);
        Iterator rolsIterator = rols.iterator();
        while (rolsIterator.hasNext()) {
            Rol rol = (Rol) rolsIterator.next();
            Collection networkAuthorizations = findNetworkAuthorizationsByRol(rol);
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                if (codiXarxa == null || newtworkAuthorization.getCodiXarxa().equals(codiXarxa)) {
                    for (int i = 0; i < autoritzacions.length; i++) {
                        if (newtworkAuthorization.getNivell() == autoritzacions[i])
                            return true; // La hemos encontrado
                    }
                }
            }
        }
        // llistes d'acces per grups (esto puede tardar ms.. el ltimo q
        // miramos)
        Collection grups = getGrupService().findGrupsByCodiUsuari(codiUsuari);
        Iterator grupIterator = grups.iterator();
        while (grupIterator.hasNext()) {
            Grup grup = (Grup) grupIterator.next();
            Collection networkAuthorizations = findNetworkAuthorizationsByCodiGrup(grup.getCodi());
            Iterator iterator = networkAuthorizations.iterator();
            while (iterator.hasNext()) {
                NetworkAuthorization newtworkAuthorization = (NetworkAuthorization) iterator.next();
                if (codiXarxa == null || newtworkAuthorization.getCodiXarxa().equals(codiXarxa)) {
                    for (int i = 0; i < autoritzacions.length; i++) {
                        if (newtworkAuthorization.getNivell() == autoritzacions[i])
                            return true; // La hemos encontrado
                    }
                }
            }
        }
        return false; // No se ha encontrado
    }

    private boolean adrecaCorrecta(String adreca) {
        if (adreca != null && adreca.trim().compareTo("") != 0) { //$NON-NLS-1$
            String[] adreces = adreca.split("\\."); //$NON-NLS-1$
            if (adreces.length == 4) {
                boolean correcte = true;
                for (int i = 0; i < 4 && correcte; i++) {
                    try {
                        correcte = Integer.parseInt(adreces[i]) <= 255;
                    } catch (Exception e) {
                        return false;
                    }
                }
                return correcte;
            }
        }
        return false;
    }

    private boolean maquinaCompatibleAmbXarxa(String adrecaMaquina, String adrecaXarxa, String mascaraXarxa) {
        if (adrecaXarxa.compareTo("0.0.0.0") == 0 && mascaraXarxa.compareTo("0.0.0.0") == 0) { //$NON-NLS-1$ //$NON-NLS-2$
            return true;
        }

        if (!adrecaCorrecta(mascaraXarxa)) {
            return false;
        }
        String[] mascaresXarxa = mascaraXarxa.split("\\."); //$NON-NLS-1$
        if (!adrecaCorrecta(adrecaXarxa)) {
            return false;
        }
        String[] adrecaXarxes = adrecaXarxa.split("\\."); //$NON-NLS-1$
        if (!adrecaCorrecta(adrecaMaquina)) {
            return false;
        }
        String[] adrecaMaquines = adrecaMaquina.split("\\."); //$NON-NLS-1$
        boolean compatible = true;
        for (int i = 0; i < 4 && compatible; i++) {
            int currentMascaraXarxa = Integer.parseInt(mascaresXarxa[i]);
            int currentAdrecaMaquina = Integer.parseInt(adrecaMaquines[i]);
            int currentAdrecaXarxa = Integer.parseInt(adrecaXarxes[i]);
            compatible = (currentMascaraXarxa & currentAdrecaXarxa) == (currentMascaraXarxa & currentAdrecaMaquina);
        }
        return compatible;
    }

    private boolean maquinesIguals(Maquina maquinaA, Maquina maquinaB) {
        return (!(((maquinaA.getNom() == null && maquinaB.getNom() != null)
                || (maquinaA.getNom() != null && maquinaB.getNom() == null))
                && ((maquinaA.getSistemaOperatiu() == null || maquinaB.getSistemaOperatiu() != null)
                        || (maquinaA.getSistemaOperatiu() != null || maquinaB.getSistemaOperatiu() == null))
                && ((maquinaA.getAdreca() == null && maquinaB.getAdreca() != null)
                        || (maquinaA.getAdreca() != null && maquinaB.getAdreca() == null))
                && ((maquinaA.getDescripcio() == null && maquinaB.getDescripcio() != null)
                        || (maquinaA.getDescripcio() != null && maquinaB.getDescripcio() == null))
                && ((maquinaA.getDhcp() == null && maquinaB.getDhcp() != null)
                        || (maquinaA.getDhcp() != null && maquinaB.getDhcp() == null))
                && ((maquinaA.getCorreu() == null && maquinaB.getCorreu() != null)
                        || (maquinaA.getCorreu() != null && maquinaB.getCorreu() == null))
                && ((maquinaA.getOfimatica() == null && maquinaB.getOfimatica() != null)
                        || (maquinaA.getOfimatica() != null && maquinaB.getOfimatica() == null))
                && ((maquinaA.getAliasMaquina() == null && maquinaB.getAliasMaquina() != null)
                        || (maquinaA.getAliasMaquina() != null && maquinaB.getAliasMaquina() == null))
                && ((maquinaA.getCodiXarxa() == null && maquinaB.getCodiXarxa() != null)
                        || (maquinaA.getCodiXarxa() != null && maquinaB.getCodiXarxa() == null))
                && ((maquinaA.getMac() == null && maquinaB.getMac() != null)
                        || (maquinaA.getMac() != null && maquinaB.getMac() == null))
                && ((maquinaA.getServidorImpressores() == null && maquinaB.getServidorImpressores() != null)
                        || (maquinaA.getServidorImpressores() != null
                                && maquinaB.getServidorImpressores() == null))))
                // condicions
                && (((maquinaA.getNom() == null && maquinaB.getNom() == null)
                        || (maquinaA.getNom().compareTo(maquinaB.getNom()) == 0))
                        && ((maquinaA.getSistemaOperatiu() == null || maquinaB.getSistemaOperatiu() == null)
                                || (maquinaA.getSistemaOperatiu().compareTo(maquinaB.getSistemaOperatiu()) == 0))
                        && ((maquinaA.getAdreca() == null && maquinaB.getAdreca() == null)
                                || (maquinaA.getAdreca().compareTo(maquinaB.getAdreca()) == 0))
                        && ((maquinaA.getDescripcio() == null && maquinaB.getDescripcio() == null)
                                || (maquinaA.getDescripcio().compareTo(maquinaB.getDescripcio()) == 0))
                        && ((maquinaA.getDhcp() == null && maquinaB.getDhcp() == null)
                                || (maquinaA.getDhcp().compareTo(maquinaB.getDhcp()) == 0))
                        && ((maquinaA.getCorreu() == null && maquinaB.getCorreu() == null)
                                || (maquinaA.getCorreu().compareTo(maquinaB.getCorreu()) == 0))
                        && ((maquinaA.getOfimatica() == null && maquinaB.getOfimatica() == null)
                                || (maquinaA.getOfimatica().compareTo(maquinaB.getOfimatica()) == 0))
                        && ((maquinaA.getAliasMaquina() == null && maquinaB.getAliasMaquina() == null)
                                || (sonAliasIguales(maquinaA.getAliasMaquina(), maquinaB.getAliasMaquina())))
                        && ((maquinaA.getCodiXarxa() == null && maquinaB.getCodiXarxa() == null)
                                || (maquinaA.getCodiXarxa().compareTo(maquinaB.getCodiXarxa()) == 0))
                        && ((maquinaA.getMac() == null && maquinaB.getMac() == null)
                                || (maquinaA.getMac().compareTo(maquinaB.getMac()) == 0))
                        && ((maquinaA.getServidorImpressores() == null && maquinaB.getServidorImpressores() == null)
                                || (maquinaA.getServidorImpressores()
                                        .compareTo(maquinaB.getServidorImpressores()) == 0)));
    }

    private boolean sonAliasIguales(String alias1, String alias2) {
        if ((alias1 == null && alias2 != null) || (alias1 != null && alias2 == null))
            return false; // solo 1 nulo
        if (alias1 == null && alias2 == null)
            return true; // ambos nulos
        HashSet h_alias1 = new HashSet();
        HashSet h_alias2 = new HashSet();
        // alias1 y alias2 NO son nulos
        String[] v_alias1 = alias1.split(" "); //$NON-NLS-1$
        String[] v_alias2 = alias2.split(" "); //$NON-NLS-1$
        // Los guardamos en los sets
        if (v_alias1 != null)
            for (int i = 0; i < v_alias1.length; i++) {
                String act = v_alias1[i];
                if (act != null && !"".equals(act.trim())) //$NON-NLS-1$
                    h_alias1.add(act);
            }
        if (v_alias2 != null)
            for (int i = 0; i < v_alias2.length; i++) {
                String act = v_alias2[i];
                if (act != null && !"".equals(act.trim())) //$NON-NLS-1$
                    h_alias2.add(act);
            }
        if (h_alias1.size() != h_alias2.size())
            return false; // No tienen el mismo tamao
        // Los comparamos buscando todos los del primero en el segundo:
        for (Iterator it = h_alias1.iterator(); it.hasNext();) {
            String elem = (String) it.next();
            if (!h_alias2.contains(elem))
                return false;
        }
        return true;
    }

    private Collection<XarxaEntity> localFindXarxaByFiltre(java.lang.String codi, java.lang.String adreca,
            java.lang.String descripcio, java.lang.String mascara, java.lang.String normalitzada,
            java.lang.String dhcp, String maquina) throws java.lang.Exception {
        if (codi != null && (codi.trim().compareTo("") == 0 || codi.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            codi = null;
        }
        if (adreca != null && (adreca.trim().compareTo("") == 0 || adreca.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            adreca = null;
        }
        if (descripcio != null && (descripcio.trim().compareTo("") == 0 || descripcio.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            descripcio = null;
        }
        if (mascara != null && (mascara.trim().compareTo("") == 0 || mascara.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            mascara = null;
        }
        if (normalitzada != null
                && (normalitzada.trim().compareTo("") == 0 || normalitzada.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            normalitzada = null;
        }
        if (dhcp != null && (dhcp.trim().compareTo("") == 0 || dhcp.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            dhcp = null;
        }
        String query = "select xarxa " + "from es.caib.seycon.ng.model.XarxaEntity xarxa " //$NON-NLS-1$ //$NON-NLS-2$
                + "where " + "(:codi is null or xarxa.codi like :codi) and " //$NON-NLS-1$ //$NON-NLS-2$
                + "(:adreca is null or xarxa.adreca like :adreca) and " //$NON-NLS-1$
                + "(:descripcio is null or xarxa.descripcio like :descripcio) and " //$NON-NLS-1$
                + "(:mascara is null or xarxa.mascara like :mascara) and " //$NON-NLS-1$
                + "(:normalitzada is null or xarxa.normalitzada = :normalitzada) and " //$NON-NLS-1$
                + "(:dhcp is null or xarxa.dhcp like :dhcp) " + "order by xarxa.codi"; //$NON-NLS-1$ //$NON-NLS-2$
        Parameter codiParameter = new Parameter("codi", codi); //$NON-NLS-1$
        Parameter adrecaParameter = new Parameter("adreca", adreca); //$NON-NLS-1$
        Parameter descripcioParameter = new Parameter("descripcio", descripcio); //$NON-NLS-1$
        Parameter normalitzadaParameter = new Parameter("normalitzada", normalitzada); //$NON-NLS-1$
        Parameter mascaraParameter = new Parameter("mascara", mascara); //$NON-NLS-1$
        Parameter dhcpParameter = new Parameter("dhcp", dhcp); //$NON-NLS-1$
        Parameter parametres[] = { codiParameter, adrecaParameter, mascaraParameter, descripcioParameter,
                normalitzadaParameter, dhcpParameter };
        Collection<XarxaEntity> xarxesTrobades = getXarxaEntityDao().query(query, parametres);
        return xarxesTrobades;
    }

    private Collection<Xarxa> filtraPerMaquina(Collection<Xarxa> xarxesTrobades, String maquina) {
        if (maquina != null && maquina.compareTo("") != 0 && maquina.compareTo("%") != 0 //$NON-NLS-1$ //$NON-NLS-2$
                && xarxesTrobades.size() > 0) {
            String xarxes = ""; //$NON-NLS-1$
            Iterator xarxesIterator = xarxesTrobades.iterator();
            while (xarxesIterator.hasNext()) {
                Xarxa xarxa = (Xarxa) xarxesIterator.next();
                xarxes += "'" + xarxa.getCodi() + "'" + (xarxesIterator.hasNext() ? "," : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
            }
            String query = "select distinct maquina.xarxa " //$NON-NLS-1$
                    + "from es.caib.seycon.ng.model.MaquinaEntity maquina " + "where " //$NON-NLS-1$ //$NON-NLS-2$
                    + "maquina.nom like :maquina and " + "maquina.xarxa.codi in (" + xarxes + ") " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                    + "order by maquina.xarxa.codi"; //$NON-NLS-1$
            Parameter parametres[] = { new Parameter("maquina", maquina) }; //$NON-NLS-1$
            List<XarxaEntity> xarxesList = getXarxaEntityDao().query(query, parametres);
            return getXarxaEntityDao().toXarxaList(xarxesList);
        }
        return xarxesTrobades;
    }

    private Collection<NetworkAuthorization> findNetworkAuthorizationsByRol(Rol rol) {
        String query = "select xarxaAC from " //$NON-NLS-1$
                + "es.caib.seycon.ng.model.XarxaACEntity xarxaAC where " //$NON-NLS-1$
                + "xarxaAC.role.nom = :nom and " //$NON-NLS-1$
                + "xarxaAC.role.baseDeDades.codi = :dispatcher and " //$NON-NLS-1$
                + "xarxaAC.role.aplicacio.codi = :aplicacio"; //$NON-NLS-1$
        Parameter parametres[] = { new Parameter("nom", rol.getNom()), //$NON-NLS-1$
                new Parameter("dispatcher", rol.getBaseDeDades()), //$NON-NLS-1$
                new Parameter("aplicacio", rol.getCodiAplicacio()) }; //$NON-NLS-1$
        Collection<XarxaACEntity> xarxaACsTrobades = getXarxaACEntityDao().query(query, parametres);
        if (xarxaACsTrobades != null) {
            return getXarxaACEntityDao().toNetworkAuthorizationList(xarxaACsTrobades);
        }
        return new LinkedList<NetworkAuthorization>();
    }

    private void auditaSolicitudDadesAdministradorHost(String maquina) {
        String codiUsuari = Security.getCurrentAccount();
        Auditoria auditoria = new Auditoria();
        auditoria.setAccio("A"); // Administrador //$NON-NLS-1$
        auditoria.setMaquina(maquina);
        auditoria.setAutor(codiUsuari);
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
        auditoria.setData(dateFormat.format(GregorianCalendar.getInstance().getTime()));
        auditoria.setObjecte("SC_ADMMAQ"); //$NON-NLS-1$

        AuditoriaEntity auditoriaEntity = getAuditoriaEntityDao().auditoriaToEntity(auditoria);
        getAuditoriaEntityDao().create(auditoriaEntity);
    }

    protected Collection<Maquina> handleFindMaquinaOfirmaticaUsuariByFiltre(String nom, String sistemaOperatiu,
            String adreca, String dhcp, String correu, String ofimatica, String alias, String mac,
            String descripcio, String xarxa, String codiUsuari, Boolean restringeixCerca,
            String servidorImpressores) throws Exception {
        int limitResults = Integer.parseInt(System.getProperty("soffid.ui.maxrows")); //$NON-NLS-1$

        if (nom != null && (nom.trim().compareTo("") == 0 || nom.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            nom = null;
        }
        if (sistemaOperatiu != null
                && (sistemaOperatiu.trim().compareTo("") == 0 || sistemaOperatiu.trim().compareTo( //$NON-NLS-1$
                        "%") == 0)) { //$NON-NLS-1$
            sistemaOperatiu = null;
        }
        if (adreca != null && (adreca.trim().compareTo("") == 0 || adreca.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            adreca = null;
        }
        if (dhcp != null && (dhcp.trim().compareTo("") == 0 || dhcp.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            dhcp = null;
        }
        if (correu != null && (correu.trim().compareTo("") == 0 || correu.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            correu = null;
        }
        if (ofimatica != null && (ofimatica.trim().compareTo("") == 0 || ofimatica.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            ofimatica = null;
        }
        if (alias != null && (alias.trim().compareTo("") == 0 || alias.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            alias = null;
        }
        if (mac != null && (mac.trim().compareTo("") == 0 || mac.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            mac = null;
        }
        if (descripcio != null && (descripcio.trim().compareTo("") == 0 || descripcio.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            descripcio = null;
        }
        if (xarxa != null && (xarxa.trim().compareTo("") == 0 || xarxa.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            xarxa = null;
        }

        if (codiUsuari != null && (codiUsuari.trim().compareTo("") == 0 || codiUsuari.trim().compareTo("%") == 0)) { //$NON-NLS-1$ //$NON-NLS-2$
            codiUsuari = null;
        }

        if (servidorImpressores != null
                && (servidorImpressores.trim().compareTo("") == 0 || servidorImpressores.trim() //$NON-NLS-1$
                        .compareTo("%") == 0)) { //$NON-NLS-1$
            servidorImpressores = null;
        }

        Collection<MaquinaEntity> maquines = null;

        // Realizamos la siguiente consulta (sin tener cuenta el alias)
        String query = "select distinct maquina from " //$NON-NLS-1$
                + " es.caib.seycon.ng.model.SessioEntity sessio " //$NON-NLS-1$
                + " right outer join sessio.maquina as maquina " //$NON-NLS-1$
                + " left outer join sessio.usuari as usuari" //$NON-NLS-1$
                + " where " //$NON-NLS-1$
                + "(:nom is null or maquina.nom like :nom) and (:sistemaOperatiu is null or " //$NON-NLS-1$
                + "maquina.operatingSystem.name like :sistemaOperatiu) and (:adreca is null or " //$NON-NLS-1$
                + "maquina.adreca like :adreca) and (:dhcp is null or " //$NON-NLS-1$
                + "maquina.dhcp like :dhcp) and (:correu is null or " //$NON-NLS-1$
                + "maquina.correu like :correu) and (:ofimatica is null or " //$NON-NLS-1$
                + "maquina.ofimatica like :ofimatica) " //$NON-NLS-1$
                + "and (:mac is null or maquina.mac like :mac) and " //$NON-NLS-1$
                + "(:descripcio is null or maquina.descripcio like :descripcio) and " //$NON-NLS-1$
                + "(:xarxa is null or maquina.xarxa.codi like :xarxa) and " //$NON-NLS-1$
                + "(:codiUsuari is null  or (usuari is not null and  usuari.codi like :codiUsuari))" //$NON-NLS-1$
                + "and (:servidorImpressores is null or maquina.servidorImpressores like :servidorImpressores) " //$NON-NLS-1$
                + "order by maquina.nom "; //$NON-NLS-1$

        Parameter[] params = new Parameter[] { new Parameter("nom", nom), //$NON-NLS-1$
                new Parameter("sistemaOperatiu", sistemaOperatiu), new Parameter("adreca", adreca), //$NON-NLS-1$ //$NON-NLS-2$
                new Parameter("dhcp", dhcp), new Parameter("correu", correu), //$NON-NLS-1$ //$NON-NLS-2$
                new Parameter("ofimatica", ofimatica), new Parameter("mac", mac), //$NON-NLS-1$ //$NON-NLS-2$
                new Parameter("descripcio", descripcio), new Parameter("xarxa", xarxa), //$NON-NLS-1$ //$NON-NLS-2$
                new Parameter("codiUsuari", codiUsuari), //$NON-NLS-1$
                new Parameter("servidorImpressores", servidorImpressores) }; //$NON-NLS-1$
        maquines = getMaquinaEntityDao().query(query, params);

        // Filtramos por alias (si se ha especificado algn valor)
        if (alias != null) {
            Collection maquinesAlias = getAliasMaquinaEntityDao().findMaquinaByAlias(alias);
            HashSet h_maquinesAlias = new HashSet(maquinesAlias.size());
            for (Iterator it = maquinesAlias.iterator(); it.hasNext();) {
                MaquinaEntity maqAlias = (MaquinaEntity) it.next();
                h_maquinesAlias.add(maqAlias.getId());
            }
            // Nos quedamos slo con las mquinas de la bsqueda que tengan el
            // alias indicado
            for (Iterator it = maquines.iterator(); it.hasNext();) {
                MaquinaEntity maq = (MaquinaEntity) it.next();
                if (!h_maquinesAlias.contains(maq.getId()))
                    it.remove(); // Lo eliminamos (no tiene el alias buscado)
            }
        }

        // Check results list lenght
        if (maquines.size() > limitResults) {
            return getMaquinaEntityDao().toMaquinaList(maquines).subList(0, limitResults);
        }

        return getMaquinaEntityDao().toMaquinaList(maquines);
    }

    private void auditaVNC(SessioEntity sessio, String accio) {
        String codiUsuari = Security.getCurrentAccount();
        Auditoria auditoria = new Auditoria();

        auditoria.setAutor(codiUsuari); // usuari auditador
        auditoria.setUsuari(sessio.getUsuari().getCodi()); // usuari auditat
        auditoria.setAccio(accio);
        auditoria.setMaquina(sessio.getMaquina().getNom());

        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
        auditoria.setData(dateFormat.format(GregorianCalendar.getInstance().getTime()));
        auditoria.setObjecte("VNC"); //$NON-NLS-1$

        AuditoriaEntity auditoriaEntity = getAuditoriaEntityDao().auditoriaToEntity(auditoria);
        getAuditoriaEntityDao().create(auditoriaEntity);
    }

    private Long internalGetAccessLevel(String nomMaquina, String codiXarxa) throws InternalErrorException {
        // Si t l'autoritzaci, no es miren els ACL
        if (AutoritzacionsUsuari.canSupportAllNetworks_VNC())
            return new Long(SUPORT);

        String codiUsuari = Security.getCurrentUser();
        if (codiUsuari == null)
            return new Long(SENSE_PERMISOS);

        Collection networkAuthorizations = findALLNetworkAuthorizationsByCodiUsuari(codiUsuari);
        return getAccessLevel(networkAuthorizations, nomMaquina, codiXarxa);
    }

    /**
     * Lanzar el VNC contra la sesin indicada. Se verificar que el usuario
     * est autorizado a lanzar capturas en la red asociada
     * 
     * @param sessioId
     *            id de la sesin que se quiere capturar
     * @return true si el usuario acepta la captura de pantalla y teclado
     * @throws InternalErrorException
     *             error en la configuracin del servidor
     * @throws es.caib.seycon.util.TimedOutException
     *             el usuario no ha respondido en el tiempo especificado
     * @throws java.io.IOException
     *             error en la comunicacin con el puesto de trabajo
     */
    protected Boolean handleLaunchVNC(Long sessioId)
            throws java.io.IOException, TimedOutException, InternalErrorException {

        try {
            SessioEntity sessio = getSessioEntityDao().findById(sessioId);

            if (sessio == null)
                throw new InternalErrorException(
                        String.format(Messages.getString("XarxaServiceImpl.NoSessionIDFound"), //$NON-NLS-1$
                                sessioId));

            if (sessio.getMaquinaClient() != null)
                return false;

            // Mirem si s autoritzat (autoritzaci o acls)
            if (internalGetAccessLevel(sessio.getMaquina().getNom(),
                    sessio.getMaquina().getXarxa().getCodi()) < SUPORT)
                throw new java.lang.SecurityException(Messages.getString("XarxaServiceImpl.NoPermissionMessage")); //$NON-NLS-1$

            InetAddress addr = InetAddress.getLocalHost();

            if (addr == null)
                throw new InternalErrorException(Messages.getString("XarxaServiceImpl.NoGetInetAddress")); //$NON-NLS-1$

            TimedProcess t = new TimedProcess(20000);
            if (addr.getHostName().toLowerCase().startsWith("epreinf14")) //$NON-NLS-1$
                t.exec(new String[] { "rsh", "spreinfsun2", "rsh", sessio.getMaquina().getNom(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
                        "vnc" }); //$NON-NLS-1$
            else
                t.exec(new String[] { "rsh", sessio.getMaquina().getNom(), "vnc" }); //$NON-NLS-1$ //$NON-NLS-2$

            if (t.getOutput().indexOf("concedit") > 0) { //$NON-NLS-1$

                auditaVNC(sessio, "S"); //$NON-NLS-1$
                /*
                 * registraAuditoria (sessio.getMaquina().Name,
                 * usuaris.getIdUsuari(autor), sessio.getUsuari()!=null ?
                 * sessio.getUsuari().User : "", "S");
                 */
                return true;
            } else
                auditaVNC(sessio, "N"); //$NON-NLS-1$
            /*
             * registraAuditoria( sessio.getMaquina().Name,
             * usuaris.getIdUsuari(autor), sessio.getUsuari() != null ?
             * sessio.getUsuari().User : "", "N");
             */
            return false;

        } catch (java.net.UnknownHostException e) {
            throw new InternalErrorException(e.toString());
        }
    }

    protected Boolean handleHasAnyACLXarxes(String codiUsuari) throws Exception {
        return hasNetworkAuthorizations(codiUsuari, null, new int[] { ADMINISTRACIO, CONSULTA, SUPORT });
    }

    @Override
    protected AutoritzacioAccesHostComAdministrador handleRevocarAccesHostComAdministrador(
            AutoritzacioAccesHostComAdministrador autoritzacioAccesComAdministrador) throws Exception {
        // Aquest mtode ja s restringit pel jboss (host:admin:query)

        // 1) canviem la data de l'autoritzaci a ara mateix
        Calendar araMateix = Calendar.getInstance();

        // Comprovem que no estiga caducada
        if (autoritzacioAccesComAdministrador.getDataCaducitatAutoritzacioAcces().getTimeInMillis() < araMateix
                .getTimeInMillis()) {
            throw new SeyconException(Messages.getString("XarxaServiceImpl.AuthorizacionExpired")); //$NON-NLS-1$
        }

        autoritzacioAccesComAdministrador.setDataCaducitatAutoritzacioAcces(araMateix);
        AutoritzacioAccesHostComAdministradorEntity entity = getAutoritzacioAccesHostComAdministradorEntityDao()
                .autoritzacioAccesHostComAdministradorToEntity(autoritzacioAccesComAdministrador);
        // Actualitzem les dades
        getAutoritzacioAccesHostComAdministradorEntityDao().update(entity);

        // Auditem el canvi
        // Indiquem com a M l'acci (modificaci)
        auditaPeticioAdministrarHost(autoritzacioAccesComAdministrador.getNomHost(),
                autoritzacioAccesComAdministrador.getCodiUsuari(), "R"); //$NON-NLS-1$

        return getAutoritzacioAccesHostComAdministradorEntityDao().toAutoritzacioAccesHostComAdministrador(entity);
    }

    private void auditaPeticioAdministrarHost(String maquina, String codiUsuari, String accio) throws Exception {

        String codiUsuariCanvi = Security.getCurrentAccount();
        // Fem un nestedlogin per obtindre autoritzaci per fer auditoria

        Auditoria auditoria = new Auditoria();
        auditoria.setAccio(accio); // Aprovat / Rebujat /
        auditoria.setMaquina(maquina);
        auditoria.setAutor(codiUsuariCanvi);
        auditoria.setUsuari(codiUsuari);
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
        auditoria.setData(dateFormat.format(Calendar.getInstance().getTime()));
        auditoria.setObjecte("SC_ADMMAQ"); //$NON-NLS-1$

        AuditoriaEntity auditoriaEntity = getAuditoriaEntityDao().auditoriaToEntity(auditoria);
        getAuditoriaEntityDao().create(auditoriaEntity);
    }

    private void auditaCanviDadesAdministradorHost(String maquina) throws Exception {

        String codiUsuariCanvi = Security.getCurrentAccount(); //$NON-NLS-1$
        // Fem un nestedlogin per obtindre autoritzaci per fer auditoria

        Auditoria auditoria = new Auditoria();
        auditoria.setAccio("U"); //$NON-NLS-1$
        auditoria.setMaquina(maquina);
        auditoria.setAutor(codiUsuariCanvi);
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy kk:mm:ss"); //$NON-NLS-1$
        auditoria.setData(dateFormat.format(Calendar.getInstance().getTime()));
        auditoria.setObjecte("SC_ADMMAQ"); //$NON-NLS-1$

        AuditoriaEntity auditoriaEntity = getAuditoriaEntityDao().auditoriaToEntity(auditoria);
        getAuditoriaEntityDao().create(auditoriaEntity);
    }

    @Override
    protected void handleSetContrasenyaAdministrador(String nomMaquina, String adminUser, String adminPass)
            throws Exception {
        // Aadimos auditora de la peticin
        auditaCanviDadesAdministradorHost(nomMaquina); // AUDITORIA

        MaquinaEntity host = getMaquinaEntityDao().findByNom(nomMaquina);

        host.setUsuariAdministrador(adminUser);
        host.setContrasenyaAdministrador(new Password(adminPass).toString());
        host.setDataContrasenyaAdministrador(new Date());
        getMaquinaEntityDao().update(host);
    }

    @Override
    protected Maquina handleFindMaquinaBySerialNumber(String serialNumber) throws Exception {
        MaquinaEntity maquina = getMaquinaEntityDao().findBySerialNumber(serialNumber);
        if (maquina == null)
            return null;
        else
            return getMaquinaEntityDao().toMaquina(maquina);
    }

    @Override
    protected Maquina handleRegisterDynamicIP(String nomMaquina, String ip, String serialNumber)
            throws es.caib.seycon.ng.exception.UnknownHostException, UnknownNetworkException {
        boolean anyChange = false;
        // First. Test if this IP belongs to anybody else
        MaquinaEntity old = getMaquinaEntityDao().findByAdreca(ip);
        MaquinaEntity maquina = null;
        if (old != null) {
            if (serialNumber.equals(old.getSerialNumber())) {
                maquina = old;
                // Coincide serial number 
                if (!nomMaquina.equals(maquina.getNom())) {
                    // Host name changed
                    // Check if already exists such a name
                    old = getMaquinaEntityDao().findByNom(nomMaquina);
                    if (old != null) {
                        old.setDeleted(true);
                        getMaquinaEntityDao().update(old);
                    }
                    maquina.setNom(nomMaquina);
                    anyChange = true;
                }
            } else {
                if (old.getDeleted().booleanValue() || old.getDynamicIP().booleanValue()) {
                    old.setAdreca(null);
                    old.setXarxa(null);
                    getMaquinaEntityDao().update(old);
                } else {
                    log.warn(String.format(Messages.getString("XarxaServiceImpl.HostsCollisionMessage"), //$NON-NLS-1$
                            nomMaquina, nomMaquina, ip, serialNumber));
                    throw new UnknownHostException(
                            String.format(Messages.getString("XarxaServiceImpl.IPAssignedMessage"), //$NON-NLS-1$
                                    ip, old.getNom()));
                }
            }
        }
        // Second. Test if this name belongs to anybody else
        if (maquina == null) {
            // Found a host with no serial number => Bind it
            old = getMaquinaEntityDao().findByNom(nomMaquina);
            if (old == null) {
                // Nothing to do
            } else if (old.getSerialNumber() == null && old.getDynamicIP().booleanValue()) {
                // Replace unused host
                maquina = old;
                maquina.setSerialNumber(serialNumber);
                maquina.setAdreca(ip);
                maquina.setLastSeen(new Date());
                getMaquinaEntityDao().update(maquina);
            } else if (serialNumber.equals(old.getSerialNumber())) {
                // Found host entry
                maquina = old;
            } else if (old.getDynamicIP().booleanValue()) {
                // Autodelete
                old.setDeleted(true);
                getMaquinaEntityDao().update(old);
            } else {
                log.warn(String.format(Messages.getString("XarxaServiceImpl.HostsCollisionMessage"), //$NON-NLS-1$
                        nomMaquina, nomMaquina, ip, serialNumber));
                throw new UnknownHostException(nomMaquina);
            }
        }
        // Third. Test if this serial is already used (with another name)
        if (maquina == null) {
            maquina = getMaquinaEntityDao().findBySerialNumber(serialNumber);
            if (maquina != null && !nomMaquina.equals(maquina.getNom())) {
                anyChange = true;
                maquina.setNom(nomMaquina);
            }
        }

        if (maquina == null) {
            try {
                InetAddress addr = InetAddress.getByName(ip);
                XarxaEntity x = guessNetwork(addr.getAddress());
                if (x == null) {
                    String msg = String.format(Messages.getString("XarxaServiceImpl.RequestUnmanagedIP"), //$NON-NLS-1$
                            nomMaquina, ip);
                    log.warn(msg);
                    throw new UnknownNetworkException(msg);
                }
                maquina = getMaquinaEntityDao().newMaquinaEntity();
                maquina.setAdreca(ip);
                maquina.setCorreu("N"); //$NON-NLS-1$
                maquina.setDeleted(false);
                DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
                maquina.setDescripcio(Messages.getString("XarxaServiceImpl.AutocreatedMessage") + //$NON-NLS-1$
                        " " + // $NON-NLS-1$ //$NON-NLS-1$
                        df.format(new Date())); //$NON-NLS-1$
                maquina.setDynamicIP(new Boolean(true));
                maquina.setNom(nomMaquina);
                maquina.setOfimatica("N"); //$NON-NLS-1$
                maquina.setSerialNumber(serialNumber);
                maquina.setServidorImpressores("N"); //$NON-NLS-1$
                maquina.setOperatingSystem(getOsTypeEntityDao().findOSTypeByName("ALT")); //$NON-NLS-1$
                maquina.setXarxa(x);
                getMaquinaEntityDao().create(maquina);
            } catch (java.net.UnknownHostException e) {
                String msg = String.format(Messages.getString("XarxaServiceImpl.RequestUnmanagedIP"), nomMaquina, //$NON-NLS-1$
                        "??"); //$NON-NLS-1$ 
                log.warn(msg);
                throw new UnknownNetworkException(msg);
            }
        }

        if (!ip.equals(maquina.getAdreca()) || maquina.getXarxa() == null
                || !Boolean.FALSE.equals(maquina.getDeleted())) {
            try {
                InetAddress addr = InetAddress.getByName(ip);
                XarxaEntity x = guessNetwork(addr.getAddress());
                if (x != null) {
                    if (x.isDchpSupport()) {
                        anyChange = true;
                        maquina.setDeleted(Boolean.FALSE);
                        maquina.setAdreca(ip);
                        maquina.setXarxa(x);
                    } else {
                        throw new UnknownNetworkException(
                                String.format(Messages.getString("XarxaServiceImpl.RequestWithoutDHCP"), //$NON-NLS-1$
                                        nomMaquina, ip, x.getCodi()));
                    }
                } else {
                    throw new UnknownNetworkException(String
                            .format(Messages.getString("XarxaServiceImpl.RequestUnmanagedIP"), nomMaquina, ip)); //$NON-NLS-1$
                }
            } catch (java.net.UnknownHostException e) {
                String msg = String.format(Messages.getString("XarxaServiceImpl.RequestUnmanagedIP"), nomMaquina, //$NON-NLS-1$
                        "??"); //$NON-NLS-1$ 
                log.warn(msg);
                throw new UnknownNetworkException(msg);
            }
        }
        if (anyChange || maquina.getLastSeen() == null
                || System.currentTimeMillis() - maquina.getLastSeen().getTime() > 8 * 60L * 60L * 1000L) // each 8 hours update last seen
        {
            maquina.setLastSeen(new Date());
            getMaquinaEntityDao().update(maquina);
        }

        return getMaquinaEntityDao().toMaquina(maquina);
    }

    private XarxaEntity guessNetwork(byte[] b) {
        XarxaEntityDao dao = getXarxaEntityDao();
        XarxaEntity xarxa = null;
        for (int bc = b.length - 1; xarxa == null && bc >= 0; bc--) {
            byte mascara = (byte) 255;
            for (int bits = 0; xarxa == null && bits < 8; bits++) {
                mascara = (byte) (mascara << 1);
                b[bc] = (byte) (b[bc] & mascara);
                InetAddress addr2;
                try {
                    addr2 = InetAddress.getByAddress(b);
                    String addrText = addr2.getHostAddress();
                    xarxa = dao.findByAdreca(addrText);
                } catch (java.net.UnknownHostException e) {
                    e.printStackTrace();
                }
            }
        }
        if (xarxa == null) {
            String defaultNetwork = System.getProperty("soffid.network.internet"); //$NON-NLS-1$
            if (defaultNetwork != null) {
                xarxa = dao.findByCodi(defaultNetwork);
                if (xarxa == null) {
                    xarxa = dao.newXarxaEntity();
                    xarxa.setCodi(defaultNetwork);
                    xarxa.setAdreca("0.0.0.0"); //$NON-NLS-1$
                    xarxa.setMascara("255.255.255.255"); //$NON-NLS-1$
                    xarxa.setDchpSupport(true);
                    xarxa.setDescripcio("Autocreated network for unknown IP adresses"); //$NON-NLS-1$
                    xarxa.setNormalitzada("N"); //$NON-NLS-1$
                    dao.create(xarxa);
                }
            }
        }
        return xarxa;
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleFindAllOSType()
     */
    @Override
    protected List<OsType> handleFindAllOSType() throws Exception {
        OsTypeEntityDao entity = getOsTypeEntityDao();

        return getOsTypeEntityDao().toOsTypeList(entity.loadAll());
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleFindOSTypeById(java.lang.Long)
     */
    @Override
    protected OsType handleFindOSTypeById(Long osId) throws Exception {
        OsTypeEntityDao entityDAO = getOsTypeEntityDao();

        return getOsTypeEntityDao().toOsType(entityDAO.load(osId));
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleCreateOSType(es.caib.seycon.ng.comu.OsType)
     */
    @Override
    protected OsType handleCreate(OsType osType) throws Exception {
        OsTypeEntity entity = getOsTypeEntityDao().osTypeToEntity(osType);
        getOsTypeEntityDao().create(entity);
        osType.setId(entity.getId());

        return getOsTypeEntityDao().toOsType(entity);
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleDeleteOSType(es.caib.seycon.ng.comu.OsType)
     */
    @Override
    protected void handleDelete(OsType osType) throws Exception {
        OsTypeEntity osTypeEntity = getOsTypeEntityDao().osTypeToEntity(osType);
        if (!osTypeEntity.getOperatingSystemHost().isEmpty())
            throw new SeyconException(String.format(
                    Messages.getString("XarxaServiceImpl.IntegrityViolationMachines"), osTypeEntity.getName())); //$NON-NLS-1$
        getOsTypeEntityDao().remove(osTypeEntity);
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleUpdateOSType(es.caib.seycon.ng.comu.OsType)
     */
    @Override
    protected void handleUpdate(OsType osType) throws Exception {
        OsTypeEntity entity = getOsTypeEntityDao().osTypeToEntity(osType);

        getOsTypeEntityDao().update(entity);
    }

    /* (non-Javadoc)
     * @see es.caib.seycon.ng.servei.XarxaServiceBase#handleFindOSTypeByName(java.lang.String)
     */
    @Override
    protected OsType handleFindOSTypeByName(String osName) throws Exception {
        OsTypeEntity osTypeEntity = getOsTypeEntityDao().findOSTypeByName(osName);

        if (osTypeEntity != null) {
            return getOsTypeEntityDao().toOsType(osTypeEntity);
        }

        else {
            return null;
        }
    }

}