openxava / documentación / Lección 13: @DefaultValueCalculator desde archivo

Curso: 1. Primeros pasos | 2. Modelo básico del dominio (1) | 3. Modelo básico del dominio (2) | 4. Refinar la interfaz de usuario | 5. Desarrollo ágil | 6. Herencia de superclases mapeadas | 7. Herencia de entidades | 8. Herencia de vistas | 9. Propiedades Java |10. Propiedades calculadas | 11. @DefaultValueCalculator en colecciones |12. @Calculation y totales de colección | 13. @DefaultValueCalculator desde archivo |14. Evolución del esquema manual |15. Cálculo de valor por defecto multiusuario |16. Sincronizar propiedades persistentes y calculadas |17. Lógica desde la base de datos |18. Validación avanzada | 19. Refinar el comportamiento predefinido | 20. Comportamiento y lógica de negocio | 21. Referencias y colecciones | A. Arquitectura y filosofía | B. Java Persistence API | C. Anotaciones | D. Pruebas automáticas

Tabla de contenidos

Lección 13: @DefaultValueCalculator desde archivo
Valor por defecto desde un archivo de propiedades
Resumen
Hemos establecido propiedades persistentes con @Calculation y definido propiedades de total para nuestra aplicación. Veremos ahora como establecer valores por defecto desde un archivo externo.
Si no te gustan los videos sigue las instrucciones a continuación.

Valor por defecto desde un archivo de propiedades

Es conveniente para el usuario tener el campo porcentajeIVA lleno por defecto con un valor adecuado. Podrías usar un calculador (@DefaultValueCalculator) que devuelva un valor fijo, pero en ese caso cambiar el valor por defecto implica cambiar el código fuente. O podrías leer el valor por defecto de una base de datos (usando JPA desde tu calculador), pero en ese caso cambiar el valor por defecto implica actualizar la base de datos.
Otra opción es tener estos valores de configuración en un archivo de propiedades, un archivo plano con pares clave=valor. En este caso cambiar el valor por defecto de porcentajeIVA es tan simple como editar un archivo plano con un editor de texto.
Implementemos la opción del archivo de propiedades. Crea un archivo llamado facturacion.properties en la carpeta Facturacion/properties con el siguiente contenido:
porcentajeIVADefecto=21
Aunque puedes usar la clase java.util.Properties de Java para leer este archivo preferimos usar una clase propia para leer estas propiedades. Vamos a llamar a esta clase PreferenciasFacturacion y la pondremos en un nuevo paquete llamado com.tuempresa.facturacion.util. Veamos el código:
package com.tuempresa.facturacion.util; // En el paquete 'util'
 
import java.io.*;
import java.math.*;
import java.util.*;
import org.apache.commons.logging.*;
import org.openxava.util.*;
 
public class PreferenciasFacturacion {
 
    private final static String ARCHIVO_PROPIEDADES="facturacion.properties";
    private static Log log = LogFactory.getLog(PreferenciasFacturacion.class);
 
    private static Properties propiedades; // Almacenamos las propiedades aquí
 
    private static Properties getPropiedades() {
        if (propiedades == null) { // Usamos inicialización vaga
            PropertiesReader reader = // PropertiesReader es una clase de OpenXava
                new PropertiesReader(
                    PreferenciasFacturacion.class, ARCHIVO_PROPIEDADES);
            try {
                propiedades = reader.get();
            }
            catch (IOException ex) {
                log.error(
                    XavaResources.getString( // Para leer un mensaje i18n
                        "properties_file_error",
                        ARCHIVO_PROPIEDADES),
                    ex);
                  propiedades = new Properties();
             }
        }
        return propiedades;
    }
 
    public static BigDecimal getPorcentajeIVADefecto() { // El único método público
        return new BigDecimal(getPropiedades().getProperty("porcentajeIVADefecto"));
    }
}
Como puedes ver PreferenciasFacturacion es una clase con un método estático, getPorcentajeIVADefecto(). La ventaja de usar esta clase en lugar de leer directamente del archivo de propiedades es que si cambias la forma en que se obtienen las preferencias, por ejemplo leyendo de una base de datos o de un directorio LDAP, solo has de cambiar esta clase en toda tu aplicación.
Puedes usar esta clase desde el calculador por defecto para la propiedad porcentajeIVA. Aquí tienes el código del calculador:
package com.tuempresa.facturacion.calculadores; // En el paquete 'calculadores'
 
import org.openxava.calculators.*; // Para usar 'ICalculator'
import com.tuempresa.facturacion.util.*; // Para usar 'PreferenciasFacturacion'
 
public class CalculadorPorcentajeIVA implements ICalculator {
 
    public Object calculate() throws Exception {
        return PreferenciasFacturacion.getPorcentajeIVADefecto();
    }
}
Como ves, simplemente devuelve porcentajeIVADefecto de PreferenciasFacturacion. Ahora, ya puedes usar este calculador en la definición de la propiedad porcentajeIVA en DocumentoComercial. Mira el código:
@DefaultValueCalculator(CalculadorPorcentajeIVA.class)
BigDecimal porcentajeIVA;
Con este código cuando el usuario pulsa para crear una nueva factura, el campo porcentajeIVA se rellenará con 21, o cualquier otro valor que hayas puesto en facturacion.properties.

Resumen

En esta lección has aprendido cómo usar un archivo externo desde el cuál establecer valores por defecto, para configurar las propiedades que utilizaremos en la lógica de negocio de nuestra aplicación, permitiéndonos abstraernos de tener que modificar el código cuando queramos modificar dichas propiedades.

¿Problemas con la lección? Pregunta en el foro ¿Ha ido bien? Ve a la lección 14