Clés DCX et associateurs d'événement pour le chaînage et l'imbrication de boîtes de dialogue
Dans le contexte de chaînage et d'imbrication de boîte de dialogue, les clés DCX et les associateurs n'influencent jamais un autre segment DCX de boîtes de dialogue. Quand une partie de transition d'une boîte de dialogue appelante utilise ou clé DCX ou un associateur, elle influence uniquement les données qui sont stockées dans le segment DCX de la boîte de dialogue appelante et non le segment de la boîte de dialogue appelée. De la même façon, quand une partie de transition d'une boîte de dialogue appelée utilise ou clé DCX ou un associateur, elle influence uniquement les données qui sont stockées dans le segment DCX de la boîte de dialogue appelée et non le segment de la boîte de dialogue appelante.
L'utilisation de clés DCX et d'associateurs dans le chaînage ou l'imbrication de boîte de dialogue est requis pour correctement échanger des données entre les boîtes de dialogue appelante et appelée. Dans de nombreux cas de figure, les boîtes de dialogue appelées sont développées de façon indépendante des boîtes de dialogue appelantes et ne sont pas destinées à faire partie d'une autre boîte de dialogue.
Prenons l'exemple d'un flux d'écran de réservation de voyage. Celui-ci se compose d'étapes permettant de réserver un vol, un hôtel et un véhicule après qu'une date de voyage particulière et une destination ont été spécifiées. Avant que l'agent puisse démarrer la réservation, les données personnelles du client doivent être collectées. Considérons qu'un autre flux d'écran, un flux d'écran de facturation, est déjà modélisé et permet à l'agent de rechercher ces données via un ID client. Le flux complet nécessite le démarrage de la réservation, la collecte et la mise à jour des données personnelles, et enfin l'exécution des réservations réelles.
travellerID est un flux d'écran bleu. Considérons que le flux d'écran de facturation qui transporte les données du client sous la clé customerID est un flux d'écran rouge. - Lors de l'étape 1, l'ID
travellerIDest spécifié avec la date du voyage et la destination. Le flux d'écran rouge est démarré de façon imbriquée. - Lors de l'étape 2, le flux d'écran rouge est supposé afficher les informations client telles que le nom et l'adresse.
- Lors de l'étape 3, le flux d'écran rouge doit autoriser la mise à jour des données client. Le flux d'écran rouge doit être renseigné avec l'ID
travellerIDmais attend que celui-ci soit envoyé avec un événement avecQName customerID. - L'ensemble des informations client telles que le nom et l'adresse est fourni dans un objet client spécial. Cet objet client est émis par la transition de fin du flux d'écran rouge sous la clé
customerBean. - Le flux d'écran bleu requiert ces données, mais attend leur envoi par un événement avec
QName travellerBean. L'IDtravellerIDdoit être converti encustomerIDettravellerBeanencustomerBean.
L'exemple de code suivant montre une option de conversion de l'événement Qnames. La transition sortante responsable de l'appel de la boîte de dialogue rouge a affecté l'attribut dcx-key avec la valeur customerID à l'élément d'événement associé au nœud final de transition source de cette transition. De ce fait, même si le noeud final de transition step_1 émet un événement avec QName travellerID, l'information est stockée dans le segment DCX de la boîte de dialogue bleue sous la clé customerID. Il peut ainsi être envoyé à la boîte de dialogue rouge via un événement avec QName customerID car le contenu correspondant se trouve dans le segment DCX de la boîte de dialogue bleue, exactement sous cette clé. La transition entrante de la boîte de dialogue bleue reçoit les informations client via un événement avec QName customerBean, mais stocke le contenu correspondant sous la clé travellerBean. Les données client peuvent ainsi être propagées avec des événements avec QName travellerBean car le contenu correspondant se trouve dans le segment DCX de la boîte de dialogue bleue, exactement sous ce nom.
<dialog name="dialog blue">
...
<transition type="nested">
<source>
<transition-endpoint nameref="step_1">
<event qname="travellerID" dcx-key="customerID"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="dialog red">
<event qname="customerID"/>
</transition-endpoint>
</target>
</transition>
...
<transition>
<source>
<transition-endpoint nameref="dialog red">
<event qname="customerBean" dcx-key="travellerBean"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="step 4">
<event qname="travellerBean"/>
</transition-endpoint>
</target>
</transition>
...
</dialog>
...
<dialog name="dialog red">
...
<transition type="start">
<source>
<transition-endpoint nameref="...">
<event qname="customerID"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="step_2">
<event qname="customerID"/>
</transition-endpoint>
</target>
</transition>
...
<transition type="end">
<source>
<transition-endpoint nameref="step 3">
<event qname="customerBean"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="PAGE ORIGIN">
<event qname="customerBean"/>
</transition-endpoint>
</target>
</transition>
...
</dialog>
...
</dialog>
Considérons que le flux d'écran qui transporte les données du client sous la clé travellerID est un flux d'écran bleu. Considérons que le flux d'écran qui transporte les données du client sous la clé customerID est un flux d'écran rouge. Considérons que l'ID travellerID est de type string et l'ID customerID de type Integer. Considérons également que les beans travellerBean et customerBean diffèrent non seulement par leur nom mais sont également de type d'objet différents.
L'exemple de code suivant montre une option de conversion des clés et du bean. Ces associateurs garantissent que les événements sont correctement renommés et que les types de données sont correctement transformés.
<dialog name="dialog blue">
...
<transition type="nested">
<source>
<transition-endpoint nameref="step 1">
<event qname="travellerID" mapper-class="B2RMapper"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="dialog red">
<event qname="customerID"/>
</transition-endpoint>
</target>
</transition>
...
<transition>
<source>
<transition-endpoint nameref="dialog red">
<event qname="customerBean" mapper-class="R2BMapper"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="step 4">
<event qname="travellerBean"/>
</transition-endpoint>
</target>
</transition>
...
</dialog>
...
<dialog name="dialog red">
...
<transition type="start">
<source>
<transition-endpoint nameref="...">
<event qname="customerID"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="step_2">
<event qname="customerID"/>
</transition-endpoint>
</target>
</transition>
...
<transition type="end">
<source>
<transition-endpoint nameref="step 3">
<event qname="customerBean"/>
</transition-endpoint>
</source>
<target>
<transition-endpoint nameref="PAGE ORIGIN">
<event qname="customerBean"/>
</transition-endpoint>
</target>
</transition>
...
</dialog>
...
</dialog>