Groovy

1. Allgemeines

Mit Groovy-Skript kann der Funktionsumfang von Intrexx erheblich erweitert werden. An welchen Stellen der Groovy-Skript-Editor im Intrexx Portal Manager erreichbar ist, erfahren Sie hier. Über die folgenden Links finden Sie weitere hilfreiche Informationen zu Groovy in Intrexx:
Für den Einsatz von Groovy in Intrexx sind ausreichende Kenntnisse in der Programmierung mit Groovy vorausgesetzt. Bitte beachten Sie, dass United Planet für Fehler, Datenverlust oder Sicherheitslücken, die von fehlerhaften Groovy-Skripts in Intrexx verursacht sind, keine Haftung übernimmt.

2. Intrexx-Standardbibliothek




Im Groovy-Skripteditor haben Sie im Bereich Bibliotheken Zugriff auf die Intrexx-Standardbibliothek. Wenn Sie einen Eintrag in der Bibliothek markiert haben, finden Sie unten rechts die folgenden Schaltflächen:

Beschreibung anzeigen
Hier finden Sie eine Beschreibung der aktuell ausgewählten Funktion mit Beispiel-Skript.

Link öffnen
Verlinkt auf entsprechende Seiten mit weiterführenden Informationen. Dabei wird jeweils genau die Seite mit den Klassen, Interfaces, Methoden oder Properties geöffnet, die Sie für die aktuell markierte Funktion verwenden können.

2.1. Applikationsstruktur

2.1.1. Applikations-Property aus Datensatz-Objekt

Liest Applikationseigenschaften aus dem Datensatz-Objekt. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def appInfoValue = g_record.applicationInfo.getGuid() liefert die GUID der Applikation, zu der der Datensatz gehört.
def appInfoValue = g_record.applicationInfo.meineMethode()
Class AbstractGroovyRecord

2.1.2. Datengruppen-Property aus Datensatz-Objekt

Liest Datengruppen-Eigenschaften aus dem Datensatz-Objekt. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def dgInfoValue = g_record.dataGroupInfo.getGuid() liefert die GUID der Datengruppe, zu der der Datensatz gehört.
def dgInfoValue = g_record.dataGroupInfo.meineMethode()
Class AbstractGroovyRecord
Interface DataGroupInfo

2.1.3. Applikationsinfo

Liefert Informationen zur Applikation mit der übergebenen GUID. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def appPropValue = app?.getGuid() liefert die GUID der Applikation.
def app = g_rtCache.applications["<GUID der Applikation>"]
def appPropValue = app?.meineMethode()
Interface ApplicationInfo

2.1.4. Kontrollen-Info

Liefert Informationen zur Kontrolle mit der übergebenen GUID. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def ctrlInfo = ctrl?.getPageGuid() liefert die GUID der Seite, auf der sich die Kontrolle befindet.
def ctrl = g_rtCache.controls["<GUID der Kontrolle>"]
def ctrlInfo = ctrl?.meineMethode()
Interface ControlInfo

2.1.5. Datengruppen-Info

Liefert Informationen zur Datengruppe mit der übergebenen GUID. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def dgInfo = dg?.getGuid() liefert die GUID der Datengruppe.
def dg = g_rtCache.dataGroups["<GUID der Datengruppe>"]
def dgInfo = dg?.meineMethode()
Interface DataGroupInfo

2.1.6. Datenfeld-Info

Liefert Informationen zum Datenfeld mit der übergebenen GUID. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def fldInfo = fld?.getGuid() liefert die GUID des Datenfeldes.
def fld = g_rtCache.fields["<GUID des Datenfeldes>"]
def fldInfo = fld?.meineMethode()
Interface FieldInfo

2.1.7. Referenz-Info

Liefert Informationen zur Referenz mit der übergebenen GUID. Ersetzen Sie im Beispiel-Skript "meineMethode()" mit der gewünschten Methode. Beispiel: def refInfo = ref?.getGuid() liefert die GUID der Referenz.
def ref = g_rtCache.references["<GUID der Referenz>"]
def refInfo = ref?.meineMethode()
Interface ReferenceInfo

2.2. Sprachkonstanten

Alle im Intrexx-Standard verwendeten Textelemente sind in den globalen Sprachkonstanten definiert. Allgemeine Informationen zu diesem Thema finden Sie hier.

2.2.1. Zugriff auf globale Sprachkonstante

Liefert den Wert, den die globale Sprachkonstante in der Portal-Standardsprache hat. Ersetzen Sie im Beispiel-Skript "PORTAL_CONST_NAME" mit dem Namen der gewünschten Sprachkonstante. Beispiel: def strValue = g_i18n.BUTTON_NEXT - liefert "Weiter" (Beschriftung der "Weiter"-Schaltfläche, die Sie in vielen Dialogen finden, in deutsch, der Standardsprache des Beispielportals).
def strValue = g_i18n.PORTAL_CONST_NAME
Class GroovyLanguageConstants

2.2.2. Zugriff auf globale Sprachkonstante in einer bestimmten Sprache

Liefert den Wert, den die globale Sprachkonstante in einer bestimmten Portalsprache hat. Ersetzen Sie im Beispiel-Skript "PORTAL_CONST_NAME" mit dem Namen der gewünschten Sprachkonstante. Beispiel: def lang = g_i18n.language("en") - liefert den Wert, den die globale Sprachkonstante in der englischen Spracheinstellung hat.
def lang = g_i18n.language("Sprachcode")
def strValue = lang.PORTAL_CONST_NAME
Class GroovyLanguageConstants

2.2.3. Zugriff auf Sprachkonstante einer Applikation

Liefert den Wert, den die Applikations-Sprachkonstante in der Portal-Standardsprache hat. Ersetzen Sie im Beispiel-Skript "APP_CONST_NAME" mit dem Namen der gewünschten Sprachkonstante.
def app = g_i18n.application("<GUID der Applikation>")
def strValue = app.APP_CONST_NAME
Class GroovyLanguageConstants

2.2.4. Zugriff auf Sprachkonstante einer Applikation in einer bestimmten Sprache

Liefert den Wert, den die Applikations-Sprachkonstante in einer bestimmten Portalsprache hat. Ersetzen Sie im Beispiel-Skript "APP_CONST_NAME" mit dem Namen der gewünschten Sprachkonstante. Als Sprachcode setzen Sie z.B. "en" für englisch ein.
def app = g_i18n.application("<GUID der Applikation>")
def strLang  = app.language("<Sprachcode>")
def strValue = strLang.APP_CONST_NAME
Class GroovyLanguageConstants

2.3. Imports

2.3.1. Intrexx AccessController

Klasse, mit der geprüft werden kann, ob die durch Zugriffsanfragen basierend auf der aktuell gültigen Sicherheitsrichtlinie zugelassen oder abgelehnt werden sollen.
import de.uplanet.lucy.server.security.IxAccessController
Class IxAccessController

2.3.2. IFilter

import de.uplanet.util.filter.IFilter
Interface IFilter<T>

2.3.3. WorkflowException

import de.uplanet.lucy.server.workflow.WorkflowException

2.4. Objekte im Groovy-Kontext

2.4.1. PageActionHandler und PageRenderingHandler

2.4.1.1. g_appGuid

2.4.1.2. g_handlerGuid

2.4.1.3. g_page

2.4.1.4. g_action

2.4.2. g_context

Der aktuelle Verarbeitungskontext.
g_context
Interface IProcessingContext

2.4.3. g_ctx

BPEE Verarbeitungskontext - nur verfügbar im Webservicekontext.
g_ctx

2.4.4. g_dataCollection

Die Seite, die als Portlet dient bzw. die DataCollection, die dann geladen wird.

Zugriff auf Tabelle:
g_dataCollection.getDataRange("<GUID TABLERECORDS>").getNumberOfRecords() > 0
Zugriff auf einen Datensatz:
g_dataCollection.getValueHolder(String p_guid)
g_dataCollection

2.4.5. g_dbConnections

Zugriff auf verfügbare Datenbankverbindungen.
//Systemverbindung 
def conn = g_dbConnections.systemConnection

//Fremddatenverbindung
def conn = g_dbConnections["CONNECTION_NAME"]
Class GroovyContextConnections

2.4.6. g_dbQuery

Objekt zur Generierung und Ausführung von Datenbankabfragen.
//Aufbauen eines Prepared Statements
def stmt = g_dbQuery.prepare(conn, "SELECT * FROM MYTABLE WHERE LID = ?")
stmt.setInt(1, iLid)
stmt.executeQuery()
stmt.close()

//Abfrage eines einzelnen Wertes
def iMax = g_dbQuery.executeAndGetScalarValue(conn, "SELECT MAX(LID) FROM MYTABLE", 0)
Class DbQuery

2.4.7. g_defaultLanguage

Liefert die aktuell eingestellte Standardsprache des Portals.
assert g_defaultLanguage == 'en' : 'This script requires default language en.'

2.4.8. g_dirWorkflow

Nur in Prozessen verfügbar - liefert das Verzeichnis des aktuellen Prozesses. Auf dieses Verzeichnis sollte ausschließlich lesend zugegriffen werden.
g_dirWorkflow
Class File

2.4.9. g_dirWorkflowTmp

Zugriff auf das temporäre Arbeitsverzeichnis des Prozesses auf dem Server. Das Verzeichnis ist für alle nachfolgenden Prozess-Elemente verfügbar, bis der Prozess beendet ist.
g_dirWorkflowTmp
Class File

2.4.10. g_event

Nur in Prozessen verfügbar - beinhaltet das Ereignis, das den aktuellen Prozess auslöste. Zu beachten ist, dass Vergleiche auf das aktuelle Event (s. Skript-Beispiel) immer auf die Interfaces und nie auf die konkreten Klassen auszuführen sind.
import de.uplanet.lucy.server.workflow.event.*

if (g_event instanceof IGlobalTimerWorkflowEvent)
	//Hier Skript, mit dem auf ein Timerevent reagiert wird, einfügen.
Interface IWorkflowEvent

2.4.11. g_fileScript

Pfad zum aktuellen Skript als java.io.File. Dieses Objekt steht im Webservice-Umfeld nicht zur Verfügung. Beispiel:
println("Executing " + g_fileScript.path)
g_fileScript
Class File

2.4.12. g_guidSelf

Enthält die GUID des aktuellen Prozess-Objekts (Aktion, Bedingung oder Ereignisbehandler). Diese Variable ist nur in Prozessen definiert.
g_guidSelf

2.4.13. g_guidWf

Enthält die GUID des aktuellen Prozesses. Diese Variable ist nur in Prozessen definiert.
g_guidWf

2.4.14. g_i18n

Zugriff auf Sprachkonstanten.
g_i18n
Class GroovyLanguageConstants

2.4.15. g_language

Enthält die verwendete Sprache des aktuellen Benutzers.
g_language

2.4.16. g_log

Schreibt einen Eintrag in die zum Ausführungskontext des Skripts gehörige Logdatei.
g_log.info("Prozess wurde ohne Fehler beendet.")
g_log.error("Es ist ein Fehler aufgetreten.")
Logging

2.4.17. g_mutexSelf

Synchronisiert auf dem umgebenden Prozess-Objekt (Aktion, Bedingung, Ereignisbehandler). Die Variable g_mutexSelf ist nur in Prozessen definiert.
g_mutexSelf
synchronized-Skriptblock

2.4.18. g_om

Objekt für den Zugriff auf die Benutzerverwaltung.
g_om
g_om Details

2.4.18.1 Details

Intrexx bietet eine Vielzahl an erweiterten Möglichkeiten der prozessgesteuerten Benutzerverwaltung. Mit Zugriffsobjekten und –methoden in Groovy-Aktionen können u.a. neue Benutzer angelegt und verwaltet werden. Als Einstiegspunkt für die Organisationsstruktur eines Portals in Prozessen dient das global verfügbare und bereits initialisierte Objekt g_om. Damit können grundlegende UseCases wie z.B. das Suchen eines Benutzers oder das Generieren eines neuen Passworts umgesetzt werden. Diese Methoden sind wie "normale" Methodenaufrufe zu verwenden. Beispiele:
// Ändern des Passwworts des übergebenen Benutzers.
g_om.changePassword(g_session.user, "SECRET")
// Generieren und Versenden eines neuen Passworts an den übergebenen Benutzer.
g_om.generateAndSendPassword(g_session.user)
// Suchen eines Benutzers anhand einer GUID.
def user = g_om.getUser("C10579449052F85D9C3FF3C2824348FCE020A22E")
// Klassifizieren einer Liste von GUIDs. Übergeben werden kann eine Liste mit GUIDs
// oder ein Text (z.B. Inhalt eines Datenfelds einer Mehrfachauswahl).
def guids = ["AE39A904172F5867DA23DE289D1D6B7967420DC0", "6AA80844C3C99EF93BF4536EB18605BF86FDD3C5", g_session.user.guid]
			 
def classified = g_om.classifyGuids(guids) //guids = Collection oder String

//Ergebnis ist eine Map mit den kategorisierten GUIDs.
//z.B. {containers=[], users=[7312F993D0DA4CECCA9AE5A9D865BE142DE413EA], 
//      unclassified=[AE39A904172F5867DA23DE289D1D6B7967420DC0], 
//      sets=[6AA80844C3C99EF93BF4536EB18605BF86FDD3C5]}
println(classified)

//Weitere Filterung auf bestimmte Objektarten
println(classified.users)
println(classified.containers)
println(classified.sets)
println(classified.unclassified)

//Liefert die Anzahl aller nicht-anonymen Session.
g_om.getNonAnonymousActiveSessionCount()
Darüber hinaus verfügt das Objekt g_om noch über einige Methoden, die in Verbindung mit einer Closure aufgerufen werden, um weiterführende Aktionen zu realisieren. Zu erkennen sind diese Methoden an dem in den JavaDocs angegebenen Parameter vom Typ groovy.lang.Closure, z.B. GroovyOrgBuilder.createUser(groovy.lang.Closure p_closure). Innerhalb einer solchen Closure können Methoden jener Klasse aufgerufen werden, die in den jeweiligen hinterlegten Links dokumentiert sind. Folgende Methoden sind mit einer Closure aufrufbar:
g_om.createUser(groovy.lang.Closure p_closure)
Damit kann ein neuer Intrexx-Benutzer angelegt werden. Dabei können innerhalb der Closure die folgend aufgelisteten Properties gesetzt werden, wobei die Properties name und loginName erforderlich, die restlichen optional sind.

PropertyDatatype
birthdayDate
cityString
containerObject
countryString
defaultLanguageString
defaultLayoutString
deletableboolean
deletedboolean
descriptionString
disabledboolean
dnString
emailBizString
emailHomeString
employeeNoString
enterDateDate
externalLogin1String
externalLogin2String
externalLogin3String
externalPassword1String
externalPassword2String
externalPassword3String
externalPrimaryGroupIdint
femaleboolean
firstNameString
fullNameString
genderint
guidString
idint
internalUsnint
lastNameString
loginDomainString
loginDomainLwrString
loginNameString
loginNameLwrString
maleboolean
memberOfCollection<?>
middleNameString
nameString
passwordString
passwordChangedDateDate
passwordExpiresboolean
passwordHashString
phoneBizString
phoneFaxString
phoneHomeString
phoneMobileBizString
phoneMobileHomeString
phonePagerString
poBoxString
postalCodeString
priorityint
rplGuidString
saltString
showUserboolean
stateString
streetString
timeZoneTimeZone
titleString
userImageContentTypeString
userImageFileFile
userImageMetaInfoString

Bei den Properties "container" und "memberOf" können wahlweise die GUIDs, die eindeutigen Namen der Container, Rollen, Sets oder Gruppen und Pfade in der Organisationsstruktur angegeben werden. Beispiel:
g_om.createUser {
	name      = "g_om"
	loginName = "g_om"
	birthday  = now()
	container = "0F8233A39555B28F6B32CFFE666A5151E1F41AD3"
	memberOf = ["8FBF199EE826D16742F0F131E0AB4CF0E6BA6CA3", "Benutzer"]
	emailBiz  = "g_om@example.org"
	guid      = newGuid()
	male      = true
}
g_om.getLoggedOnUsers(boolean p_bIncludeAnonymous, groovy.lang.Closure p_closure)
Gibt alle aktuell eingeloggten Benutzer aus. Über p_bIncludeAnonymous kann angegeben werden, ob anonyme Sessions in das Ergebnis mitaufgenommen werden sollen. Über die Groovy-Closure können weitere Filterungen vorgenommen werden. Beispiel:
def userOnline = g_om.getLoggedOnUsers(false) {
	it.containerGuid == "9DABA9EE4F9F6F771704F75C79A1C3A124FF399C"
}
g_om.getLoggedOnUsersDistinct(groovy.lang.Closure p_closure)
Gibt alle aktuell eingeloggten, nicht-anonymen Benutzer ohne doppelte Vorkommen aus. Über die Groovy-Closure können analog zu g_om.getLoggedOnUsers(boolean p_bIncludeAnonymous, groovy.lang.Closure p_closure) weitere Filterungen vorgenommen werden.
g_om.withOrgStructure(groovy.lang.Closure p_closure)
Erlaubt das Arbeiten auf der Organisationsstruktur eines Portals. Beispiel:
g_om.withOrgStructure {
	println("9DABA9EE4F9F6F771704F75C79A1C3A124FF399C".isUser())
}

Folgende Methoden sind innerhalb der OrgStructure-Closure aufrufbar:

isUser()
isSet()
isGroup()
isDistList()
isContainer()
isOrganization()
isOrgUnit()
Erzeugt eine Liste der GUIDs aller Benutzer, die zu einer bestimmten oder mehreren Gruppen gehören. Beispiel:
def userGuids = g_om.getMembers(["00A303288634E154D755732E478F2BE0D9AD36F7"], false)*.guid
"00A303288634E154D755732E478F2BE0D9AD36F7" ist die aus der Benutzerverwaltung kopierte GUID der Gruppe. Mehrere Gruppen-GUIDs bzw. Set-GUIDs sind möglich. Weitere Informationen finden Sie hier:

https://docs.intrexx.com/intrexx/version/9200/api/groovy/jdk/de/uplanet/lucy/server/usermanager/groovy/GroovyOrgBuilder.html#getMembers(java.lang.Object,boolean)
https://docs.intrexx.com/intrexx/version/9200/api/groovy/jdk/de/uplanet/lucy/server/usermanager/groovy/GroovyOrgBuilder.html#getMembers(java.util.Collection,boolean)

Class GroovyOrgBuilder

2.4.19. g_permissions

Diese Klasse dient der Prüfung und Abfrage von Berechtigungen. Die Verwendung wird in der Vorlage "JSON-Antwort" für den dortigen Anwendungsfall gezeigt. checkPermission(Permission) und check(Closure) prüfen, ob die gewünschten Berechtigungen gewährt werden. Andernfalls wird eine java.security.AccessControlException geworfen. hasPermission(Permission) und has(Closure) funktionieren analog, liefern jedoch einen boolean-Wert, der angibt, ob die angeforderten Berechtigungen gewährt werden oder nicht. Die Closure-Methoden delegieren an das o.g. GroovyIxAccessControllerDelegate-Objekt und verlangen eine Map, die den Objektnamen Aktionen zuweist. Beispiel: Prüfe Zugriffsberechtigung an der Applikation <application GUID>, Leseberechtigungen an der Datengruppe <data group GUID> sowie Schreibberechtigungen an der Datengruppe <another data group GUID>.
g_permissions.check {
    application("<application GUID>": "access")
    dataGroup("<data group GUID>": "read", "<another data group GUID>": "write,create")
}
g_permissions
Class GroovyIxAccessController
Class GroovyIxAccessController.GroovyIxAccessControllerDelegate
Klassen aus de.uplanet.lucy.security.permission

2.4.20. g_portal

Objekt für den Zugriff auf Portaleigenschaften wie Name oder Base-URL. Beispiel: def strUrl = g_portal.baseUrl
g_portal
Class GroovyPortalInfo

2.4.21. g_portlet

Zugriff auf das jeweilige Portlet, das gefiltert werden soll (im Portlet-Pool oder beim Rendern des Portlets).
g_portlet
Class GroovyPortlet

2.4.22. g_portletPool

Zugriff auf den Portlet-Pool, der gefiltert werden soll (Collection von Portlets), zum einen wirklich im Portlet-Pool und zum anderen beim Rendern der Portlets.
g_portletPool
Class GroovyPortlet

2.4.23. g_record

Zugriff auf den aktuellen Datensatz. Beispiel: def iLid = g_record["0D8F13B2B43B128DB23C0C1CC8C5DC1143C9D826"].value // datafield (PK) (S) ID
g_record
Class ReadOnlyGroovyRecord

2.4.24. g_rwRecord

Lesender und schreibender Zugriff auf den aktuellen Datensatz. Nur verfügbar innerhalb von Groovy-PageActionHandlern. Beispiel:
def iLid = g_rwRecord["0D8F13B2B43B128DB23C0C1CC8C5DC1143C9D826"].value // datafield (PK) (S) ID
g_rwRecord
Class ReadWriteGroovyRecord

2.4.25. g_request

Zugriff auf den aktuellen Request, z.B. Auslesen von Requestvariablen im Prozess. Diese Variable ist nur definiert, wenn das Skript von einem Web-Request aufgerufen wurde.
g_request
Class GroovyServerBridgeRequest

2.4.26. g_rtCache

RtCache - Zugriff auf Datengruppen, Applikationen, Felder etc. Beispiel:
//Finde alle Datengruppen der Applikation mit der GUID 68C97BF4D89E8466BDE08AF03A4EF95F5B23AF72
def datagroups = g_rtCache.dataGroups.findAll {it.appGuid == "68C97BF4D89E8466BDE08AF03A4EF95F5B23AF72"}
g_rtCache
Class GroovyRtCache

2.4.27. g_session

Die aktuelle Session. Beispiel:
//Name des aktuell angemeldeten Benutzers
def strUserName = g_session?.user?.name
g_session
Class GroovySession

2.4.28. g_sharedState

Shared State, in den Variablen und Werte geschrieben und wieder ausgelesen werden können. Beispiel:
//Variable in Shared State schreiben
g_sharedState.meineVariable = "Mein Wert"
//Variable aus Shared State lesen
def strValue = g_sharedState.meineVariable
g_sharedState
Class SharedState

2.4.29. g_springApplicationContext

Spring Anwendungskontext
g_springApplicationContext
Interface ApplicationContext

2.4.30. g_sysDg

Mit diesem Objekt können Werte aus einer Systemdatengruppe ausgelesen werden. Beispiel:
//Als GUID die Guid des Systemdatenfelds angeben
def strValue = g_sysDg['C1BFDD165EBFD0713D306D3E2B124E80021E613F']
def strValueByFieldGuid = g_sysDg.getValueByFieldGuid('C1BFDD165EBFD0713D306D3E2B124E80021E613F')
def vhByFieldGuid = g_sysDg.getValueHolderByFieldGuid('C1BFDD165EBFD0713D306D3E2B124E80021E613F')
g_sysDg
Class GroovySystemDataGroup

2.4.31. g_syslog

Loggingobjekt zur Ausgabe in die Log-Datei des Portals (portal.log).
g_syslog.info("Meine Nachricht in die Logdatei portal.log.")

2.4.32. g_ws

Objekt zum expliziten Aufruf eines Webservices. Nur verfügbar bei Skripts, die bei einem Webservice hinterlegt sind.
//Webservice in einem Skript aufrufen
g_ws.invoke()

2.4.33. Closures

Die vordefinierten Closures können wie Funktionen aufgerufen werden.

2.4.33.1. checkInterrupted()

Prüft ob entweder Verwenden sie diesen Aufruf in Skripts, die sich in solchen Fällen kooperativ verhalten sollen.
checkInterrupted()
Class CheckInterruptedClosure

2.4.33.2. createTemporaryDirectory()

Erzeugt ein temporäres Arbeitsverzeichnis, dass bis zum Ende der Abarbeitung des Prozesses verfügbar ist.
createTemporaryDirectory()
Class CreateTemporaryDirectoryClosure

2.4.33.3. currentTimestamp()

Diese Closure liefert den Zeitstempel der aktuellen Transaktion. Dieser Wert bleibt bis zum Verarbeitungsende dieser Transaktion unverändert. Beispiel:
def dtNow = currentTimestamp()
currentTimestamp()
Class CurrentTimestampClosure

2.4.33.4. getStackTraceString()

Liefert den vollständigen StackTrace eines aufgetretenen Fehlers als String zurück. Die Closure "getStackTraceString()" benötigt einen Parameter vom Typ java.lang.Throwable, also eine Exception.
try
{
	trySomething()

}
catch (e)
{
	def strStackTrace = getStackTraceString(e)

	doSomethingWithStackTrace(strStackTrace)
}
Class CreateStackTraceStringClosure

2.4.33.5. newGuid()

Erzeugt eine neue GUID.
newGuid()
Class NewGuidClosure

2.4.33.6. now()

Erzeugt ein neues Datum (Jetzt) als Timestamp oder als ValueHolder.
now()
Class NowClosure

2.4.33.7. vh()

Erzeugt einen neuen ValueHolder aus dem übergebenen Objekt.
def vhTest = vh("Hello world!")
def vhInt  = vh(1000)
Class CreateValueHolderClosure

2.4.33.8. parseGuids(strText)

Parst GUIDs aus dem übergebenen String (z.B. eine Pipe-getrennte Liste) und liefert ein TreeSet mit den gefundenen GUIDs zurück.
def strText = "18CC231E0A71F6F27091855C4C0FD0D6F2F26038||D0CACC8058DC36A9A499AB2DD3B993F427AB9200"
def guids   = parseGuids(strText)
guids.each {println it}
Class ParseGuidsClosure

2.5. Datenbanken

2.5.1. Datengruppen

2.5.1.1. Datengruppe per GUID finden

Hier finden Sie ein Beispiel, mit dem der Name einer Datengruppe ermittelt werden kann:
def strName = g_rtCache.dataGroups["C399FB1F398D76E91BC7DC679E1E4DDB9F5CEB9C"].name
def strName = g_rtCache.dataGroups["<GUID der Datengruppe"].name
Interface DataGroupInfo

2.5.1.2. Datengruppe in SQL über GUID referenzieren

Mit Hilfe dieser Clientfunktion kann eine Datengruppe über ihre GUID statt über ihren Namen referenziert werden. Damit muss in SQL-Statements nicht der Name der Datengruppe fest hinterlegt werden, womit Probleme beim Import oder bei Änderungen an der Datengruppe vermieden werden. Nur verfügbar über das Intrexx Datenbank-API. Beispiel:
g_dbQuery.executeAndGetScalarValue(conn, "SELECT COUNT(LID) FROM DATAGROUP('DAF7CECF66481FCABE50E529828116EAFE906962')")
def strName = g_rtCache.dataGroups["<GUID der Datengruppe>"].name
Interface DataGroupInfo

2.5.1.3. Spaltennamen einer Datengruppe

Liefert eine Liste mit den Namen aller Spalten der Datengruppe mit der übergebenen GUID.
def fieldNames = g_rtCache.fields.findAll{it.dataGroupGuid == "DG-GUID"}*.columnName
Interface FieldInfo

2.5.2. Intrexx Datenbank-API

2.5.2.1. Vorbereitete Anweisung mit SELECT

Führt eine vorbereitete Anweisung mit einem SELECT-Statement aus. Anschließend kann über die Ergebnisse im Resultset iteriert werden. Beispiel:

stmt = g_dbQuery.prepare(conn, "SELECT * FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') WHERE ID = ?")
stmt.setInt(1, 1)
stmt.executeQuery()
stmt = Safely.close(stmt)
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null
def rs   = null

try
{
	stmt = g_dbQuery.prepare(conn, "SELECT <COLUMNS> FROM DATAGROUP('<DATAGROUP_GUID>') WHERE <CONDITION>")
	
	//stmt.setInt(1, 1)
	
	rs = stmt.executeQuery()
	
	while (rs.next())
	{
		// do something
		// rs.getIntValue(1)
		// rs.getStringValue(2)
		// rs.getBooleanValue(3)
		// rs.getTimestampValue(4)
	}
	
	rs   = Safely.close(rs)
	stmt = Safely.close(stmt)
}
finally
{
	rs   = Safely.close(rs)
	stmt = Safely.close(stmt)
}
Class DbPreparedStatement

2.5.2.2. Vorbereitete Anweisung mit INSERT

Führt eine vorbereitete Anweisung mit einem INSERT-Statement aus. Beispiel:

stmt = g_dbQuery.prepare(conn, "INSERT INTO DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') (ID, STRTEXT, DTDATE, BBOOLEAN) VALUES (?,?,?,?)")

stmt.setInt(1, 1)
stmt.setString(2, "Example text")
stmt.setTimestamp(3, now().withoutFractionalSeconds)
stmt.setBoolean(4, true)
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = g_dbQuery.prepare(conn, "INSERT INTO DATAGROUP('<DATAGROUP_GUID>') (<COLUMNS>) VALUES ()")
	
	//stmt.setInt(1, 1)
	//stmt.setString(2, "Example text")
	//stmt.setTimestamp(3, now().withoutFractionalSeconds)
	//stmt.setBoolean(4, true)
	
	stmt.executeUpdate()

	stmt = Safely.close(stmt)
}
finally
{
	stmt = Safely.close(stmt)
}
Class DbPreparedStatement

2.5.2.3. Vorbereitete Anweisung mit INSERT (mit Closure)

Führt eine vorbereitete Anweisung mit einem INSERT-Statement mit Closure aus. Beispiel:

def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "INSERT INTO DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') (LID, STRTEXT, DATE) VALUES (?,?,?)") {
setInt(1, 1)
setString(2, "Example text")
setTimestamp(3, now().withoutFractionalSeconds)
}

Bitte beachten:
Soll das Statement wiederverwendet werden, z.B. innerhalb einer Schleife, ist die Variante als Prepared Statement ohne Closure effizienter.
def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "INSERT INTO DATAGROUP('<DATAGROUP_GUID>') (<COLUMNS>) VALUES ()") {
	//setString(1, "Example text")
	//setTimestamp(2, now().withoutFractionalSeconds)
	//setBoolean(3, true)
}
Class DbQuery

2.5.2.4. Vorbereitete Anweisung mit UPDATE

Führt eine vorbereitete Anweisung mit einem UPDATE-Statement aus. Beispiel:

stmt = g_dbQuery.prepare(conn, "UPDATE DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') SET STRTEXT = ?, DTDATE = ?, BBOOLEAN = ? WHERE ID = ?")

stmt.setString(1, "Example text")
stmt.setTimestamp(2, now().withoutFractionalSeconds)
stmt.setBoolean(3, true)
stmt.setInt(4, 1)

stmt.executeUpdate()
stmt = Safely.close(stmt)

import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = g_dbQuery.prepare(conn, "UPDATE DATAGROUP('<DATAGROUP_GUID>') SET <COLUMNS> = ? WHERE <CONDITION>")
	
	//stmt.setInt(1, 1)
	//stmt.setString(2, "Example text")
	//stmt.setTimestamp(3, now().withoutFractionalSeconds)
	//stmt.setBoolean(4, true)
	
	stmt.executeUpdate()

	stmt = Safely.close(stmt)
}
finally
{
	stmt = Safely.close(stmt)
Class DbPreparedStatement

2.5.2.5. Vorbereitete Anweisung mit UPDATE (mit Closure)

Führt eine vorbereitete Anweisung mit einem UPDATE-Statement mit Closure aus. Beispiel:

def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "UPDATE DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') SET STRTEXT = ? WHERE DATE < ?") {
setString(1, "Example text")
setTimestamp(2, now().withoutFractionalSeconds)
}

Bitte beachten:
Soll das Statement wiederverwendet werden, z.B. innerhalb einer Schleife, ist die Variante als Prepared Statement ohne Closure effizienter.
def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "UPDATE DATAGROUP('<DATAGROUP_GUID>') SET <COLUMNS> = ? WHERE <CONDITION>") {
	//setString(1, "Example text")
	//setTimestamp(2, now().withoutFractionalSeconds)
	//setBoolean(3, true)
}
Class DbQuery

2.5.2.6. Vorbereitete Anweisung mit DELETE

Führt eine vorbereitete Anweisung mit einem DELETE-Statement aus. Beispiel:

def conn = g_dbConnections.systemConnection
def stmt = null

stmt = g_dbQuery.prepare(conn, "DELETE FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') WHERE ID > ?")

stmt.setInt(1, 5)
stmt.executeUpdate()
stmt = Safely.close(stmt)
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = g_dbQuery.prepare(conn, "DELETE FROM DATAGROUP('<DATAGROUP_GUID>') WHERE <CONDITION>")
	
	//stmt.setInt(1, 1)
	//stmt.setString(2, "Example text")
	//stmt.setTimestamp(3, now().withoutFractionalSeconds)
	//stmt.setBoolean(4, true)
	
	stmt.executeUpdate()
	
	stmt = Safely.close(stmt)
}
finally
{
	stmt = Safely.close(stmt)
}
Class DbPreparedStatement

2.5.2.7. Vorbereitete Anweisung mit DELETE (mit Closure)

Führt eine vorbereitete Anweisung mit einem DELETE-Statement mit Closure aus. Beispiel:

def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "DELETE FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') WHERE ID > ?"){

setInt(1, 5)
}

Bitte beachten: Soll das Statement wiederverwendet werden, z.B. innerhalb einer Schleife, ist die Variante als Prepared Statement ohne Closure effizienter.
def conn = g_dbConnections.systemConnection

g_dbQuery.executeUpdate(conn, "DELETE FROM DATAGROUP('<DATAGROUP_GUID>') WHERE <CONDITION>"){

	//setInt(1, 1)
	//setString(2, "Example text")
	//setTimestamp(3, now().withoutFractionalSeconds)
	//setBoolean(4, true)
Class DbPreparedStatement

2.5.2.8. Einzelner Wert aus Datenbankabfrage

Liest einen einzelnen Wert aus einer Datenbankabfrage aus. Ist die Ergebnismenge leer oder null, wird der mit fallbackValue definierte Wert zurückgegeben. Soll der Datentyp der Rückgabe genauer spezifiziert werden, können typisierte Methodenaufrufe wie z.B. executeAndGetScalarBooleanValue(...) erfolgen. Beispiel:

def value = g_dbQuery.executeAndGetScalarValue(conn, "SELECT MAX(ID) FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F')", 0)

oder mit vorbereiteter Anweisung

def value = g_dbQuery.executeAndGetScalarValue(conn, "SELECT MAX(ID) FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F') WHERE DTEDIT < ?", 0) {
setTimestamp(1, now().withoutFractionalSeconds)
def conn = g_dbConnections.systemConnection

def value = g_dbQuery.executeAndGetScalarValue(conn, "SELECT <COLUMNS> FROM DATAGROUP('<DATAGROUP_GUID>') WHERE <CONDITION>", <FALLBACK_VALUE>) {
	//setString(1, "Example text.")
}
Class DbQuery

2.5.2.9. Einzelner Wert aus vorbereiteter Datenbankabfrage

Liest einen einzelnen Wert aus einer Datenbankabfrage aus. Ist die Ergebnismenge leer oder null, wird der mit fallbackValue definierte Wert zurückgegeben. Soll der Datentyp der Rückgabe genauer spezifiziert werden, können typisierte Methodenaufrufe wie z.B. executeAndGetScalarBooleanValue(...) erfolgen. Beispiel:

def stmt = g_dbQuery.prepare(conn, "SELECT MAX(LID) FROM DATAGROUP('7AFAF7CB5DE281D35F05D96FCD96CE27692C110F')")

def value = stmt.executeAndGetScalarValue(0)

stmt = Safely.close(stmt)
import de.uplanet.scripting.groovy.util.Safely

def conn  = g_dbConnections.systemConnection
def stmt  = null
def value

try
{
	stmt = g_dbQuery.prepare(conn, "SELECT <COLUMN> FROM DATAGROUP('<DATAGROUP_GUID>') WHERE <CONDITION>")

	//stmt.setInt(1, 1)
	//stmt.setString(2 , "Example text")
	//stmt.setTimestamp(3, now().withoutFractionalSeconds)
	//stmt.setBoolean(4, false)

	value = stmt.executeAndGetScalarValue(<FALLBACK_VALUE>)

	stmt = Safely.close(stmt)
}
finally
{
	stmt = Safely.close(stmt)
}
Class DbPreparedStatement

2.5.3. JDBC

2.5.3.1. Vorbereitete Anweisung mit SELECT

Führt eine vorbereitete Anweisung mit einem SELECT-Statement aus. Anschließend kann über die Ergebnisse iteriert werden.
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null
def rs   = null

try
{
	stmt = conn.prepareStatement("SELECT <COLUMNS> FROM <DATAGROUP_NAME> WHERE <CONDITION>")

	//stmt.setInt(1, 42)
	//stmt.setString(2, "Example text")
	//stmt.setTimestamp(3, now().withoutFractionalSeconds)
	//stmt.setBoolean(4, false)

	rs = stmt.executeQuery()

	while (rs.next())
	{
		// do something
		// rs.getInt(1)
		// rs.getString(2)
		// rs.getTimestamp(3)
	}
}
finally
{
	rs   = Safely.close(rs)
	stmt = Safely.close(stmt)
}
Interface PreparedStatement

2.5.3.2. Vorbereitete Anweisung mit INSERT

Führt eine vorbereitete Anweisung mit einem INSERT-Statement aus.
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = conn.prepareStatement("INSERT INTO <DATAGROUP_NAME> (<COLUMNS>) VALUES ()")

	// stmt.setInt(1, 1234)
	// stmt.setString(2, "Example text")
	// stmt.setBoolean(3, true)
	// stmt.setTimestamp(4, now().withoutFractionalSeconds)

	stmt.executeUpdate()
}
finally
{
	stmt = Safely.close(stmt)
}
Interface PreparedStatement

2.5.3.3. Vorbereitete Anweisung mit UPDATE

Führt eine vorbereitete Anweisung mit einem UPDATE-Statement aus.
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = conn.prepareStatement("UPDATE <DATAGROUP_NAME> SET <COLUMNS> = ? WHERE <CONDITION>")

	// stmt.setInt(1, 1234)
	// stmt.setString(2, "Example text")
	// stmt.setBoolean(3, true)
	// stmt.setTimestamp(4, now().withoutFractionalSeconds)

	stmt.executeUpdate()
}
finally
{
	stmt = Safely.close(stmt)
}
Interface PreparedStatement

2.5.3.4. Vorbereitete Anweisung mit DELETE

Führt eine vorbereitete Anweisung mit einem DELETE-Statement aus.
import de.uplanet.scripting.groovy.util.Safely

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = conn.prepareStatement("DELETE FROM <DATAGROUP_NAME> WHERE <CONDITION>")

	// stmt.setInt(1, 1234)
	// stmt.setString(2, "Example text")
	// stmt.setBoolean(3, true)
	// stmt.setTimestamp(4, now().withoutFractionalSeconds)

	stmt.executeUpdate()
}
finally
{
	stmt = Safely.close(stmt)
}
Interface PreparedStatement

2.5.4. Systemdatenquelle

System-Datenbankverbindung - Beispiel:
def conn = g_dbConnections.systemConnection
g_dbConnections.systemConnection
Class GroovyContextConnections

2.5.5. Fremddatenquelle

Verbindung zu einer Fremddatenquelle. Anzugeben ist der im Modul Integration vergebene Name für die Fremddatenverbindung. Beispiel:
def conn = g_dbConnections["ForeignData"]
g_dbConnections["<CONNECTION_NAME>"]
Class GroovyContextConnections

2.5.6. Datenbanktyp unterscheiden

Ermittelt den Datenbanktyp.
def conn = g_dbConnections.systemConnection

switch (conn.descriptor.databaseType)
{
	case "Db2":
		// DB2
		break

	case "Derby":
		// Derby/Java DB
		break

	case "Firebird":
		// Firebird
		break

	case "HSQLDB":
		// HSQLDB
		break

	case "Ingres":
		// Ingres
		break

	case "MySQL":
		// MySQL
		break

	case "Oracle8":
		// Oracle 8
		break

	case "Oracle9":
		// Oracle 9
		break

	case "Oracle10":
		// Oracle 10
		break

	case "PostgreSQL":
		// PostgreSQL
		break

	case "MaxDB":
		// MaxDB
		break

	case "MsSqlServer":
		// Microsoft SQL Server
		break

	case "Standard":
		// unspecified
		break

	default:
		assert false : "Unexpected database type."
		break
}
Class GroovyContextConnections

2.6. Webservices

2.6.1. Webservice-Aufruf ausführen

Ruft den zu Grunde liegenden Webservice auf. Gilt nur für Skripts, die innerhalb eines Webservices definiert sind.
g_ws.invoke()

2.6.2. Webservice-Eingabewerte auslesen

Auslesen von Werten, die einem Webservice als Eingabeparameter übergeben werden. Als Variablenname ist der Name der Kontrolle anzugeben, die den Wert enthält. Beispiel:
g_ctx.requestVars.textcontrolD72A9620
g_ctx.requestVars.

2.6.3. Webservice-Rückgabewerte auslesen

Auslesen von Werten, die einem Webservice als Rückgabeparameter übergeben werden. Als Variablenname ist der Name der Kontrolle anzugeben, in die der Rückgabewert geschrieben wird. Beispiel:
g_ctx.bpeeVars.textvcontrol72EF4A0B.value
g_ctx.bpeeVars..value

2.7. Fallunterscheidung

2.7.1. switch-Anweisung für Groovy-Bedingung

Anwendbar in Prozessen. Die Rückgabewerte entsprechen den ausgehenden Verbindungen (Verbindungs-ID) der Groovy-Bedingung.
switch (g_record[""].value)
{
	case "expected value 1":
		return connectionId1
	case "expected value 2":
		return connectionId2
	default:
		return connectionId3
}

2.7.2. switch-Anweisung für Datengruppenereignisse

Anwendbar in Prozessen.
import de.uplanet.lucy.server.workflow.event.IAfterCreateDataGroupWorkflowEvent
import de.uplanet.lucy.server.workflow.event.IAfterUpdateDataGroupWorkflowEvent
import de.uplanet.lucy.server.workflow.event.IBeforeDeleteDataGroupWorkflowEvent
import de.uplanet.lucy.server.workflow.event.INotifyDataGroupWorkflowEvent

switch (g_event)
{
	case IAfterCreateDataGroupWorkflowEvent:
		g_log.info("A new record was inserted.")
		break

	case IAfterUpdateDataGroupWorkflowEvent:
		g_log.info("A record was updated.")
		break

	case IBeforeDeleteDataGroupWorkflowEvent:
		g_log.info("A record will be deleted.")
		break

	case INotifyDataGroupWorkflowEvent:
		g_log.info("A timer resubmitted a record.")
		break

	default:
		g_log.warn("Unhandled event ${g_event}.")
		break
}
Interface IWorkflowEvent

2.7.3. Datensätze bei globalen Datengruppen-Timern

Unterscheidung zwischen dem erstem und den nachfolgenden Datensätzen bei globalen Datengruppen-Timern.
if (g_sharedState["wasHere${g_guidSelf}"])
{
	// we were here before
}
else
{
	// we are here for the first time
	g_sharedState["wasHere${g_guidSelf}"] = true
}

2.8. Mathematische Berechnungen

2.8.1. Kaufmännisches Runden

Kaufmännisches Runden mit optionaler Angabe der Nachkommastellen.

Beispiel:
13,3749 -> 13,37
-13,3749 -> -13,37
13,3750 -> 13,38
-13,3750 -> -13,38
import de.uplanet.util.math.RoundingUtil
RoundingUtil.roundHalfAwayFromZero(, 2)
Class Math

2.8.1. Mathematisches Runden

Mathematisches Runden mit optionaler Angabe der Nachkommastellen.

Beispiel:
2.2499 -> 2.2
2.2501 -> 2.3
2.2500 -> 2.2
2.3500 -> 2.4
import de.uplanet.util.math.RoundingUtil
RoundingUtil.roundHalfEven(, 2)
Class Math

2.9. Datum / Uhrzeit

2.9.1. Dauer in Tagen berechnen

Ein Datensatz beinhaltet Daten für ein Start- und ein Enddatum. Berechnet wird die Zeitspanne zwischen diesen beiden Datumswerten. Bitte beachten Sie, dass hier keine Zeitzonen berücksichtigt werden.
def conn    = g_dbConnections.systemConnection
def dtStart = g_record["GUID"].value // datafield startDate
def dtEnd   = g_record["GUID"].value // datafield endDate
def iID     = g_record["GUID"].value // datafield (PK) (S) ID

use (groovy.time.TimeCategory)
{
	def duration = dtEnd - dtStart

	def stmt = g_dbQuery.prepare(conn, "UPDATE DATAGROUP('<DATAGROUP_GUID>') SET <COLUMN_DURATION> = ? WHERE LID = ?")

	stmt.setInt(1, duration.days)
	stmt.setInt(2, iId)
	stmt.executeUpdate()
	stmt.close()
}

2.9.2. ISO-Datumsstring parsen

Parst eine Zeichenkette im ISO-Format in ein java.util.Date-Objekt. Beispiel:

def strDate = "2013-01-01T12:00:01Z"
def strDateMillis = "2013-01-01T15:00:01.000Z"

def dtDate1 = ISODateTimeUtil.parseISODateTime(strDate)
def dtDate2 = ISODateTimeUtil.parseISODateTimeMillis(strDateMillis)
def dtDate3 = ISODateTimeUtil.parseISODateTimeOptionalMillis(strDate)
def dtDate4 = ISODateTimeUtil.parseISODateTimeOptionalMillis(strDateMillis)
import de.uplanet.util.ISODateTimeUtil

def dtDate  = ISODateTimeUtil.parseISODateTimeOptionalMillis("<DATE_ISO_STRING>")
Class ISODateTimeUtil

2.9.3. Datum als ISO-String formatieren

Formatiert ein Datumsobjekt als ISO-String. Beispiel:
println ISODateTimeUtil.formatISODateTime(currentTimestamp())
println ISODateTimeUtil.formatISODateTimeMillis(currentTimestamp())
import de.uplanet.util.ISODateTimeUtil

ISODateTimeUtil.formatISODateTime(currentTimestamp())
Class ISODateTimeUtil

2.9.4. Jetzt als Timestamp

now().withoutFractionalSeconds
Class ChimeraDate

2.9.5. Zeitstempel für Systemwerte

Diese Closure liefert den Zeitstempel der aktuellen Transaktion. Dieser Wert bleibt bis zum Verarbeitungsende dieser Transaktion unverändert.
currentTimestamp()

2.10. E-Mail

2.10.1. Groovy E-Mail (einfach)

Eine einfache Text-E-Mail erzeugen.
import de.uplanet.lucy.server.mail.GroovyMailBuilder
	def mail = new GroovyMailBuilder().composeMail {
	from    = "sender@example.org"
	to      = "recipient@example.org"
	subject = "Insert the subject here"

	body << "Hello world"
}

mail.drop()

2.10.2. Groovy E-Mail

Eine HTML-E-Mail mit Bildern und Dateianhang erzeugen.
import de.uplanet.lucy.server.mail.GroovyMailBuilder

def fileImg        = new File(g_dirWorkflow, "theImage.png")
def fileAttachment = new File(g_dirWorkflow, "document.pdf")

def mail = new GroovyMailBuilder().composeMail {
	headers = [
		"Importance": "High",
		"X-Priority": "1"
	]

	from        = "sender@example.org"
	to          = ["recipient-1@example.org", "recipient-2@example.org"]
	subject     = "Insert the subject here"
	contentType = "text/html; charset=UTF-8"

	body << """<html>
	<body>
		<h1>Hello World</h1>
		<p>
			Look at this image
			<br>
			<img src="${srcInlineImage(fileImg)}">
			<br>
			Nice.
		</p>
	</body>
	</html>"""

	// note: name is an optional parameter
	attachFile(file: fileAttachment, name: "nameOfTheAttachment.pdf", contentType: "application/pdf")
}

mail.drop()

2.10.3. E-Mail per Ant verschicken

def strFromAddr = g_session?.user?.emailBiz
def strFromName = g_session?.user?.name
def strToAddr   = "" // insert the recipient here

new AntBuilder().mail(mailhost:"localhost", messagemimetype:"text/plain", subject:"Hello World") {
	from(address:"${strFromName} <${strFromAddr}>")
	to(address:addrTo)
	message("""Here goes the message text.

With kind regards
${strFromName}
""")
}

2.11. Dateien und Verzeichnisse

2.11.1. Festplattenplatz ermitteln

// the partition where the Intrexx portal resides
File partition = new File(".")

long totalSpace = partition.totalSpace
long freeSpace = partition.freeSpace

2.11.2. Verzeichnis des aktuellen Workflows

g_dirWorkflow

2.11.3. Temporäres Workflow-Verzeichnis

Zugriff auf ein temporäres Workflow-Verzeichnis. Das Verzeichnis ist auch für nachfolgende Workflow-Objekte sichtbar. Es wird gelöscht, sobald der Workflow vollständig abgearbeitet wurde.
g_dirWorkflowTmp

2.11.4. In temporärem Verzeichnis arbeiten

import de.uplanet.io.IOHelper 

File dirTemp = createTemporaryDirectory()

try
{
	
}
finally
{
	IOHelper.deleteFileRecursively(dirTemp)
}

2.11.5. Datei zu Datensatz hinzufügen

Fügt eine Datei zu einem bestehenden Datensatz hinzu. Mit copyFileToIntrexx(...) wird die Quelldatei kopiert und bleibt an ihrem Speicherort erhalten. Ein analoger Aufruf ist mit moveFileToIntrexx(...). Hierbei wird die Quelldatei nach Intrexx verschoben.

Parameter:
p_ctx - Der aktuelle Verarbeitungskontext (g_context)
p_fileSrc - Datei, die hinzugefügt werden soll
p_strFieldGUID - GUID des Dateidatenfeldes
p_recId - ID des Datensatzes, zu dem die Datei hinzugefügt werden soll
p_bTriggerWorkflow - Soll ein Workflow getriggert werden, der auf Datensatzänderungen reagiert?


Beispiel:
FileUCHelper.copyFileToIntrexx(g_context, fileInput, "0B5CFF839F946923DBB0D92F39BB5D79BEC8D94C", g_record.recId, false)
import de.uplanet.lucy.server.businesslogic.util.FileUCHelper
FileUCHelper.copyFileToIntrexx(g_context, p_fileSrc, p_strFieldGuid, p_recId, p_bTriggerWorkflow) 
Class FileUCHelper

2.11.6. Datei aus Datensatz löschen

Löscht eine Datei aus einem Datensatz.

Parameter:
p_ctx - Der aktuelle Verarbeitungskontext (g_context)
p_strFieldGUID - GUID des Dateidatenfeldes
p_recId - ID des Datensatzes, von dem die Datei gelöscht werden soll

Beispiel:
FileUCHelper.deleteFileFromIntrexx(g_context, "0B5CFF839F946923DBB0D92F39BB5D79BEC8D94C", g_record.recId)
import de.uplanet.lucy.server.businesslogic.util.FileUCHelper
FileUCHelper.deleteFileFromIntrexx(g_context, p_strFieldGuid, p_recId) 
Class FileUCHelper

2.11.7. Textdatei einlesen

Liest den Inhalt einer Texdatei mit dem definierten Encoding. Nicht bei großen Datenmengen einsetzen.
def fileIn     = new File("<FILE_NAME>")
def strContent = fileIn.getText("UTF-8")

2.11.8. Textdatei zeilenweise einlesen

Liest zeilenweise den Inhalt einer Texdatei mit dem definierten Encoding. def fileIn = new File("_in.txt")
fileIn.eachLine("UTF-8") {line ->
	//process line
}

2.11.9. In Textdatei schreiben

Schreibt eine Textausgabe in eine Textdatei mit dem definierten Encoding.

Beispiel:
def fileOut = new File("out.txt")
def strOutput = "This is my output text.\n"

fileOut.withWriter("UTF-8") {out ->
out << strOutput
out.write(strOutput)
out.append(strOutput)
}
def fileOut = new File("out.txt")

fileOut.withWriter("UTF-8") {out ->
	//write output to  file
}

2.12. Session / Benutzer

2.12.1. Name des aktuellen Benutzers

g_session?.user?.name
Interface IUser

2.12.2. E-Mail-Adresse des aktuellen Benutzers

g_session?.user?.emailBiz
Interface IUser

2.12.3. Anonyme Session oder nicht?

g_session?.anonymous
Class GroovySession

2.12.4. Zugriff auf die Organisationsstruktur

g_om.getOrgStructure()
g_om - Details

2.12.5. Angemeldete Benutzer

Liste aller angemeldeten, nicht anonymen Benutzer.
de.uplanet.lucy.server.portalserver.LoggedOnUsers.getLoggedOnUsersDistinct()

2.12.6. Neues Passwort für Benutzer setzen

Setzt ein neues Passwort für den angegebenen Benutzer.
g_om.changePassword(user, password)
Class GroovyOrgBuilder

2.13. Benutzerverwaltung

2.13.1. Benutzer anlegen (einfach)

g_om.createUser {
	container     = "System"
	name          = "user-${now().withoutFractionalSeconds}" 
	loginName     = "UserU-${now().withoutFractionalSeconds}"
	password      = "secret"
	emailBiz      = "user@example.org"
	description   = "User created with Groovy at ${now().withoutFractionalSeconds}"
}

2.13.2. Benutzer anlegen

/ provide the copy of an user image (optional)
def fileTemplImage = new File(g_dirWorkflow, "user.jpg")
def fileUserImage  = new File(g_dirWorkflowTmp, "user.jpg")

de.uplanet.io.IOHelper.copyFile(fileUserImage, fileTemplImage)

def user = g_om.createUser {
	container     = "System"
	name          = "user-${now().withoutFractionalSeconds}" 
	loginName     = "UserU-${now().withoutFractionalSeconds}"
	password      = "secret"
	emailBiz      = "user@example.org"
	description   = "User created with Groovy at ${now().withoutFractionalSeconds}"
	nickName      = "dodo"  // this is a custom user field
	userImageFile = fileUserImage

	// provide a list of sets (group, role, dist list, ...) the user should be member of
	// allowed are GUIDs, unique names, paths, or org structure set nodes
	memberOf = ["importantRole", "36B3BFD54A57BE5D1EE51288D920CDA9B20A67A4"]
}

// create a new password and send it to the user's emailBiz address (optional)
g_om.generateAndSendPassword(user, g_defaultLanguage)

2.13.3. GUIDs klassifizieren

Klassifizieren von GUIDs nach
def classified = g_om.classifyGuids(/* a list of GUIDs or text that contains GUIDs */)

// do something with the classified GUIDs
classified.users
classified.containers
classified.sets
classified.unclassified

2.14. Kategorien

2.14.1. Datum / Uhrzeit

use (groovy.time.TimeCategory)
{
	
}	

2.14.2. IValueHolder

use (de.uplanet.lucy.server.scripting.groovy.GroovyIntrexxValueHolderCategory)
{
	
}
Class GroovyIntrexxValueHolderCategory

12.15. Info

12.15.1. Systeminformation

def osmbean = java.lang.management.ManagementFactory.operatingSystemMXBean
def sysInfo = """
name                        ${osmbean.name}
version                     ${osmbean.version}
arch                        ${osmbean.arch}
availableProcessors         ${osmbean.availableProcessors}
processCpuTime              ${osmbean.processCpuTime}
systemLoadAverage           ${osmbean.systemLoadAverage}
committedVirtualMemorySize  ${osmbean.committedVirtualMemorySize} bytes
totalPhysicalMemorySize     ${osmbean.totalPhysicalMemorySize} bytes
freePhysicalMemorySize      ${osmbean.freePhysicalMemorySize} bytes
totalSwapSpaceSize          ${osmbean.totalSwapSpaceSize} bytes
freeSwapSpaceSize           ${osmbean.freeSwapSpaceSize} bytes"""

g_log.info(sysInfo)

12.15.2. Intrexx-Version

Liefert die Version der Intrexx-Installation.
de.uplanet.lucy.VERSION.CURRENT.toFormattedString()

2.16. Fehlerbehandlung und Fehlersuche

2.16.1. Stacktrace als String

getStackTraceString()

2.16.2. Groovy-Kontext

def dumpBinding = {
	def sbuf = new StringBuilder()

	sbuf << "Dump the Groovy binding:\n"

	binding.variables.each { k, v ->
		if (v && v.metaClass.respondsTo(v, "dump"))
			sbuf << "${k} = ${v.dump()}\n"
		else
			sbuf << "${k} = ${v.toString()}\n"
	}

	sbuf.toString()
}

g_log.info(dumpBinding())

2.16.3. Fehlerbehandler für Skript definieren

Einsetzbar in
onError = { exception, err ->
	err.title = ""
	err.description = "Insert your description here. ${exception.message}"
}

2.17. Groovy Server Skripts

2.17.1. JSON-Antwort

Bitte beachten Sie, dass vor allen Aktionen, die von Benutzern ausgelöst werden können, eine Rechteprüfung (IxAccessController) erforderlich ist.
response.json()

// define an error handler
response.onError = {e, err ->
	//err.type = "default"
	// either title/description, ...
	err.title = "my error"
	err.description = e.message
	err.showEmbedded = true
	// ... or a redirect
	// err.redirectUrl = "http://www.example.org/"
	// err.redirectDelay = 1500 // milliseconds
}

// check permissions
g_permissions.check {
	// application("${application.guid}": "access")
	// dataGroup("<data group GUID>": "read", "<another data group GUID>": "write,create")
}

// create some JSON content
writeJSON("person": [
	givenName: "Donald",
	lastName: "Duck",
	age: 78,
	nephews: ["Huey", "Dewey", "Louie"]
])

12.18. Velocity

2.18.1. Text aus Velocity-Template erzeugen

import de.uplanet.lucy.server.scripting.velocity.VelocityContextUtil
import org.apache.velocity.app.Velocity

def fileVm = new File(g_dirWorkflow, "") // the Velocity input file
def vc     = VelocityContextUtil.createDefaultContext(g_context)

// add additional variables to the Velocity context
// vc.put("PreparedQuery", g_dbQuery)
// vc.put("variableName", variableValue)

def template = Velocity.getTemplate(fileVm.path)
def writer   = new StringWriter(4096) // 4 KiB initial buffer

template.merge(vc, writer)

g_log.info(writer.toString())

2.18.2. Datei aus Velocity-Template erzeugen

Aus Sicherheitsgründen können Velocity-Dateien nur ausgeführt werden, wenn sie sich in einem der folgenden Unterverzeichnisse befinden:

2.19. Request-Variable

2.19.1. g_request.get(...)

g_request.get("")
Class GroovyServerBridgeRequest

2.19.2. rq_Lang

Liefert die aktuell verwendete Sprache des angemeldeten Benutzers.
rq_Lang

2.19.3. rq_command

rq_command

2.19.4. rq_RecId

rq_RecId

2.19.5. rq_AppGuid

rq_AppGuid

2.19.6. rq_TargetPageGuid

rq_TargetPageGuid

2.19.7. REMOTE_ADDR

IP-Adresse des Client-Computers.
REMOTE_ADDR

2.19.8. SERVER_PORT

SERVER_PORT

2.19.9. HTTP_HOST

HTTP_HOST

2.19.10. HTTP_REFERER

HTTP_REFERER
HTTP_COOKIE

2.19.12. HTTP_USER_AGENT

HTTP_USER_AGENT

2.19.13. SCHEME

HTTP oder HTTPS
SCHEME

2.20. Bilder

2.20.1. Bild skalieren

Unterstützte Formate sind PNG, JPEG (JPG) und BMP.
import de.uplanet.lucy.server.scripting.groovy.ImageHelper

// Parameters: inputFile, outputFile, format?, width?, height?, maxWidth?, 
// maxHeight?, scaleX?, scaleY?, shrinkOnly?, rotate?, crop?
ImageHelper.scaleImage(inputFile: , outputFile: <OUTPUT_FILE>)
Class ImageHelper

2.20.2. Bildgröße ermitteln

Als Parameter kann ein File-Objekt oder ein Pfad als Zeichenfolge übergeben werden.
import de.uplanet.lucy.server.scripting.groovy.ImageHelper

def (x, y) = ImageHelper.getImageSize()
Class ImageHelper

2.20.3. Iterieren über Bild-Metadaten

Hier finden Sie ein Beispiel, das die Verwendung der Metadaten-Extraktion in Groovy zeigt.
import de.uplanet.lucy.server.scripting.groovy.ImageHelper

def file = 

ImageHelper.getImageMetaData(file).each { tag, value ->
	println("$tag -> $value")
}
Class ImageHelper

2.21. Logging

2.21.1. Info in Portal-Logdatei schreiben

Schreibt einen INFO-Eintrag in die portal.log-Datei. Diese Methode kann verwendet werden, wenn die zum Ausführungskontext des Skripts gehörige Logdatei nicht die portal.log ist, die Ausgabe aber dennoch in die portal.log erfolgen soll.
g_syslog.info("")

2.21.2. Info in Logdatei schreiben

Schreibt einen INFO-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.
g_log.info("")

2.21.3. Warnung in Portal-Logdatei schreiben

Schreibt einen WARN-Eintrag in die portal.log-Datei. Diese Methode kann verwendet werden, wenn die zum Ausführungskontext des Scripts gehörige Logdatei nicht die portal.log ist, die Ausgabe aber aber dennoch in die portal.log erfolgen soll.
g_syslog.warn("")

2.21.4. Warnung in Logdatei schreiben

Schreibt einen WARN-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.
g_log.warn("")

2.21.5. Fehler in Portal-Logdatei schreiben

Schreibt einen ERROR-Eintrag in die portal.log-Datei. Diese Methode kann verwendet werden, wenn die zum Ausführungskontext des Scripts gehörige Logdatei nicht die portal.log ist, die Ausgabe aber aber dennoch in die portal.log erfolgen soll.
g_syslog.error("")

2.21.6. Fehler in Logdatei schreiben

Schreibt einen ERROR-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.
g_log.error("")

2.21.7. Statistik-Logs lesen

import de.uplanet.lucy.server.monitor.log.GroovyLogReader

// flush queued log entries to disk
GroovyLogReader.flushLogQueue()

// collect the log files
def logFiles = []

new File("internal/statistics").eachFile {
	if (!it.name.startsWith(".")) // TODO check additional criteria
		logFiles << it
}

// read the selected log files
logFiles.each { file ->
	GroovyLogReader.readLog(file) { entry ->
		// TODO do something with the entry
		println("Time in millis = ${entry.time}, targetGuid = ${entry.targetGuid}")
	}
}

2.22. Connector für Microsoft Exchange

2.22.1. Aktuelle Exchange-Verbindung

Liefert die aktuelle Verbindung zu Microsoft Exchange.
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
Class ExchangeConnectionUtil

2.22.2. Mailboxname des aktuellen Exchangebenutzers

Liefert den Namen der Mailbox der aktuellen Exchangeverbindung.
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def mailboxUtil = ExchangeUtils.getMailboxUtil(connEx)

def strMailboxName = mailboxUtil.getImpersonateUserAccount(g_context.impersonateUserGuid).exchangeMailbox
Class ExchangeUserMailboxInfo

2.22.3. E-Mail lokal als EML abspeichern

Speichert eine E-Mail lokal im EML-Format ab. Alternativ kann auch saveMessageAsMSG(..) verwendet werden, um die E-Mail im Format MSG abzuspeichern.

Parameter:
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def messageUtil = ExchangeUtils.getMessageUtil(connEx)

messageUtil.saveMessageAsEML(strMessageId, fileMail)
Interface IExchangeMessageUtil

2.22.4. Anhänge einer E-Mail abspeichern

Speichert die Anhänge der durch strMessageId definierten E-Mail.
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def itemUtil    = ExchangeUtils.getItemUtil(connEx)
def attachments = itemUtil.getAttachments(strMessageId)

attachments.each{ item ->
	def attachment = new File(g_dirWorkflowTmp, item.displayName)
	itemUtil.saveAttachment(item, attachment)
}
Interface IExchangeItemUtil

2.22.5. Abwesenheitsnachricht setzen

Schreibt den Text der Abwesenheitsnachricht und setzt den Status auf aktiv. Achtung: Der Text wird sowohl als interne als auch als externe Nachricht gesetzt.
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def mailboxUtil = ExchangeUtils.getMailboxUtil(connEx)

mailboxUtil.setOutOfOfficeMessage("Out of office till 2010/31/12")
mailboxUtil.setOutOfOffice(true)
Interface IExchangeMailboxUtil

2.22.6. Ordnerinformationen abrufen

Ruft Informationen zu einem Ordner des Exchangekontos ab.
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def mailboxUtil = ExchangeUtils.getMailboxUtil(connEx)
def folderInfo  = mailboxUtil.getFolderInfoByHref(mailboxUtil.getInboxFolderHref())
Interface IFolderInfo

2.22.7. Ordner erstellen

Erstellt einen Exchange-Ordner (in diesem Beispiel unterhalb des Posteingangs).

Parameter:
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx         = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def mailboxUtil    = ExchangeUtils.getMailboxUtil(connEx)
def strInboxFolder = mailboxUtil.getInboxFolderHref()

mailboxUtil.createFolder(strInboxFolder, "myFolder", "urn:content-classes:mailfolder")
Interface IExchangeMailboxUtil

2.22.8. Anhang einem Element hinzufügen

Fügt einem bereits existieren Element (z.B. einem Termin) einen Anhang hinzu.

Parameter:
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def itemUtil    = ExchangeUtils.getItemUtil(connEx)
def strFileName = "myAttachment.txt"
def strMimeType = "text/plain"
def fileAttach  = new File(strFileName)

itemUtil.addAttachmentToItem(strItemId, fileAttach, strFileName, strMimeType, bIsContactPhoto, bDeleteAfter)
Interface IExchangeItemUtil

2.22.9. Exchange-Termin anlegen

Legt für den aktuellen Exchange-Benutzer einen neuen Termin an.

Parameter: Werden nach dem Erstellen des Termins weitere Eigenschaften über set()-Methoden definiert, müssen abschließend mit appointment.save() der Termin erneut gespeichert werden, um die Änderungen zu übernehmen.

Beispiel:
def appointment = aptUtil.createNewAppointment(dtStartDate, dtEndDate, strSubject, strBody)

appointment.setLocation("Konferenzraum")
appointment.save()
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx  = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def aptUtil = ExchangeUtils.getAppointmentUtil(connEx)

def appointment = aptUtil.createNewAppointment(dtStartDate, dtEndDate, strSubject, strBody)
Interface IExchangeAppointmentUtil

2.22.10. Exchange-Kontakt anlegen

Legt für den aktuellen Exchange-Benutzer einen neuen Kontakt an.

Parameter: Werden nach dem Erstellen des Kontakts weitere Eigenschaften über set()-Methoden definiert, muss der Termin abschließend mit contact.save() erneut gespeichert werden, um die Änderungen zu übernehmen.

Beispiel:
def contact = contactUtil.createNewContact("Doe", "John", "john.doe@example.org", null)

contact.setJobTitle("Developer")
contact.save()
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx      = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def contactUtil = ExchangeUtils.getContactUtil(connEx)

def contact = contactUtil.createNewContact(strLastName, strFirstName, strMail, strMailbox)
Interface IExchangeContactUtil

2.22.11. Exchange-E-Mail generieren und versenden

Generiert eine neue E-Mail für den aktuellen Exchange-Benutzer.

Parameter: Werden nach dem Erstellen der E-Mail weitere Eigenschaften über set()-Methoden definiert, muss der Entwurf abschließend mit message.save() erneut gespeichert werden, um die Änderungen zu übernehmen.

Beispiel:
def message = msgUtil.createNewDraft("sender@example.org", "recipient@example.org", "Example subject", "Example text")

message.setCc("cc_recipient@example.org")
message.save()

message.send()
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx  = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def msgUtil = ExchangeUtils.getMessageUtil(connEx)

def message = msgUtil.createNewDraft(strSender, strRecipient, strSubject, strBody)
Interface IExchangeMessageUtil

2.22.12. Exchange-Notiz anlegen

Legt für den aktuellen Exchange-Benutzer eine neue Notiz an.

Parameter: Beispiel:
def noteUtil = ExchangeUtils.getNoteUtil(connEx)

def note = noteUtil.createNewNote("My note", null)
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx   = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def noteUtil = ExchangeUtils.getNoteUtil(connEx)

def note = noteUtil.createNewNote(strText, strMailBox)
Interface IExchangeNoteUtil

2.22.13. Exchange-Aufgabe anlegen

Legt für den aktuellen Exchange-Benutzer eine neue Aufgabe an.

Parameter: Beispiel:
def taskUtil = ExchangeUtils.getTaskUtil(connEx)

def dtStart, dtDue, reminder

use (groovy.time.TimeCategory)
{
dtStart = new Date() + 1.day
dtStart = dtStart.clearTime()
dtDue = dtStart + 5.days
reminder = dtDue - 12.hours
}

def task = taskUtil.createNewTask(dtStart, dtDue, "Task subject", null)

task.setPercentComplete(25.0)
task.setUserDefinedFieldValue("ReminderTime", VH.getValueHolder(reminder))
task.setUserDefinedFieldValue("ReminderSet", VH.getValueHolder(true))

task.save()
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil
import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeUtils

def connEx   = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
def taskUtil = ExchangeUtils.getTaskUtil(connEx)

def task = taskUtil.createNewTask(dtStart, dtDue, "Task subject", null)
Interface IExchangeTaskUtil

2.23. Auf eine Unterbrechungsanforderung prüfen

checkInterrupted()
Prüft ob entweder Verwenden sie diesen Aufruf in Skripts, die sich in solchen Fällen kooperativ verhalten sollen.
checkInterrupted()
Class CheckInterruptedClosure

2.24. Scheduler-Job starten

Eingabeparameter: ID bzw. GUID des Jobs.
de.uplanet.lucy.server.scheduler.JobStarter.startJob("")

2.25. Externes Programm ausführen

def pOut = new StringBuffer()
def pErr = new StringBuffer()
def proc = [""].execute()

proc.consumeProcessOutput(pOut, pErr)
proc.waitForOrKill(10000) // 10 seconds

if (proc.exitValue() == 0)
{
	// success
	// ...
}
else
{
	// an error occurred
	g_log.error(pErr.toString())
}

2.26. Neue GUID erzeugen

Erzeugt eine neue GUID.
newGuid()
Class NewGuidClosure

2.27. synchronized-Skriptblock

Synchronisiert auf dem umgebenden Prozess-Objekt (Aktion, Bedingung, Ereignisbehandler). Die Variable g_mutexSelf ist nur in Prozessen definiert.
synchronized (g_mutexSelf)
{
	
}

2.28. ValueHolder erzeugen

Erzeugt einen ValueHolder für einen einfachen Datentyp.

Wird null übergeben, so wird ein NullValueHolder erzeugt. Dessen Wert null ist; hasValue() gibt false zurück.
vh()

2.29. GUIDs parsen

GUIDs aus textuellen Eingaben parsen. Es sind mehrere Parameter möglich.
parseGuids()