Universidad Carlos III de Madrid Departamento de Ingeniería Telemática
Home / Docencia / Ing. Telecomunicación / Software de Comunicaciones, Práctica 1
anteriorsiguiente
 
Software de Comunicaciones
Práctica 1:
Nivel de datos
Navegador
   Objetivos
   Descripción
   Base de Datos
   Entorno de Laboratorio
   Esqueleto de la solución
   Entrega
   Bibliografía
 
Autores: Pedro Muñoz Merino, Simon Pickin, Norberto Fernández García
Universidad Carlos III de Madrid

 

 Objetivo

El objetivo fundamental de esta práctica es aprender a modelar e implementar el nivel de datos de una aplicación típica. Para ello se propone una aplicación concreta que se debe resolver. En relación con este objetivo se deben conseguir las siguientes metas:

  • Aprender a trabajar con bases de datos y aprender a implementar el modelo de datos en una base de datos relacional concreta. En particular la base de datos a utilizar es MySQL.
  • Aprender a usar la API JDBC (Java DataBase Connectivity) para comunicar programas Java con bases de datos.
  • Aprender a realizar peticiones sencillas a bases de datos relacionales mediante el lenguaje SQL (Structured Query Language).
  • Poder realizar una aplicación completa que haga uso de bases de datos.
  • Comprender el diseño modular de aplicaciones, separando el código de interacción con la base de datos con respecto al resto de código de la aplicación.
 Descripción de la práctica

En esta práctica se debe realizar una aplicación con interfaz de línea de comandos que modele un sistema Gestor de Actividades deportivas. La aplicación a realizar debe modelar un sistema en el cual hay un conjunto de actividades deportivas disponibles que se ofrecen a un determinado precio, tienen un número limitado de plazas, se desarrollan en un determinado pabellón y a las cuales diferentes clientes se pueden inscribir. Clientes, actividades y pabellones se pueden crear y eliminar por medio de la persona que representa la figura del gestor. A la aplicación se podrá acceder con dos tipos diferente de perfil: gestor o cliente.

  • Con el perfil de gestor la aplicación debe poder mostrar un listado de todos los clientes que hay en el sistema en un determinado momento, un listado de todas las actividades disponibles que hay en el sistema en un determinado momento, un listado de todos los pabellones disponibles en un determinado momento, un listado de todas las actividades de las que quedan plazas libres y poder añadir y eliminar tanto clientes como actividades como pabellones.
  • Con el perfil de cliente se deben poder listar todas las actividades o bien aquellas actividades que cumplan una determinada condición (ej.: en las que queden plazas disponibles) y además ese determinado cliente se podrá apuntar o desinscribir en aquellas actividades que considere oportunas y podrá listar las actividades en las cuales está actualmente inscrito.

A través de la aplicación se podrá elegir el perfil deseado o, alternativamente, el usuario podrá registrarse como nuevo cliente. Seguidamente se mostrarán las opciones asociadas a cada perfil o las opciones de registro. La aplicación deberá comunicarse con la base de datos para efectuar las operaciones que se vayan seleccionando al introducirlas por pantalla.

Al ejecutar la aplicación a través de su main, se debe mostrar por pantalla lo siguiente:

        Please choose the option you require:

            A. Log in as Manager
            B. Log in as Client
            C. Register as new Client
                            

Seguidamente el cliente debe introducir por teclado una A, una B, o bien una C. En caso de que introduzca una A, la aplicación en primer lugar le pedirá la contraseña de gestor y en caso de que sea correcta deberá mostrar por pantalla otro menú, que tenga las opciones que puede tomar un Gestor. Dicho menú debe ser como sigue:

            1. Add client
            2. Delete client
            3. Add activity
            4. Delete activity
            5. Add pavillion
            6. Delete pavillion
            7. List all clients
            8. List all activities
            9. List all pavillions
            10. List the activities for which there are currently free places
            11. Exit the application
                            

Quien esté ejecutando la aplicación y haya elegido el perfil de gestor y haya podido acceder deberá introducir por teclado una de las siguientes opciones (de la 1 a la 11). Para cada elección particular se deberán realizar las operaciones oportunas en la base de datos. Si se elige la opción 1, entonces se deberán pedir seguidamente todos los campos necesarios de la tabla de clientes para crear ese nuevo cliente. Si se elige la opción 3, del mismo modo se deberán pedir todos los campos necesarios de la tabla de actividades para crear la nueva actividad y si se elige la opción 5 se deberán pedir todos los datos necesarios de la tabla de pabellones para crear un nuevo pabellón en la tabla. Para las opciones de eliminar clientes (2), actividades (4) y pabellones (6), la aplicación pedirá el valor de aquel campo que es la clave primaria de la tabla respectiva. En cualquiera de las otras opciones que son listar clientes (7), actividades (8), pabellones (9) y listar actividades con plazas disponibles (10), no se deberá pedir más información por teclado y se deberá mostrar por pantalla el resultado de la acción seleccionada, mostrando todos los campos de cada tabla.

En cualquiera de las opciones seleccionadas (excepto en la de "Salir de la aplicación"), una vez ejecutada deberá volver al mismo menú del gestor.

En caso de que introduzca una B, la aplicación en primer lugar le pedirá el nombre de cliente y su password y en caso de que los datos de login sean correctos (de acuerdo con la tabla de clientes) deberá mostrar por pantalla otro menú, que tenga las opciones que puede tomar un cliente. Dicho menú debe ser como sigue:

            1. List all activities
            2. List all pavillions
            3. List activities for which there are currently free places
            4. List activities for which there are free places costing less than a certain amount
            5. List activities for which there are free places that take place in a certain pavillion
            6. Show information about a particular activity
            7. List the activities to which I am subscribed
            8. Subscribe to an activity
            9. Unsubscribe from an activity
            10. Exit the application
                            

Quien esté ejecutando la aplicación y haya elegido el perfil de cliente y haya podido acceder mediante un login y password de cliente válido, deberá introducir por teclado una de las siguientes opciones (del 1 al 10). Para cada elección particular se deberán realizar las modificaciones oportunas en la base de datos. Si se elige la opción 1, 3, 4, 5, 6, o 7 se deberán visualizar aquellas actividades que reúnan el requisito especificado y en la visualización se deben poder observar todos los campos relacionados con la tabla de actividades. Además, para las opciones 4, 5, 6, y 7, tras la elección se deberá pedir al cliente el dato sobre el cual se realizará la búsqueda. Por otro lado si se elige la opción 8 u opción 9 se deberá pedir al usuario el identificador de la actividad en la que se quiere inscribir o de la que se quiere eliminar procediendo a hacer el procesado adecuado en la base de datos. Obviamente, la opción 8 requerirá que el usuario no esté ya suscrito en la actividad, y la 9, por el contrario, que esté previamente suscrito.

En cualquiera de las opciones seleccionadas (excepto en la de "Salir de la aplicación"), una vez ejecutada deberá volver al mismo menú del usuario.

Finalmente, si un usuario introduce la opción C, la aplicación le pide su información de registro, que incluye login, contraseña, nombre, apellido, dirección y número de teléfono, y seguidamente la aplicación debe almacenar esa información del usuario en la base de datos.

Adicionalmente, como requisito de la práctica, la solución debe mostrar una clara separación entre el control, la vista en forma de texto, y el modelo de la base de datos. Esta modularidad facilita la reutilización; de hecho en la próxima práctica (sobre el nivel de presentación) reutilizaremos la parte de código relativa a la interacción con la base de datos para la aplicación basada en web.

Para simplificar la práctica, no es obligatorio tratar las excepciones, en particular, las de la base de datos. Sin embargo, se debería utilizar el valor de retorno para comprobar que las operaciones de insert, update y delete se realizan bien.

 Base de Datos

El modelo de la base de datos, con los detalles de las tablas y sus campos debe ser el siguiente:


Tabla CLIENTES

Campo Tipo Propiedades Descripción
LOGIN VARCHAR(16) NOT NULL, PRIMARY KEY Login del usuario
PASSWD VARCHAR(16) NOT NULL Password del usuario
NOMBRE VARCHAR(16) NOT NULL Nombre del usuario registrado
APELLIDO VARCHAR(16) NOT NULL Apellido del usuario registrado
DIRECCION VARCHAR(16) NOT NULL Dirección del usuario registrado
TELEFONO VARCHAR(16) NOT NULL Teléfono del usuario registrado

Tabla ACTIVIDADES

Campo Tipo Propiedades Descripción
ID INT UNSIGNED NOT NULL, AUTO_INCREMENT, PRIMARY KEY Código de la actividad
NOMBRE VARCHAR(16)
NOT NULL     \ UNIQUE
NOT NULL     /
Nombre de la actividad
NOMBRE_PABELLON VARCHAR(16) Pabellón donde se realiza la actividad
DESCRIPCION VARCHAR(32) Descripción de la actividad
INICIO TIMESTAMP Fecha de inicio de la actividad
PRECIO FLOAT Precio de la matrícula en la actividad
PLAZAS_TOTALES INT UNSIGNED NOT NULL Número total de plazas ofrecidas para la actividad
PLAZAS_OCUPADAS INT UNSIGNED NOT NULL Número de plazas ocupadas en la actividad. Es igual al número de usuarios inscritos que aún no se han quitado de la actividad

Tabla PABELLONES

Campo Tipo Propiedades Descripción
PABELLON VARCHAR(16) NOT NULL, PRIMARY KEY Nombre del pabellón
LOCALIDAD VARCHAR(16) Localidad donde se encuentra el pabellón

Tabla INSCRIPCIONES

Campo Tipo Propiedades Descripción
LOGIN_CLIENTE VARCHAR(16)
NOT NULL     \ PRIMARY KEY
NOT NULL     /
Login del cliente
ID_ACTIVIDAD INT UNSIGNED Identificador de la actividad

En los campos de tipo autoincremento se debe dejar el valor a NULL, la base de datos se encarga de generar y asignar los valores consecutivos.

En la tabla INSCRIPCIONES, los dos campos que forman la clave primaria, LOGIN_CLIENTE y ID_ACTIVIDAD, son a su vez claves externas que definen las relaciones con las otras dos tablas. Esto se expresa de la siguiente forma:

                ..., PRIMARY KEY (LOGIN_CLIENTE, ID_ACTIVIDAD),
                     FOREIGN KEY (LOGIN_CLIENTE) REFERENCES CLIENTES(LOGIN),
                     FOREIGN KEY (ID_ACTIVIDAD) REFERENCES ACTIVIDADES(ID))
                        

En la tabla ACTIVIDADES también hay una relación que debe ser expresada correctamente de forma similar. La relación implica al campo NOMBRE_PABELLON con el campo PABELLON de la tabla de PABELLONES. Recordad que sólo funcionarán las claves externas si el motor de la base de datos (database engine) está puesto como "InnoDB".

Con la idea de usarlos en la siguiente práctica, también puede ir experimentando con los comandos: ON UPDATE {CASCADE | SET NULL} y ON DELETE {CASCADE | SET NULL} después del texto REFERENCES tabla_referenciada(atributo referenciado). Más información sobre dichos comandos puede encontrarse en el manual de MySQL.

La creación de estas tablas iniciales puede realizarse fuera del programa Java (conectándose directamente a la base de datos desde el cliente MySQL), utilizando las sentencias SQL necesarias.

Es relevante notar que la creación de una tabla de gestores no es necesaria ya que en la aplicación suponemos que sólo hay un gestor, cuya password está puesta a mano en el código de programa.

 Entorno de Laboratorio

Existe un servidor de bases de datos MySQL instalado en la máquina mysql.lab.it.uc3m.es

Dentro de ese servidor, se han abierto las cuentas de usuario, cuyos datos de acceso (login y password) se proporcionarán en clase. Para cada usuario, está ya creada una base de datos con el mismo nombre que el login. Se deberá trabajar sobre esa base de datos. La asignación de cuentas a grupos de dos personas se hará en el laboratorio.

Si no puedes asistir al laboratorio, entonces debes pedir un número de cuenta por e-mail al profesor de prácticas Norberto Fernández.

Para conectaros a la base de datos mediante el cliente de MySQL, deberéis hacer:

mysql -h mysql.lab.it.uc3m.es -u <usuario> -p

Seguidamente el sistema pedirá la contraseña para dicha cuenta, de acuerdo con lo indicado un poco más arriba en el texto del enunciado.

Una vez conectados podéis introducir las sentencias SQL directamente sobre la base de datos y así ver el resultado. Así podéis ver el comportamiento de una instrucción SQL antes de insertarla en vuestro programa Java. Podráis encontrar útiles los siguientes comandos de MySQL:

Para conectaros a la base de datos desde vuestro programa Java, os hará falta un driver de JDBC. Podéis usar  MySQL Connector/J5 para tal fin. Debéis descargarlo en vuestra máquina y colocarlo en el CLASSPATH. El nombre del driver que debéis utilizar en vuestro código es com.mysql.jdbc.Driver y la URL del servidor MySQL que debéis utilizar es jdbc:mysql://mysql.lab.it.uc3m.es/nombre_basedatos.

No hace falta utilizar el comando CREATE DATABASE schema_name  porque, como ya se ha dicho anteriormente, hay abierto una esquema (o "database" en terminología de MySQL) por cada grupo.

 Esqueleto de la solución

Para ayudaros en la resolución de esta práctica, se proporcionan un conjunto de ficheros, los cuales contienen un esqueleto de las clases que debéis usar. En la práctica debéis completar lo que falta de código y además comentarlo apropiadamente.

Se proporcionan tres paquetes java (activities.model, activities.view y activities.control), que conforman una solución completa del enunciado descrito. Se proporciona el código de todos los ficheros con la excepción del DBInteraction.java que es el fichero que debéis completar en esta práctica.

  • El paquete activities.model contiene todas las clases necesarias para la interacción con la base de datos, y la conforman los siguientes ficheros:
    • DBInteraction.java, es la clase encargada del control de todas las interacciones con la base de datos (incluyendo la creación de la conexión, la creación de las sentencias SQL, etc.). Este es el fichero que debéis completar en esta práctica. Debéis escribir el código de los diferentes métodos. Cada método está brevemente explicado en el fichero proporcionado, y debéis mirar al resto del código de la aplicación para daros cuenta de cómo codificar cada método.
    • Query.java, una clase auxiliar que ejecuta sentencias SQL.
    • Activity.java, una clase que representa una actividad.
    • Client.java, una clase que representa a un cliente.
    • Pavillion.java, una clase que representa un pabellón.
  • El paquete activities.view package contiene sólo una clase, InputOutput.java que es la encargada de escribir por pantalla y leer del teclado.
  • El paquete activities.control contiene las clases relacionadas con el control de la aplicación:
    • Control.java, la clase que contiene el método main y que representa el control general de toda la aplicación.
    • ManagerActions.java, la clase que ejecuta acciones asociadas con el gestor.
    • ClientActions.java, la clase que ejecuta acciones asociadas con el cliente.
    • AccessControl.java, la clase que realiza la autenticación de los perfiles de gestor y cliente.

Reutilización

Es importante notar que en esta solución existe una clara separación entre:

  • El control: clases Control, ManagerActions, ClientActions y AccessControl
  • El interfaz visual en modo texto: clase InputOutput
  • El modelo de la base de datos: clases DBInteraction, Query, Activity, Client y Pavillion

Esta modularidad facilita la reutilización; de hecho en la próxima práctica (sobre nivel de presentación) reutilizaremos el código de interacción con la base de datos para la aplicación Web.

Algunas observaciones

  • Respecto al uso de los paquetes en Java: recuerde que se debe añadir al classpath el camino del directorio que contiene el paquete y se debe llamar al programa desde fuera del paquete (como activities.control.Control).
  • Para ejecutar los comandos utilizados para crear la base de datos como batch, puede escribirlos en un fichero de texto (la extensión por convención es .sql) y utilizar o bien el comando  mysql -h mysql.lab.it.uc3m.es -u <usuario> -p < <nombre_fichero>  desde fuera del cliente MySQL o bien el comando  source <nombre_fichero>  desde dentro del cliente MySQL.
 Entrega

Esta práctica se llevará a cabo en grupos de dos. ¿Por qué? Véase la noción de pair programming de la metodología de desarrollo de software XP (Xtreme Programming).

La solución se debe entregar a través de Aula Global 2, concretamente, a través de la página web siguiente:

página de entrega, nivel de datos, grupo español (91)

Se deberá entregar el fichero DBInteraction.java tal que junto con todos los ficheros Java que se proporcionan como código implementen una solución correcta del sistema propuesto en esta práctica (no se deben incluir ficheros .class). El programa debe compilar y funcionar correctamente en el entorno de los laboratorios de telemática para todos los diferentes casos y de acuerdo a las instrucciones dadas en la sección de Descripción de la Práctica. Vuestra entrega debe incluir el nombre y NIA (los nombres y NIA) del autor (de los autores) como comentario al principio del fichero. Puede también incluir cualquir otra clarificación adicional que consideréis de importancia, también como comentario, pero no será normalmente necesario.

Fecha límite para entrega: 29/10/2009.

Hora límite: 11:00 h.

 Bibliografía

Véanse:

en la página Web de la asignatura y: en la página Web de la asignatura bilingüe.

 


Localización | Personal | Docencia | Investigación | Novedades | Intranet
inicio | mapa del web | contacta