openadom
  • Accueil
  • Installation
  • Fichier d’example
  • Lexique
  • A propos
  1. Pour aller plus loin
  2. Expression Groovy
  • Introduction
    • Introduction
    • Vocabulaire
    • Fichier d’échange
  • Fichiers d’échange
    • Aide fichier
    • Application (OA_application)
    • Etiquettes (OA_tags)
    • Données (OA_data)
      • Components
        • introduction
        • Basic Components
        • Computed Components
        • Dynamic Components
        • Constant Components
        • Pattern Components
        • Paramétrage des composants
        • Verificateurs
        • Validations
        • Dépôt de fichier (OA_submission)
        • Autorisations (OA_autorisations)
      • Fichier additionnels
      • Formulaire de demande de droits
  • Pour aller plus loin
    • Glossaire
    • Authorization
    • Component Qualifiers
    • Expression Groovy
    • Internationalisation i18n
    • Submission
  • Base de données
    • Introduction
  • En réflexion
    • Verificateurs
    • Clefs étrangères
  • Exemples
    • Fichier de configuration minimale
    • Composantes
      • Example d’utilisation des composants
      • Example d’utilisation des composantes dynamiques(sites)
      • Example d’utilisation des composantes dynamiques (taxons)
      • Example d’utilisation des composantes basiques

Sur cette page

  • Expression groovy
  • Exemples de scripts groovy
  • Exemples de scripts groovy
  • Expressions Prédéfinies
  • Objets du contexte
  • autres
  • Modifier cette page
  • Voir la source
  • Faire part d'un problème
  1. Pour aller plus loin
  2. Expression Groovy

Expression groovy

Expressions pour calculer ou transformer des valeurs de composantes

Date de publication

07 mai 2025

Résumé

Les expressions Groovy dans votre application sont utilisées pour calculer des valeurs par défaut, tester les valeurs de components ou effectuer des computations en utilisant des données fournies.

Expression groovy

Les expressions Groovy dans votre application sont utilisées pour calculer des valeurs par défaut, tester les valeurs de components ou effectuer des computations en utilisant des données fournies. Ce contexte est généralement une map contenant :

  • les données d’entrée de la ligne (datum)
  • Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l’expression (OA_expression) (references et referencesValues)
  • pour le dépôt avec versionnement (OA_strategy: OA_VERSIONING) le contexte de versionnement (binaryFile)
  • l’internationalisation du data (dataI18n)
  • la description du data (dataDescription)
  • l’identificateur du data (dataName)
  • la configuration de l’application (application)
  • l’identificateur de l’application (applicationName)
  • les lignes d’en-tête du fichier (preHeaderRow, headerRow, postHeaderRow)
  • la ligne courante (currentRow)
  • le numéro de ligne (currentRowNumber)

Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l’expression (OA_expression) (references et referencesValues), et des fonctions utilitaires. Les expressions sont évaluées dans ce contexte pour produire un résultat ou déclencher des exceptions personnalisées en cas d’erreur.

Le contexte met aussi des expressions pour simplifier l’écriture du groovy ainsi que pour générer des exceptions personalisées.

Exemples de scripts groovy

search
    def numbers = [1, 2, 3, 4, 5]
    def firstEven = numbers.find { it % 2 == 0 }
    println(firstEven) // Affiche: 2

Exemples de scripts groovy

listes
    def names = ['Alice', 'Bob', 'Charlie']
    def upperNames = names.collect { it.toUpperCase() }
    println(upperNames) // Affiche: [ALICE, BOB, CHARLIE]
    def numbers = [1, 2, 3, 4, 5]
    def evenNumbers = numbers.findAll { it % 2 == 0 }
    println(evenNumbers) // Affiche: [2, 4]
    def sales = [
        [product: 'A', amount: 100],
        [product: 'B', amount: 200],
        [product: 'A', amount: 150]
    ]
    def totalSales = sales.sum { it.amount }
    println(totalSales) // Affiche: 450
        def transactions = [
            [product: 'A', amount: 100],
            [product: 'B', amount: 200],
            [product: 'A', amount: 150],
            [product: 'C', amount: 300]
        ]
        def salesByProduct = transactions.groupBy { it.product }
                                         .collect { product, sales -> 
                                             [product: product, total: sales.sum { it.amount }] 
                                         }
        println(salesByProduct)
        // Affiche: [[product:A, total:250], [product:B, total:200], [product:C, total:300]]
    def people = [
        [name: 'Alice', age: 25],
        [name: 'Bob', age: 30],
        [name: 'Charlie', age: 35],
        [name: 'David', age: 28]
    ]
    def namesOfPeopleOver30 = people.findAll { it.age > 30 }
            .collect { it.name }
    println(namesOfPeopleOver30) // Affiche: [Charlie]

Groovy Official Site

Expressions Prédéfinies

Le contexte inclut des expressions prédéfinies pour simplifier l’écriture des scripts Groovy et générer des exceptions personnalisées :

OA_naturalKeyBuilder

Construit des clés naturelles à partir de multiples critères. Exemple :

groovy   OA_naturalKeyBuilder     .forDatumField("agroecosystem").onDataName("tr_agroecosystem_agr").forKey("agr_key").withException("MISSING_AGROECOSYSTEM")     .forDatumField("site").onDataName("tr_site_sit").forKey("sit_key").withException("MISSING_SITE")     .naturalKey() 

Ici on construit une clé naturelle en se basant sur les colonnes agroecosystem et site, que l’on compare auw valeurs des composants agr_key de tr_agroecosystem_agr et sit_key de tr_site_sit. Si l’une de ces valeurs est manquante, on renverra une groovyException avec le nom MISSING_AGROECOSYSTEM ou MISSING_SITE.

Il est à votre charge de compléter l’expression de la section OA_expression par une section d’internationalisation de ces exceptions.

Voici un exemple d’une telle section :

        OA_computation:
          OA_expression: >
            OA_naturalKeyBuilder
                .forDatumField("flx_site_name")
                  .onDataName("tr_sites_sit")
                  .forKey("sit_site_key")
                  .withException("MISSING_SITE")
                .forDatumField("flx_parcelle_name")
                  .onDataName("tr_parcelles_par")
                  .forKey("par_parcelle_key")
                  .withException("MISSING_PARCELLE")
                .naturalKey()
          OA_references:
            - tr_sites_sit
            - tr_parcelles_par

          OA_groovyExceptions:   #optional
            MISSING_SITE:
              - fr: le site {value} n'existe pas. Les sites connus sont {knownValues}
              - en: site {value} doesn't exists. Knowns sites are {knownValues}
            MISSING_PARCELLE:
              - fr: la parcelle {value} n'existe pas. Les parcelles connues pour le site [parents[0]} connus sont ${knownValues}
              - en: plot {value} doesn't exists. Knowns plots for site {parents[0]} are ${knownValues}

OA_escapeLabel

Permet d’échapper un texte pour qu’il puisse être utilisé dans une clef naturelle

    OA_escapeLabel("Une chaîne à échapper")

valeur de retour: une_chaine_a_echapper

OA_buildException

Permet de créer une exception dans un script groovy

    throw OA_buildException(
                          "MISSING_SITE", s
                          Map.of(
                            "site",  datum.site,s
                            "knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
                          )
                      )

N’oublier pas de déclarer l’internationalisation de votre exception dans une section OA_groovyExceptions

        OA_computation:
          OA_expression: >
            throw OA_buildException(
              "MISSING_SITE", s
              Map.of(
                "site",  datum.site,s
                "knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
              )
            )

          OA_groovyExceptions:   #optional
            MISSING_SITE:
              - fr: le site {site} n'existe pas. Les sites connus sont {knownSites}
              - en: site {site} doesn't exists. Knowns sites are {knownSites}

OA_buildCompositeKey

Créé une clé composite à partir des valeurs de plusieurs composants

    OA_buildCompositeKey(['agroecosystem', 'site', 'plot'])

Exemple de réponse : agroecosysteme_1__site_experimental_1__parcelle_2

Si vous voulez construire une liste de clé composite à partir de component MANY, on utilisera OA_buildManyCompositeKey

    OA_buildManyCompositeKey(['agroecosystem', 'site', 'plot'])

Exemple de réponse : agroecosysteme_1__site_experimental_1__parcelle_1,agroecosysteme_2__site_experimental_1__parcelle_2

Objets du contexte

datum

Ce sont les valeurs de la ligne.

datum:

    [
        "date": "01/01/2005",
        "heure": "00:30:00",
        "sit_loc": "paris"
]

utilisation :

        OA_computation:
          OA_expression: >
            return datum.date + " " + datum.heure

valeur de retour: 01/01/20005 00:30:00

references et referencesValues

Ce sont les lignes enregistrées des référentiels déclarés dans la section OA_references relative à l’expression. Renvoie un tableau de lignes ou un tableau de tableau de valeurs des lignes

referenceValues:

    [
            "t_data_dat": [
                [
                "hierarchicalKey": "tr_agroecosystemes_agrKprairies_permanentes.tr_sites_sitKtheix",
                "naturalKey": "theix",
                "refValues": [
                        ["key": "theix",
                        "date": "01/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "02/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "03/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "04/01/2005",
                        "name": "Theix"]
                    ]
                 ]                    
            ]
    ]
        OA_computation:
          OA_expression: >
            return references.t_data_dat[0].refValues.collect { it.date }
          OA_references: [t_data_dat]

valeur de retour: [“01/01/2005”,“02/01/2005”,“03/01/2005”,“04/01/2005”}

        OA_computation:
          OA_expression: >
            return references.t_data_dat[0].naturalKey
          OA_references: [t_data_dat]

valeur de retour: theix

A noter que referenceValues permet d’accéder aux métadonnées de la ligne. Si vous n’utilisez que les valeurs vous utiliserez la variable de contexte referenceValues

referencesValues :

    [
        ["key": "theix",
        "date": "01/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "02/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "03/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "04/01/2005",
        "name": "Theix"]
    ]
        OA_computation:
          OA_expression: >
            return referencesValues.collect{it.t_data_dat.date}
          OA_references: [t_data_dat]

valeur de retour: {“01/01/2005”,“02/01/2005”,“03/01/2005”,“04/01/2005”}

headerRow

La liste de la ligne d’en-tête

headerRow:

    ["site",  "traitement","version"]

preHeaderRow et postHeaderRow

La liste des lignes avant ou après la ligne d’en-tête et avant les lignes de données

autres

  • application correspond à l’objet application correspondant à la configuration chargées
  • applicationName: identificateur de l’application
  • dataDescription: description du data courant tel que définie dans le fichier de configuration
  • dataName: identificateur du data courant
  • dataI18n: valeurs d’internationalisation pour ce data
  • currentRowNumber: numero de la ligne en cours
  • binaryFile: objet d’information du fichier déposé ou en cours de publication

Pour plus d’information sur ces valeurs vous pouvez tester un computed component avec la valeur en retour.

Retour au sommet
Component Qualifiers
Internationalisation i18n
Code source
---
title: Expression groovy
subtitle: Expressions pour calculer ou transformer des valeurs de composantes
abstract: >
  Les expressions Groovy dans votre application sont utilisées pour
  calculer des valeurs par défaut, 
  tester les valeurs de components
  ou effectuer des computations en utilisant des données fournies. 
---

## Expression groovy {#OA_expression}

Les expressions Groovy dans votre application sont utilisées pour calculer des valeurs par défaut, tester les valeurs de components ou effectuer des computations en utilisant des données fournies. Ce contexte est généralement une map contenant :

-   les données d'entrée de la ligne (datum)
-   Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l'expression (OA_expression) (references et referencesValues)
-   pour le dépôt avec versionnement (OA_strategy: OA_VERSIONING) le contexte de versionnement (binaryFile)
-   l'internationalisation du data (dataI18n)
-   la description du data (dataDescription)
-   l'identificateur du data (dataName)
-   la configuration de l'application (application)
-   l'identificateur de l'application (applicationName)
-   les lignes d'en-tête du fichier (preHeaderRow, headerRow, postHeaderRow)
-   la ligne courante (currentRow)
-   le numéro de ligne (currentRowNumber)

Les valeurs enregistrées des types de données déclarés (OA_references) en même temps que l'expression (OA_expression) (references et referencesValues), et des fonctions utilitaires. Les expressions sont évaluées dans ce contexte pour produire un résultat ou déclencher des exceptions personnalisées en cas d'erreur.

Le contexte met aussi des expressions pour simplifier l'écriture du groovy ainsi que pour générer des exceptions personalisées.

## Exemples de scripts groovy

::: {#search .callout-note title="search" collapse="true"}
``` groovy
    def numbers = [1, 2, 3, 4, 5]
    def firstEven = numbers.find { it % 2 == 0 }
    println(firstEven) // Affiche: 2
```
:::

## Exemples de scripts groovy

::: {.callout-note title="listes" collapse="transform"}
``` groovy
    def names = ['Alice', 'Bob', 'Charlie']
    def upperNames = names.collect { it.toUpperCase() }
    println(upperNames) // Affiche: [ALICE, BOB, CHARLIE]
```
:::

``` groovy
    def numbers = [1, 2, 3, 4, 5]
    def evenNumbers = numbers.findAll { it % 2 == 0 }
    println(evenNumbers) // Affiche: [2, 4]
```

``` groovy
    def sales = [
        [product: 'A', amount: 100],
        [product: 'B', amount: 200],
        [product: 'A', amount: 150]
    ]
    def totalSales = sales.sum { it.amount }
    println(totalSales) // Affiche: 450
```

``` groovy
        def transactions = [
            [product: 'A', amount: 100],
            [product: 'B', amount: 200],
            [product: 'A', amount: 150],
            [product: 'C', amount: 300]
        ]
        def salesByProduct = transactions.groupBy { it.product }
                                         .collect { product, sales -> 
                                             [product: product, total: sales.sum { it.amount }] 
                                         }
        println(salesByProduct)
        // Affiche: [[product:A, total:250], [product:B, total:200], [product:C, total:300]]
```

``` groovy
    def people = [
        [name: 'Alice', age: 25],
        [name: 'Bob', age: 30],
        [name: 'Charlie', age: 35],
        [name: 'David', age: 28]
    ]
    def namesOfPeopleOver30 = people.findAll { it.age > 30 }
            .collect { it.name }
    println(namesOfPeopleOver30) // Affiche: [Charlie]
```

[Groovy Official Site](http://groovy-lang.org/)

## Expressions Prédéfinies

Le contexte inclut des expressions prédéfinies pour simplifier l'écriture des scripts Groovy et générer des exceptions personnalisées :

### OA_naturalKeyBuilder {#OA_naturalKeyBuilder}

Construit des clés naturelles à partir de multiples critères. Exemple :

``` groovy
groovy   OA_naturalKeyBuilder     .forDatumField("agroecosystem").onDataName("tr_agroecosystem_agr").forKey("agr_key").withException("MISSING_AGROECOSYSTEM")     .forDatumField("site").onDataName("tr_site_sit").forKey("sit_key").withException("MISSING_SITE")     .naturalKey() 
```

Ici on construit une clé naturelle en se basant sur les colonnes agroecosystem et site, que l'on compare auw valeurs des composants **agr_key** de **tr_agroecosystem_agr** et **sit_key** de **tr_site_sit**. Si l'une de ces valeurs est manquante, on renverra une groovyException avec le nom *MISSING_AGROECOSYSTEM* ou *MISSING_SITE*.

Il est à votre charge de compléter l'expression de la section OA_expression par une section d'internationalisation de ces exceptions.

Voici un exemple d'une telle section :

``` yaml
        OA_computation:
          OA_expression: >
            OA_naturalKeyBuilder
                .forDatumField("flx_site_name")
                  .onDataName("tr_sites_sit")
                  .forKey("sit_site_key")
                  .withException("MISSING_SITE")
                .forDatumField("flx_parcelle_name")
                  .onDataName("tr_parcelles_par")
                  .forKey("par_parcelle_key")
                  .withException("MISSING_PARCELLE")
                .naturalKey()
          OA_references:
            - tr_sites_sit
            - tr_parcelles_par

          OA_groovyExceptions:   #optional
            MISSING_SITE:
              - fr: le site {value} n'existe pas. Les sites connus sont {knownValues}
              - en: site {value} doesn't exists. Knowns sites are {knownValues}
            MISSING_PARCELLE:
              - fr: la parcelle {value} n'existe pas. Les parcelles connues pour le site [parents[0]} connus sont ${knownValues}
              - en: plot {value} doesn't exists. Knowns plots for site {parents[0]} are ${knownValues}
```

### OA_escapeLabel {#OA_escapeLabel}

Permet d'échapper un texte pour qu'il puisse être utilisé dans une clef naturelle

``` groovy
    OA_escapeLabel("Une chaîne à échapper")
```

valeur de retour: une_chaine_a_echapper

### OA_buildException {#OA_buildException}

Permet de créer une exception dans un script groovy

``` groovy
    throw OA_buildException(
                          "MISSING_SITE", s
                          Map.of(
                            "site",  datum.site,s
                            "knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
                          )
                      )
```

N'oublier pas de déclarer l'internationalisation de votre exception dans une section OA_groovyExceptions

``` yaml
        OA_computation:
          OA_expression: >
            throw OA_buildException(
              "MISSING_SITE", s
              Map.of(
                "site",  datum.site,s
                "knownSites", references.tr_site_sit.refValues.collect{it.sit_key}
              )
            )

          OA_groovyExceptions:   #optional
            MISSING_SITE:
              - fr: le site {site} n'existe pas. Les sites connus sont {knownSites}
              - en: site {site} doesn't exists. Knowns sites are {knownSites}
```

### OA_buildCompositeKey {#OA_buildCompositeKey}

Créé une clé composite à partir des valeurs de plusieurs composants

``` groovy
    OA_buildCompositeKey(['agroecosystem', 'site', 'plot'])
```

Exemple de réponse : agroecosysteme_1\_\_site_experimental_1\_\_parcelle_2

Si vous voulez construire une liste de clé composite à partir de component MANY, on utilisera OA_buildManyCompositeKey

``` groovy
    OA_buildManyCompositeKey(['agroecosystem', 'site', 'plot'])
```

Exemple de réponse : agroecosysteme_1\_\_site_experimental_1\_\_parcelle_1,agroecosysteme_2\_\_site_experimental_1\_\_parcelle_2

## Objets du contexte

### datum

Ce sont les valeurs de la ligne.

datum:

``` groovy
    [
        "date": "01/01/2005",
        "heure": "00:30:00",
        "sit_loc": "paris"
]
```

utilisation :

``` yaml
        OA_computation:
          OA_expression: >
            return datum.date + " " + datum.heure
```

valeur de retour: 01/01/20005 00:30:00

### references et referencesValues

Ce sont les lignes enregistrées des référentiels déclarés dans la section OA_references relative à l'expression. Renvoie un tableau de lignes ou un tableau de tableau de valeurs des lignes

referenceValues:

``` groovy
    [
            "t_data_dat": [
                [
                "hierarchicalKey": "tr_agroecosystemes_agrKprairies_permanentes.tr_sites_sitKtheix",
                "naturalKey": "theix",
                "refValues": [
                        ["key": "theix",
                        "date": "01/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "02/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "03/01/2005",
                        "name": "Theix"],
                        ["key": "theix",
                        "date": "04/01/2005",
                        "name": "Theix"]
                    ]
                 ]                    
            ]
    ]
```

``` yaml
        OA_computation:
          OA_expression: >
            return references.t_data_dat[0].refValues.collect { it.date }
          OA_references: [t_data_dat]
```

valeur de retour: \["01/01/2005","02/01/2005","03/01/2005","04/01/2005"}

``` yaml
        OA_computation:
          OA_expression: >
            return references.t_data_dat[0].naturalKey
          OA_references: [t_data_dat]
```

valeur de retour: theix

A noter que referenceValues permet d'accéder aux métadonnées de la ligne. Si vous n'utilisez que les valeurs vous utiliserez la variable de contexte referenceValues

referencesValues :

``` groovy
    [
        ["key": "theix",
        "date": "01/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "02/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "03/01/2005",
        "name": "Theix"],
        ["key": "theix",
        "date": "04/01/2005",
        "name": "Theix"]
    ]
```

``` yaml
        OA_computation:
          OA_expression: >
            return referencesValues.collect{it.t_data_dat.date}
          OA_references: [t_data_dat]
```

valeur de retour: {"01/01/2005","02/01/2005","03/01/2005","04/01/2005"}

### headerRow

La liste de la ligne d'en-tête

headerRow:

``` groovy
    ["site",  "traitement","version"]
```

### preHeaderRow et postHeaderRow

La liste des lignes avant ou après la ligne d'en-tête et avant les lignes de données

## autres

-   application correspond à l'objet application correspondant à la configuration chargées
-   applicationName: identificateur de l'application
-   dataDescription: description du data courant tel que définie dans le fichier de configuration
-   dataName: identificateur du data courant
-   dataI18n: valeurs d'internationalisation pour ce data
-   currentRowNumber: numero de la ligne en cours
-   binaryFile: objet d'information du fichier déposé ou en cours de publication

Pour plus d'information sur ces valeurs vous pouvez tester un computed component avec la valeur en retour.

Copyright 2025, OpenADOM

 
  • Modifier cette page
  • Voir la source
  • Faire part d'un problème