openxava
Blog

27 de marzo del 2019

OpenXava 6.1 liberado

Tradicionalmente, en cada nueva versión mayor de OpenXava actualizamos las librerías y eliminamos el soporte de versiones viejas de servidores, Java, etc. Sin embargo, para la versión 6 entregamos una versión centrada en el usuario, dejando de lado la tradicional actualización de librerías. Por eso, hemos hecho esta actualización para la 6.1. Podemos decir que la versión 6.1 es la versión 6.0 parte 2. El principal cambio es que hemos quitado el soporte de Java 6 (y 7). Esto era indispensable para poder actualizar las librerías de terceros, dado que ya no hay librerías con soporte de Java 6. Esto significa que ya no podemos seguir soportando WebSphere 8, pero también significa que podemos disfrutar de características muy útiles, como las anotaciones repetibles, LocalDate o JPA 2.2.

Te invitamos a que descargues esta nueva versión y actualices tus aplicaciones OpenXava. Mira las instrucciones de migración.

Descarga OpenXava 6.1

Soporte de Java Persistence API 2.2

JPA 2.2 soporta anotaciones repetibles, inyección en los atributos de los conversores, mapeo de java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime y java.time.OffsetDateTime; y métodos para obteners los resultado de una Query o TypedQuery como un stream de Java 8. 
Lo más divertido de todo esto es poder usar los streams para examinar las consultas. Por ejemplo, para una consulta como esta:

TypedQuery<Factura> q = XPersistence.getManager()
    .createQuery("SELECT f FROM Factura f", Factura.class);
Si quieres obtener la suma de los importes de todas las facturas, usando el JPA tradicional sería así:
List<Factura> facturas = q.getResultList();
BigDecimal total = BigDecimal.ZERO;
for (Factura factura: facturas) {
	total = total.add(factura.getTotal());
}
Con el nuevo JPA puedes escribir:
BigDecimal total = q.getResultStream()
    .map(FActura::getTotal)
    .reduce(BigDecimal.ZERO, BigDecimal::add);
Opcionalmente, por supuesto. Sólo si te gusta este nuevo mundo de Java 8, sin bucles ni ifs.

También, el uso de las anotaciones repetibles en JPA hace el código un poco más claro. Por ejemplo, ya no necesitarás usar @JoinColumns para mapear una clave foránea compuesta, puedes usar varios @JoinColumn, así:
@ManyToOne
@JoinColumn(name="COD_AP_PERFIL", 
    referencedColumnName="COD_AP")
@JoinColumn(name="COD_PERFIL",
    referencedColumnName="COD")
private Perfil perfil;
 

Anotaciones repetibles

El ejemplo @JoinColumn de arriba es una muestra de una característica muy útil de Java 8, las anotaciones repetidas. Y, por supuesto, hemos hecho todas las anotaciones de OpenXava susceptibles de ser repetibles, repetibles.
Por tanto, si quieres definir varias vista para una misma entidad, ya no necesitas usar @Views:

@Entity
@View( members=
    "numero;" +
    "tipo;" +
    "nombre, Cliente.cambiarEtiquetaNombre();" +
    "foto;" +
    "telefono, correoElectronico;" +
    "sitioWeb;" +
    "direccion;" +
    "ciudad;" +
    "vendedor [" +
    "    vendedor; " +
    "    relacionConVendedor;" +
    "]" +
    "vendedorAlternativo;"  +
    "lugaresEntrega;" +
    "observaciones"
)
@View( name="Simple", members=
    "numero;" +
    "tipo;" +
    "nombre;" +
    "foto;" +
    "direccion;"
)
@View( name="SimpleConCiudad", 
    extendsView="Simple", 
    members= "; ciudad")
public class Cliente {
También disponible para los @Tab, todas las anotaciones con forViews y muchas más anotaciones. Otro ejemplo:
@ManyToOne(fetch=FetchType.LAZY)
@DescriptionsList(
    condition="${caracteristica.numero} = ?", 
    depends="this.usadoPara")
@DescriptionsList(
    forViews="Normal2", 
    condition="${numero} < 2",
    forTabs="Color2")
private CaracteristicaEspecial caracteristicaEspecial;

Fíjate como no usamos @DescriptionsLists para envolver los dos @DescriptionsList.

LocalDate de Java 8

La clase java.util.Date de Java es un engaño, porque no es una fecha, es un momento en el tiempo, incluyendo milisegundos. Pero, como se llama Date y además no tenemos alternativa, la usamos como si fuera una fecha, creando un montón de confusión y problemas, como cuando una fecha cambia cuando se mueve de un servidor a otro con diferente zona horaria, por ejemplo. O cuando dos fechas no son iguales, aunque sean del mismo día. Desde Java 8 contamos con un nuevo tipo, LocalDate, que es una fecha de verdad, con día, mes, año y nada más. En la mayoría de los casos el tipo que deberíamos usar en nuestra aplicaciones de gestión debería ser LocalDate.

OpenXava 6.1 soporta java.time.LocalDate, por lo que puedes escribir:

public class Factura {
    
    ...

    @Required
    @DefaultValueCalculator(CurrentLocalDateCalculator.class)
    private java.time.LocalDate fecha;
Fíjate que usamos el nuevo CurrentLocalDateCalculator como calculador por defecto. LocalDate se mapea contra un tipo DATE en la base de datos, igual que el java.util.Date de siempre.

Actualización de liberías

Hemos actualizado las siguientes librerías de terceros:

  • JasperReports actualizado a 6.7.0.
  • Hibernate actualizado a 5.3.9.
  • Hibernate Envers actualizado a 5.3.9.        
  • Hibernate Commons Annotations actualizado a 5.0.4.
  • Hibernate Validator actualizado a 6.0.15.
  • Commons Validator actualizado a 1.6.
  • Commons FileUpload actualizado a 1.4.
  • JSoup actualizado a 1.11.3.
  • Groovy actualizado a 2.4.5. 
  • JSTL Apache implentación estándar actualizado a 1.2.5. 
  • JavaMail actualizado a 1.6.3.
  • Actualización de las librerías PDF/Excel: itext-2.1.7, poi 3.15, poi-ooxml 3.15, poi-ooxml-schemas 3.15.  
  • HtmlUnit actualizado a 2.32.
  • Actualización de las librerías para beans y colecciones: commons-beanutils 1.9.3, commons-collections 3.2.2. 
  • Actualización de las librerías common: commons-codec 1.10, commons-io 2.6, commons-lang3 3.8, dom4j 2.1.1.
  • Actualización de las librerías de manipulación de clases: classmate 1.3.4, jandex 2.0.5, javassist 3.23.1, 
  • Actualización de las librerías de logging: commons-logging 1.2, jboss-logging-3.3.2.Final.
  • Actualización de las librerías pre-Java 9: javax.activation 1.2.0, jaxb-api-2.3.1.

Otras mejoras

Hemos hecho muchas mejoras en otras áreas:

  • Soporte de Bean Validation 2.0.
  • Descripción emergente con la descripción del módulo en el menú de la izquierda, cuando la descripción del módulo no coincida con su nombre.
  • El análisis (parsing) de los argumentos para filtrar en la lista se hace usando el formateador del editor del tipo.
  • Nuevo método getCurrentIP() en la clase Users.
  • Incremento de la velocidad de las pruebas jUnit en un 25%.
  • Añadidas nuevas librerías de utilidad: commons-text 1.4, commons-collections4 4.3.
  • Workspace de la distribución actualizado a Eclipse 2019-03, aunque todavía funciona con Neon (4.6).
  • Quitamos el código de LayoutParser y LayoutPainter, introducido en v5.0 y desactivado desde v5.5. 
  • Algunas etiquetas nuevas de uso común para usar en las aplicaciones.

Arreglos

Aunque esta no es una versión de mantenimiento hemos arreglado algunas cosas:

  • Arreglo: La anotación @Trees, usada para envolver varias @Tree, no funciona.
  • Arreglo: Traza en el log cuando se muestran los totales de las colecciones. 
  • Arreglo: Traza confusa al iniciar cualquier prueba jUnit. 
  • Arreglo: Cuando el usuario elimina una columna en la lista se queda una columna vacía muy estrecha.
  • Arreglo: Faltan alguna imágenes en la guía "Primeros pasos" en español.
  • Arreglo: Algunos errores ortográficos en los mensajes en inglés.    
  • Arreglo: Los gráficos se quedan congelados cuando la lista tiene muchos registros.
  • Arreglo: Al navegar entre páginas en una colección con @OnSelectElementAction los elementos seleccionados se deseleccionan. 
Descarga OpenXava 6.1

blog comments powered by Disqus

English - 中文