Fullmenu null

 

07 March 2018

Cuando tu script es sencillo y requiere unos pocos parámetros de configuración probablemente te sea suficiente con interpretar la linea de comando, usando por ejemplo CliBuilder . Sin embargo cuando la configuración se vuelve más compleja esta opción no resulte cómoda y la opción más obvia es utilizar un fichero properties de Java donde cada línea es un clave=valor.

Aunque es una opción válida y muy usada resulta muy oscura y propensa al error. En este post vamos a ver lo sencillo que es utilizar un formato más amigable para el humano y que permite expresar mucho mejor configuraciones "de niveles" llamado YAML https://es.wikipedia.org/wiki/YAML

Mediante este formato podemos escribir no sólo pares de clave,valor sino expresar arrays, mapas, etc Por ejemplo una configuración típica para conexiones a base de datos puede ser como la siguiente:

# config jerarquizada
dataSources:
    development:
        url: jdbc:mysql:localhost://desa
        username: user
        password: pwd
    production:
        url: jdbc:mysql:dataserver://prod
        username: sasdfoi123k
        password: asfd9.dslsd0

# array de [username,password]
logins:
    - username: pp
      password: PP

    - username: otro
      password: pazzz

En este ejemplo simplemente leemos un fichero de texto y si no está bien formado el parseador generará una excepción. Una vez cargado el fichero podemos navegar a través del mapa usando las características de groovy:

  • comprobar si una clave existe con el operador '?'

  • recorrer un array con each o eachWithIndex

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()

config = parser.load( new File('config_script.yml').text )

println config.doesntExists ?: "doesnExists doesn't exists"

println config.dataSources?.development?.url

println config.dataSources?.production?.url

config.logins.eachWithIndex{ user, idx->
    println "index $idx:"
    println "$user.username = $user.password"
}

Script
@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()

config = parser.load( new File('config_script.yml').text )

println config.doesntExists ?: "doesnExists doesn't exists"

println config.dataSources?.development?.url

println config.dataSources?.production?.url

config.logins.eachWithIndex{ user, idx->
    println "index $idx:"
    println "$user.username = $user.password"
}