En esta tercera iteración se implementará la funcionalidad relativa a la gestión de inventario y la accesibilidad desde dispositivos móviles de todos los módulos.
Tabla 8.3. Historias tercera iteración
Creación de modelos y productos | 1 |
Visualización, modificación, eliminación y búsqueda de modelos | 1 |
Creación y modificación de precios | 1 |
Accesibilidad desde dispositivos móviles | 1 |
ESTIMACIÓN INICIAL | 4 |
REAL | 4 |
En esta iteración han surgido problemas en la implementación de la funcionalidad relativa a la auditoría en el núcleo del sistema, dado que han surgido errores en la integración con Hibernate en las relaciones entre objetos. A pesar de estos problemas la duración de la iteración no ha aumentado, gracias a que añadir nueva funcionalidad ha resultado tener un coste en tiempo realmente bajo.
Para comenzar se realiza el diagrama de clases UML que se puede ver en la Figura 8.6, “Creación de modelos y productos” con los objetos del dominio descritos en la historia de usuario.
Al igual que en el módulo party se creará una fachada InventoryFacade del módulo como interfaz de la capa modelo hacia capas superiores ocultando los detalles de implementación de la capa modelo.
En la capa controlador se añadirá una acción de Struts, ModelAction, que hará de intermediario entre la vista y el modelo, con su correspondiente configuración. En la capa vista al igual que en el módulo party se añadirán las páginas jsp para mostrar el formulario de creación y búsqueda de modelos.
Los métodos getAll* son necesarios para construír una caché con la información de tallajes y colores en la capa vista sin necesidad de acceder a la base de datos en reiteradas ocasiones. Estos datos no suelen ser modificados por lo que pueden ser cargados al inicio de la aplicación, para lo que se desarrollará un listener de la aplicación web, SpringContextLoaderListener, que extenderá y sustituirá al proporcionado por Spring, para además de realizar sus operaciones inicializar esta caché. En caso de necesitar reconstruir la caché tan sólo será necesario recargar la aplicación web en el contenedor.
Una vez creados los objetos del dominio en la historia anterior en cuanto a la capa modelo sólo será necesario añadir a la fachada los métodos que implementarán esta nueva funcionalidad.
En la capa controlador se añadirán a la clase ModelAction los métodos que darán soporte a la nueva funcionalidad (find, edit, update, delete) y en la capa vista la página jsp para visualizar un modelo, que mostrará todas las tallas y colores en los que existe, así como sus códigos de barras y las existencias en cada uno de los almacenes.
Será necesario modelar los precios y tarifas, de forma que cada producto tenga un precio por tarifa, y añadir a la fachada los métodos editPrices y updatePrices, así como hacer que findModelWithDetails devuelva también los precios de cada producto en cada tarifa.
En el controlador serán necesarias una nueva acción, PriceAction, que permitirá visualizar los precios de cada producto de un modelo y su posterior actualización, y las páginas jsp en la vista. Además se añadirá a la visualización de modelos los precios de cada producto en cada una de las tarifas.
Dado que la aplicación debe ser accesible desde dispositivos móviles tipo PDA se debe buscar una forma sencilla para adaptar el interfaz web a estos dispositivos, lo que implica principalmente considerar el tamaño de pantalla. Para realizar las pruebas se ha utilizado el simulador del sistema operativo PalmOS junto con su navegador web PalmSource.
La primera opción para adaptar el interfaz ha sido utilizar el soporte que proporciona CSS para estabecer distintas hojas de estilo para distintos fines a través del atributo media. Así por ejemplo se ha creado una hoja de estilo para impresión (media="print") que evita que la cabecera, el pie de página o el menú no se impriman, tan sólo el contenido ocupando todo el ancho de la página. Para los dispositivos con pantallas reducidas se puede utilizar el tipo de medio handheld, que de igual forma que para el tipo print no mostrará ni cabecera ni pie de página, pero que mantendrá el menu en formato texto.
El problema que ha surgido es que el navegador PalmSource no utiliza las hojas de estilo definidas como handheld, puede que sea debido a que la calidad de la imagen de la Palm es mucho mejor que la de otros dispositivos portátiles como pueden ser los móviles y los desarrolladores del navegador hayan optado por no utilizar ese tipo de hojas de estilo. Por lo tanto la única opcion restante es utilizar el identificador que el navegador envía con cada petición y cambiar las hojas de estilo si éste se corresponde con el identificador de PalmSource. Dado que las hojas de estilo y otras características de la presentación se definen mediante Tiles en el fichero de configuración de definiciones se ha optado por crear una acción de Tiles, SwitchLayoutController, que procesará todas las peticiones y tendrá acceso al contexto de configuración de Tiles, donde se configurará otra disposición de interfaz para PalmSource que sustituirá al interfaz por defecto en caso de que la petición sea de este navegador. Es una solución extensible, pudiéndose añadir tantas definiciones como sea necesario para distintos tipos de navegador o compartir una única definición entre varios.
El interfaz en Internet Explorer en la Figura 8.11, “Interfaz en Internet Explorer, página principal” y la Figura 8.12, “Interfaz en Internet Explorer, resultado de una búsqueda” se puede comparar con el resultado en el simulador de una Palm de la Figura 8.13, “Interfaz en una Palm”, para la página principal y para una página de resultados de búsqueda. Aunque en la página de búsqueda los resultados ocupan más ancho del que ofrece la pantalla se puede desplazar la pantalla tanto de arriba a abajo como de izquierda a derecha utilizando las barras de desplazamiento.
En esta iteración se ha optado por cambiar el método de carga de datos de ejemplo en la base de datos, utilizando para ello el listener anteriormente realizado en esta iteración, de forma que los datos son insertados en el momento de cargarse la aplicación web sin necesidad de intervención por parte del usuario.