/** * @(#) PersistenciaUsuario.java */ package com.tarisan.control; import com.tarisan.data.Tamedico; import com.tarisan.data.Usuario; import com.tarisan.excepcion.*; import com.tarisan.log.*; import com.tarisan.util.Utilidades; import java.sql.*; import java.util.Calendar; import java.util.Vector; /** * Controla los accesos a la persistencia para la entidad Usuario. * @author Dpto. Informática. * @version 1.0, 24/09/2003 */ public class PersistenciaUsuario implements Constantes { /** * El objeto Paginacion que controla el número de filas a mostrar por cada página. */ private Paginacion objPaginacion = new Paginacion(); /** * Obtiene el valor del objeto Paginacion para saber que página se está visualizando. * @return El objeto Paginacion */ public Paginacion getPaginacion() { return objPaginacion; } /** * Selecciona el primer registro de la tabla TAMEDICO encontrado para el usuario conectado a la aplicación Tarisan. *
Retorna uno de los siguientes objetos: * @param codigo El código de usuario introducido en la página de conexión. * @param clave La clave de usuario introducida en la página de conexión. * @return El objeto resultante del proceso de validación. * @throws */ public Object seleccionar(int codigo, String clave) throws ExcepcionTarisan { Object retorno = null; Usuario usuario = null; StringBuffer sqlSelect = new StringBuffer(); Connection conexion = null; try { sqlSelect.append("SELECT MEDICO"); sqlSelect.append(", NOMBRE"); sqlSelect.append(", APELLIDOS"); sqlSelect.append(", ESPECIALIDAD"); sqlSelect.append(", TARIFA"); sqlSelect.append(", NOMBRE_CAB"); sqlSelect.append(", DIRECCION_CAB"); sqlSelect.append(", POBLACION_CAB"); sqlSelect.append(", TELEFONO_CAB"); sqlSelect.append(", EMAIL_CAB"); sqlSelect.append(", COLEGIADO_CAB"); sqlSelect.append(", ESPECIALIDAD_CAB"); sqlSelect.append(", BLOQUEO_CLAVE"); sqlSelect.append(", FECHA_ULT_ACCESO"); sqlSelect.append(", FECHA_MODIF_CLAVE"); sqlSelect.append(", PASSWORD"); sqlSelect.append(" FROM TAMEDICO"); sqlSelect.append(" WHERE MEDICO = ?"); conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); Object aCondiciones[] = new Object[1]; aCondiciones[0] = Integer.valueOf(codigo); String bloqueo = ""; Timestamp fecModifClave = null; String password = ""; Calendar calHoy = null; Calendar calInactividad = null; Calendar calCaducidad = null; Calendar calPreaviso = null; ResultSet rs = ParametrosConfiguracion.dataStore.seleccionar(conexion, sqlSelect.toString(), aCondiciones); while(rs.next()) { String nombre = ""; if (rs.getString("NOMBRE") != null){ nombre = rs.getString("NOMBRE") + " "; } String ape = ""; if (rs.getString("APELLIDOS") != null){ ape = rs.getString("APELLIDOS"); } String nombreCab = ""; if (rs.getString("NOMBRE_CAB") != null){ nombreCab = rs.getString("NOMBRE_CAB"); } usuario = new Usuario(); usuario.setMedico(rs.getInt("MEDICO")); usuario.setNombre(nombre + ape); usuario.setEspecialidad(rs.getInt("ESPECIALIDAD")); usuario.setTarifa(rs.getInt("TARIFA")); usuario.setNombreCab(nombreCab); usuario.setDireccionCab(rs.getString("DIRECCION_CAB")); usuario.setPoblacionCab(rs.getString("POBLACION_CAB")); usuario.setTelefonoCab(rs.getString("TELEFONO_CAB")); usuario.setEmailCab(rs.getString("EMAIL_CAB")); usuario.setColegiadoCab(rs.getString("COLEGIADO_CAB")); usuario.setEspecialidadCab(rs.getString("ESPECIALIDAD_CAB")); usuario.setFechaUltAcceso(rs.getTimestamp("FECHA_ULT_ACCESO")); bloqueo = rs.getString("BLOQUEO_CLAVE"); fecModifClave = rs.getTimestamp("FECHA_MODIF_CLAVE"); password = rs.getString("PASSWORD"); } rs.close(); //Primero: se calculan las fechas para su tratamiento posterior calHoy = Calendar.getInstance(); if (usuario != null) { if(usuario.getFechaUltAcceso() != null) { //Cálculo de la fecha de fin de actividad de la clave calInactividad = Calendar.getInstance(); calInactividad.setTime((java.util.Date)usuario.getFechaUltAcceso()); calInactividad.add(Calendar.DATE, ParametrosConfiguracion.diasActividad); } if(fecModifClave != null) { //Cálculo de la fecha de caducidad de la clave calCaducidad = Calendar.getInstance(); calCaducidad.setTime((java.util.Date)fecModifClave); calCaducidad.add(Calendar.DATE, ParametrosConfiguracion.diasCaducidad); //Cálculo de la fecha de preaviso de caducidad de la clave calPreaviso = Calendar.getInstance(); calPreaviso.setTime((java.util.Date)fecModifClave); calPreaviso.add(Calendar.DATE, ParametrosConfiguracion.diasCaducidad - ParametrosConfiguracion.diasPreaviso); } } //Segundo: se evalúa la selección del usuario realizada en la base de datos if (usuario == null) { //El usuario no se ha encontrado en la base de datos retorno = USUARIO_INEXISTENTE; } else { if(usuario.getFechaUltAcceso() == null) { //El usuario realiza el primer acceso a la aplicación if(password.compareTo(clave) != 0) { //El usuario no existe (la clave sin encriptar en la base de datos no es la misma que la escrita en el formulario de login) retorno = USUARIO_ERROR_CLAVE; } else { //El usuario existe y se le redigirá a la introducción de la nueva clave, para su encriptación retorno = usuario; } } else { if(password.compareTo(Utilidades.encripta(clave, String.valueOf(codigo))) != 0) { //El usuario no existe (la clave encriptada en la base de datos no es la misma que la escrita en el formulario de login) retorno = USUARIO_ERROR_CLAVE; } else if((bloqueo != null) && (bloqueo.trim().toUpperCase().compareTo("S") == 0)) { //El usuario está bloqueado retorno = USUARIO_BLOQUEADO; } else if((calCaducidad != null) && calCaducidad.before(calHoy)) { //El usuario se bloquea por haber excedido la fecha de caducidad this.bloquearUsuario(codigo, calHoy); retorno = USUARIO_CADUCADO; } else if((calPreaviso != null) && calPreaviso.before(calHoy) && calHoy.before(calCaducidad)) { //Se muestra mensaje al usuario de cambio de clave por proximidad de la fecha de caducidad usuario.setFechaCaducidad(new Date(calCaducidad.getTimeInMillis())); retorno = usuario; } else if((calInactividad != null) && calInactividad.before(calHoy)) { //El usuario está bloqueado por período de inactividad this.bloquearUsuario(codigo, calHoy); retorno = USUARIO_INACTIVO; } else { //El usuario introducido es correcto retorno = usuario; } } } ParametrosConfiguracion.dataStore.liberarConexion(conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Seleccionado el usuario " + usuario + " de la tabla TAMEDICO (" + sqlSelect + ")"); } catch(SQLException sqle) { usuario = null; LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de usuario: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(); } catch(Exception e) { usuario = null; LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de usuario: " + e + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(); } return retorno; } public Usuario seleccionar(int medico) throws ExcepcionTarisan { return this.seleccionar(medico, 0); } /** * Selecciona el primer registro de la tabla TAMEDICO encontrado para el usuario conectado a la aplicación Tarisan. * @param medico El código de usuario introducido en la página de conexión. * @param especialidad El código de especialidad del usuario conectado. * @return El Usuario encontrado en la tabla de médicos, * un objeto vacío Usuario si no se cumplen las condiciones de búsqueda o null si se produce alguna excepción. * @throws */ public Usuario seleccionar(int medico, int especialidad) throws ExcepcionTarisan { Usuario usuario = null; StringBuffer sqlSelect = new StringBuffer(); try { sqlSelect.append("SELECT MEDICO"); sqlSelect.append(", NOMBRE"); sqlSelect.append(", APELLIDOS"); sqlSelect.append(", ESPECIALIDAD"); sqlSelect.append(", TARIFA"); sqlSelect.append(", NOMBRE_CAB"); sqlSelect.append(", DIRECCION_CAB"); sqlSelect.append(", POBLACION_CAB"); sqlSelect.append(", TELEFONO_CAB"); sqlSelect.append(", EMAIL_CAB"); sqlSelect.append(", COLEGIADO_CAB"); sqlSelect.append(", ESPECIALIDAD_CAB"); sqlSelect.append(" FROM TAMEDICO"); sqlSelect.append(" WHERE MEDICO = ?"); if(especialidad >0) sqlSelect.append(" AND ESPECIALIDAD = ?"); Connection conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); Object aCondiciones[] = null; if(especialidad > 0) { aCondiciones = new Object[2]; aCondiciones[0] = Integer.valueOf(medico); aCondiciones[1] = Integer.valueOf(especialidad); } else { aCondiciones = new Object[1]; aCondiciones[0] = Integer.valueOf(medico); } ResultSet rs = ParametrosConfiguracion.dataStore.seleccionar(conexion, sqlSelect.toString(), aCondiciones); while(rs.next()) { usuario = new Usuario(); usuario.setMedico(rs.getInt("MEDICO")); usuario.setNombre(rs.getString("NOMBRE") + " " + rs.getString("APELLIDOS")); usuario.setEspecialidad(rs.getInt("ESPECIALIDAD")); usuario.setTarifa(rs.getInt("TARIFA")); usuario.setNombreCab(rs.getString("NOMBRE_CAB")); usuario.setDireccionCab(rs.getString("DIRECCION_CAB")); usuario.setPoblacionCab(rs.getString("POBLACION_CAB")); usuario.setTelefonoCab(rs.getString("TELEFONO_CAB")); usuario.setEmailCab(rs.getString("EMAIL_CAB")); usuario.setColegiadoCab(rs.getString("COLEGIADO_CAB")); usuario.setEspecialidadCab(rs.getString("ESPECIALIDAD_CAB")); } rs.close(); ParametrosConfiguracion.dataStore.liberarConexion(conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Seleccionado el usuario " + usuario + " de la tabla TAMEDICO (" + sqlSelect + ")"); } catch(SQLException sqle) { usuario = null; LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de usuario: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(); } return usuario; } /** * Modifica el registro correspondiente al usuario conectado marcándolo como bloqueado. *
Escribe 'S' en el campo BLOQUEO_CLAVE de la tabla TAMEDICO. * @param codigo El código de usuario que se intenta conectar. * @param fechaAcceso Fecha en la que el usuario ha realizado el acceso a la aplicación. Utilizado para introducir un nuevo registro en la tabla de seguimiento TAREGLOG. * @return El resultado de la actualización en base de datos. * @throws */ public boolean bloquearUsuario(int codigo, Calendar fechaAcceso) throws ExcepcionTarisan { boolean resultado = true; StringBuffer sqlUpdate = new StringBuffer(); sqlUpdate.append("UPDATE TAMEDICO"); sqlUpdate.append(" SET BLOQUEO_CLAVE = ?"); sqlUpdate.append(" WHERE MEDICO = ?"); try { Object[] aValores = new Object[1]; aValores[0] = "S"; Object[] aCondiciones = new Object[1]; aCondiciones[0] = Integer.valueOf(codigo); Connection conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); ParametrosConfiguracion.dataStore.iniciarTransaccion(conexion); try { //dejamos al usuario bloqueado LogTarisan.logger.log(NivelLog.DEBUG, "Llega 332: "+sqlUpdate.toString()); resultado = ParametrosConfiguracion.dataStore.actualizar(sqlUpdate.toString(), aValores, aCondiciones, conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Llega 334, ha actualizado "); ///////////////////////////////////////////////////////////////////// //insertamos un registro en la tabla tareglog para indicar los movimientos realizados por el usuario Timestamp tsFechaAcceso = new Timestamp(fechaAcceso.getTimeInMillis()); PersistenciaTareglog perTareglog = new PersistenciaTareglog(); //obtenemos el ultimo valor del campo correlativo de la tabla tareglog. //Este campo es un numero correlativo utilizado para diferenciar las claves. int intUltimoValorCorrelativo = perTareglog.obtenerUltimoValorCorrelativo(codigo, tsFechaAcceso); perTareglog.insertarLog(codigo, tsFechaAcceso, Calendar.getInstance(), intUltimoValorCorrelativo + 1, "TAMEDICO", Utilidades.obtenerSentenciaSQL(sqlUpdate, aValores, aCondiciones), "", conexion); ///////////////////////////////////////////////////////////////////// //las actualizaciones han ido bien. Confirmamos la transaccion ParametrosConfiguracion.dataStore.confirmarTransaccion(conexion); } catch (ExcepcionTarisan ex) { ParametrosConfiguracion.dataStore.deshacerTransaccion(conexion); LogTarisan.logger.log(NivelLog.ERROR, "ExcepcionTarisan: " + ex.getMensaje()); throw (ExcepcionTarisan)ex; } catch (Exception ex) { ParametrosConfiguracion.dataStore.deshacerTransaccion(conexion); LogTarisan.logger.log(NivelLog.ERROR, "Exception: " + ex.getMessage()); throw new ExcepcionTarisan(ex.getMessage()); } finally { //liberamos la conexion ParametrosConfiguracion.dataStore.liberarConexion(conexion); } } catch(ExcepcionTarisan ex) { LogTarisan.logger.log(NivelLog.ERROR, "Error en el bloqueo de usuario: " + ex + " (" + sqlUpdate + ")"); throw ex; } return true; } /** * Actualiza la fecha de último acceso a la aplicación una vez conectado con éxito. *
Escribe la fecha y hora actual en el campo FECHA_ULT_ACCESO de la tabla TAMEDICO. * @param codigo El código de usuario a modificar. * @param calHoy La fecha actual a poner como fecha de último acceso. * @return El resultado de la actualización en base de datos. * @throws */ public boolean actualizarFechaAcceso(int codigo, Calendar calHoy) throws ExcepcionTarisan { boolean resultado = true; Connection conexion = null; StringBuffer sqlUpdate = new StringBuffer(); sqlUpdate.append("UPDATE TAMEDICO"); sqlUpdate.append(" SET FECHA_ULT_ACCESO = ?"); sqlUpdate.append(" WHERE MEDICO = ?"); try { Object[] aValores = new Object[1]; aValores[0] = new Timestamp(calHoy.getTimeInMillis()); Object[] aCondiciones = new Object[1]; aCondiciones[0] = Integer.valueOf(codigo); resultado = ParametrosConfiguracion.dataStore.actualizar(sqlUpdate.toString(), aValores, aCondiciones); } catch(ExcepcionTarisan ex) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la actualización de la fecha de acceso de usuario: " + ex + " (" + sqlUpdate + ")"); throw ex; } return true; } public Vector listado_usuarios(int pagina, String strCampoApellido) { int elementosPaginacion = 1; Vector vResultado = new Vector(); Tamedico tamedico = null; StringBuffer strSql = new StringBuffer(); strSql.append("SELECT APELLIDOS, NOMBRE, MEDICO"); strSql.append(" FROM TAMEDICO"); Object aCondiciones[] = null; //comprobamos si se trata de una busqueda por apellido if (!strCampoApellido.equalsIgnoreCase("")) //la sql tiene una condición de búsqueda { if (strCampoApellido.endsWith("*")) { strCampoApellido=strCampoApellido.replace('*', '%'); } else { strCampoApellido="%" + strCampoApellido + "%"; } aCondiciones = new Object[1]; aCondiciones[0] = strCampoApellido; strSql.append(" WHERE APELLIDOS LIKE ?"); } else { aCondiciones = new Object[0]; } strSql.append(" ORDER BY APELLIDOS, NOMBRE"); try { Connection conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); ResultSet rs = ParametrosConfiguracion.dataStore.seleccionar(conexion, strSql.toString(), aCondiciones); objPaginacion.inicializarPaginacion(rs); if (objPaginacion.getNumeroRegistrosTotales()!=0) { objPaginacion.realizarPaginacion(rs, pagina); while(rs.next() && (elementosPaginacion <= Paginacion.getFilasPorPagina())) { tamedico = new Tamedico(); tamedico.setApellidos(rs.getString("APELLIDOS")); tamedico.setMedico(rs.getInt("MEDICO")); tamedico.setNombre(rs.getString("NOMBRE")); vResultado.addElement(tamedico); if (pagina != 0) { elementosPaginacion++; } } } rs.close(); ParametrosConfiguracion.dataStore.liberarConexion(conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Seleccionados " + vResultado.size() + " registros de la tabla TAMEDICO (" + strSql.toString() + ")"); } catch (ExcepcionTarisan sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + strSql.toString() + ")"); } catch(SQLException sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + strSql.toString() + ")"); } catch(Exception sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + strSql.toString() + ")"); } return vResultado; } /** * Selecciona los registros de la tabla TAMEDICO en función de la sentencia SELECT indicada. * Retorna la lista con todos los usuarios de la aplicación. * @param sqlSelect La sentencia SELECT de selección. * @param pagina El número de página a mostrar. * @param aCondiciones El array que contiene las condiciones utilizadas en la sentencia SELECT. * @return El Vector con la lista de objetos Tamedico obtenidos. * @throws */ public Vector seleccionar(String sqlSelect, int pagina, Object[] aCondiciones) throws ExcepcionTarisan { int elementosPaginacion = 1; Vector vResultado = new Vector(); Tamedico tamedico = null; try { Connection conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); ResultSet rs = ParametrosConfiguracion.dataStore.seleccionar(conexion, sqlSelect, aCondiciones); objPaginacion.inicializarPaginacion(rs); if (objPaginacion.getNumeroRegistrosTotales()!=0) { objPaginacion.realizarPaginacion(rs, pagina); while(rs.next() && (elementosPaginacion <= Paginacion.getFilasPorPagina())) { tamedico = new Tamedico(); tamedico.setApellidos(rs.getString("APELLIDOS")); tamedico.setMedico(rs.getInt("MEDICO")); tamedico.setNombre(rs.getString("NOMBRE")); vResultado.addElement(tamedico); if (pagina != 0) { elementosPaginacion++; } } } rs.close(); ParametrosConfiguracion.dataStore.liberarConexion(conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Seleccionados " + vResultado.size() + " registros de la tabla TAMEDICO (" + sqlSelect + ")"); } catch (ExcepcionTarisan sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + sqlSelect + ")"); throw (ExcepcionTarisan)sqle; } catch(SQLException sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(sqle.getMessage()); } catch(Exception sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(sqle.getMessage()); } catch(Throwable sqle) { LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de TAMEDICO: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(sqle.getMessage()); } return vResultado; } public Object seleccionarSimulado(int codigo) throws ExcepcionTarisan { Object retorno = null; Usuario usuario = null; StringBuffer sqlSelect = new StringBuffer(); Connection conexion = null; try { sqlSelect.append("SELECT MEDICO"); sqlSelect.append(", NOMBRE"); sqlSelect.append(", APELLIDOS"); sqlSelect.append(", ESPECIALIDAD"); sqlSelect.append(", TARIFA"); sqlSelect.append(", NOMBRE_CAB"); sqlSelect.append(", DIRECCION_CAB"); sqlSelect.append(", POBLACION_CAB"); sqlSelect.append(", TELEFONO_CAB"); sqlSelect.append(", EMAIL_CAB"); sqlSelect.append(", COLEGIADO_CAB"); sqlSelect.append(", ESPECIALIDAD_CAB"); sqlSelect.append(", BLOQUEO_CLAVE"); sqlSelect.append(", FECHA_ULT_ACCESO"); sqlSelect.append(", FECHA_MODIF_CLAVE"); sqlSelect.append(", PASSWORD"); sqlSelect.append(" FROM TAMEDICO"); sqlSelect.append(" WHERE MEDICO = ?"); conexion = ParametrosConfiguracion.dataStore.obtenerConexion(); Object aCondiciones[] = new Object[1]; aCondiciones[0] = Integer.valueOf(codigo); ResultSet rs = ParametrosConfiguracion.dataStore.seleccionar(conexion, sqlSelect.toString(), aCondiciones); while(rs.next()) { String nombre = ""; if (rs.getString("NOMBRE") != null){ nombre = rs.getString("NOMBRE") + " "; } String ape = ""; if (rs.getString("APELLIDOS") != null){ ape = rs.getString("APELLIDOS"); } String nombreCab = ""; if (rs.getString("NOMBRE_CAB") != null){ nombreCab = rs.getString("NOMBRE_CAB"); } usuario = new Usuario(); usuario.setMedico(rs.getInt("MEDICO")); usuario.setNombre(nombre + ape); usuario.setEspecialidad(rs.getInt("ESPECIALIDAD")); usuario.setTarifa(rs.getInt("TARIFA")); usuario.setNombreCab(nombreCab); usuario.setDireccionCab(rs.getString("DIRECCION_CAB")); usuario.setPoblacionCab(rs.getString("POBLACION_CAB")); usuario.setTelefonoCab(rs.getString("TELEFONO_CAB")); usuario.setEmailCab(rs.getString("EMAIL_CAB")); usuario.setColegiadoCab(rs.getString("COLEGIADO_CAB")); usuario.setEspecialidadCab(rs.getString("ESPECIALIDAD_CAB")); usuario.setFechaUltAcceso(rs.getTimestamp("FECHA_ULT_ACCESO")); } rs.close(); retorno = usuario; ParametrosConfiguracion.dataStore.liberarConexion(conexion); LogTarisan.logger.log(NivelLog.DEBUG, "Seleccionado el usuario " + usuario + " de la tabla TAMEDICO (" + sqlSelect + ")"); } catch(SQLException sqle) { usuario = null; LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de usuario: " + sqle + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(); } catch(Exception e) { usuario = null; LogTarisan.logger.log(NivelLog.ERROR, "Error en la selección de usuario: " + e + " (" + sqlSelect + ")"); throw new ExcepcionTarisan(); } return retorno; } }