ips1ap101.lib.core.control.UsuarioAutenticado.java Source code

Java tutorial

Introduction

Here is the source code for ips1ap101.lib.core.control.UsuarioAutenticado.java

Source

/*
 * Este programa es software libre; usted puede redistribuirlo y/o modificarlo bajo los trminos
 * de la licencia "GNU General Public License" publicada por la Fundacin "Free Software Foundation".
 * Este programa se distribuye con la esperanza de que pueda ser til, pero SIN NINGUNA GARANTIA;
 * vea la licencia "GNU General Public License" para obtener mas informacin.
 */
package ips1ap101.lib.core.control;

import java.io.Serializable;
import java.security.Principal;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import ips1ap101.lib.base.constant.CBM;
import ips1ap101.lib.base.entity.enumeration.TipoFuncionEnumeration;
import ips1ap101.lib.base.persistence.entity.ConjuntoSegmentoBase;
import ips1ap101.lib.base.persistence.entity.ElementoSegmentoBase;
import ips1ap101.lib.base.persistence.entity.FuncionBase;
import ips1ap101.lib.base.persistence.entity.RolBase;
import ips1ap101.lib.base.persistence.entity.RolFuncionBase;
import ips1ap101.lib.base.persistence.entity.RolFuncionParBase;
import ips1ap101.lib.base.persistence.entity.RolUsuarioBase;
import ips1ap101.lib.base.persistence.entity.UsuarioBase;
import ips1ap101.lib.base.util.BitUtils;
import ips1ap101.lib.core.app.Bitacora;
import ips1ap101.lib.core.app.TLC;
import ips1ap101.lib.core.constant.EAC;
import ips1ap101.lib.core.jsf.JSF;
import ips1ap101.lib.core.util.EA;
import ips1ap101.lib.core.web.app.EJBL;
import org.apache.commons.lang.StringUtils;

/**
 * @author Jorge Campins
 */
public class UsuarioAutenticado extends UsuarioActual implements Principal, Serializable {

    private static final String ROL_SUPER_GESTOR = "SuperGestor";

    private static final String ROL_SUPER_LECTOR = "SuperLector";

    private static final String ROL_OPERADOR = "Operador";

    private static final String USUARIO_OPERADOR = "oper";

    private static enum AutorizacionFuncion {

        NO_AUTORIZADA, AUTORIZADA, ACCESO_PERSONALIZADO

    }

    static String getPrincipalName() {
        Principal principal = JSF.getPrincipal();
        return principal == null ? CODIGO_USUARIO_DESCONOCIDO : principal.getName();
    }

    static boolean isUserInRoleSuperGestor() {
        return isUserInRole(ROL_SUPER_GESTOR);
    }

    static boolean isUserInRoleSuperLector() {
        return isUserInRole(ROL_SUPER_LECTOR);
    }

    static boolean isUserInRoleOperador() {
        return isUserInRole(ROL_OPERADOR);
    }

    static boolean isUserInRole(String role) {
        HttpServletRequest request = JSF.getRequest();
        return request != null && request.isUserInRole(role);
    }

    private void stamp() {
        Bitacora.stamp(this);
    }

    /**
     * Creates a new instance of UsuarioAutenticado
     */
    public UsuarioAutenticado() {
        super();
        filterFragmentRendered = true;
        helpInlineRendered = true;
        filasPorPagina = 0;
        stamp();
        clear();
    }

    /**
     * Creates a new instance of UsuarioAutenticado
     */
    UsuarioAutenticado(String codigo) {
        this();
        if (codigo != null) {
            setCodigoUsuario(codigo);
            setNombreUsuario(StringUtils.capitalize(codigo));
        }
        setCredencialesUsuario();
    }

    private void clear() {
        funcionesAutorizadas.clear();
        parametrosAutorizados.clear();
        segmentosAutorizados.clear();
        modificado = false;
        fechaHoraModificacion = getSessionCreationTime();
    }

    /**
     * Conserva el valor de la propiedad filterFragmentRendered.
     */
    boolean filterFragmentRendered;

    public boolean isFilterFragmentRendered() {
        return filterFragmentRendered;
    }

    public void setFilterFragmentRendered(boolean filterFragmentRendered) {
        this.filterFragmentRendered = filterFragmentRendered;
    }

    /**
     * Conserva el valor de la propiedad helpInlineRendered.
     */
    boolean helpInlineRendered;

    public boolean isHelpInlineRendered() {
        return helpInlineRendered;
    }

    public void setHelpInlineRendered(boolean helpInlineRendered) {
        this.helpInlineRendered = helpInlineRendered;
    }

    /**
     * Conserva el valor de la propiedad filasPorPagina.
     */
    int filasPorPagina;

    public int getFilasPorPagina() {
        return filasPorPagina;
    }

    public void setFilasPorPagina(int filasPorPagina) {
        this.filasPorPagina = filasPorPagina;
    }

    /**
     * Conserva el valor de la coleccin funcionesAutorizadas.
     */
    private Set<FuncionAutorizada> funcionesAutorizadas = new LinkedHashSet();

    /**
     * Getter para coleccin funcionesAutorizadas.
     *
     * @return Valor de la coleccin funcionesAutorizadas.
     */
    Set<FuncionAutorizada> getFuncionesAutorizadas() {
        return funcionesAutorizadas;
    }

    /**
     * Conserva el valor de la coleccin parametrosAutorizados.
     */
    private Set<ParametroAutorizado> parametrosAutorizados = new LinkedHashSet();

    /**
     * Getter para coleccin parametrosAutorizados.
     *
     * @return Valor de la coleccin parametrosAutorizados.
     */
    Set<ParametroAutorizado> getParametrosAutorizados() {
        return parametrosAutorizados;
    }

    /**
     * Conserva el valor de la coleccin segmentosAutorizados.
     */
    private Set<SegmentoAutorizado> segmentosAutorizados = new LinkedHashSet();

    /**
     * Getter para coleccin segmentosAutorizados.
     *
     * @return Valor de la coleccin segmentosAutorizados.
     */
    Set<SegmentoAutorizado> getSegmentosAutorizados() {
        return segmentosAutorizados;
    }

    /**
     * Conserva el valor de la propiedad modificado.
     */
    private boolean modificado;

    /**
     * Getter para propiedad modificado.
     *
     * @return Valor de la propiedad modificado.
     */
    public boolean isModificado() {
        return modificado;
    }

    /**
     * Setter para propiedad modificado.
     *
     * @param modificado Nuevo valor de la propiedad modificado.
     */
    public void setModificado(boolean modificado) {
        this.modificado = modificado;
        this.fechaHoraModificacion = modificado ? System.currentTimeMillis() : -1;
    }

    /**
     * Conserva el valor de la propiedad fechaHoraModificacion.
     */
    private long fechaHoraModificacion;

    long getFechaHoraModificacion() {
        return fechaHoraModificacion;
    }

    /**
     * Getter para propiedad name.
     *
     * @return Valor de la propiedad name.
     */
    @Override
    public String getName() {
        return getCodigoUsuario();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (obj instanceof UsuarioAutenticado) {
            UsuarioAutenticado that = (UsuarioAutenticado) obj;
            if (this.getName().equals(that.getName())) {
                return true;
            }
        }
        return false;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return getCodigoUsuario() + "(" + getNombreUsuario() + ")";
    }

    final void setCredencialesUsuario() {
        Bitacora.trace(getClass(), "setCredencialesUsuario", getCodigoUsuario());
        track(false);
        clear();
        UsuarioBase usuario = findUsuario(getCodigoUsuario());
        if (usuario == null) {
            TLC.getBitacora().warn(CBM.USUARIO_NO_EXISTE, getCodigoUsuario());
            usuario = findUsuario(USUARIO_OPERADOR);
        }
        if (usuario == null) {
            TLC.getBitacora().warn(CBM.USUARIO_NO_EXISTE, USUARIO_OPERADOR);
        } else {
            setIdUsuario(usuario.getIdUsuario());
            setNombreUsuario(usuario.getNombreUsuario());
            if (isUserInRoleSuperGestor() || isUserInRoleSuperLector() || isUserInRoleOperador()) {
                setFuncionesAutorizadas(usuario);
            }
            setLimiteArchivoDetalle(usuario.getLimiteArchivoDetalle());
            setLimiteArchivoResumen(usuario.getLimiteArchivoResumen());
            setLimiteInformeDetalle(usuario.getLimiteInformeDetalle());
            setLimiteInformeResumen(usuario.getLimiteInformeResumen());
            setLimiteInformeGrafico(usuario.getLimiteInformeGrafico());
        }
        track(true);
    }

    private void setFuncionesAutorizadas(UsuarioBase usuario) {
        Long id;
        boolean esPublica;
        boolean esProgramatica;
        boolean esProtegida;
        boolean esPersonalizable;
        boolean esSegmentable;
        boolean esLectura;
        boolean esLecturaAutorizada;
        boolean esAutorizada;
        boolean esAccesoPersonalizado;
        AutorizacionFuncion autorizacion;
        Collection<? extends FuncionBase> funciones;
        Collection<? extends RolBase> roles;
        Collection<? extends ConjuntoSegmentoBase> conjuntos;
        Collection<? extends RolUsuarioBase> rolesPorUsuario;
        Collection<? extends RolFuncionBase> funcionesPorRol;
        FuncionAutorizada funcionAutorizada;
        funcionesAutorizadas.clear();
        parametrosAutorizados.clear();
        segmentosAutorizados.clear();
        if (isUserInRoleSuperGestor()) {
            return;
        }
        funciones = Controlador.getFunciones();
        if (funciones == null || funciones.isEmpty()) {
            return;
        }
        boolean dynrbac = EA.isDynamicAccess();
        //      roles = dynrbac ? null : EJBL.getRolFacade().findAll(true);
        roles = findRoles();
        conjuntos = findConjuntos();
        Bitacora.trace(EAC.RBAC + "=" + dynrbac);
        Bitacora.trace("roles=" + (roles == null ? null : roles.size()));
        Bitacora.trace("conjuntos=" + (conjuntos == null ? null : conjuntos.size()));
        Bitacora.trace("funciones=" + funciones.size());
        for (FuncionBase f : funciones) {
            id = f.getIdFuncion();
            esPublica = BitUtils.valueOf(f.getEsPublica());
            esProgramatica = BitUtils.valueOf(f.getEsProgramatica());
            esProtegida = BitUtils.valueOf(f.getEsProtegida());
            esPersonalizable = BitUtils.valueOf(f.getEsPersonalizable());
            esSegmentable = BitUtils.valueOf(f.getEsSegmentable());
            esLectura = esFuncionLectura(f);
            esAutorizada = false;
            esLecturaAutorizada = esLectura && isUserInRoleSuperLector();
            esAccesoPersonalizado = esPersonalizable;
            if (dynrbac) {
                rolesPorUsuario = usuario.getRolUsuarioByIdUsuarioCollection();
                if (rolesPorUsuario != null && !rolesPorUsuario.isEmpty()) {
                    for (RolUsuarioBase ru : rolesPorUsuario) {
                        RolBase r = findRol(ru.getIdRol().getIdRol(), roles);
                        funcionesPorRol = r == null ? null : r.getRolFuncionByIdRolCollection();
                        if (funcionesPorRol != null && !funcionesPorRol.isEmpty()) {
                            autorizacion = getAutorizacionFuncion(id, esPersonalizable, esSegmentable,
                                    funcionesPorRol, conjuntos);
                            switch (autorizacion) {
                            case AUTORIZADA:
                                esAutorizada = true;
                                esAccesoPersonalizado = false; /* permite acceso a recursos de otros usuarios */
                                break;
                            case ACCESO_PERSONALIZADO:
                                esAutorizada = true;
                                break;
                            case NO_AUTORIZADA:
                            default:
                                break;
                            }
                        }
                    }
                }
            } else if (roles != null && !roles.isEmpty()) {
                for (RolBase rol : roles) {
                    funcionesPorRol = isUserInRole(rol.getCodigoRol()) ? rol.getRolFuncionByIdRolCollection()
                            : null;
                    if (funcionesPorRol != null && !funcionesPorRol.isEmpty()) {
                        autorizacion = getAutorizacionFuncion(id, esPersonalizable, esSegmentable, funcionesPorRol,
                                conjuntos);
                        switch (autorizacion) {
                        case AUTORIZADA:
                            esAutorizada = true;
                            esAccesoPersonalizado = false; /* permite acceso a recursos de otros usuarios */
                            break;
                        case ACCESO_PERSONALIZADO:
                            esAutorizada = true;
                            break;
                        case NO_AUTORIZADA:
                        default:
                            break;
                        }
                    }
                }
            }
            if (esPublica || esProgramatica || esLecturaAutorizada || (esAccesoPersonalizado && !esProtegida)
                    || esAutorizada) {
                funcionAutorizada = new FuncionAutorizada();
                funcionAutorizada.setFuncion(id);
                funcionAutorizada.setPublica(esPublica);
                funcionAutorizada.setProgramatica(esProgramatica);
                funcionAutorizada.setProtegida(esProtegida);
                funcionAutorizada.setPersonalizable(esPersonalizable);
                funcionAutorizada.setSegmentable(esSegmentable);
                funcionAutorizada.setLectura(esLectura);
                funcionAutorizada.setAutorizada(esAutorizada);
                funcionAutorizada.setLecturaAutorizada(esLecturaAutorizada);
                funcionAutorizada.setAccesoPersonalizado(esAccesoPersonalizado);
                funcionesAutorizadas.add(funcionAutorizada);
            }
        }
    }

    private boolean esFuncionLectura(FuncionBase f) {
        int i = f.getNumeroTipoFuncion().getNumeroTipoFuncion();
        TipoFuncionEnumeration e = TipoFuncionEnumeration.valueOf(i);
        return TipoFuncionEnumeration.CONSULTA.equals(e) || TipoFuncionEnumeration.INFORME.equals(e)
                || TipoFuncionEnumeration.ARCHIVO.equals(e);
    }

    private AutorizacionFuncion getAutorizacionFuncion(Long id, boolean esPersonalizable, boolean esSegmentable,
            Collection<? extends RolFuncionBase> funcionesPorRol,
            Collection<? extends ConjuntoSegmentoBase> conjuntos) {
        Collection<? extends ElementoSegmentoBase> segmentos;
        for (RolFuncionBase rf : funcionesPorRol) {
            if (id.equals(rf.getIdFuncion().getIdFuncion())) {
                for (RolFuncionParBase rfp : rf.getRolFuncionParByIdRolFuncionCollection()) {
                    addParametro(id, rfp.getIdFuncionParametro().getIdFuncionParametro());
                }
                if (esSegmentable) {
                    if (rf.getIdConjuntoSegmento() == null) {
                        addSegmento(id, null);
                    } else {
                        ConjuntoSegmentoBase c = findConjunto(rf.getIdConjuntoSegmento().getIdConjuntoSegmento(),
                                conjuntos);
                        segmentos = c == null ? null : c.getElementoSegmentoByIdConjuntoSegmentoCollection();
                        if (segmentos != null && !segmentos.isEmpty()) {
                            for (ElementoSegmentoBase es : segmentos) {
                                addSegmento(id, es.getSegmentoEnteroGrande());
                            }
                        }
                    }
                }
                return esPersonalizable && BitUtils.valueOf(rf.getEsAccesoPersonalizado())
                        ? AutorizacionFuncion.ACCESO_PERSONALIZADO
                        : AutorizacionFuncion.AUTORIZADA;
            }
        }
        return AutorizacionFuncion.NO_AUTORIZADA;
    }

    private void addParametro(Long idFuncion, Long idParametro) {
        ParametroAutorizado parametroAutorizado = new ParametroAutorizado();
        parametroAutorizado.setFuncion(idFuncion);
        parametroAutorizado.setParametro(idParametro);
        if (parametrosAutorizados.contains(parametroAutorizado)) {
        } else {
            parametrosAutorizados.add(parametroAutorizado);
        }
    }

    private void addSegmento(Long idFuncion, Long idSegmento) {
        SegmentoAutorizado segmentoAutorizado = new SegmentoAutorizado();
        segmentoAutorizado.setFuncion(idFuncion);
        segmentoAutorizado.setSegmento(idSegmento);
        if (segmentosAutorizados.contains(segmentoAutorizado)) {
        } else {
            segmentosAutorizados.add(segmentoAutorizado);
        }
    }

    private UsuarioBase findUsuario(String codigo) {
        //      String query = "select a from Usuario as a "
        //          + "left join fetch a.rolUsuarioByIdUsuarioCollection "
        //          + "where a.codigoUsuario = '" + codigo + "'";
        //      /**/
        //      Bitacora.trace("findUsuario JPQL Query = " + query);
        //      List<? extends UsuarioBase> list = EJBL.getUsuarioFacade().findByQuery(query, true);
        //      UsuarioBase element = list == null || list.isEmpty() ? null : list.get(0);
        //      return element;
        return EJBL.getUsuarioFacade().findByCodigo(codigo, true);
    }

    private List<? extends RolBase> findRoles() {
        //      String query = "select a from Rol as a "
        //          + "left join fetch a.rolFuncionByIdRolCollection as b "
        //          + "left join fetch b.rolFuncionParByIdRolFuncionCollection "
        //          + "order by a.idRol";
        //      /**/
        //      Bitacora.trace("findRoles JPQL Query = " + query);
        //      List<? extends RolBase> list = EJBL.getRolFacade().findByQuery(query, true);
        //      return list;
        return EJBL.getRolFacade().findAll(true);
    }

    private RolBase findRol(Long id, Collection<? extends RolBase> roles) {
        if (roles != null && !roles.isEmpty()) {
            for (RolBase element : roles) {
                if (id.equals(element.getIdRol())) {
                    return element;
                }
            }
        }
        Bitacora.trace("*** rol " + id + " not found ***");
        return null;
    }

    private List<? extends ConjuntoSegmentoBase> findConjuntos() {
        //      String query = "select a from ConjuntoSegmento as a "
        //          + "join fetch a.elementoSegmentoByIdConjuntoSegmentoCollection "
        //          + "order by a.idConjuntoSegmento";
        //      /**/
        //      Bitacora.trace("findConjuntos JPQL Query = " + query);
        //      List<? extends ConjuntoSegmentoBase> list = EJBL.getConjuntoSegmentoFacade().findByQuery(query, true);
        //      return list;
        return EJBL.getConjuntoSegmentoFacade().findAll(true);
    }

    private ConjuntoSegmentoBase findConjunto(Long id, Collection<? extends ConjuntoSegmentoBase> conjuntos) {
        if (conjuntos != null && !conjuntos.isEmpty()) {
            for (ConjuntoSegmentoBase element : conjuntos) {
                if (id.equals(element.getIdConjuntoSegmento())) {
                    return element;
                }
            }
        }
        Bitacora.trace("*** conjunto " + id + " not found ***");
        return null;
    }

    private void track(boolean b) {
        Bitacora.trace("idUsuario=" + getIdUsuario());
        Bitacora.trace("codigoUsuario=" + getCodigoUsuario());
        Bitacora.trace("nombreUsuario=" + getNombreUsuario());
        Bitacora.trace("SuperGestor=" + isUserInRoleSuperGestor());
        Bitacora.trace("SuperLector=" + isUserInRoleSuperLector());
        Bitacora.trace("Operador=" + isUserInRoleOperador());
        Bitacora.trace("funcionesAutorizadas=" + funcionesAutorizadas.size());
        Bitacora.trace("parametrosAutorizados=" + parametrosAutorizados.size());
        Bitacora.trace("segmentosAutorizados=" + segmentosAutorizados.size());
        Bitacora.trace("modificado=" + modificado);
        Bitacora.trace("fechaHoraModificacion=" + fechaHoraModificacion);
        Bitacora.trace("fechaHoraModificacion<fechaHoraInicioSesion="
                + (fechaHoraModificacion < getSessionCreationTime()));
        if (b) {
            List<? extends RolBase> roles;
            roles = EJBL.getRolFacade().findAll();
            if (roles != null && !roles.isEmpty()) {
                for (RolBase rol : roles) {
                    Bitacora.trace(rol.getCodigoRol() + "," + isUserInRole(rol.getCodigoRol()));
                }
            }
            for (FuncionAutorizada f : funcionesAutorizadas) {
                Bitacora.trace(f.toString());
            }
            for (ParametroAutorizado p : parametrosAutorizados) {
                Bitacora.trace(p.toString());
            }
            for (SegmentoAutorizado s : segmentosAutorizados) {
                Bitacora.trace(s.toString());
            }
        }
    }

}