Proyecto MiCasa, versión 1.
Copyright (C) 2002 Grzegorz Adam Hankiewicz
(gradha@terra.es) y
Jon López de Dicastillo
(darwater@hotmail.com).
Curso 2001-2002
Facultad de Ingeniería, Universidad de Deusto.
Este servidor de bases de datos tiene como características principales ser software libre y estar escrito en java, con lo que resulta totalmente portable y ejecutable desde cualquier plataforma capaz de ejecutar el proyecto MiCasa, permite su inclusión en cualquier software y va empaquetado en el fichero mckoidb.jar, incluido con el proyecto MiCasa.
El único requisito para que todo funcione es incluir en la ruta ClassPath de la virtual machine el directorio donde se encuentra mckoidb.jar. Para esto se incluyen dos ficheros .bat que se pueden ejecutar desde Windows, y en entornos Linux sólo hace falta ejecutar `make run_servidor' o `make run_cliente' desde el directorio base del proyecto.
Gracias a que la base de datos va integrada con el proyecto, otra de las características añadidas es que se puede borrar la base de datos (puede borrar sin problemas los directorios data y log del subdirectorio MckoiSQLDatabase que contienen toda la información), y el servidor la reconstruirá con unos datos básicos la próxima vez que se ejecute, con unas tablas con valores iniciales.
En el proyecto MiCasa únicamente se incluye la clase mckoidb.jar, lista para ser usada. Para obtener ejemplos, documentación y nuevas versiones, vaya a http://www.mckoi.com/database.
Clase | Implicación |
ServidorCasa | Esta es la clase del servidor, y se encarga de manejar la parte que debe hacer el servidor a la hora de ejecutar este comando. Este comando, solo puede usarse en el estado Esperando Nombre, y el servidor comprueba que si estando en dicho estado, recibe un string que comienza por USER, y en caso afirmativo, llama a la función que comprobara si existe el nombre, que devolverá al cliente el mensaje de bienvenida o de error, dependiendo de esta última condición. |
VentanaCliente | Esta clase implementa la interfaz gráfica con la que el usuario se va a mover y va a realizar las peticiones. A la hora de ejecutar el comando USER, el cliente deberá rellenar el campo habilitado para poner su nombre de usuario, y pulsar el botón de Aceptar, lo que provocará un evento que hará que se lance en ejecución la función Autentificar de la clase ConexionCliente. En caso de que se produzca algún error, se mostrará en pantalla. |
ConexionCliente | Esta clase se encarga de realizar las peticiones y recoger las respuestas del servidor. En el comando User, esta clase escribe la línea USER + el nombre que el usuario a puesto en la ventana anterior, y espera que la respuesta, que se la comunicara a la VentanaCliente. |
Clase | Implicación |
ServidorCasa | Este comando se ejecuta en el estado Verificar Clave, que es cuando nos ha llegado el nombre de usuario, y nos disponemos a comprobar la clave. Por lo tanto, en esta clase, comprobamos si ha llegado la password, y mediante una función hacemos una llamada a la clase BaseDatos, que actúa como interfaz entre el programa y la base de datos. Tras recibir la respuesta de esta clase, se reenviará al cliente, indicándole la validez o no de la password. |
BaseDatos | Esta clase es la interfaz que nos permite manejar la base de datos y actualizar, modificar y comprobar los datos necesarios para la ejecución del programa. A la hora de ejecutar el comando PASSWORD, buscamos la fila cuyo nombre sea igual al que hemos recibido de usuario (si no existe se manda error de usuario desconocido, esto debería formar parte del comando anterior, pero realizamos las dos comprobaciones seguidas, por lo que hemos decidido comentarlo en este apartado, siguiendo la ejecución del programa), y comprobamos si el campo password es igual al introducido por el usuario, devolviendo el resultado. |
VentanaCliente | Al igual que en el comando anterior, tras mostrar la ventana, espera a que el usuario rellene los campos necesarios y pulse el botón aceptar, que lanzará la ejecución del programa cliente, que mandará la password y esperara la respuesta, visualizando en pantalla los posibles errores o la correcta conexión. |
ConexionCliente | Este comando se lanza justo después de haber recibido la información de usuario correcto, y manda el mensaje correspondiente a la petición de password: "PASSWORD + clave introducida por el usuario", y espera la respuesta, devolviendo el valor de esta a la clase VentanaCliente. |
Clase | Implicación |
ServidorCasa | El servidor recibe la petición por parte del cliente cuando esta en el estado Esperando Petición, y manda la ejecución de la función que se encargara de hacer una petición u otra dependiendo de si hay patrón o no, esta petición la realiza a la clase BaseDatos, con lo que recibirá un vector con las viviendas correctas, por lo que tan sólo tendrá que devolverlas al cliente que ha realizado la petición. |
BaseDatos | La interfaz con la base de datos recibe la petición de listado, y tras transformar el string a formato de búsqueda SQL, recibe las tablas seleccionadas, que las almacenara en un vector, que a su vez será devuelto a la clase ServidorCasa. |
VentanaCliente | La clase interfaz con el usuario será la que lance la petición de listado, al accionarse un botón, y la que muestre el listado de las casas, una vez se ha realizado la búsqueda. |
ConexionCliente | Es la clase que tras la petición del usuario que recibe de la clase VentanaCliente, manda por el socket la petición de listado al servidor, pasándole los parámetros que se hayan seleccionado, y lee el resultado, almacenándolo en un vector y devolviéndolo a la clase VentanaCliente. |
Clase | Implicación |
ServidorCasa | El servidor recibe la petición por parte del cliente, y manda la ejecución de la función que se encargara de comprobar el estado de la casa que se desea comprar, en caso de que se pueda comprar, pasara al siguiente estado; en caso contrario, mandará el mensaje correspondiente al usuario, explicando las razones de por que es imposible dicha compra. |
BaseDatos | La interfaz con la base de datos recibe la petición de compra, y obtiene la vivienda en cuestión de la base de datos. Si no existe manda el error correspondiente, y si existe comprueba si esta comprada, y si no lo esta comprueba el precio. La función que se encarga de esta gestión devuelve un valor en coma flotante, por lo que los diferentes valores significaran una cosa u otra (para más información ver el código comentado) |
VentanaCliente | La clase interfaz con el usuario será la que lance la petición de compra, mediante la selección de una vivienda y accionando el botón Comprar. Hace una llamada a la clase ConexionCliente, al que indicara la vivienda seleccionada. Una vez hecha la petición de compra, mostrará la ventana pertinente en caso de haberse producido algún error que imposibilite la compra, o pasará a la pantalla de confirmar compra. |
ConexionCliente | Es la clase manda por el socket la petición de compra, enviando el código de la vivienda, y queda a la escucha de la respuesta proveniente del servidor, y se la comunicará a VentanaCliente. |
Clase | Implicación |
ServidorCasa | El servidor solo puede recibir este mensaje si esta en el estado 3, por lo que si lo recibe en cualquier otro estado produciría un error. Cuando lo recibe, tan solo hará una llamada a BaseDatos, indicándole la vivienda que se esta comprando, tras esto volverá al estado anterior |
BaseDatos | La interfaz con la base de datos recibe la orden de compra, y actualiza la base de Datos, marcando la columna "comprada" de dicha vivienda, |
VentanaCliente | Una vez llegado a este punto, la ventana mostrara una opción de comprar y de rechazar, para ejecutar este comando, habrá que pulsar el botón comprar, que enviará a ConexiónCliente la orden de que envíe los datos. Tras esta acción, se vuelve al menú principal. |
ConexionCliente | Cuando esta clase recibe la orden de confirmar la compra, manda el mensaje pertinente por el socket. |
Clase | Implicación |
ServidorCasa | El servidor solo puede recibir este mensaje si esta en el estado 3, por lo que si lo recibe en cualquier otro estado produciría un error. Cuando lo recibe devuelve al cliente el mensaje que le indica que se ha tramitado su petición y se pone n el estado de espera de petición |
VentanaCliente | Una vez llegado a este punto, la ventana mostrara una opción de comprar y de rechazar, para ejecutar este comando, habrá que pulsar el botón rechazar, que enviará a ConexiónCliente la orden de que envíe los la decisión del usuario, tras lo que volverá al menú principal. |
ConexionCliente | Cuando esta clase recibe la orden de rechazar la compra, manda el mensaje pertinente por el socket. |
Al arrancar la aplicación cliente, en primer lugar aparece una ventana de conexión que solicita que se introduzca la dirección IP de la máquina donde se encuentra el servidor al que se quiere conectar y el puerto al que nos vamos a conectar. Una vez introducida se debe pulsar el botón "Conectar a servidor". En caso de querer cerrar la aplicación, pulsar "Cancelar conexión".
A continuación aparecerá una pantalla con dos campos de texto a rellenar, en el primero deberá introducirse el nombre de usuario, y en el segundo la clave. Después se pulsará el botón de "Aceptar" para solicitar al servidor que el acceso al menú de opciones.
Este es el menú principal, en el que se muestran las casas y en el que se pueden realizar búsquedas parciales, elegir casa, comprarla y obtener la foto de la vivienda.
Muestra un listado completo de las casas, esta opción se ejecuta automáticamente al entrar en el menú principal, y en cualquier momento hace que todas las casas de la base de datos puedan ser visionadas por el cliente.
Este listado permite hacer una búsqueda selectiva de casas dependiendo de sus ciudades. Para ello hay que introducir la cadena clave en el campo de texto habilitado y pulsar en el botón buscar. El patrón puede usar `?' para sustituir una letra, o `*' para cualquier número de éstas.
Una vez seleccionada una vivienda, se pulsa en el botón "Comprar Vivienda", y se desplegará un nuevo menú, que informará si la casa está comprada o no, y en caso de que se pueda comprar saldrá una nueva ventana, que pedirá la confirmación.
Mensaje de aviso de que la casa ya ha sido comprada
Finaliza el programa