Despliegue inicial del proyecto

Se ha configurado el proyecto base con Maven y se han añadido todas las
dependencias iniciales previstas (si fuese necesario, se incluirán más a medida
que el proyecto avance).

JPA ha sido configurado con Hibernate como provider, y se han añadido dos
persistence-units, una configurada con MySQL para ser utilizada en modo
"producción" (nombre: 'default') y otra con HSQLDB para ser utilizada durante
las pruebas (nombre: 'testing'). En producción se utilizará C3P0 para la
gestión del pool de conexiones a la base de datos, en pruebas se utilizará el
ConnectionProvider por defecto de Hibernate.

A su vez, se ha configurado el sistema de Logging para generar los ficheros de
log "daa_tarde.log" y "daa_tarde_testing.log" dentro del directorio "logs" de
la raíz del proyecto. Se utiliza Log4J12 como framework de logging, a través de
la API de SLF4J.
Ejemplo de JPA para entidad Articulos

Se ha añadido un ejemplo de uso de JPA con una entidad Articulos y una pequeña
demo en JUnit, que puede servir de partida inicial para el desarrollo de la
entidad real.
Configuracion inicial de webapp

Se ha añadido la configuración básica de la aplicación web en el fichero
web.xml de "*/webapp/WEB-INF" para ser utilizado por un contenedor Servlet
como⋅ Tomcat o Jetty.

También han sido añadidas dependencias restantes a la configuración de Maven:
AssertJ[1] para aserciones mas ricas e intuitivas en los tests, Mockito[2] como
framework para uso de mocks en los tests y una dependencia "provided" para el
api de Servlet, y asi permitir que Maven pueda compilar el código sin
problemas. Se han corregido también pequeños problemas en la configuración de
Hibernate, así como incrementado su versión de 4.3.1 a 4.3.4.

[1] AssertJ: http://joel-costigliola.github.io/assertj/
[2] Mockito: https://code.google.com/p/mockito/
Añade Listener para gestión de Persistencia

Se ha añadido un ServletContextListener (PersistenceListener) para la gestión
de la creación de un EntityManagerFactory sobre la Persistence-Unit "default"
(la base de datos MySQL), de modo que sea creada en la inicialización del
contexto y cerrada en la destrucción del mismo. A su vez, se incluye un método
estático para obtener dicha instancia del EntityManagerFactory y poder usarlo
en el resto del código, liberando a éste de una dependencia directa sobre el
nombre de la Persistence Unit utilizada.

También se ha añadido una clase base para la realización de Tests sobre la base
de datos. Define un método @Before para la creación de un EntityManagerFactory
sobre la Persistence-Unit "testing" (la base de datos HSQLDB), así como un
EntityManager creado con la misma; y un método @After para el cierre tanto del
EntityManager como de su factoría. Dado que Hibernate ha sido configurado para
que cree y elimine las tablas de la base de datos en cada sesión (en modo test,
no producción), la existencia de estos métodos garantiza que la base de datos
HSQLDB será creada y borrada antes y después de cada test respectivamente,
garantizando de forma limpia la independencia entre los mismos.
Code Formatter para Eclipse incluido en la raiz del proyecto
Terminadas entidades para búsqueda simple
Modificado HBM2DDL de 'update' a 'create'
Implementado DAO de búsqueda simple de libros
Añadidos hashCode() y equals() a todas las entidades

Se ha establecido en la clase abstracta Article que todas las entidades hijas
deban implementar hashCode() y equals() para evitar problemas futuros. A su
vez, se ha eliminado el constructor @VisibleForTesting, prefiriendo la
existencia de un unico constructor visible (si no se necesitan todos los
atributos, se pasan parametros "por defecto" y se evita la necesidad de un
constructor necesario solo para pruebas).

Se han añadido los tests necesarios para verificar la correcta lógica del
hashCode e equals en todas las entidades, haciendo uso de la libreria
EqualsVerifier (añadida al pom.xml en scope de test) y que los constructores de
las distintas entidades validan que no se utilicen parametros nulos para la
asignacion de los atributos con "nullable = false".

Como ultimo se han corregido ciertos problemas de indentación en el código
(mezcla de tabuladores y espacios), que en Eclipse no se distinguen pero en el
visor de código de GitHub sí.
Implementados DAOs y tests

Se han implementado todas las funcionalidades necesarias en los DAOs para la
historia de usuario "Búsqueda de artículo", así como sus tests.
Permite que la búsqueda ignore la capitalización

Los DAOs han sido modificados, así como añadido pruebas, para permitir la
búsqueda por título ignorando las mayúsculas/minúsculas presentes tanto en la
BD como en la String recibida.

A su vez, se ha modificado PersistenceListener para permitir una construcción
más limpia de los DAOs, sin necesidad de un constructor que utilice un
EntityManagerFactory para la asociación a la BD de testing.
Implementada API REST para Libros

Implementada clase abstracta generica para todos los tipos de articulo y una
subclase especifica para Libros, así como sus tests.
Implementado test para API REST haciendo uso de Mocks

Se ha modificado el código del test existente para la API REST de Libros, para
hacer uso de un Mock sobre el objeto DAO que utiliza para la conexión a la base
de datos. Además, se ha refactorizado el código de los mismos, para evitar que
la superclase realice ninguna conexión a la base de datos y así, las APIs REST
puedan testearse de manera independiente a los DAOs y la BD. Se ha creado
también una clase JerseyTestBuilder para facilitar el uso de la API JerseyTest
(ver cómo está implementado BookResourceTest para un mayor entendimiento)..

También se ha refactorizado y corregido errores en ciertas partes del código.
Lo más notable es el movimiento de la anterior clase DatabaseTest dentro del
paquete "*.daos" para evitar su uso fuera de los mismos, así como ser renombra
da a BaseDAOTest. También se han renombrado las clases ArticlesREST y BooksREST
a ArticleResource y BookResource, respectivamente, para mejorar mínimamente la
legibilidad (se evitan siglas en los nombres de las clases).
Añadidos los <Entity>Resource faltantes. Añadidos datos de prueba a
MusicStorageDAOTest.
Añadidas <Entity>ResourceTest faltantes.
Corregido lapsus en MusicStorageResourceTest: -haskell +love <3
Limpieza/refactorización en tests y creado DAO generico

Se ha incluido un GenericDAO para acomodar a futuros DAOS que no formen parte
de la familia de ArticleDAO, y aún así permitir que se beneficien de ciertos
aspectos que deben ser genéricos a todos los DAOs.

Además, se han refactorizado prácticamente todos los tests, manteniendo las
mismas pruebas, pero con un ćodigo un poco más limpio y simple, gracias a
cambios en la parametrización de los mismos. Ahora, las parametrizaciones
existentes en lugar de devolver un número fijo de objetos, devuelven un String
representando el nombre de dicho bloque y un array con N objetos. Gracias al
nombre se puede añadir un "name" a la anotación Parameters para presentar los
mismos de una forma más legible, además de facilitar las búsquedas por palabra
clave en los test de la API REST; y gracias al array de objetos, se puede pasar
un número variable de parámetros a los tests (no los 3 fijos que existían
antes).

También se han eliminado todos los trailing whitespaces encontrados en el
código y corregido algún problema con alguna indentación y/o salto de línea
inapropiado.
Imagen de Byte[ ] a byte[ ] en Article

Se ha modificado la representación interna de una imagen en las entidades
Artículo (e hijas), de un array de objetos Byte a un array de bytes nativos.
Así, Jackson es capaz de generar automáticamente una representación en Base64
de los mismos al enviarlos a través de JSON, y evita tener que crear/configurar
un mapeador Byte[ ] -> JSON.

Junto a este cambio, se incluye un incremento en las longitudes de nombre y
descripción para todos los artículos.
Mejora del sistema de testing en REST

Se ha remplazado la necesidad de que todas las clases hijas de BaseResourceTest
sobreescriban/implementen el método createJerseyTest( ), y en lugar se solicita
que simplemente llamen al método registerResourceUnderTest( ) para registrar el
recurso o recursos (se pueden incluir tantos como sea necesario, llamando al
método varias veces) bajo pruebas.
Configuración inicial de AngularJS con RequireJS

Se ha configurado AngularJS en la capa web para ser utilizado junto a RequireJS
como gestor de módulos y se ha creado la estructura básica de directorios para
la aplicación web. También ha sido incluido Bootstrap como framework front-end
para facilitar la codificación de la interfaz.

Todas las dependencias han sido incluidas a través de WebJars[1], definidos en
el fichero pom.xml. Si la web fuese a ser desplegada en un servidor de
internet, sería conveniente reemplazar las definiciones en la configuración de
require.js (scripts/main.js) y en el "script src=" de index.html para utilizar
algún CDN que sirva las dependencias. Todo el contenido de WebJars está
disponible en jsDeliver, tal como establece su documentación, y el cambio
consistiría únicamente en prefijar "//cdn.jsdeliver.net" delante de las
definiciones de webjars, eg:

    angular: '../webjars/angularjs/1.2.15/angular.min'

se convertiría en:

    angular: '//cdn.jsdeliver.net/webjars/angularjs/1.2.14/angular.min'

No se ha configurado aún el sistema de testing de AngularJS (haciendo uso de
Karma y Jasmine).

[1] http://www.webjars.org/