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

Java tutorial

Introduction

Here is the source code for ips1ap101.lib.core.control.Controlador.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.beans.Beans;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.faces.context.FacesContext;
import ips1ap101.lib.base.constant.CBM;
import ips1ap101.lib.base.entity.enumeration.OperadorComEnumeration;
import ips1ap101.lib.base.interfaces.Accesible;
import ips1ap101.lib.base.interfaces.RecursoPersonalizable;
import ips1ap101.lib.base.interfaces.RecursoSegmentable;
import ips1ap101.lib.base.persistence.entity.FuncionBase;
import ips1ap101.lib.base.persistence.entity.FuncionParametroBase;
import ips1ap101.lib.base.util.BitUtils;
import ips1ap101.lib.base.util.ThrowableUtils;
import ips1ap101.lib.core.app.Bitacora;
import ips1ap101.lib.core.app.ExcepcionAplicacion;
import ips1ap101.lib.core.app.FiltroBusqueda;
import ips1ap101.lib.core.app.TLC;
import ips1ap101.lib.core.db.util.DB;
import ips1ap101.lib.core.jms.message.AbstractMessage;
import ips1ap101.lib.core.web.app.EJBL;
import org.apache.commons.lang.StringUtils;

/**
 * @author Jorge Campins
 */
public class Controlador implements Serializable {

    static {
        init();
    }

    private static void init() {
        Bitacora.stamp(Controlador.class.getSimpleName());
        if (Beans.isDesignTime()) {
            Bitacora.trace("Beans.isDesignTime");
        } else if (FacesContext.getCurrentInstance() == null) {
            Bitacora.trace("FacesContext.getCurrentInstance is null");
        } else {
            getFunciones();
        }
        Bitacora.trace(Controlador.class, "init", "funciones=" + (_funciones == null ? "?" : _funciones.size()));
    }

    private static List<? extends FuncionBase> _funciones;

    static List<? extends FuncionBase> getFunciones() {
        if (_funciones == null) {
            try {
                _funciones = findFunciones();
            } catch (Throwable throwable) {
                Bitacora.logError(ThrowableUtils.getString(throwable));
            }
        }
        return _funciones;
    }

    private static List<? extends FuncionBase> findFunciones() {
        //      String query = "select a from Funcion as a "
        //          + "left join fetch a.funcionParametroByIdFuncionCollection "
        //          + "order by a.idFuncion";
        //      /**/
        //      Bitacora.trace("getFunciones JPQL Query = " + query);
        //      return EJBL.getFuncionFacade().findByQuery(query, true);
        return EJBL.getFuncionFacade().findAll(true);
    }

    static FuncionBase getFuncion(Long id) {
        if (id == null) {
            return null;
        }
        List<? extends FuncionBase> funciones = getFunciones();
        if (funciones == null || funciones.isEmpty()) {
            return null;
        }
        for (FuncionBase funcion : funciones) {
            if (id.equals(funcion.getIdFuncion())) {
                return funcion;
            }
        }
        return null;
    }

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

    /**
     * Crea una instancia de Controlador
     */
    public Controlador() {
        stamp();
    }

    /**
     * Getter para propiedad superUsuario.
     *
     * @return True, si el usuario ejecutante es un "super-usuario".
     */
    public boolean esSuperUsuario() {
        return UsuarioAutenticado.isUserInRoleSuperGestor();
    }

    /**
     * Getter para propiedad funcionAutorizada.
     *
     * @param funcion Identificacion de la funcion.
     * @return true, si el usuario ejecutante esta autorizado para ejecutar la funcion.
     */
    public boolean esFuncionAutorizada(long funcion) {
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        if (this.esSuperUsuario()) {
            return true;
        }
        for (FuncionAutorizada funcionAutorizada : usuarioAutenticado.getFuncionesAutorizadas()) {
            if (funcionAutorizada.getFuncion() == funcion) {
                return true;
            }
        }
        Bitacora.trace(CBM.FUNCION_NO_AUTORIZADA, funcion);
        return false;
    }

    /**
     * Getter para propiedad funcionConParametrosRestringidos
     *
     * @param funcion Identificacion de la funcion.
     * @return true, si la funcion tiene al menos un parametro de acceso restringido.
     */
    public boolean esFuncionConParametrosRestringidos(long funcion) {
        if (this.esSuperUsuario()) {
            return false;
        }
        FuncionBase fb = getFuncion(funcion);
        if (fb == null) {
            return false;
        }
        Collection<? extends FuncionParametroBase> parametros = fb.getFuncionParametroByIdFuncionCollection();
        if (parametros == null || parametros.isEmpty()) {
            return false;
        }
        for (FuncionParametroBase fpb : parametros) {
            if (BitUtils.valueOf(fpb.getAccesoRestringido())) {
                return true;
            }
        }
        return false;
    }

    public boolean esParametroAutorizado(String parametro, long funcion) {
        if (StringUtils.isBlank(parametro)) {
            return false;
        }
        if (this.esSuperUsuario()) {
            return true;
        }
        FuncionBase fb = getFuncion(funcion);
        if (fb == null) {
            return true;
        }
        Collection<? extends FuncionParametroBase> parametros = fb.getFuncionParametroByIdFuncionCollection();
        if (parametros == null || parametros.isEmpty()) {
            return true;
        }
        Long ID = null;
        String codigo = fb.getCodigoFuncion() + "." + parametro;
        for (FuncionParametroBase fpb : parametros) {
            if (codigo.equals(fpb.getCodigoFuncionParametro())) {
                if (BitUtils.valueOf(fpb.getAccesoRestringido())) {
                    ID = fpb.getIdFuncionParametro();
                }
                break;
            }
        }
        if (ID == null) {
            return true;
        }
        long id = ID;
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        Set<ParametroAutorizado> parametrosAutorizados = usuarioAutenticado.getParametrosAutorizados();
        for (ParametroAutorizado parametroAutorizado : parametrosAutorizados) {
            if (funcion == parametroAutorizado.getFuncion() && id == parametroAutorizado.getParametro()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Getter para propiedad entidadAutorizada.
     *
     * @param entidad entity bean.
     * @param funcion Identificacion de la funcion.
     * @return true, si el usuario ejecutante esta autorizado para ejecutar la funcion sobre la entidad
     */
    public boolean esEntidadAutorizada(Accesible entidad, long funcion) {
        if (TLC.getControlador().esPropietarioRecurso(entidad, funcion)) {
            if (segmentoIgualPropietario(entidad) || TLC.getControlador().esSegmentoAutorizado(entidad, funcion)) {
                return true;
            } else {
                TLC.getBitacora().error(CBM.SEGMENTO_NO_AUTORIZADO);
            }
        } else {
            TLC.getBitacora().error(CBM.USUARIO_NO_PROPIETARIO);
        }
        return false;
    }

    private boolean segmentoIgualPropietario(Accesible entidad) {
        if (entidad instanceof RecursoPersonalizable && entidad instanceof RecursoSegmentable) {
            RecursoPersonalizable recursoPersonalizable = (RecursoPersonalizable) entidad;
            RecursoSegmentable recursoSegmentable = (RecursoSegmentable) entidad;
            String cpr = recursoPersonalizable.getColumnaPropietarioRecurso();
            String csr = recursoSegmentable.getColumnaSegmentoRecurso();
            return cpr != null && csr != null && cpr.equals(csr);
        }
        return false;
    }

    /**
     * Getter para propiedad segmentoAutorizado.
     *
     * @param entidad entity bean.
     * @param funcion Identificacion de la funcion.
     * @return true, si el usuario ejecutante esta autorizado para ejecutar la funcion sobre los recursos del segmento o si el segmento es nulo.
     */
    public boolean esSegmentoAutorizado(Accesible entidad, long funcion) {
        if (entidad instanceof RecursoSegmentable) {
            RecursoSegmentable recurso = (RecursoSegmentable) entidad;
            return esSegmentoAutorizado(recurso.getSegmentoRecurso(), funcion);
        }
        return true;
    }

    /**
     * Getter para propiedad segmentoAutorizado.
     *
     * @param segmento Identificacion del segmento de recursos.
     * @param funcion Identificacion de la funcion.
     * @return true, si el usuario ejecutante esta autorizado para ejecutar la funcion sobre los recursos del segmento o si el segmento es nulo.
     */
    public boolean esSegmentoAutorizado(Long segmento, long funcion) {
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        if (segmento == null || this.esSuperUsuario()) {
            return true;
        }
        for (FuncionAutorizada funcionAutorizada : usuarioAutenticado.getFuncionesAutorizadas()) {
            if (funcionAutorizada.getFuncion() == funcion) {
                if (funcionAutorizada.isSegmentable()) {
                    for (SegmentoAutorizado segmentoAutorizado : usuarioAutenticado.getSegmentosAutorizados()) {
                        if (segmentoAutorizado.getFuncion() == funcion) {
                            if (segmentoAutorizado.getSegmento() == null
                                    || segmentoAutorizado.getSegmento().equals(segmento)) {
                                return true;
                            }
                        }
                    }
                } else {
                    return true;
                }
                break;
            }
        }
        Bitacora.trace(CBM.SEGMENTO_NO_AUTORIZADO, segmento, funcion);
        return false;
    }

    /**
     * Getter para propiedad referenciaAutorizada.
     *
     * @param recurso Identificacion del recurso.
     * @param funcion Identificacion de la funcion.
     * @param strings Vector de nombres: [0] Tabla, [1] Columna Identificacion, [2] Columna Propietario, [3] Columna Segmento.
     * @return true, si el usuario ejecutante esta autorizado para ejecutar la funcion sobre el recurso o si el recurso es nulo.
     */
    public boolean esReferenciaAutorizada(Object recurso, long funcion, String[] strings) {
        if (recurso == null || this.esSuperUsuario()) {
            return true;
        }
        String comando = this.getComandoSelectReferencia(recurso, funcion, strings);
        Bitacora.trace("comando" + "=" + comando);
        if (comando == null) {
            return false;
        }
        boolean es = false;
        String sql1 = comando;
        Object resultado1;
        ResultSet resultSet1 = null;
        Object objeto1;
        if (TLC.getAgenteSql().connected()) {
            try {
                resultado1 = TLC.getAgenteSql().executeQuery(sql1);
                if (resultado1 instanceof ResultSet) {
                    resultSet1 = (ResultSet) resultado1;
                    if (resultSet1.next()) {
                        objeto1 = resultSet1.getObject(1);
                        if (objeto1 != null) {
                            es = true;
                        } else {
                            /* TODO: error handling */
                        }
                    } else {
                        /* TODO: error handling */
                    }
                } else {
                    /* TODO: error handling */
                }
            } catch (SQLException e) {
                TLC.getBitacora().fatal(e);
            } finally {
                DB.close(resultSet1);
            }
        } else {
            /* TODO: error handling */
        }
        return es;
    }

    private String getComandoSelectReferencia(Object recurso, long funcion, String[] strings) {
        if (recurso == null || strings == null || StringUtils.isBlank(strings[0])
                || StringUtils.isBlank(strings[1])) {
            return null;
        }
        FiltroBusqueda filtro = new FiltroBusqueda();
        filtro.addCriterio(strings[1], OperadorComEnumeration.ES_IGUAL, recurso);
        if (!StringUtils.isBlank(strings[2])) {
            Long propietario = this.getPropietarioAutorizado(funcion);
            if (propietario != null) {
                filtro.addCriterio(strings[2], OperadorComEnumeration.ES_NULO_O_ES_IGUAL, propietario);
            }
        }
        if (!StringUtils.isBlank(strings[3])) {
            String segmentos = this.getSegmentosAutorizados(funcion);
            if (segmentos != null) {
                filtro.addCriterio(strings[3], OperadorComEnumeration.ES_NULO_O_ESTA_ENTRE, segmentos);
            }
        }
        String comando = "SELECT 1 FROM " + strings[0] + " WHERE ";
        String criterios = filtro.toString();
        if (StringUtils.isBlank(criterios)) {
            comando += "(0=1)";
        } else {
            comando += "(" + criterios + ")";
        }
        return comando;
    }

    /**
     * Getter para propiedad propietarioRecurso.
     *
     * @param entidad entity bean.
     * @return true, si la Identificacion del usuario ejecutante coincide con la del propietario del recurso o si el propietario es nulo.
     */
    public boolean esPropietarioRecurso(Accesible entidad, long funcion) {
        if (entidad instanceof RecursoPersonalizable) {
            RecursoPersonalizable recurso = (RecursoPersonalizable) entidad;
            return esPropietarioRecurso(recurso.getPropietarioRecurso(), funcion);
        }
        return true;
    }

    /**
     * Getter para propiedad propietarioRecurso.
     *
     * @param usuario Identificacion del propietario del recurso.
     * @return true, si la Identificacion del usuario ejecutante coincide con la del propietario del recurso o si el propietario es nulo.
     */
    public boolean esPropietarioRecurso(Long usuario, long funcion) {
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        if (usuario == null || this.esSuperUsuario() || usuarioAutenticado.getIdUsuario().equals(usuario)) {
            return true;
        }
        for (FuncionAutorizada funcionAutorizada : usuarioAutenticado.getFuncionesAutorizadas()) {
            if (funcionAutorizada.getFuncion() == funcion) {
                if (funcionAutorizada.isPersonalizable() && funcionAutorizada.isAccesoPersonalizado()) {
                    continue;
                }
                return true;
            }
        }
        Bitacora.trace(CBM.USUARIO_NO_PROPIETARIO, usuario);
        return false;
    }

    /**
     * Getter para propiedad segmentosAutorizados. Obtiene la lista de segmentos que el usuario ejecutante puede utilizar con una funcion.
     *
     * @param funcion Identificacion de la funcion.
     * @return Valor de la propiedad segmentosAutorizados, con los segmentos separados por una coma. Si el usuario ejecutante es un "super-usuario",
     * entonces retorna nulo.
     */
    public String getSegmentosAutorizados(long funcion) {
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        if (this.esSuperUsuario()) {
            return null;
        }
        String segmentosAutorizados = StringUtils.EMPTY;
        for (SegmentoAutorizado segmentoAutorizado : usuarioAutenticado.getSegmentosAutorizados()) {
            if (segmentoAutorizado.getFuncion() == funcion) {
                if (segmentoAutorizado.getSegmento() == null) {
                    return null; /* esta autorizado a todos los segmentos */
                }
                segmentosAutorizados += ", " + segmentoAutorizado.getSegmento().toString();
            }
        }
        return StringUtils.isBlank(segmentosAutorizados) ? null : segmentosAutorizados.substring(2);
    }

    /**
     * Getter para propiedad propietarioAutorizado. Obtiene la Identificacion del usuario ejecutante.
     *
     * @return Valor de la propiedad propietarioAutorizado. Si el usuario ejecutante es un "super-usuario", entonces retorna nulo.
     */
    public Long getPropietarioAutorizado(long funcion) {
        UsuarioAutenticado usuarioAutenticado = UsuarioAutenticadoCachingServiceLocator.getInstance();
        if (this.esSuperUsuario() || usuarioAutenticado == null) {
            return null;
        }
        for (FuncionAutorizada funcionAutorizada : usuarioAutenticado.getFuncionesAutorizadas()) {
            if (funcionAutorizada.getFuncion() == funcion) {
                if (funcionAutorizada.isPersonalizable() && funcionAutorizada.isAccesoPersonalizado()) {
                    continue;
                }
                return null;
            }
        }
        return usuarioAutenticado.getIdUsuario();
    }

    public Long grabarRastroFuncion(RastroFuncion rastro) {
        return Auditor.grabarRastroFuncion(rastro);
    }

    public Long ponerInformePendiente(long funcion, String informe, String formato, int limite)
            throws ExcepcionAplicacion, Exception {
        return Auditor.grabarRastroInforme(funcion, informe, formato, limite);
    }

    public Long ponerProcesoPendiente(long funcion) throws ExcepcionAplicacion, Exception {
        return Auditor.grabarRastroProceso(funcion);
    }

    //  public <M extends AbstractMessage> M ponerInformePendiente(M message) throws ExcepcionAplicacion, SQLException {
    //      return Auditor.grabarRastroInforme(message);
    //  }
    //
    public <M extends AbstractMessage> M ponerProcesoPendiente(M message) throws Exception {
        return Auditor.ponerProcesoPendiente(message);
    }

    public void grabarTareasUsuario(SeudoTareaUsuario seudo) {
        grabarTareasUsuario(seudo.getDominio(), seudo.getComando(), seudo.getIdRecurso());
    }

    private void grabarTareasUsuario(String dominio, String comando, Object id) {
        Object pk = id instanceof Long || id instanceof Integer ? id : null;
        if (StringUtils.isBlank(dominio) || StringUtils.isBlank(comando) || pk == null) {
            String metodo = Bitacora.getTextoMetodo(Controlador.class, "grabarTareasUsuario", dominio, comando, pk);
            Bitacora.logWarn("IllegalArgumentException @ " + metodo);
        } else {
            grabarTareasUsuario(dominio, comando, new Object[] { id });
        }
    }
    //
    //  public static void grabarTareasUsuario(String entidad, String operacion, AbstractMessage message) {
    //      Long rastro = message == null ? null : message.getRastro();
    //      if (StringUtils.isBlank(entidad) || StringUtils.isBlank(operacion) || rastro == null) {
    //          String metodo = Bitacora.getTextoMetodo(Controlador.class, "grabarTareasUsuario", entidad, operacion, rastro);
    //          Bitacora.logWarn("IllegalArgumentException @ " + metodo);
    //      } else if (message.isGrabarTareasUsuarioPendiente()) {
    //          message.setGrabarTareasUsuarioPendiente(false);
    //          grabarTareasUsuario(entidad, operacion, new Object[]{rastro});
    //      }
    //  }
    //
    //  public static void grabarTareasUsuario(String entidad, String operacion, AbstractMessage message, Object id) {
    //      Long rastro = message == null ? null : message.getRastro();
    //      Object pk = id instanceof Long || id instanceof Integer ? id : null;
    //      if (StringUtils.isBlank(entidad) || StringUtils.isBlank(operacion) || rastro == null || pk == null) {
    //          String metodo = Bitacora.getTextoMetodo(Controlador.class, "grabarTareasUsuario", entidad, operacion, rastro, pk);
    //          Bitacora.logWarn("IllegalArgumentException @ " + metodo);
    //      } else if (message.isGrabarTareasUsuarioPendiente()) {
    //          message.setGrabarTareasUsuarioPendiente(false);
    //          grabarTareasUsuario(entidad, operacion, new Object[]{rastro, id});
    //      }
    //  }

    private static void grabarTareasUsuario(String entidad, String operacion, Object[] argumentos) {
        if (TLC.getAgenteSql().connected()) {
            try {
                String procedimiento = entidad + DB.DOLLAR + operacion + DB.DOLLAR + DB.JOB;
                if (TLC.getAgenteSql().isStoredProcedure(procedimiento)) {
                    TLC.getAgenteSql().executeProcedure(procedimiento, argumentos);
                }
            } catch (SQLException ex) {
                TLC.getBitacora().error(ex);
            }
        }
    }

    public void close() {
        Bitacora.trace(this.getClass(), "close");
    }

}