Buscar
Social
Ofertas laborales ES
« Vaadin 10 disponible: Framework Java y Componentes Web | Main | Abierto el C4P para Commit 2018 »
miércoles
may232018

OpenXava 5.9 released: Plataforma Java Low Code de código abierto

OpenXava 5.9 permite copiar y pegar en las colecciones, el usuario puede seguir módulos para recibir notificaciones por correo electrónico de los cambios, registro de accesos personalizables, mejoras en las listas, gráficos y totales de colección, además de muchas cosas más.

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

Cortar y pegar en colecciones

Ahora hay botones para cortar y pegar en todas las colecciones. El usuario puede cortar y pegar entre colecciones del mismo tipo, incluso de diferentes módulos:



 

Seguir módulos

El usuario puede seguir cualquier módulo con sólo pulsar un icono en la esquina superior derecha:

Después de pulsarlo cualquier cambio que otros usuarios hagan en los datos de este módulo se le notificará vía correo electrónico. El usuario puede pulsar en cualquier momento en el mismo icono para anular la suscripción. Para que esto funcione el usuario necesita tener una cuenta de correo electrónico válida definida en su cuenta de usuario (XavaPro o Liferay) o bien usar un correo electrónico válido como nombre de usuario (algo disponible incluso en el OpenXava simple y llano mediante naviox-users.properties). Suscribirse a un módulo no está disponible para los módulos con @Tab en baseCondition por razones de seguridad.

Además, cuando un usuario crea un nuevo registro, todos los cambios a ese registro concreto por otros usuario le serán notificados por correo electrónico.

En cada mensaje el usuario tiene vínculos para quitar la suscripción.

Los cambios notificados son: creación de nuevos registros, modificación, borrado, añadir comentarios a una discusión, añadir/quitar imágenes de la galería, añadir/quitar archivos adjuntos y modificar colecciones. En el caso de la modificación el mensaje de correo informa sobre las propiedades que se han cambiado con su valor antiguo y nuevo.

Mira las instrucciones para activar esta característica en tus aplicaciones.

Registro de accesos

OpenXava tiene un mecanismo para registrar cualquier cambio hecho por los usuarios y también accesos de lectura. Este mecanismo es totalmente configurable y está desactivado por defecto.

Para registra el acceso a los datos necesitas un IAccessTrackerProvider (una interfaz de org.openxava.util). Crear una es fácil, simplemente crea una clase que implemente la interfaz, como la siguiente:

package org.openxava.util;

import java.io.*;
import java.util.*;

import org.apache.commons.logging.*;
import org.openxava.application.meta.*;


public class LogAccessTrackerProvider implements IAccessTrackerProvider {

    private static Log log = LogFactory.getLog(LogAccessTrackerProvider.class);

    private static String fileName;

    public void consulted(String modelName, Map key) {
        log("CONSULTED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }


    public void created(String modelName, Map key) {
        log("CREATED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }

    public void modified(String modelName, Map key,
        Map oldChangedValues,
        Map newChangedValues)
    {
        StringBuffer changes = new StringBuffer();
        for (String property: oldChangedValues.keySet()) {
            if (changes.length() > 0) changes.append(", ");
            changes.append(Labels.getQualified(property));
            changes.append(": ");
            changes.append(Strings.toString(oldChangedValues.get(property)));
            changes.append(" --> ");
            changes.append(Strings.toString(newChangedValues.get(property)));
        }
        log("MODIFIED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key + ", changes=" + changes);
    }

    public void removed(String modelName, Map key) {
        log("REMOVED: user=" + Users.getCurrent() +    ", model="
            + modelName + ", key=" + key);
    }

    private static void log(String line) {
        try {
            createFileIfNotExist();
            FileOutputStream f = new FileOutputStream(getFileName(), true);
            PrintStream p = new PrintStream(f);
            p.println(line);
            p.close();
            f.close();
        }
        catch (Exception ex) {
            log.warn(XavaResources.getString("log_tracker_log_failed"), ex);
        }
    }

    private static void createFileIfNotExist() throws Exception {
        Files.createFileIfNotExist(getFileName());
    }

    private static String getFileName() {
        if (fileName == null) {
            Collection applicationNames = MetaApplications.getApplicationsNames();
            String app = "openxava-app";
            if (!applicationNames.isEmpty()) {
                app = applicationNames.iterator().next().toString().toLowerCase();
            }
            fileName = Files.getOpenXavaBaseDir() + app + "-access.log";
        }
        return fileName;
    }

}


Esta es la implementación más simple posible, simplemente registra los accesos en un archivo log. Fíjate que has de implementar cuatro simples métodos: consulted(), created(), modified() y removed(). Puedes escribir tu propia implementación para grabar los acceso a la base de datos, por ejemplo. El proveedor de registro de arriba, LogTrackerAccessProvider, se incluye en OpenXava, en el paquete org.openxava.util, por lo que puedes usarlo tal cual si no necesitas más.

Para que tu proveedor de registro funcione lo has de declarar en el xava.properties de tu proyecto, usando la entrada accessTrackerProvidersClasses:

accessTrackerProvidersClasses=org.openxava.util.LogTrackerAccessProvider


Puedes definir varios proveedores de registros separados por comas. Ahora, todos los cambios y lecturas hechos por los usuarios añadirán una línea en .openxava/yourapplication-accesss.log.

Mejoras en las listas

Cantidad de registros en la lista cuando se usa "Agrupado por":

Fíjate en la columna "Cantidad registros", ahora disponible en todas las listas cuando agrupes.

Seleccionar una configuración de filtro/ordenación y agrupar está disponible en todos los formatos de listas, incluido las tarjetas y los gráficos:



Así el usuario puede seleccionar un filtro en tarjetas o gráficos, además el filtro seleccionado se recuerda de sesión a sesión. Sin embargo, ahora sólo el filtro seleccionado con el combo se recuerda, si el usuario hace un filtro introduciendo los valores y pulsando en filtrar no se establece por defecto para la siguiente vez, esto es una mejora de experiencia de usuario sobre la 5.8.

Mejoras en los gráficos

Hemos hecho un esfuerzo especial para que los gráficos sean útiles de una vez por todas:

Fíjate como puedes agrupas en gráficos, que la tarta muestra la cantidad en vez del porcentaje, que no puedes añadir más columnas en la tarta, que puedes cambiar los filtros, etc. Muchas mejoras, aquí está la lista completa:

  • Los datos mostrados en los gráficos son los datos actualmente filtrados en la lista.
  • La suma de los grupos en la lista se muestra correctamente cuando cambiamos a gráficos.
  • Cantidad de registros cuando "Agrupar por" está disponible en los gráficos.
  • Los gráficos de tarta suman los resultados de la misma categoria automáticamente.
  • Los gráficos de tarta agrupan los datos y los suman incluso si la lista no está agrupada.
  • En los gráficos de tarta el usuario solo puede escoger una columna para los valores y.
  • Agrupar por en los gráficos de tarta muestra la suma de cada grupo.
  • La columna X no se muestra por defecto como columna Y en los gráficos.
  • Los gráficos de tarta muestran los datos reales en lugar de los porcentajes, el porcentaje se muestra al poner el ratón encima.
  • Los gráficos llenan todo el espacio disponible en la página.
  • Se mejora la disposición de los gráficos para Liferay.
  • Se mejora la posición de los botones para escoger un tipo de gráfico.
  • Las columnas en los gráficos muestra sus etiqueta calificadas si son de referencias.

Totales en colecciones

Ahora las propiedades de total pueden ser editables, no sólo calculadas. También puedes anotar una propiedad de total con @Calculation. Por tanto puedes definir @ListProperties de esta forma:

@ListProperties("cantidad, importe[factura.sumaImportes, factura.porcentajeIVA, factura.iva, factura.total]")


Donde porcentajeIVA es una propiedad persistente. Esta propiedad se mostrará en totales, será editable y funcionará como una propiedad normal en cualquier otro sitio. Además, iva y total también son propiedades persistentes, pero anotadas con @ReadOnly y @Calculation. El resultado sería:

En la v5.9 es posible combinar el sumatorio de las columnas (el + en la propiedad) con las propiedades de total, lo que te permite escribir una @ListProperties como esta:

@ListProperties("porcentajeIVA, total+[costeTrabajo.porcentajeBeneficio, costeTrabajo.beneficio, costeTrabajo.total]")


Fíjate en el + después de total y a continuación las propiedades de total entre corchetes. Esto produce el siguiente efecto:

Donde el 131,08 es el sumatorio de la columna, por causa del total+. Debajo tienes porcentajeBeneficio, beneficio y total, las propiedades de total convencionales. Se puede referenciar el sumatorio de la columna (es decir total+, el 131,08) desde una propiedad @Calculation usando sum(nombreColumna). Por ejemplo, en este caso podrías definir la propiedad beneficio de esta manera:

@Calculation("sum(facturas.total) * porcentajeBeneficio / 100")
@ReadOnly
private BigDecimal beneficio;


En este caso el sum(facturas.total) dentro de @Calculation es la suma de las propiedades total de todos los elementos de la colección facturas, es decir lo mismo que total+ en @ListProperties, es decir el 131,08 que ves en la imagen.

Otras mejoras

Hemos hechos muchas mejoras en otras áreas:

  • Colecciones @OneToMany muestran totales incluso si la colección no tiene líneas.
  • El usuario puede sumar cualquier columna numérica en colecciones calculadas, @ElementCollection y listas @OrderColumn.
  • @ListProperties permite + como sufijo para sumar columnas en colecciones calculadas, @ElementCollection y listas @OrderColumn.
  • Experiencia de usuario mejorada para DISCUSION.
  • Número de filas en la colección se muestra en la etiqueta de la sección cuando la colección es el único elemento de la sección.
  • La página de bienvenida y la de identificación son páginas separadas, al acceder a la raíz vamos a la página de bienvenida.
  • La acción se añade a la URL del navegador sólo para la acciones "new".
  • Los booleanos en la lista y colecciones muestran la etiqueta de la propiedad para verdadero en lugar de un icono de chequeo.
  • Sumatorio para colecciones @OneToMany se muestra aunque la lista esté vacía.
  • Nueva propiedad fixModulesOnTopMenu en naviox.properties para tener ciertos módulos siempre presentes en el menú superior.
  • Propiedad @Calculation que depende de otras propiedades @Calculation se recalcula si la original se recalcula.
  • Nuevo método moveCollectionElementToAnotherCollection() en MapFacade.
  • Log incluye cambio de módulo con la IP y nombre del usuario.
  • Log para la ejecuación de las acciones incluye la IP y nombre del usuario.
  • IJavaScriptPostAction para ejecutar JavaScript después de la ejecución normal de la acción.
  • IAvailableAction para que una acción pueda determinar si va estar disponible u oculta por código.
  • Colecciones calculadas soportadas para DefaultListActionsForCollections y DefaultRowActionsForCollections.
  • Algunas etiquetas de uso común nuevas para ser usadas en las aplicaciones.
  • IMetaPropertyFormatter para usar MetaProperty del valor para formatear o analizar.
  • Mejorado el comportamiento de Strings.naturalLabelToIdentifier() para funcionar con el caracter %.
  • Nuevo método recursiveCloneWithCollections() en la clase de utilidad Maps.
  • Taglib <xava:message/> soporta param1, param2, param3 y param4 para enviar parametros al mensaje.
  • Nuevos métodos treeToPlainIncludingCollections() y getKeyFromValue() en la clase de utilidad en Maps.
  • Nuevo método isArray() en la clase utilidad XArrays.
  • Is.equal() e Is.empty() funcionan bien con arrays nativos de Java.
  • Nuevos métodos sendInBackground() en la clase Emails para enviar correos en segundo plano.
  • Nuevo método setValuesNotTracking() en MapFacade.
  • Nuevo método createFileIfNotExist() en la clase de utilidad Files.
  • Nuevo método Strings.toString() para hacer un toString() decente de cualquier objeto, soportando fechas, números, arrays, etc.

Arreglos

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

  • Arreglo: Los totales tienen el tamaño de letra demasiado grande.
  • Arreglo: Dos colecciones en una línea dentro de Liferay Portal 6.1.2 se visualizan una debajo de la otra.
  • Arreglo: Los mensajes no se muestran desde los diálogos en Chrome.
  • Arreglo: @Depends no funciona para propiedades de total en colecciones.
  • Arreglo: En los módulos de sólo detalle la vista no es editable por defecto.
  • Arreglo: Importar datos falla cuando el archivo a importar tiene datos numéricos vacios.
  • Arreglo: Módulos duplicados en el menú cuando los modulos se definen en aplicacion.xml.
  • Arreglo: Los métodos assertTotalXXX() de ModuleTestBase no funcionan si la colección no tiene líneas.
  • Arreglo: Cuando no se especifica @View las colecciones de total se visualizan en la vista principal y en los totales.
  • Arreglo: La configuración filtro/orden por defecto no está disponible en algunos casos.
  • Arreglo: El editor WebURL tiene un espacio invisible a la derecha que descoloca el siguiente editor.
  • Arreglo: Redondeo incorrecto en sumatorio de lista y colecciones.
  • Arreglo: Los gráficos salen descolocados con Internet Explorer.
  • Arreglo: Con estereotipo FILE añadir un archivo, quitarlo y volverlo a añadir falla.

Descarga OpenXava 5.9

PrintView Printer Friendly Version

EmailEmail Article to Friend

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>