Il existe beaucoup de données XML associées aux workflows Process Management d’AEM Forms on JEE. Par exemple, les informations XML peuvent être créées dans un processus et envoyées à une application Flex dans AEM Forms on JEE Workspace, utilisées pour les paramètres du système ou pour transmettre des informations à et depuis des formulaires. Il existe de nombreux cas où un développeur d’AEM Forms on JEE doit gérer du XML, ce qui nécessite souvent que le XML soit géré via un processus AEM Forms on JEE.
Lorsque vous utilisez des paramètres XML simples, vous pouvez utiliser le service Set Value
par défaut d’AEM Forms on JEE. Ce service définit la valeur d’un ou plusieurs éléments de données dans le modèle de données de processus. Pour une logique conditionnelle très simple « si ceci, alors cela », ce service peut répondre à l’objectif.
Cependant, dans des situations plus complexes, le service Set Value n’est pas aussi efficace. Dans ces situations, il faut s’appuyer sur un ensemble plus robuste de commandes de programmation, telles que celles fournies par un langage de programmation comme Java. L’utilisation de Java pour créer du XML complexe peut s’avérer beaucoup plus facile et plus claire que la création d’un document XML à partir d’un texte simple dans le service Set Value. En outre, il est plus facile d’inclure la programmation conditionnelle dans Java que dans un service Set Value.
Parmi tous les services AEM Forms on JEE standard disponibles dans AEM Forms on JEE Workbench se trouve le service Execute Script
. Ce service permet d’exécuter des scripts dans des processus et fournit l’opération executeScript
pour ce faire.
La création globale d’applications et de processus est hors de portée pour ce tutoriel, mais pour l’application de cette instruction, nous avons créé une application nommée « DemoApplication02 ». En supposant qu’une application ait déjà été créée, nous devons créer un processus dans cette application pour appeler le service executeScript. Pour ajouter un processus à l’application qui inclut le service Execute Script
:
executeScriptDemoProcess
.Foundation
. Le nom Services répertorie l’objet sous la forme Execute Script – 1.0
avec le nom d’opération executeScript
. Cliquez pour sélectionner cet élément.Une fois le processus créé avec l’activité de service Execute Script définie, il est possible d’ajouter un script à ce processus. Pour ajouter un script à ce processus :
Accédez à la palette Propriétés du processus. Dans cette palette, développez la section Entrée et cliquez sur l’icône « … ».
Dans la zone de texte qui s’affiche, écrivez votre script. Une fois le script écrit, appuyez sur OK (voir la figure ci-dessous).
Une fois qu’un processus a été créé avec le service Execute Script inclus, il est possible d’utiliser ce script pour créer du code XML. Il est possible d’écrire les scripts décrits ci-dessous dans la zone de texte décrite dans la section Ajouter un script au processus avec la section Service Execute Script
ci-dessus.
À propos de la technologie du service Execute Script
Pour connaître les capacités et les limites du service Execute Script, il faut connaître les fondements technologiques du service. AEM Forms on JEE utilise l’analyseur DOM (Apache Xerces Document Object Model) pour créer et stocker des variables XML dans des processus. Xerces est une implémentation Java de la spécification Document Object Model du W3C, définie ici. La spécification DOM est un moyen standard de manipuler XML qui existe depuis 1998. L’implémentation Java de Xerces, Xerces-J, prend en charge DOM Level 2 version 1.0.
Les classes Java utilisées pour stocker les variables XML sont :
org.apache.xerces.dom.NodeImpl et
org.apache.xerces.dom.DocumentImpl
DocumentImpl est une sous-classe de NodeImpl. On peut donc supposer que toute variable de processus XML est une dérivation de NodeImpl. Vous pouvez trouver la documentation de NodeImpl ici.
Exemple de création de fichier XML à l’aide du service Execute Script
Consultez ci-après un exemple de création de fichier XML au sein d’un service Execute Script. Le processus comporte une variable, un nœud, qui est de type XML. Le résultat final de cette activité sera un document XML. Lʼutilité de ce document, ou son application au processus global, est hors de portée de ce tutoriel ; tout dépend de ce que doit accomplir le document XML dans lʼapplication globale. Comme mentionné en introduction, le document XML peut servir à de nombreuses fins dans les formulaires et processus d’AEM Forms sur JEE. Ce tutoriel se contente d’expliquer comment coder l’activité Execute Script afin de générer un simple document XML.
Un script Java simple permettant de générer un document XML se présenterait comme suit :
import org.apache.xerces.dom.DocumentImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
Document document = new DocumentImpl();
Element topLevelResources = document.createElement("resources");
Element resource = document.createElement("resource");
resource.setAttribute("id", "first item id");
resource.setAttribute("value", "first item value");
topLevelResources.appendChild(resource);
document.appendChild(topLevelResources);
patExecContext.setProcessDataValue("/process_data/node", document);
les objets DOM susmentionnés doivent être importés dans le script.
Le résultat de ce script simple est un nouveau document XML avec un nœud de variable défini sur :
<resources>
<resource id="first item id" value="first item value"/>
</resources>
Utiliser une boucle itérative pour ajouter des nœuds au XML
Il est également possible d’ajouter des nœuds à une variable XML existante dans le processus. La variable, le nœud, contient l’objet XML que nous venons de créer.
Document document = patExecContext.getProcessDataValue("/process_data/node");
NodeList childNodes = document.getChildNodes();
int numChildren = childNodes.getLength();
for (int i = 0; i < numChildren; i++)
{
Node currentChild = childNodes.item(i);
if (currentChild.getNodeType() == Node.ELEMENT_NODE)
{
// found the top level node
Element newResource = document.createElement("resource");
newResource.setAttribute("id", "second item id");
newResource.setAttribute("value", "second item value");
currentChild.appendChild(newResource);
break;
}
}
patExecContext.setProcessDataValue("/process_data/node", document);
The variable node in the XML is now set to:
<resources>
<resource id="first item id" value="first item value"/>
<resource id="second item id" value="second item value"/>
</resources>