Drop Target – Syntax
User Guide
Getting Started
Ein JellyScript beginnt typischerweise mit der Definition der benötigten Namesräume:
ROOT eines JellyScripts
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary"/>
Als nächstes muss ein Schrank ausgewählt werden, in dem Aktionen ausgeführt werden sollen. Es ist auch möglich, mehrere Schränke parallel zu definieren. Diese werden dann sequenziell abgearbeitet.
Definition eines Schranks
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="${foldername}" keyType="INTERNAL_NAME"/>
</j:jelly>
Das Attribut key definiert den Bezeichner des Schranks. Die Art des Bezeichners (keyType) ist per default auf INTERNAL_NAME gesetzt und wird an alle untergeordneten Tags vererbt. Falls auf einer tieferen Ebene eine andere Art des Bezeichners (z. B.: NAME) benötigt wird, kann die Vererbung aber auch übersteuert werden.
Innerhalb des Schranks können nun weitere Aktionen definiert werden. Vor allem ist es jetzt möglich ServerJobs zu erstellen, die sequenziell abgearbeitet werden.
Definition von ServerJobs
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert/>
</os:cabinet>
</j:jelly>
In diesem JellyScript wird ein neues Objekt im Schrank (interner Name "customer") angelegt. Der ServerJob muss ein Objekt enthalten, auf das er angewendet werden soll.
Definition von ServerJobs
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert>
<os:folder>
<os:field key="name">Mueller</os:field>
<os:field key="firstname">Franz</os:field>
</os:folder>
</os:insert>
</os:cabinet>
</j:jelly>
In diesem Fall wird ein Kundenordner angelegt, bei dem die Felder "name" bzw. "lastname" mit den Werten "Mueller" bzw. "Franz" belegt werden. Da der Bezeichner des Ordners (key) mit dem des Schranks übereinstimmt, wird dieses Attribut nicht angegeben.
Referenzen
In vielen Fällen ist es notwendig, die Ergebnisse von ServerJobs weiterzuverarbeiten. Um dies zu ermöglichen, gibt es die Attribute id und ref. Mit id wird ein Objekt in den JellyContext geschrieben, über ref kann dieses Objekt dann an einer anderen Stelle weiterverwendet werden.
Im folgenden Skript wird nach einem Objekt gesucht, welches dann gelöscht wird.
Referenzen
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:search id="myfolder">
<os:folder>
<os:field key="name">Mueller</os:field>
<os:field key="firstname">Franz</os:field>
</os:folder>
</os:search>
<os:delete>
<os:folder ref="myfolder"/>
</os:delete>
</os:cabinet>
</j:jelly>
Das Ergebnis der Suche wird unter dem Bezeichner "myfolder" in den JellyContext geschrieben. Der Folder-Tag innerhalb des Delete-Tags verweist nun auf das Ergebnis der Suche. Der gefundene Ordner wird also gelöscht. Per default schreibt das Search-Tag das erste Ergebnis in den JellyContext. Dieser Modus lässt sich aber auch übersteuern.
Invalide XML
Es kann vorkommen, das via Variablen komplexe Inhalte dem Kontext von Droptargets hinzugefügt werden.
Vor allem bei Emails tauchen häufig Steuerzeichen im Kontext auf, welche allerdings in XML invalide sind.
Falls solch ein Sonderzeichen/Controll im XML/Jelly-Kontext auftaucht, führt das sehr wahrscheinlich zu schwerwiegenden Fehlern innerhalb des XML-Interpreters und das Programm bricht sofort ab!
Durch Verwendung der Option skipInvalidXML kann der Inhalt eines <os:field> auf invalide Zeichen überprüft werden. Diese werden dann einfach aus dem Kontext entfernt.
Vorsicht
Gelöschte Zeichen stellen einen Datenverlust da!
Bei ohnehin nicht sichtbaren Steuerzeichen dürfte dass in den meisten Anwendungsfällen kein Problem darstellen.
Sonderzeichen können nur über eine Variable in den Kontext verwiesen werden.
Direkte Benutzung macht das gesamte Jelly-Script/Droptarget technisch ungültig.
Codebeispiel
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="test_cabinet">
<os:search id="getMailArchive">
<os:folder osid="116818" id="testArchive" purpose="SEARCH">
<os:field key="name" keyType="Internal_Name">test_posselt</os:field>
<os:field key="firstname" keyType="Internal_Name">test_ca</os:field>
</os:folder>
</os:search>
<os:insert>
<os:folder ref="testArchive" purpose="LOCATION"/>
<os:document id="InsertedObject" key="xml_validation" purpose="INSERT">
<os:field key="valide" keyType="Internal_Name" skipInvalidXML="true">
Some text for int${XMLError}egration
</os:field>
<os:field key="invalide" keyType="Internal_Name">
Some text for int XMLError egration
</os:field>
</os:document>
</os:insert >
</os:cabinet>
</j:jelly>
{"XMLError":""}
Encoding (Nicht freigegeben)
Das Object SimpleFieldTag und alle die davon erben, besitzten eine Möglichkeit den übergebenen Value in einem bestimmten Format zu codieren. Dafür gibt es mehrere Verfahrensmöglichkeiten.
encodingBehaviour(not case-sensitiv)
Report: wirft eine Exception, falls ein unverarbeitbares Zeichen auftaucht
Ignore(DEFAULT): ignoriert alle unzulässigen Zeichen → möglicher dauerhafter Datenverlust
Replace: ersetzt alle ungültigen Zeichen durch ein Platzhalter
EncodingFormat(not case-sensitiv)
UTF-8(DEFAULT), US-ASSCII, ISO-8859-1, etc..
FORBIDDEN: JIS_C6226-1983, JIS_X0212-1990, HZ-GB-2312, JOHAB
Encoding
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:search id="myfolder">
<os:folder>
<os:field key="name" encodingFormat="ISO-8859-1" encodingBehaviour="REPLACE">façade</os:field>
<os:field key="firstname">にも、息子はこの四月</os:field> <!--encodingFormat=UTF-8 encodingBehaviour="IGNORE" -->
</os:folder>
</os:search>
<os:delete>
<os:folder ref="myfolder"/>
</os:delete>
</os:cabinet>
</j:jelly>
ServerJobs mit mehreren Objekten
Einige ServerJobs benötigen die Angabe mehrerer Objekte. Hierbei muss die Aufgabe der Objekte explizipt angegeben werden. Dies geschieht über das Attribut purpose.
ServerJobs mit mehreren Objekten
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert file="mypdf">
<os:document id="mynewdocument" key="doc" purpose="INSERT"/>
<os:folder osid="5566" purpose="LOCATION"/>
</os:insert>
</os:cabinet>
</j:jelly>
In diesem Droptarget wird ein Dokument angelegt. Dies geschieht mit dem insert-Tag. Hierbei wird das Objekt mit dem Attribut purpose="INSERT" als anzulegendes Objekt (in diesem Fall ein Dokument mit dem internen Namen "doc") definiert. Das Objekt mit dem Attribut purpose="LOCATION" definiert dann den Standort. Hierbei handelt es sich um einen Ordner mit der osid "5566".
Die meisten ServerJobs haben einen Standardzweck. Dem ersten Objekt, beim dem purpose Attribut nicht explizit gesetzt wurde, wird dieser Zweck dann zugeordnet. Im Beispiel könnte man purpose="INSERT" für os:document weglassen. Dieses Attribut würde automatisch gesetzt werden.
Zugriff auf Variablen
Innerhalb eines JellyContext hat man Zugriff auf unterschiedliche Variablen. Hierzu zählen:
Variablen, die von außerhalb an das JellyScript übergeben wurden
IDs und ObjektTypIDs von Objekten
Attribute von Objekten (Feldwerte)
Der Zugriff auf diese Attribute erfolgt über folgende Notation
Zugriff auf Variablen
${NAME_DES_UEBERGEBEN_ATTRIBUTS}
${OBJEKTNAME.FELDNAME}
${OBJEKTNAME['FELDNAME']}
In Zeile 1 wird auf ein übergebenes Attribut zugegriffen. Zeile 2 und 3 greifen auf das Feld eines Objekts zu. Wobei die Notation in Zeile 3 nur notwendig ist, wenn der Name des Feldes Leer- und/oder Sonderzeichen enthält.
Außerdem gibt es noch reservierte Felder, die den Zugriff auf bestimmte Objektinformationen erlauben:
Zugriff auf Attribute
${OBJEKTNAME.key}
${OBJEKTNAME.keyType}
${OBJEKTNAME.osid}
${OBJEKTNAME.objectTypeId}
Zugriff auf mitgesendete Dateien
Dateien, die zusammen mit den JSON-Daten zum DropTarget hochgeladen wurden, können über das file-Attribute angesprochen werden. Bei einem Insert- oder Update-Tag existiert ein file-Attribut, das, wenn es weggelassen wird, den Wert DEFAULT_FILE enthält. DEFAULT_FILE verweist auf den Multipartteil file, der standardmäßig die einzige hochzuladene Datei enthält. Existieren nun mehrere Insert- und/oder Update-Tags im DropTarget, kann mit dem file-Attribute das Anhängen der hochgeladenen Datei gesteuert werden:
Steuerung Dateiuploadzuordnung
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert>
<os:document id="mynewdocument" key="doc" purpose="INSERT"/>
<os:folder osid="5566" purpose="LOCATION"/>
</os:insert>
</os:cabinet>
</j:jelly>
Da im Insert-Tag im vorherigen Beispiel das file-Attribute weggelassen wurde, wird dem nachfolgenden os:document die hochgeladene Datei angehängt. Dem nachfolgenden Folder hingegen nicht, da er kein purpose="INSERT" hat.
Im nachfolgenden Beispiel wird das file-Attribut angegeben und trägt den Wert IGNORE. IGNORE steht hierbei nicht pauschal für "Ignoriere den Dateianhang bei diesem Insert". Vielmehr sucht das DropTarget nach einem Multipart-Abschnitt namens IGNORE. Wenn ein Dateiupload mit diesem Schlüssel hochgeladen wurde, wird dem inneren Insert die Datei angehängt. Wird der Multipart-Abschnitt nicht gefunden, so bekommt der Insert keinen Dateianhang. Über das file-Attribut kann somit der Multipart-Abschnitt festgelegt werden, der für das innere Objekt den Dateianhang beinhaltet. Ist der Abschnitt vorhanden, wird die Datei dem ECM-Objekt angehängt, wenn nicht dann nicht.
Steuerung Dateiuploadzuordnung
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert file="IGNORE">
<!-- Das DropTarget sucht nun nach einem Multipart-Teil namens IGNORE -->
<os:document id="mynewdocument" key="doc" purpose="INSERT"/>
<os:folder osid="5566" purpose="LOCATION"/>
</os:insert>
</os:cabinet>
</j:jelly>
Bislang haben wir immer nur mit einem Dateianhang gearbeitet. DropTargets können auch mehrere mitgesendete Dateien verarbeiten. Dies geschieht wie zuvor über das file-Attribut. Das file-Attribut beinhaltet den Multipart-Abschnitt der jeweiligen Datei. Nun kann verschiedenen os:insert und/oder os:update Tages unterschiedliche Dateien angehängt werden:
Steuerung Dateiuploadzuordnung
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:insert file="file1">
<os:document id="mynewdocument1" key="doc" purpose="INSERT"/>
<os:folder osid="5566" purpose="LOCATION"/>
</os:insert>
<os:insert file="file2">
<os:document id="mynewdocument1" key="doc" purpose="INSERT"/>
<os:folder osid="5566" purpose="LOCATION"/>
</os:insert>
</os:cabinet>
</j:jelly>
Beim vorherigen Beispiel kann das DropTarget zwei Dateianhänge verarbeiten, die im Multipart-Abschnitt "file1" und "file2" hochgeladen wurden.
Logging
Der Zugriff auf Objektinformationen ist vor allem beim Erstellen von sprechenden Logging Nachrichten sinnvoll. Ein Beispiel dazu würde wie folgt aussehen:
Logging
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="Kunde" keyType="name">
<os:insert>
<os:register key="Supportcall" id="suppcall">
<os:field key="Call-Nr">${myNumber}</os:field>
</os:register>
<os:folder osid="1494"/>
</os:insert>
<os:logger level="info">Der Supportcall ${myNumber} wurde erstellt und hat die osid ${supportcall.osid}!</os:logger>
</os:cabinet>
</j:jelly>
Nach erfolgreichem Anlegen eines Supportcalls wird ein Logeintrag im INFO Level geschrieben.
Es ist zu empfehlen, <logger> außerhalb von ServerJobs zu positionieren. Andernfalls werden die Logs geschrieben, noch bevor die ServerJobs abgearbeitet wurden.
Umgang mit mehreren Treffern
Weiter oben wurde schon erwähnt, dass es möglich ist, über den Suchmodus die Anzahl der Treffer, die eine Suche liefert, zu definieren. Per default wird der erste Treffer in den JellyContext geschrieben. Es ist aber auch möglich, mit mode="ALL", alle Treffer zu erhalten.
Zugriff auf Trefferlisten
${OBJEKTNAME[0].FELDNAME}
${OBJEKTNAME.FELDNAME}
${OBJEKTNAME[n].FELDNAME}
In Zeile 1 wird auf das Feld des ersten Objekts zugegriffen. Das erste Objekt lässt sich aber auch ohne explzite Angabe des Index ansprechen (Zeile 2). So ist es möglich, Änderungen am Suchmodus durchzuführen, ohne andere Stellen im Skript anpassen zu müssen. Auf alle weiteren Objekte wird mit dem entsprechenden Index zugegriffen (Zeile 3).
Mehrzweck-Tags
Einige Arbeitsabläufe, die öfter benötigt werden, wurden zu Tags zusammengefasst.
<select>
Dieser Tag sucht nach einem Objekt und kann es optional anlegen, wenn es nicht vorhanden ist, oder aktualisieren.
Select Tag
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="qsmanuals">
<os:select id="folder">
<os:folder purpose="SEARCH">
<os:field key="name">Testhandbuch</os:field>
<os:field key="author">Max Muster</os:field>
</os:folder>
<os:folder purpose="INSERT, UPDATE">
<os:field key="name">Testhandbuch</os:field>
<os:field key="author">Max Muster</os:field>
<os:field key="visiblefor">Schmidt</os:field>
<os:field key="editfor">Meier</os:field>
</os:folder>
</os:select>
</os:cabinet>
</j:jelly>
Es ist möglich, Mehrzweckobjekte zu definieren. Im Fall oben wird derselbe Ordner für das Einfügen wie auch für das Aktualisieren verwendet.
Per default sind sowohl update wie auch insert mit den Werten true belegt. Deshalb müssen auch Objekte für den Zweck INSERT und UPDATE definiert werden.
Prozessoren verwenden
Mit Hilfe von Datei-Prozessoren ist es möglich, Metadaten auszulesen und im DropTarget zu verwenden.
Datum formatieren
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:email id="Mail" />
<os:cabinet key="Emailarchiv" keyType="name">
<os:insert id="InsertedObject" >
<os:register osid="14024315" purpose="LOCATION"/>
<os:document key="Email" purpose="INSERT">
<os:field key="MAIL_TO" keyType="Internal_Name">${Mail.TO}</os:field>
<os:field key="MAIL_FROM" keyType="Internal_Name">${Mail.FROM}</os:field>
</os:document>
</os:insert>
</os:cabinet>
</j:jelly>
Der E-mail-Prozessor wird in der zweiten Zeile definiert. Dateien in unterstützten Dateiformaten können dem DropTarget übergeben werden und deren auslesbaren Metadaten über ${<id>.<attribut>} referenziert werden.
Prozessoren sind unabhängig von Schränken und können daher auch außerhalb von <cabinet>-Tags stehen.
Datum formatieren
Um ein Datum nach einem entsprechenden Muster zu formatieren, bietet Jelly-Bordmittel an, die sich an der JSP Standard Tag Library orientieren.
Datum formatieren
<j:jelly xmlns:j="jelly:core" xmlns:fmt="jelly:fmt" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<j:new var="currentDate" className="java.util.Date"/>
<fmt:setLocale/>
<fmt:formatDate pattern="yyyy" value="${currentDate}" var="year"/>
</j:jelly>
In Zeile 1 wurde der Namesbereich "fmt" definiert. Danach wird eine Variable angelegt und dann nach dem Muster "yyyy" formatiert als "year" in den Kontext geschrieben. Über ${year} lässt sich nun innerhalb des JellyScripts auf das aktuelle Jahr zugreifen.
Datum konvertieren
enaio® arbeitet mit 3 (sic!) unterschiedlichen Datumstypen: UNIX-Timestamp, deutsches Datum und deutsches Datum mit Uhrzeit. Anwendungen, die die Droptargets benutzen, sollen ein Datum immer als UNIX-Timestamp bereitstellen. Da enaio® selbstständig keine Konvertierung durchführen kann, muss diese innerhalb der droptargets durchgeführt werden.
Datum konvertieren
<j:jelly xmlns:j="jelly:core" xmlns:fmt="jelly:fmt" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<j:new var="currentDate" className="java.util.Date">
<j:arg value="${(timestamp * 1000)}" type="long"/>
</j:new>
<fmt:setLocale/>
<fmt:formatDate pattern="dd.MM.yyyy" value="${currentDate}" var="date"/>
</j:jelly>
In den Zeilen 2 bis 4 wird die Variable "timestamp" (enthält einen UNIX-Timestamp) in ein Java-Date-Objekt umgewandelt. In Zeile 7 wird dieses Objekt in das Format "dd.MM.yyyy" konvertiert und in der Variable "date" gespeichert.
Mehrere Tabellenzeilen hinzufügen
Mit den Jelly-Bordmitteln ist es auch möglich, mehrere Tabellenzeilen innerhalb eines Objekts hinzuzufügen. Hierbei wird <forEach> aus dem Jelly-Namesbereich eingesetzt.
Mehrere Tabellenzeilen
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="customer">
<os:update>
<os:folder id="myfolder">
<os:table key="history">
<j:forEach items="${hist}" var="entry">
<os:row>
<os:field key="date">${entry.date}</os:field>
<os:field key="username">${entry.user}</os:field>
<os:field key="state">${entry.state}</os:field>
<os:field key="priority">${entry.prio}</os:field>
</os:row>
</j:forEach>
</os:table>
</os:folder>
</os:update>
</os:cabinet>
</j:jelly>
In Zeile 8 wird eine Schleife definiert. Es wird über eine Liste iteriert, die unter dem Namen "hist" im JellyContext vorhanden ist. Die einzelnen Einträge der Liste sind dann unter dem Namen "entry" erreichbar. Innerhalb des Schleife muss es ein <row> geben, das wiederum die einzelnen Spalten der Tabellenzeile enthält.
Exemplarischer Aufbau der Variable in JSON
{
"hist":[
{
"date":"01.02.2001",
"user":"Hans",
"state":"Verhandlung"
},
{
"date":"12.12.2000",
"user":"Petra",
"state":"abgeschlossen",
"prio":"hoch"
}
]
}
Bei der Variable handelt es sich um eine Liste, die als Einträge Key-Value-Paare enthält (Map).
Sollen vorhandene Tabellendaten überschrieben werden, ist die Serverjoboption REPLACETABLEFIELDS zu setzen.
Eine Verweiskopie erstellen
Eine Verweiskopie wird mit <link> erstellt.
Verweiskopie erstellen
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="Emailarchiv" keyType="name">
<os:link>
<os:document ref="email"/>
<os:register ref="standortFuerDieVerweiskopie" purpose="LOCATION"/>
</os:link>
</os:cabinet>
</j:jelly>
Ein Verweisdokument (alias Grüner-Pfeil-Verweis) erstellen
Ein Verweisdokument wird mit <reference> erstellt.
Verweisdokument erstellen
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="Kunde" keyType="name">
<os:reference>
<os:document key="Email">
<os:field key="Von:">peter@optimal-systems.de</os:field>
<os:field key="An:">schmidt@optimal-systems.de</os:field>
<os:field key="Datum:">12.12.2013</os:field>
</os:document>
<os:document ref="dokumentAufDasVerwiesenWerdenSoll" purpose="SOURCE"/>
<os:register ref="standortFuerDasVerweisdokument" purpose="LOCATION"/>
</os:reference>
</os:cabinet>
</j:jelly>
Falls das Dokument, auf das verwiesen werden soll, aus einem anderen Schrank kommt, so muss bei einer evtl. Suche auch ein weiteres <cabinet> genutzt werden!
Einen Workflow-Prozess starten
Innerhalb eines Droptargets lassen sich auch Processe starten (mit Workflowfamilien-ID).
Prozess starten
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:start>
<os:process wfid="F265B0168961493887A269A30530F0ED" clientType="OS_DESKTOP_CLIENT">
<os:datafield type="string" key="s_EMail">meine@mail.de</os:datafield>
<os:datafield type="string" key="d_Eingang">NEIN</os:datafield>
<os:object osid="123456" objectTypeId="141222"/>
<os:object ref="myfolder"/>
</os:process>
</os:start>
</j:jelly>
Einen Prozess startet man mit dem start-Tag. Analog zu den anderen ServerJobs, muss das start-Tag einen process-Tag und dieser wiederum datafield-Tags enthalten. Aktendokumente zum Workflow können innerhalb des <os:process>-Bereiches mittels <os:object> angehängt werden. Ein Aktendokument kann hierbei wahlweise über die osid und objectTypeId oder über eine ref-Referenz zu einem zuvor gesuchten Dokument/Register/Ordner (vgl. Mehrere Tabellenzeilen hinzufügen) angehängt werden. Die osid und objectTypeId kann auch als Resultat eines Inserts weiterverwendet werden. Hierzu muss der Insert-Tag eine ID aufweisen. Dann kann innerhalb von <os:object> die osId und objectTypeId über die Variable ${ID-Tag-Value-vom-Insert.osid} und ${ID-Tag-Value-vom-Insert.objectTypeId} eingesetzt werden:
Variable für osid und objectTypeId
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:start>
<os:process wfid="F265B0168961493887A269A30530F0ED" clientType="OS_DESKTOP_CLIENT">
...
<os:object osid="${ID-Tag-Value-vom-Insert.osid}" objectTypeId="${ID-Tag-Value-vom-Insert.objectTypeId}"/>
</os:process>
</os:start>
</j:jelly>
Der start-Tag kann sich sowohl im root wie auch in einem cabinet-Tag befinden.
Beschreibung für einen Client hinzufügen
Falls die Droptargets von einem Client benutzt werden sollen, können Informationen über das Droptarget und die benötigten Felder mit angegeben werden.
Beschreibung
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<description>
<title>Ablage Eingangsrechnung</title>
<longtitle>
Ablage von Eingangsrechnungsdokumenten in einem separaten Register der Kundenakte.
</longtitle>
<helptext>
help help help
</helptext>
<acceptedmimetypes>
<mimetype>image/.*</mimetype>
<mimetype>.*/.*pdf</mimetype>
</acceptedmimetypes>
<field required="true" type="DATE" size="199" validate="^4[0-9]{12}(?:[0-9]{3})?$">fieldname</field>
<cabinet key="Kunde">
<object key="Kunde">
<field key="SUPFEST" validate="^4[0-9]{12}(?:[0-9]{3})?$">fieldname1</field>
<field key="Firmenname">fieldname2</field>
<field key="Bundesland">fieldname3</field>
</object>
</cabinet>
<files>
<file fileid="DOC_01" filetype="PDF"/>
<file fileid="DOC_02" filetype="PDF"/>
</files>
</description>
</j:jelly>
Die Beschreibung muss sich in <description> befinden. Allgemeine Infos zum Droptarget können mit <title>, <longtitle> und <helptext> definiert werden. Um Felder zu definieren, gibt es zwei Möglichkeiten:
Ein Feld mit allen benötigten Informationen direkt unter <description> angeben.
Ein Feld in einer <cabinet> <object> Struktur angeben; die Informationen werden aus der Objektdefinition geparsed.
Das Attribut "validate" ist optional. Es muss vom Client ausgewertet werden.
Sollen dem DropTarget mehrere Dateien mitgegeben werden, können unter <files> IDs gesetzt werden. Wenn nur eine Datei übergeben wird, sind die IDs hinfällig – es wird der interne Standardname ("Default_Files") verwendet.
Eine E-Mail per EMS-Service persistieren
Es ist möglich, Mailobjekte vereinheitlicht in enaio® zu persistieren. Der Vorteil ist eine einheitliche Verschlagwortung durch den EMS-Webservice.
Persitieren mit EMS
<j:jelly xmlns:j="jelly:core" xmlns:os="jelly:com.os.droptargets.DropTargetTagLibrary">
<os:cabinet key="iEmailarchiv">
<os:search id="getMailArchive">
<os:folder id="mailArchive" purpose="SEARCH">
<os:field key="iPostfach" keyType="Internal_Name">MyTest</os:field>
</os:folder>
</os:search>
<os:search id="getTargetPostfach">
<os:folder ref="getMailArchive" purpose="LOCATION"/>
<os:register id="ablageTarget" key="iAblage" keyType="Internal_Name" purpose="SEARCH">
<os:field key="iAblageName" keyType="Internal_Name">PosseltAblage</os:field>
</os:register>
</os:search>
<os:ems id="PersistedObjected" serviceUrl="/api/store" serverUrl="http://10.10.0.44" serverPort="7361">
<os:register ref="getTargetPostfach" purpose="LOCATION"/>
<os:document key="iEmailarchivEmail" objectTypeId="393233" purpose="INSERT"/>
</os:ems>
</os:cabinet>
</j:jelly>
Tags
Schrank
<cabinet>
Gibt an, in welchem Schrank alle weiteren Aktionen durchgeführt werden sollen.
Kann enthalten sein in:
<root>
Kann enthalten:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<link>
<reference>
<select>
<logger>
<return>
Attribute:
key
: Bezeichner des SchrankskeyType
(optional): 'name' oder 'internal_name (default)'
Serverjobs
Die folgenden Tags stellen Serverjobs dar.
<search>
Dieser Tag führt eine kombinierte Suche durch. Es können 1 bis n Suchobjekte angegeben werden, wobei das erste das Ergebnisobjekt definiert.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
SEARCH 1-mal (default): Objekt, nach dem gesucht werden soll
COMBINED_SEARCH n-mal: weitere Objekte aus demselben Schrank, die die Suche eingrenzen
LOCATION 0/1-mal: Standort des gesuchten Objekts. Hierbei muss es sich um einen Ordner oder Register handeln, bei dem die osid gesetzt ist. Nicht geeignet für die Suche nach Ordnern.
Attribute:
id: Bezeichner, mit dem innerhalb des JellyContexts auf die Suchergebnisse zugegriffen werden kann
mode (optional):Suchmodus, folgende Auswahl ist möglich:
FIRST (default): erster Treffer wird zurück geliefert
ALL: alle Treffer werden zurück geliefert
EXACTLY_ONE: es wird ein Fehler geworfen, wenn es mehr als einen Treffer gibt. Ansonsten wird der Treffer zurück geliefert.
AT_LEAST_ONE: es wird ein Fehler geworfen, wenn es keine Treffer gibt. Ansonsten werden alle Treffer zurück geliefert.
<update>
Dieser Tag aktualisiert ein Objekt. Das Attribut osid muss gesetzt sein.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<options>
<folder>
<register>
<document>
<object>
Benötigte Objekte:
UPDATE 1-mal (default): Objekt, das aktualisiert werden soll
Attribute:
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n).
Falls nicht angegeben, wird der default Name verwendet.
<insert>
Dieser Tag fügt ein Objekt in einen Standort oder als neue Variante ein.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
Beim Einfügen eines Ordners
INSERT 1-mal (default): Ordner, der eingefügt werden soll
Beim Einfügen eines Registers/Dokuments
INSERT 1-mal (default): Register/Dokument, das eingefügt werden soll
LOCATION 1-mal: Zielstandort (Ordner/Register) oder Elternvariante (Dokument)
Attribute:
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n).
Falls nicht angegeben, wird der default Name verwendet.
<reference>
Dieser Tag fügt ein Verweisdokument in einen Standort oder als neue Variante ein.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
INSERT 1-mal (default): Dokument, das eingefügt werden soll
LOCATION 1-mal: Zielstandort (Ordner/Register)
SOURCE 1-mal: Dokument, auf das verwiesen werden soll
<move>
Dieser Tag verschiebt ein Objekt (Register/Dokument) an einen anderen Standort.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
MOVE 1-mal (default): Objekt, das verschoben werden soll
LOCATION 1-mal: Zielstandort (Ordner/Register)
<copy>
Dieser Tag kopiert ein Objekt (Register/Dokument) an einen anderen Standort.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
MOVE 1-mal (default): Objekt, das kopiert werden soll
LOCATION 1-mal: Zielstandort (Ordner/Register)
<link>
Dieser Tag erstellt eine Verweiskopie. Intern wird <copy> mit "LINKDOCUMENT=1" aufgerufen.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
MOVE 1-mal (default): Objekt, das kopiert werden soll
LOCATION 1-mal: Zielstandort (Ordner/Register)
<delete>
Dieser Tag löscht ein angegebenes Objekt. Das Attribut osid muss gesetzt sein
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
DELETE 1-mal (default): Objekt, das gelöscht werden soll
<start>
Dieser Tag startet einen neuen Workflow-Prozess
Kann enthalten sein in:
<root>
<cabinet>
Kann enthalten:
<process>
Kombinierte Serverjobs
<select>
Dieser Tag führt drei Funktionen aus:
Suche nach einem Objekt
Anlegen des Objekts, falls 1. kein Ergebnis geliefert hat
Aktualisieren des Objekts, falls 1. ein Ergebnis geliefert hat
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder>
<register>
<document>
<object>
Benötigte Objekte:
SEARCH 1-mal: Objekt, das gesucht werden soll
COMBINED_SEARCH n-mal: weitere Objekte aus demselben Schrank, die die Suche eingrenzen
INSERT 1-mal: Objekt, das eingefügt werden soll
UPDATE 1-mal: Objekt, das aktualisiert werden soll
LOCATION 1-mal: Standort (Ordner/Register) – sowohl für die Suche wie auch das Einfügen
Attribute:
id: Bezeichner, mit dem innerhalb des JellyContexts auf das gefundene/angelegte Objekt zugegriffen werden kann.
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n). Falls nicht angegeben, wird der default Name verwendet.
create (true (default) / false): Gibt an, ob ein Objekt angelegt werden soll, falls 1. kein Ergebnis geliefert hat.
update (true (default) / false): Gibt an, ob das Ergebnis von 1. aktualisiert werden soll.
Objekte
Die folgenden Tags stellen Objekte in enaio® dar.
<folder>
Dieser Tag repräsentiert einen Ordner.
Kann enthalten sein in:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<select>
<process>
Kann enthalten:
<field>
<table>
Attribute:
osid (optional): Die OsID des Ordners.
objectTypeId (optional): Objekttyp-ID des Ordners.
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren folder-Tag innerhalb desselben JellyContexts. Hierbei werden alle Werte des referenzierten Ordners übernommen.
<register>
Dieser Tag repräsentiert ein Register.
Kann enthalten sein in:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<select>
<process>
Kann enthalten:
<field>
<table>
Attribute:
key: Bezeichner des Registers
keyType (optional): 'name' oder 'internal_name (default)'
osid (optional): Die OsID des Registers.
objectTypeId (optional): Objekttyp-ID des Registers.
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren register-Tag innerhalb desselben JellyContexts. Hierbei werden alle Werte des referenzierten Registers übernommen.
<document>
Dieser Tag repräsentiert ein Dokument.
Kann enthalten sein in:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<select>
<process>
Kann enthalten:
<field>
<table>
Attribute:
key: Bezeichner des Dokuments
keyType (optional): 'name' oder 'internal_name (default)'
osid (optional): Die OsID des Dokuments.
objectTypeId (optional): Objekttyp-ID des Dokuments.
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren document-Tag innerhalb desselben JellyContexts. Hierbei werden alle Werte des referenzierten Dokuments übernommen.
maintype (optional): Der Haupttyp, der beim Anlegen und Updaten gesetzt werden soll.
<object>
Dieser Tag repräsentiert ein Objekt. Die Art (Ordner/Register/Dokument) muss nicht bekannt sein.
Kann enthalten sein in:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<select>
<process>
Kann enthalten:
<field>
<table>
Attribute:
key: Bezeichner des Objekts.
keyType (optional): 'name' oder 'internal_name (default)'
osid (optional): Die OsID des Objekts.
objectTypeId (optional): Objekttyp-ID des Objekts.
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren object-Tag innerhalb desselben JellyContexts. Hierbei werden alle Werte des referenzierten Objekts übernommen.
<process>
Dieser Tag repräsentiert einen Prozess.
Kann enthalten sein in:
<start>
Kann enthalten:
<datafield>
<folder>
<register>
<document>
<object>
Attribute:
wfid: Die ID der Workflowfamilie, zu der der Prozess gehört
clientType: Der Client-Typ, für den der Prozess gestartet werden soll (OS_DESKTOP_CLIENT / OS_MOBILE_CLIENT / OS_WEB_CLIENT)
Felder
Die folgenden Tags stellen Objektfelder dar.
<field>
Dieser Tag repräsentiert ein Textfeld.
Kann enthalten sein in:
<folder>
<register>
<document>
<object>
<row>
Kann enthalten:
Wert als Klartext oder JellyContext-Variable, z.B.: ${myVariable}
Attribute:
key: Bezeichner des Feldes.
keyType (optional): 'name' oder 'internal_name (default)'
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren field-Tag innerhalb desselben JellyContexts. Hierbei werden alle Attribute und der Wert des referenzierten Feldes übernommen.
system (optional): Gibt an, ob es sich bei dem angegebenen Feld um ein Systemfeld handelt. Mögliche Werte sind "true" oder "false" (default).
<table>
Dieser Tag repräsentiert eine Tabelle.
Kann enthalten sein in:
<folder>
<register>
<document>
<object>
Kann enthalten:
<row>
Attribute:
key: Bezeichner der Tabelle.
keyType (optional): 'name' oder 'internal_name (default)'
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren table-Tag innerhalb desselben JellyContexts. Hierbei werden alle Attribute und der Wert der referenzierten Tabelle übernommen.
<row>
Dieser Tag repräsentiert eine Zeile einer Tabelle. Die Zeilenwerte werden mit <field> definiert.
Kann enthalten sein in:
<table>
Kann enthalten:
<field>
<datafield>
Dieser Tag repräsentiert ein Datenfeld eines Prozesses.
Kann enthalten sein in:
<process>
Kann enthalten:
Wert als Klartext oder JellyContext-Variable, z.B.: ${myVariable}
Attribute:
type: Typ des Datenfeldes (STRING, INTEGER, DATE)
key: Bezeichner des Datenfeldes.
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren datafield-Tag innerhalb des selben JellyContexts. Hierbei werden alle Attribute und der Wert des referenzierten Feldes übernommen.
<ems>
Dieser Tag repräsentiert einen Mailservice via EMS-Service. Mit diesem Service können E-Mails persistiert werden. Diese werden dann im angegeben Tag mit dem Purpose "LOCATION" abgelegt.
Kann enthalten sein in:
<cabinet>
Kann enthalten:
<folder|register> mit gültigem <Purpose.LOCATION>, <ObjectId>, <ObjectTypeId>
<document> mit gültigem <Purpose.INSERT> und <ObjectTypeId>
Attribute:
serviceUrl: der Pfad des verwendeten Webservice z.B. "api/store"
serverUrl: der Pfad des verwendeten Webserver/RESTServer.
serverPort: der auf dem Server zu verwendende Port
id (optional): ID für den Zugriff innerhalb des JellyContexts.
ref (optional): Verweis auf einen weiteren ems-Tag innerhalb desselben JellyContexts. Hierbei werden alle Attribute und der Wert des referenzierten Feldes übernommen.
Prozessoren
Email Prozessor
<email>
Dieser Tag definiert einen E-Mail-Prozessor, der das automatische Auslesen von Metadaten von E-Mails ermöglicht.
Attribute:
id: ID für den Zugriff innerhalb des JellyContexts.
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n). Falls nicht angegeben, wird der default Name verwendet.
Metadaten:
TO
FROM
CC
BCC
TO_DOMAIN
FROM_DOMAIN
SUBJECT
SENT_DATE
BODY
HEADER
ATTACHMENT Referenz auf die Attachments der Email
ATTACHMENT_SIZE Anzahl der Attachments in der Email
RECIPIENT
INCOMING
OUTGOING
Unterstützte Dateiformate:
ima
eml
msg
<attach>
Dieser Tag erlaub den Zugriff auf ein Attachment (siehe Attribut ATTACHMENT im <email> Tag) der Email.
PDF Prozessor
<pdf>
Dieser Tag definiert einen PDF-Prozessor, der das automatische Auslesen von Metadaten von PDF-Dateien ermöglicht.
Attribute:
id: IDfür den Zugriff innerhalb des JellyContexts.
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n). Falls nicht angegeben, wird der default Name verwendet.
Metadaten:
AUTHOR
TITLE
SUBJECT
KEYWORDS
CREATOR
CREATION_DATE
PAGE_COUNT
PRODUCER
Unterstützde Dateiformate:
pdf
pdfa
Image Prozessor
<image>
Dieser Tag definiert einen Image-Prozessor, der das automatische Auslesen von Metadaten von Bild-Dateien ermöglicht.
Attribute:
id: ID für den Zugriff innerhalb des JellyContexts.
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n). Falls nicht angegeben, wird der default Name verwendet.
Metadaten:
NAME
CREATION_DATE
GEO_LOCATION
Unterstützte Dataiformate:
JPEG (.jpg, .jpeg, .jpe, .jif, .jfif)
TIFF (.tif, .tiff)
PSD (.psd)
PNG(.png)
BMP (.bmp, .dib)
GIF (.gif)
Camera Raw (.raw, .nef, .cr2, .orf)
Auto Detect Prozessor
<autoDetect>
Dieser Tag definiert einen AutoDetection-Prozessor, der versucht die Metadaten jeder Datei auszulesen.
Attribute:
id: ID für den Zugriff innerhalb des JellyContexts.
file (optional): Name unter dem die einzufügende(n) Datei(en) an das Droptarget übergeben wurde(n). Falls nicht angegeben, wird der default Name verwendet.
documentTypes (optional): hier werden Dateitypen kommasepariert festgelegt, auf die der Prozessor beschränkt werden soll. Falls nicht angegeben, werden alle Dateien des JellyContexts eingelesen.
Dokumententypen definieren
<os:autoDetect id="Mail" documentTypes="msg, ima, eml"/>
Metadaten:
Im TestClient können über den Reiter "AutoDetect MetadataMap" die ausgelesen Metadaten einer Datei eingesehen werden.
Die Referenzierung auf eine Variable erfolgt direkt über den JellyContext:
Variablenreferenzierung
<os:field key="MAIL_TO" keyType="Internal_Name">${context.getVariable("Mail").get("Message-To")}</os:field>
<os:field key="MAIL_FROM" keyType="Internal_Name">${context.getVariable("Mail").get("Message-From")}</os:field>
<os:field key="MAIL_CC" keyType="Internal_Name">${context.getVariable("Mail").get("Message-Cc")}</os:field>
Weitere
<options>
Dieser Tag ermöglich es, weitere Optionen an einen Serverjob zu übermitteln.
Kann enthalten sein in:
<search>
<update>
<insert>
<move>
<copy>
<delete>
<select>
Kann enthalten:
<option>
<option>
Dieser Tag definiert den Wert einer Option (true/false)
Kann enthalten sein in:
<options>
Kann enthalten:
Wert der Option (true/false)
Attribute:
key: Bezeichner der Option – siehe enaio® server-api Handbuch
<logger>
Dieser Tag ermöglich es, aus einem JellyScript heraus ins Log zu schreiben.
Kann enthalten sein in:
allen Tags aus dem os-Namespace
Kann enthalten:
Text, der ins Log geschrieben werden soll
Attribute:
level: Level, auf dem ins Log geschrieben soll
<return>
Dieser Tag ermöglich es, Werte aus einem JellyContext zu exportieren.
Kann enthalten sein in:
allen Tags aus dem os-Namespace
Kann enthalten:
Wert, der exportiert werden soll.
Attribute:
id (optional): Bezeichner, unter dem ein Wert exportiert werden soll. Falls nicht angegeben, wird der default Bezeichner (DEFAULT_RETURN_VALUE) verwendet.
Beschreibung
Die Tags aus dem Bereich Beschreibung sind nicht Teil der os-Tag-Library und müssen deshalb ohne Namespace angegeben werden.
<description>
Dieser Tag dient als Container für alle weiteren Beschreibungs-Tags.
Kann enthalten sein in: