Laboratorio 1 – Anotaciones

Objetivos

  • Afianzar y profundizar los conocimientos adquiridos en clase acerca del tema de Anotaciones.
  • Utilizar el Java’s Reflection API para implementar la semántica asociada a una anotación.
  • Realizar inyecciones de código y de dependencias por medio de anotaciones.
  • Utilizar POJOs para resolver el problema de Muebles de los Alpes.
  • Tener una primera aproximación a una arquitectura de tres niveles en una aplicación Standalone Java.

Herramientas

  • Para el desarrollo de todos los talleres del curso se utilizará Netbeans 8.0.2, el cual se puede descargar de la siguiente dirección: https://netbeans.org/downloads/
  • Puede realizar un ejemplo sencillo de reflexión en el siguiente link: Ejercicio 1

Desarrollo del laboratorio

En esta primera parte, el objetivo es examinar el código de la aplicación de ejemplo. Luego, ustedes tendrán que implementar nuevas funcionalidades sobre este código fuente. Esta aplicación es sencilla debido a que se quiere afianzar los conocimientos sobre anotaciones antes de empezar el desarrollo de una aplicación web.

  1. Descargue código completo de la aplicación y ábralo en Netbeans. Para esto, descomprima el código fuente y luego vaya a la pestaña File → Open project. En la nueva ventana busque la carpeta en la cual descomprimió el proyecto.
  2. Empiece por entender cómo funciona la aplicación. Esta se divide en tres paquetes:
    1. El paquete interfaz, que contiene las clases necesarias para la presentación de la información de Muebles de los Alpes y la interacción con el usuario. Con el fin de reducir la complejidad, la interfaz sólo permite agregar y eliminar muebles y vendedores. En este taller no es necesario realizar modificaciones sobre las clases de este paquete. Nota: El botón reiniciar no funcionará correctamente hasta la implementación de la anotación llamada NoInit.
    2. El paquete mundo, que contiene la lógica de negocio, es quien provee la informacion que se muestra en la interfaz. Hay dos entidades principales (Mueble y Vendedor) que son POJOs. Existe un manejador para cada entidad, el cual se encarga de mantener una lista de instancias de cada uno y proveer métodos para la interacción con esta lista. Por último, la clase MueblesLosAlpes es el punto de entrada de la interfaz hacia el mundo. Nota: En este taller sólo se tendrán que agregar anotaciones a las clases del mundo.
    3. El paquete anotaciones, que contiene todas las anotaciones que se utilizan en el paquete mundo. La clase Driver es la encargada de hacer que las anotaciones tengan significado durante la ejecución de la aplicación. Todas las instancias de las clases del paquete mundo se obtienen llamando el método instanciar de esta clase. La clase CodigoInserciones contiene un método por cada anotación que realice una inserción de código. Nota: En este ejemplo sólo la anotación Init realiza inserciones de código sobre los métodos que estén anotados con dicha anotación.
  3. Ahora revise cómo se realizan las inyecciones de código. Éstas se hacen específicamente en el método crearProxy de la clase Driver. En general, lo que se hace es revisar si una clase contiene métodos con anotaciones que impliquen inyecciones de código; de ser así, se construye una nueva clase (Proxy) que extiende de la clase objetivo. Los métodos que contienen inyecciones de código se reimplementan inyectando primero el código y luego llamando al método de la super clase. El método retorna la clase proxy de la clase objetivo.
  4. Revise cómo se instancian las clases en el método instanciar de la clase Driver. Aquí se da semántica a las anotaciones de nivel de Clase y se realizan las inyecciones de dependencias.
  5. Por último, revise las anotaciones Init y Cargar. Lea cuidadosamente la documentación de las mismas. La anotación Init puede ser utilizada para anotar métodos y realiza una inyección de código, es por esto que hay un método estático llamado Init en la clase CodigoInserciones. Este método es llamado cuando se invoca otro que esté anotado con @Init
  6. Una vez entendido el código, ustedes deben realizar las siguientes modificaciones a la aplicación:
    1. Declare una anotación llamada PostConstructor y realice los cambios necesarios para su correcto funcionamiento. Todo método anotado con ésta debe ser invocado despues de la instanciación (Constructor). Recuerde definir las restricciones que debe cumplir el método para que le sea aplicable esta anotación. En el caso concreto de Muebles de los Alpes, el postConstructor servirá para verificar la integridad de los datos ingresados al momento de crear un mueble o vendedor. La siguiente imagen muestra un posible uso de la anotación:imagenpostconst
    2. Declare una anotación llamada Log y realice los cambios necesarios para su correcto funcionamiento. Cuando un método con esta anotación sea invocado debe imprimir la fecha, la hora, el nombre de su clase y el nombre del método invocado en un archivo de Log (El archivo no puede ser sobreescrito, sólo se puede imprimir al final del mismo). Para el caso concreto de Muebles de los Alpes se necesitan Logs de todas las transacciones realizadas en el sistema.
    3. Declare una anotación NoInit y realice los cambios necesarios para su funcionamiento. Todo atributo anotado con esta anotación no puede ser alterado por la “ejecución” de una anotación Init. Anote los atributos ID de las clases Mueble y Vendedor, pues ningun objeto puede cambiar su ID por las restricciones de negocio.
    4. Realice las modificaciones necesarias para que la aplicación permita el uso de anotaciones en Interfaces. Proponga una anotacion que sea útil a nivel de interfaces e implementela. Se recomienda revisar el paquete reflect del API de java.

Entregables

La entrega del laboratorio se debe hacer por Sicuaplus y consiste en un archivo .zip (nombres_usuarios_grupo.zip) con el projecto de Netbeans completo.

Evaluación

La evaluación de este taller se hará de acuerdo con la siguiente plantilla de calificación