DVM (un article qui n’a rien à voir avec des VMs)

Lorsque l’on réalise un mapping, il est souvent nécessaire de convertir des données en plusieurs points (transformations XSLT, assign de processus…). Il n’est pas forcément pratique, ni maintenable, de réaliser ces traductions d’un code vers un autre, par exemple, dans chacune des transformations concernées. Heureusement, Oracle a pensé à nous avec les DVM (Domain Value Mapping) !

Présentation du DVM

Les DVM se présentent sous la forme de fichiers XML qui représente une sorte de table de référence.

   santony_dvm_001

L’interface de JDeveloper permet de l’administrer un peu comme une table, le tout de manière graphique. On pourra notamment

  • Add Domain : ajout d’une colonne (voir plus bas pour type)
  • Add Domain values : ajout d’une ligne de données

A tout moment l’on peut passer en mode source pour voir qu’il ne s’agit en effet que d’un format XML reproduisant une table, éditable directement :

<dvm name="code" xmlns="http://xmlns.oracle.com/dvm">
  <description>
  </description>
  <columns>
    <column name="code_app1"/>
    <column name="code_app2"/>
  </columns>
  <rows>
    <row>
      <cell>A1</cell>
      <cell>A2</cell>
    </row>
    <row>
      <cell>B1</cell>
      <cell>B2</cell>
    </row>
  </rows>
</dvm>

Il est également possible de mettre en place des colonnes ayant un « typage » un peu particulier : les « qualifiers ». Ces colonnes vont en fait permettre de préciser des informations concernant une ligne de données (valeurs complémentaires pour différencier 2 lignes qui pourraient correspondre). Il est à noter que la valeur d’un qualifier ne peut être récupérer par un lookup.
Pour imager l’utilisation de qualifiers, nous allons reprendre l’exemple proposé par Oracle :

santony_dvm_002

Dans  un premier temps, on remarque que si l’on se tenait à nos 2 colonnes d’origine, certaines villes seraient indifférenciables, que ce soit par le code ou le nom.
Pour différencier ces enregistrement, on a mis en place des qualifiers : pays et état. C’est grâce à ces qualifiers que l’on pourra identifier de manière unique un élément.
Ces qualifiers peuvent être ordonnés : si aucun résultat n’est trouvé avec tous les qualifiers, celui de rang plus élevé (sous entendu la valeur la plus basse, 1 étant un rang supérieur à 2) sera modifié pour une recherche à vide, jusqu’à trouver un résultat ou avoir épuisé tous les qualifiers.  Dès qu’un enregistrement est trouvé, il sera renvoyé. Cela permet d’effectuer des recherches hierarchiques, en partant de la recherche la plus exacte à la plus générale.

Les Fonctions DVM

Ces fonctions sont accessible par le menu « Advanced » de la « component palette » pour les transformations XSLT, et accessible pour les assign dans les processus. Il existe 2 fonctions qui pourront être utilisées : dvm:lookupValue et dvm:lookupValue1M

santony_dvm_003

Fonction dvm:lookupValue

Cette fonction permet de récupérer un unique résultat (sous entendu une colonne cible de la table DVM) correspondant aux critères fournis.
Voici les paramètres d’appel de la fonction :

  • Fichier DVM à utiliser
  • Nom de la colonne source
  • Valeur de la colonne source
  • Nom de la colonne cible
  • Valeur par défaut
  • Nom de la colonne du qualifier *
  • Valeur de la colonne du qualifier *

* autant de qualifier que voulu (Nom qualifier 1, valeur qualifier 1, Nom qualifier 2, valeur qualifier 2…)
Voici quelques exemples et les résultats attendus, par rapport au DVM ci-dessous (l’ordre des qualifier correspond à leur chiffre) :

santony_dvm_004

  • dvm:lookupValue(‘qualifiers.dvm’,’code’,’A’,’value’,’NotFound’)

Erreur : apparemment si des qualifiers sont en place, il faut les utiliser. Cette requête aurait fonctionné pour un DVM ayant uniquement code/value.

  • dvm:lookupValue(‘qualifiers.dvm’,’code’,’A’,’value’,’NotFound’,’qualifier1′,’qualifier1-A1′,’qualifier2′,’qualifier2-A1′)

value-A1

  • dvm:lookupValue(‘qualifiers.dvm’,’code’,’B’,’value’,’NotFound’,’qualifier1′,’qualifier1-GEN’,’qualifier2′,’qualifier2-GEN’)

value-B

Ce cas correspond à une recherche hiérarchique. Dans l’ordre :
- Qualifier2=qualifier2-GEN,Qualifier1=qualifier2-GEN, code=B
- Qualifier2=qualifier2-GEN,Qualifier1=, code=B
 avec qualifier1 à vide : c’est le qualifier ayant l’ordre le plus élevé
Cette dernière recherche a permis de trouver le résultat « value-B »
  • dvm:lookupValue(‘qualifiers.dvm’,’code’,’C’,’value’,’NotFound’,’qualifier1′,’qualifier1-GEN’,’qualifier2′,’qualifier2-GEN’)

value-C

Ce cas correspond à une recherche hiérarchique. Dans l’ordre :
Qualifier2=qualifier2-GEN,Qualifier1=qualifier2-GEN, code=C
Qualifier2=qualifier2-GEN,Qualifier1=, code=C
Qualifier2=,Qualifier1=, code=C
Cette dernière recherche a permis de trouver le résultat « value-C »
  • dvm:lookupValue(‘qualifiers.dvm’,’code’,’D’,’value’,’NotFound’,’qualifier1′,’qualifier1-GEN’,’qualifier2′,’qualifier2-GEN’)

NotFound : la valeur par défaut fournie, car il n’y a pas d’élément unique correspondant. Même via la recherche hiérarchique

Fonction dvm:lookupValue1M

Cette fonction permet de récupérer des résultats (sous entendu plusieurs colonne cibles de la table DVM) correspondant aux critères fournis.
Voici les paramètres d’appel de la fonction :

  • Fichier DVM à utiliser
  • Nom de la colonne source
  • Valeur de la colonne source
  • Nom de la colonne cible *

* Possibilité de demander plusieurs colonnes cibles (colonne cible 1, colonne cible 2…)
Les résultats sont renvoyés sous la forme d’un fragment XML.
Cette méthode ne permet pas l’utilisation de qualifiers. Cependant une combinaison bien mise en place permettra si besoin de faire un appel avec qualifiers pour déterminer un code, qui sera ensuite utilisé pour récupérer plusieurs champs.
Voici quelques exemples et les résultats attendus, par rapport au DVM ci-dessous :

santony_dvm_005

dvm:lookupValue1M(‘multiple.dvm’,’code’,’A’,’value1′,’value2′)

<value1>A-1</value1>
<value2>A-2</value2>

dvm:lookupValue1M(‘multiple.dvm’,’code’,’A’,’value1′)

<value1>A-1</value1>

Et le petit plus… ou peut être pas ?

Un petit complément qu’il faut souvent garder à l’esprit, sous peine de s’arracher les cheveux potentiellement pendant des heures : l’outil de test de mapping XSLT fourni par Jdeveloper ne supporte pas les fonction DVM ! Pas vraiment un petit plus en fait…
Mais voilà… ça parait anodin dis comme ça… mais si comme moi vous avez passé 3h à chercher à comprendre ce que vous faisiez mal dans l’utilisation des fonctions DVM, et qui provoquait une erreur sans explication lors de vos tests… là, ça vous paraitrait capital ! Finalement le savoir est un petit plus.

Conclusion

Grâce au DVM, on peut facilement mettre en place une factorisation des traductions de données qui transitent dans la SOA-Suite. Leur administration ressemblera à la gestion d’une table, mais au format XML.
Il est à noter que dans le cadre de cet article, nous avons évoqué l’utilisation de DVM dans un mapping XSLT, mais qu’il est également possible de les utiliser dans le cadre d’une opération dans un processus BPEL également, par exemple.

 Sources

2 réflexions sur “DVM (un article qui n’a rien à voir avec des VMs)”

  1. Ping : Les DVM (Domain Value Maps ) pour l’OSB | EASYTEAM LE BLOG

Les commentaires sont fermés.