Viele Prozess-Management-Workflows für AEM Forms on JEE beinhalten XML. XML-Informationen können zum Beispiel in einem Prozess erstellt und an ein Flex-Programm im Arbeitsbereich von AEM Forms on JEE gesendet oder für Systemeinstellungen verwendet werden oder mittels XML können Informationen an und von Formularen übergeben werden. Es gibt viele Fälle, in denen ein Entwickler für AEM Forms on JEE XML verwalten muss. Häufig muss dazu die XML über einen AEM Forms on JEE-Prozess verwaltet werden.
Bei einfachen XML-Einstellungen kann der Service Set Value
verwendet werden. Es handelt sich dabei um einen Standard-Service von AEM Forms on JEE. Dieser Service legt den Wert eines oder mehrerer Datenelemente im Prozessdatenmodell fest. Für Szenarien mit einer sehr einfachen bedingten „if this, then that“-Logik kann dieser Service den Zweck erfüllen.
In komplexeren Situationen ist der Service „Set Value“ jedoch nicht so effektiv. In diesen Situationen muss man sich auf einen robusteren Satz von Programmierbefehlen verlassen, wie sie beispielsweise eine Programmiersprache wie Java bietet. Die Verwendung von Java zum Erstellen komplexer XML-Dateien kann viel einfacher und klarer sein als das Erstellen eines XML-Dokuments aus einfachem Text im Service „Set Value“. Darüber hinaus ist es einfacher, bedingte Programmierung in Java als in den Service „Set Value“ einzubinden.
Zum Satz der Standard-Services von AEM Forms on JEE, die in der Workbench von AEM Forms on JEE verfügbar sind, gehört der Service Execute Script
. Dieser Service ermöglicht die Ausführung von Skripten in Prozessen und stellt hierzu den Vorgang executeScript
bereit.
Die allgemeine Erstellung von Programmen und Prozessen ist nicht Gegenstand dieses Tutorials, aber für diese Anleitung haben wir ein Programm namens „DemoApplication02“ erstellt. Wenn ein Programm bereits erstellt wurde, müssen wir in diesem Programm einen Prozess erstellen, um den executeScript-Service aufzurufen. So fügen Sie dem Programm einen Prozess hinzu, der den Service Execute Script
beinhaltet:
executeScriptDemoProcess
genannt.Foundation
der Services. Unter „Services“ wird das Objekt als Execute Script – 1.0
mit dem Vorgangsnamen executeScript
aufgeführt. Wählen Sie dieses Element aus, indem Sie darauf klicken.Nachdem der Prozess mit der definierten Aktivität „Execute Script“ erstellt wurde, kann diesem Prozess ein Skript hinzugefügt werden. So fügen Sie diesem Prozess ein Skript hinzu:
Navigieren Sie zur Palette Prozesseigenschaften. Erweitern Sie in dieser Palette den Abschnitt Eingabe und klicken Sie auf das Symbol „…“.
Schreiben Sie Ihr Skript in das angezeigte Textfeld. Wenn das Skript vollständig eingegeben wurde, wählen Sie „OK“ (siehe Abbildung unten).
Nachdem ein Prozess, der den Service „Execute Script“ enthält, erstellt wurde, kann dieses Skript zur Erstellung von XML verwendet werden. Sie würden die unten beschriebenen Skripte in das Textfeld eingeben, das im Abschnitt „Hinzufügen eines Skripts zum Prozess mit dem Service Execute Script
“ weiter oben beschrieben wurde.
Über die Technologie des Service „Execute Script“
Um zu wissen, welche Funktionen und Einschränkungen der Service „Execute Script“ hat, müssen Sie die technologischen Grundlagen des Service kennen. AEM Forms on JEE verwendet den Parser Apache Xerces Document Object Model (DOM), um XML-Variablen in Prozessen zu erstellen und zu speichern. Xerces ist eine Java-Implementierung der W3C-Spezifikation von Document Object Model, deren Definition hier zu finden ist. Die DOM-Spezifikation ist ein Standardverfahren zur Bearbeitung von XML, das seit 1998 existiert. Die Java-Implementierung von Xerces, Xerces-J, unterstützt DOM Level 2 Version 1.0.
Die Java-Klassen, die zum Speichern von XML-Variablen verwendet werden, sind:
org.apache.xerces.dom.NodeImpl und
org.apache.xerces.dom.DocumentImpl
DocumentImpl ist eine Unterklasse von NodeImpl. Daher kann angenommen werden, dass jede XML-Prozessvariable eine NodeImpl-Ableitung ist. Die Dokumentation für NodeImpl finden Sie hier.
Beispiel für die XML-Erstellung mit dem Service „Execute Script“
Im Folgenden finden Sie ein Beispiel für das Erstellen von XML in einem Service „Execute Script“. Der Prozess verfügt über eine Variable, einen Knoten, der vom Typ XML ist. Das Endergebnis dieser Aktivität ist ein XML-Dokument. Was dieses Dokument tut oder wie es auf den gesamten Prozess angewendet wird, ist für dieses Tutorial nicht relevant. Letztlich geht es darum, was XML im übergeordneten Programm tun muss. Wie in der Einführung erwähnt, kann XML in AEM Forms on JEE-Formularen und -Prozessen für viele Zwecke verwendet werden. Dies ist lediglich eine Erklärung dafür, wie die Aktivität „Execute Script“ kodiert wird, um ein einfaches XML-Dokument auszugeben.
Ein einfaches Java-Skript zur Ausgabe von XML würde in etwa wie folgt aussehen:
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);
dass die oben genannten DOM-Objekte in das Skript importiert werden müssen.
Das Ergebnis dieses einfachen Skripts ist ein neues XML-Dokument mit einem Variablenknoten, der auf Folgendes festgelegt ist:
<resources>
<resource id="first item id" value="first item value"/>
</resources>
Verwenden einer iterativen Schleife zum Hinzufügen von Knoten zur XML-Datei
Knoten können auch innerhalb des Prozesses zu einer vorhandenen XML-Variablen hinzugefügt werden. Die Variable, der Knoten, enthält das soeben erstellte XML-Objekt.
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>