Java tutorial
/* * 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"); } }