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 einfache bedingte Logikszenarien mit dem Namen "if this, then that", kann dieser Dienst dem Zweck entsprechen.
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 z. B. die, die von einer Programmiersprache wie Java™ bereitgestellt werden. Die Verwendung von Java™ zum Erstellen komplexer XML-Dateien kann viel einfacher und klarer sein als das Erstellen eines XML-Dokuments aus einfachem Text innerhalb des Set Value-Dienstes. Darüber hinaus ist es einfacher, bedingte Programmierung in Java™ einzubinden als in einen Set Value-Dienst.
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 Anwendungs- und Prozesserstellung ist für dieses Tutorial nicht relevant, aber um dieser Anleitung willen wurde eine Anwendung mit dem Namen "DemoApplication02"erstellt. Wenn eine Anwendung bereits erstellt wurde, müssen Sie in dieser Anwendung einen Prozess erstellen, um den executeScript-Dienst 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 Eingabe und klicken Sie auf das Symbol "…".
Schreiben Sie Ihr Skript in das angezeigte Textfeld. Wenn das Skript geschrieben wurde, drücken 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 erfahren, welche Fähigkeiten und Einschränkungen der Execute Script-Dienst-Funktion aufweisen, muss man die technologischen Grundlagen des Dienstes 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 Dokumentobjektmodellspezifikation des W3C-Consortiums. definiert here. 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 zum Speichern von XML-Variablen verwendeten Java™-Klassen 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 hat einen Variablenknoten vom Typ XML. Das Ergebnis 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 JavaScript zur Ausgabe von XML würde in etwa so 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);
Die zuvor erwähnten DOM-Objekte müssen in das Skript importiert werden.
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 "node"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>