Les DVM (Domain Value Maps ) pour l’OSB

Suite à l’excellent article de santony sur l’utilisation des DVM (Domain Value Mapping) dans l’Oracle SOA Suite (c’est par ici), on se rend compte que c’est un outil très pratique. Mais est-ce qu’il serait possible de l’utiliser dans l’OSB ?
Malheureusement, les DVM ne sont pas natives dans l’OSB. Mais je vous rassure, il est possible de les utiliser !!

Créer un DVM
On va commencer par créer notre DVM à l’aide de JDeveloper.

  • Rendez-vous sur JDeveloper.
  • Créer un DVM « File > New > dvm ».
  • A l’aide de l’interface JDeveloper, ajouter les colonnes et les valeurs.

DVM-OSB-1
On peut toujours switcher en mode source, vu qu’un DVM est un fichier XML.
DVM-OSB-2
Notre DVM est prêt, il ne reste plus qu’à l’intégrer dans le Message Flow de notre Proxy Service.
Intégrer un DVM dans un Proxy Service
A l’aide de notre DVM nous allons construire un Proxy Service qui permet de retourner le code de département d’une ville donnée.

  • Rendez-vous sur OEPE.
  • Ci-dessous le Proxy Service « NumeroDepartementPS » avec un « Assign » et un « Replace ».

DVM-OSB-3
Copiez dans l’Expression de  l’Assign le contenu du fichier DVM crée précédemment et affectez le à une variable (dans ce cas « dvmNumDeptTable »).
DVM-OSB-4
A ce stade on a notre DVM dans une variable, maintenant on va créer notre transformation Xquery, avec  les  « Source Type » le message d’entrée et un paramètre « anyType » qui va recevoir la DVM.
DVM-OSB-5
Pour pouvoir récupérer une valeur correspondante aux critères fournis, nous avons besoin de la fonction « dvm : lookupValue ».  Malheureusement, cette fonction n’existe pas dans l’OSB, donc on va créer notre propre fonction.
[code language= »javascript »]
declare function dvm:lookupValue($dvmTable as element(*), $sourceColumnName as xs:string,
$sourceValue as xs:string, $targetColumnName as xs:string, $defaultValue as xs:string)
as xs:string {
let $idxSource as xs:integer := for $n at $i in $dvmTable/dvm:columns/dvm:column where ($n/@name = $sourceColumnName) return $i
let $idxTarget as xs:integer := for $n at $i in $dvmTable/dvm:columns/dvm:column where ($n/@name = $targetColumnName) return $i
let $res1 := $dvmTable/dvm:rows/dvm:row/dvm:cell[position() = $idxSource and text()=$sourceValue]/../dvm:cell[position() = $idxTarget]/text()
return
if (fn:string-length($res1) > 0) then
string($res1)
else
string($defaultValue)
};
[/code]
Les paramètres d’appel à cette fonction sont :

  • $dvmTable : la table dvm (la source XML).
  • $sourceColumnName : le nom de la colonne source.
  • $sourceValue : la valeur de la colonne source.
  • $targetColumnName : le nom de la colonne cible.
  • $defaultValue : la valeur par défaut, retourner dans le cas où la source Value n’existe pas.

NB : contrairement à la fonction dvm : lookupValue de JDeveloper, cette fonction ne prend pas en compte la notion de qualifier.
Il ne reste plus qu’à faire appel à notre fonction lookupValue, lors de la transformation
[code language= »xml »]{ dvm:lookupValue($dvmNumDepartTable, ‘Source’, fn:string($getNumeroDepartementRequest/Ville), ‘Reference’, ’00’) }[/code]
Ci-dessous la transformation Xquery complète.
[code language= »javascript »](:: pragma bea:global-element-parameter parameter="$getNumeroDepartementRequest" element="ns0:GetNumeroDepartementRequest" location="../WSDL/NumeroDepartement.wsdl" ::)
(:: pragma bea:global-element-return element="ns0:GetNumeroDepartementResponse" location="../WSDL/NumeroDepartement.wsdl" ::)
declare namespace ns0 = "http://www.example.org/Client/";
declare namespace xf = "http://tempuri.org/DVMProject/XQuery/numeroDepartementRequest/";
declare namespace dvm="http://xmlns.oracle.com/dvm";
declare function dvm:lookupValue($dvmTable as element(*), $sourceColumnName as xs:string,
$sourceValue as xs:string, $targetColumnName as xs:string, $defaultValue as xs:string)
as xs:string {
let $idxSource as xs:integer := for $n at $i in $dvmTable/dvm:columns/dvm:column where ($n/@name = $sourceColumnName) return $i
let $idxTarget as xs:integer := for $n at $i in $dvmTable/dvm:columns/dvm:column where ($n/@name = $targetColumnName) return $i
let $res1 := $dvmTable/dvm:rows/dvm:row/dvm:cell[position() = $idxSource and text()=$sourceValue]/../dvm:cell[position() = $idxTarget]/text()
return
if (fn:string-length($res1) > 0) then
string($res1)
else
string($defaultValue)
};
declare function xf:numeroDepartementRequest($getNumeroDepartementRequest as element(ns0:GetNumeroDepartementRequest),
$dvmNumDepartTable as element(*))
as element(ns0:GetNumeroDepartementResponse) {
{ dvm:lookupValue($dvmNumDepartTable, ‘Source’, fn:string($getNumeroDepartementRequest/Ville), ‘Reference’, ’00’) }
};
declare variable $getNumeroDepartementRequest as element(ns0:GetNumeroDepartementRequest) external;
declare variable $dvmNumDepartTable as element(*) external;
xf:numeroDepartementRequest($getNumeroDepartementRequest,$dvmNumDepartTable)[/code]
On lance un test avec la ville « Lille » pour vérifier qu’on reçoit bien le Code Département « 59 ».
DVM-OSB-6
Conclusion
Cet article montre une façon d’implémenter les fonctionnalités DVM dans l’Oracle Service Bus. Il est vrai que c’est un peu plus évident d’utiliser les DVM dans l’Oracle SOA Suite, mais l’approche reste similaire.
Sources
http://blog.easyteam.fr/2013/02/28/dvm-un-article-qui-na-rien-a-voir-avec-des-vms/
http://docs.oracle.com/cd/E14571_01/integration.1111/e10224/med_dvm.htm
http://guidoschmutz.wordpress.com/2009/12/25/implement-domain-value-maps-dvm-with-oracle-service-bus-osb-10r3/

1 réflexion sur “Les DVM (Domain Value Maps ) pour l’OSB”

Les commentaires sont fermés.