domingo, 13 de septiembre de 2015

Guia rápida de Apache Commons Configuration

Intentando el otro día obtener propiedades de un fichero .properties en función de otras propiedades llegué a Apache Commons Configuratioins. Con esta librería me di cuenta que se puede hacer un tratamiento más potente de lo que hacemos normalmente con los ficheros de propiedades. Os indico a continuación las características que me parecieron más interesantes.
  • Manejo de fichero de propiedades más completo

Hasta ahora yo al meno solía usar un ResourceBundle, lo creaba como una clase singleton y desde ella accedía a las propiedades de un fichero de tipo '.properties' que normalmente contenia propiedades de la aplicación. 

Ahora podremos crear una clase del tipo que deseemos (en función del tipo de fichero '.xml', '.properties', '.ini', etc) y con ella manejaremos el fichero de propiedades. Además esta clase nos permitirá obtener valores del fichero en el formato que deseemos, sin necesidad de realizar casting manuales. 
PropertiesConfiguration configuration = new PropertiesConfiguration("appConfig.properties");
String propiedad1 = configuration.getString("propiedad1");
Integer propiedad2 = propertiesConfig.getInt("propiedad2");
  • Integración con Spring

Spring ya tiene PropertyPlaceholder pero también lo podemos configurar para que use esta librería y generar beans de configuración de forma automatizada. Y todo ello de forma muy sencilla.


 
  appConfig.properties
 

@Service
public class ConfigExampleService {
 @Autowired
 PropertiesConfiguration propertiesConfig;
}
  • Recarga automática

En la creación del objeto de configuración para el manejo de las propiedades podemos indicarle que se recarge automáticamente. Esto viene genial por si hay modificaciones en el fichero de propiedades y no queremos tener que parar el servidor. De esta forma, podremos modificar el fichero y sin necesidad de reinicio el objeto de configuración de propiedades hará uso del nuevo valor de las variables. 

 
  appConfig.properties
 
 
  
 

  • Obtener conjunto de variables

Hay casos en los que necesitamos que una determinada propiedad tenga un conjunto de valores para ello podemos o bien generar una única propiedad con distintos valores separados por un token. O por lo contrario algo más legible que es indicar más de una vez la propiedad con valores distintos. Aquí vemos un ejemplo de como obtener el valor.
@Service
public class ConfigExampleService {
 private final static Logger LOGGER = Logger.getLogger(ConfigExampleService.class);
 @Autowired
 PropertiesConfiguration propertiesConfig;
 public void metodo1() {
  String[] propiedad3 = propertiesConfig.getStringArray("propiedad3");
  int var = 1;
  for (String sPropiedad3 : propiedad3) {
   LOGGER.debug("propiedad3 " + var++ + ": " + sPropiedad3);
  }
 }
}
  • Utilizar variables de sistemas

También puede ser necesario poder obtener variables del sistema de forma dinámica que nos ayuden a ciertas operaciones pero que puedan ser distintas según los entornos. Para ello también tenemos solución con Commons Configuration. Aquí un ejemplo:
@Service
public class ConfigExampleService {
 private final static Logger LOGGER = Logger.getLogger(ConfigExampleService.class);
 @Autowired
 PropertiesConfiguration propertiesConfig;
 public void metodo1() {
  LOGGER.debug("java home: " + propertiesConfig.getString("java.home"));
 }
}
  • Interpolación de variables

Como he indicado anteriormente y esta fue mi duda inicial, es posible que se necesite generar una variable de propiedades en función de otras dos. Esto lo podemos hacer también de forma dinámica con Commons Configuration: 
@Service
public class ConfigExampleService {
 private final static Logger LOGGER = Logger.getLogger(ConfigExampleService.class);
 @Autowired
 PropertiesConfiguration propertiesConfig;
 public void metodo1() {
  LOGGER.debug("application.title: " + propertiesConfig.getString("application.title"));
 }
}
Además tiene otras características como puede ser la creación de objetos automatizada o incluso setear valores en el fichero properties. Podéis leer más en su documentación oficial (user guide v1.10). Este es el contenido del fichero 'appConfig.properties' que hemos utilizado para el ejemplo:
propiedad1=cadenaPropiedad1
propiedad2=24
propiedad3=cadena1Propiedad3
propiedad3=cadena2Propiedad3
propiedad3=cadena3Propiedad3
#variable interpolation example
java.home = ${env:JAVA_HOME}
application.name = CommonsConfigurationExample
application.version = 1.0.0
application.title = ${application.name} ${application.version}

1 comentario:

  1. Hola! Si estas interesado en traducir archivos .properties, yo recomiendo que utilice la herramienta en línea POEditor.

    ResponderEliminar