Groovy

1. Allgemeines

Allgemeine Informationen zum Thema "Scripting" finden Sie hier.

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.

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

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).

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

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.

Snippet

import de.uplanet.lucy.server.security.IxAccessController
Class IxAccessController

2.3.2. IFilter

Snippet

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

2.3.3. WorkflowException

Fehlerbehandlung von Prozessen.

Snippet

import de.uplanet.lucy.server.workflow.WorkflowException
Class 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.

Snippet

g_context
Interface IProcessingContext

2.4.3. g_ctx

BPEE Verarbeitungskontext - nur verfügbar im Webservicekontext.

Snippet

g_ctx

2.4.4. g_dataCollection

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

Beispiel 1

Zugriff auf Tabelle:
g_dataCollection.getDataRange("<GUID TABLERECORDS>").getNumberOfRecords() > 0

Beispiel 2

Zugriff auf einen Datensatz:
g_dataCollection.getValueHolder(String p_guid)

Snippet

g_dataCollection

2.4.5. g_dbConnections

Zugriff auf verfügbare Datenbankverbindungen.

Snippet

//Systemverbindung 
def conn = g_dbConnections.systemConnection

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

2.4.6. g_dbQuery

Objekt zur Generierung und Ausführung von Datenbankabfragen.

Snippet

//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.

Snippet

assert g_defaultLanguage == 'en' : 'This script requires default language en.'

2.4.8. g_defaultLocaleId

Snippet

g_defaultLocaleId

2.4.9. g_dirWorkflow

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

Snippet

g_dirWorkflow
Class File

2.4.10. 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.

Snippet

g_dirWorkflowTmp
Class File

2.4.11. 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.

Snippet

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.12. g_exception

Enthält die Exception, die aufgefangen wurde. Diese muss untersucht und dann entschieden werden, ob sich der ErrorHandler sich dafür zuständig erklärt. Häufige Kriterien hierfür sind: Vgl. auch readme.txt und handler_50_xxx.groovy.example im Portalverzeichnis internal/system/vm/html/errorhandler/custom.

Snippet

g_exception
Class ExceptionUtil

2.4.13. 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)

Snippet

g_fileScript
Class File

2.4.14. g_guidSelf

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

Snippet

g_guidSelf

2.4.15. g_guidWf

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

Snippet

g_guidWf

2.4.16. g_i18n

Zugriff auf Sprachkonstanten.

Snippet

g_i18n
Class GroovyLanguageConstants

2.4.17. g_json

Snippet

g_json
Class GroovyJSON

2.4.18. g_language

Enthält die verwendete Sprache des aktuellen Benutzers.

Snippet

g_language

2.4.19. g_localeId

Snippet

g_localeId

2.4.20. g_log

Schreibt einen Eintrag in die zum Ausführungskontext des Skripts gehörige Logdatei.

Snippet

g_log.info("Prozess wurde ohne Fehler beendet.")
g_log.error("Es ist ein Fehler aufgetreten.")
Logging

2.4.21. g_mutexSelf

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

Snippet

g_mutexSelf
Synchronized-Skriptblock

2.4.22. g_om

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

2.4.22.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:

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

Class GroovyOrgBuilder

2.4.23. g_parameter

Objekt für den Zugriff auf Parameter.

Beispiel

def customerid = g_parameter.get("customerid")

Snippet

g_parameter
Class GroovyParameter
Seiten-Eigenschaften - Reiter Parameter

2.4.24. 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>.

Beispiel

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

Snippet

g_permissions
Class GroovyIxAccessController
Class GroovyIxAccessController.GroovyIxAccessControllerDelegate
Klassen aus de.uplanet.lucy.security.permission

2.4.25. g_portal

Objekt für den Zugriff auf Portaleigenschaften wie Name oder Base-URL.

Beispiel

def strUrl = g_portal.baseUrl

Snippet

g_portal
Class GroovyPortalInfo

2.4.26. g_portlet

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

Snippet

g_portlet
Class GroovyPortlet

2.4.27. 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.

Snippet

g_portletPool
Class GroovyPortlet

2.4.28. g_record

Zugriff auf den aktuellen Datensatz.

Beispiel

def iLid = g_record["0D8F13B2B43B128DB23C0C1CC8C5DC1143C9D826"].value // datafield (PK) (S) ID

Snippet

g_record
Class ReadOnlyGroovyRecord

2.4.29. 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

Snippet

g_rwRecord
Class ReadWriteGroovyRecord

2.4.30. 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.

Snippet

g_request
Class GroovyServerBridgeRequest

2.4.31. 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"}

Snippet

g_rtCache
Class GroovyRtCache

2.4.32. g_session

Die aktuelle Session.

Beispiel

//Name des aktuell angemeldeten Benutzers
def strUserName = g_session?.user?.name

Snippet

g_session
Class GroovySession

2.4.33. 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

Snippet

g_sharedState
Class SharedState

2.4.34. g_springApplicationContext

Spring Anwendungskontext

Snippet

g_springApplicationContext
Interface ApplicationContext

2.4.35. 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')

Snippet

g_sysDg
Class GroovySystemDataGroup

2.4.36. g_syslog

Loggingobjekt zur Ausgabe in die Log-Datei des Portals (portal.log).

Snippet

g_syslog.info("Meine Nachricht in die Logdatei portal.log.")

2.4.37. g_ws

Objekt zum expliziten Aufruf eines Webservices. Nur verfügbar bei Skripts, die bei einem Webservice hinterlegt sind.

Snippet

//Webservice in einem Skript aufrufen
g_ws.invoke()

2.5. Closures

Die vordefinierten Closures können wie Funktionen aufgerufen werden.

2.5.1. checkInterrupted()

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

Snippet

checkInterrupted()
Class CheckInterruptedClosure

2.5.2. createTemporaryDirectory()

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

Snippet

createTemporaryDirectory()
Class CreateTemporaryDirectoryClosure

2.5.3. currentTimestamp()

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

Beispiel

def dtNow = currentTimestamp()

Snippet

currentTimestamp()
Class CurrentTimestampClosure

2.5.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.

Snippet

try
{
	trySomething()

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

	doSomethingWithStackTrace(strStackTrace)
}
Class CreateStackTraceStringClosure

2.5.5. newGuid()

Erzeugt eine neue GUID.

Snippet

newGuid()
Class NewGuidClosure

2.5.6. now()

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

Snippet

now()
Class NowClosure

2.5.7. parseGuids(strText)

Parst GUIDs aus dem übergebenen String (z.B. eine Pipe-getrennte Liste) und liefert ein TreeSet mit den gefundenen GUIDs zurück.

Snippet

def strText = "18CC231E0A71F6F27091855C4C0FD0D6F2F26038||D0CACC8058DC36A9A499AB2DD3B993F427AB9200"
def guids   = parseGuids(strText)
guids.each {println it}
Class ParseGuidsClosure

2.5.8. vh()

Erzeugt einen neuen ValueHolder aus dem übergebenen Objekt.

Snippet

def vhTest = vh("Hello world!")
def vhInt  = vh(1000)
Class CreateValueHolderClosure

2.6. Datenbanken

2.6.1. Datengruppen

2.6.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

Snippet

def strName = g_rtCache.dataGroups["<GUID der Datengruppe"].name
Interface DataGroupInfo

2.6.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')")

Snippet

def strName = g_rtCache.dataGroups["<GUID der Datengruppe>"].name
Interface DataGroupInfo

2.6.1.3. Spaltennamen einer Datengruppe

Liefert eine Liste mit den Namen aller Spalten der Datengruppe mit der übergebenen GUID.

Snippet

def fieldNames = g_rtCache.fields.findAll{it.dataGroupGuid == "DG-GUID"}*.columnName
Interface FieldInfo

2.6.2. Intrexx Datenbank-API

2.6.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)

Snippet

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.6.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)

Snippet

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.6.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.

Snippet

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.6.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)

Snippet

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.6.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.

Snippet

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.6.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)

Snippet

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.6.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.

Snippet

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.6.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)

Snippet

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.6.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)

Snippet

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.6.3. JDBC

2.6.3.1. Vorbereitete Anweisung mit SELECT

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

Snippet

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.6.3.2. Vorbereitete Anweisung mit INSERT

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

Snippet

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.6.3.3. Vorbereitete Anweisung mit UPDATE

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

Snippet

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.6.3.4. Vorbereitete Anweisung mit DELETE

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

Snippet

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.6.4. Systemdatenquelle

System-Datenbankverbindung

Beispiel

def conn = g_dbConnections.systemConnection

Snippet

g_dbConnections.systemConnection
Class GroovyContextConnections

2.6.5. Fremddatenquelle

Verbindung zu einer Fremddatenquelle. Anzugeben ist der im Modul Integration vergebene Name für die Fremddatenverbindung.

Beispiel

def conn = g_dbConnections["ForeignData"]

Snippet

g_dbConnections["<CONNECTION_NAME>"]
Class GroovyContextConnections

2.6.6. Datenbanktyp unterscheiden

Ermittelt den Datenbanktyp.

Snippet

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.7. Webservices

2.7.1. Webservice-Aufruf ausführen

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

Snippet

g_ws.invoke()

2.7.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

Snippet

g_ctx.requestVars.

2.7.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

Snippet

g_ctx.bpeeVars..value

2.8. Fallunterscheidung

2.8.1. switch-Anweisung für Groovy-Bedingung

Anwendbar in Prozessen. Die Rückgabewerte entsprechen den ausgehenden Verbindungen (Verbindungs-ID) der Groovy-Bedingung.

Snippet

switch (g_record[""].value)
{
	case "expected value 1":
		return connectionId1
	case "expected value 2":
		return connectionId2
	default:
		return connectionId3
}
switch / case

2.8.2. switch-Anweisung für Datengruppenereignisse

Anwendbar in Prozessen.

Snippet

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.8.3. Datensätze bei globalen Datengruppen-Timern

Unterscheidung zwischen dem erstem und den nachfolgenden Datensätzen bei globalen Datengruppen-Timern.

Snippet

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.9. Mathematische Berechnungen

2.9.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

Snippet

import de.uplanet.util.math.RoundingUtil
RoundingUtil.roundHalfAwayFromZero(, 2)
Class Math

2.9.2. 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

Snippet

import de.uplanet.util.math.RoundingUtil
RoundingUtil.roundHalfEven(, 2)
Class Math

2.10. Datum / Uhrzeit

2.10.1. Datumswerte formatieren

Hier finden Sie Skript für die Formatierung von Datumswerten.

Snippet

import java.text.SimpleDateFormat

// specify the time zone
def tz = g_session.user.timeZone
//def tz = de.uplanet.lucy.server.DefaultTimeZone.get()
//def tz = TimeZone.getTimeZone("Europe/Berlin")

assert tz != null

// the date/time to be formatted
def dt = new Date()

// the date format
// https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/SimpleDateFormat.html
def fmt = new SimpleDateFormat("yyyy-MM-dd")
fmt.setTimeZone(tz)

println(fmt.format(dt))
SimpleDateFormat

2.10.2. 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.

Snippet

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.10.3. 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)

Snippet

import de.uplanet.util.ISODateTimeUtil

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

2.10.4. Datum als ISO-String formatieren

Formatiert ein Datumsobjekt als ISO-String.

Beispiel

println ISODateTimeUtil.formatISODateTime(currentTimestamp())
println ISODateTimeUtil.formatISODateTimeMillis(currentTimestamp())

Snippet

import de.uplanet.util.ISODateTimeUtil

ISODateTimeUtil.formatISODateTime(currentTimestamp())
Class ISODateTimeUtil

2.10.5. Jetzt als Timestamp

Snippet

now().withoutFractionalSeconds
Class ChimeraDate

2.10.6. Zeitstempel für Systemwerte

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

Snippet

currentTimestamp()
Class CurrentTimestampClosure

2.11. E-Mail

2.11.1. Groovy E-Mail (einfach)

Eine einfache Text-E-Mail erzeugen.

Snippet

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.11.2. Groovy E-Mail

Eine HTML-E-Mail mit Bildern und Dateianhang erzeugen.

Snippet

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.11.3. E-Mail per Ant verschicken

Snippet

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.12. Dateien und Verzeichnisse

2.12.1. Festplattenplatz ermitteln

Ermittelt die freie und gesamte Festplattenkapazität.

Snippet

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

long totalSpace = partition.totalSpace
long freeSpace = partition.freeSpace
Class File

2.12.2. Verzeichnis des aktuellen Prozesses

Liefert das Verzeichnis des aktuellen Prozesses. Auf dieses Verzeichnis sollte ausschließlich lesend zugegriffen werden.

Snippet

g_dirWorkflow
Class File

2.12.3. Temporäres Prozess-Verzeichnis

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

Snippet

g_dirWorkflowTmp
Class File

2.12.4. In temporärem Verzeichnis arbeiten

Verwendet ein temporäres Verzeichnis für die Bearbeitung.

Snippet

import de.uplanet.io.IOHelper 

File dirTemp = createTemporaryDirectory()

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

2.12.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)

Snippet

import de.uplanet.lucy.server.businesslogic.util.FileUCHelper
FileUCHelper.copyFileToIntrexx(g_context, p_fileSrc, p_strFieldGuid, p_recId, p_bTriggerWorkflow) 
Class FileUCHelper

2.12.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)

Snippet

import de.uplanet.lucy.server.businesslogic.util.FileUCHelper
FileUCHelper.deleteFileFromIntrexx(g_context, p_strFieldGuid, p_recId) 
Class FileUCHelper

2.12.7. Textdatei einlesen

Liest den Inhalt einer Texdatei mit dem definierten Encoding. Nicht bei großen Datenmengen einsetzen.

Snippet

def fileIn     = new File("<FILE_NAME>")
def strContent = fileIn.getText("UTF-8")
Class File

2.12.8. Textdatei zeilenweise einlesen

Liest zeilenweise den Inhalt einer Texdatei mit dem definierten Encoding.

Snippet

def fileIn     = new File("_in.txt")

fileIn.eachLine("UTF-8") {line ->
	//process line
}
Class File

2.12.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)
}

Snippet

def fileOut = new File("out.txt")

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

2.13. Session / Benutzer

2.13.1. Name des aktuellen Benutzers

Snippet

g_session?.user?.name
Interface IUser

2.13.2. E-Mail-Adresse des aktuellen Benutzers

Snippet

g_session?.user?.emailBiz
Interface IUser

2.13.3. Anonyme Session oder nicht?

Snippet

g_session?.anonymous
Class GroovySession

2.13.4. Zugriff auf die Organisationsstruktur

Snippet

g_om.getOrgStructure()
g_om - Details

2.13.5. Angemeldete Benutzer

Liste aller angemeldeten, nicht anonymen Benutzer.

Snippet

de.uplanet.lucy.server.portalserver.LoggedOnUsers.getLoggedOnUsersDistinct()

2.13.6. Neues Passwort für Benutzer setzen

Setzt ein neues Passwort für den angegebenen Benutzer.

Snippet

g_om.changePassword(user, password)
Class GroovyOrgBuilder

2.14. Benutzerverwaltung

2.14.1. Benutzer anlegen (einfach)

Snippet

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.14.2. Benutzer anlegen

Snippet

/ 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.14.3. GUIDs klassifizieren

Klassifizieren von GUIDs nach

Snippet

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.15. Kategorien

2.15.1. Datum / Uhrzeit

Snippet

use (groovy.time.TimeCategory)
{
	
}	

2.15.2. IValueHolder

Snippet

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

12.16. Info

12.16.1. Systeminformation

Snippet

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.16.2. Intrexx-Version

Liefert die Version der Intrexx-Installation.

Snippet

de.uplanet.lucy.VERSION.CURRENT.toFormattedString()
Class Version

2.17. Fehlerbehandlung und Fehlersuche

2.17.1. Stacktrace als String

Snippet

getStackTraceString()

2.17.2. Groovy-Kontext

Snippet

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.17.3. Fehlerbehandler für Skript definieren

Einsetzbar in

Snippet

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

2.18. Groovy Server Skripts

2.18.1. JSON-Antwort


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

Snippet

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"]
])

Mögliche Varianten des oben angegebenen Skipts

Closure ohne oder mit genau einem Parameter

Falls die Closure einen Parameter deklariert, wird im ersten Parameter (e) die aufgetretene Exception an die Closure übergeben.

Snippet

// define an error handler
response.onError = {e ->
    writeJSON("error": "Something bad happened.")
}

Closure mit zwei Parametern

Im ersten Parameter (e) wird die aufgetretene Exception und im zweiten Parameter (err) ein ErrorResponseData-Objekt an die Closure übergeben. In der Closure kann das ErrorResponseData-Objekt gemäß den jeweiligen Bedürfnissen konfiguriert werden.

Snippet

// 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
}

Mit String

Der angegebene String wird im Response-Body zum Client gesendet.

Snippet

response.onError = '{"error": "Something bad happened."}'

Zuweisung eines anderen Objekts

Im Falle einer JSON-Antwort wird versucht, aus dem Objekt JSON zu erzeugen. Falls die Antwort nicht vom Typ JSON ist, wird versucht, das Objekt in geeigneter Weise als Text auszugegeben.

Snippet

response.onError = [
    "error": "Something bad happened.",
    "solace": "But things could be worse."
]

12.19. Velocity

2.19.1. Text aus Velocity-Template erzeugen

Snippet

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.19.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.20. Request-Variable

2.20.1. g_request.get(...)

Snippet

g_request.get("")
Class GroovyServerBridgeRequest

2.20.2. rq_Lang

Liefert die aktuell verwendete Sprache des angemeldeten Benutzers.

Snippet

rq_Lang

2.20.3. REMOTE_ADDR

IP-Adresse des Client-Computers.

Snippet

REMOTE_ADDR

2.20.4. SERVER_PORT

Snippet

SERVER_PORT

Snippet

2.20.5. HTTP_HOST

Snippet

HTTP_HOST

2.20.6. HTTP_REFERER

Snippet

HTTP_REFERER

Snippet

HTTP_COOKIE

2.20.8. HTTP_USER_AGENT

Snippet

HTTP_USER_AGENT

2.20.9. SCHEME

HTTP oder HTTPS

Snippet

SCHEME

2.21. Bilder

2.21.1. Bild skalieren

Unterstützte Formate sind PNG, JPEG (JPG) und BMP.

Snippet

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.1.2. Bildgröße ermitteln

Als Parameter kann ein File-Objekt oder ein Pfad als Zeichenfolge übergeben werden.

Snippet

import de.uplanet.lucy.server.scripting.groovy.ImageHelper

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

2.21.3. Iterieren über Bild-Metadaten

Hier finden Sie ein Beispiel, das die Verwendung der Metadaten-Extraktion in Groovy zeigt.

Snippet

import de.uplanet.lucy.server.scripting.groovy.ImageHelper

def file = 

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

2.22. Logging

2.22.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.

Snippet

g_syslog.info("")
Class GroovyLogger

2.22.2. Info in Logdatei schreiben

Schreibt einen INFO-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.

Snippet

g_log.info("")
Class GroovyLogger

2.22.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.

Snippet

g_syslog.warn("")
Class GroovyLogger

2.22.4. Warnung in Logdatei schreiben

Schreibt einen WARN-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.

Snippet

g_log.warn("")
Class GroovyLogger

2.22.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.

Snippet

g_syslog.error("")
Class GroovyLogger

2.22.6. Fehler in Logdatei schreiben

Schreibt einen ERROR-Eintrag in die zum Ausführungskontext des Scripts gehörige Logdatei.

Snippet

g_log.error("")
Class GroovyLogger

2.22.7. Statistik-Logs lesen

Snippet

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.23. Connector für Microsoft Exchange

2.23.1. Aktuelle Exchange-Verbindung

Liefert die aktuelle Verbindung zu Microsoft Exchange.

Snippet

import de.uplanet.lucy.server.businesslogic.exchange.util.ExchangeConnectionUtil

def connEx = ExchangeConnectionUtil.getConnectionForWorkflowAction(g_context)
Class ExchangeConnectionUtil

2.23.2. Mailboxname des aktuellen Exchangebenutzers

Liefert den Namen der Mailbox der aktuellen Exchangeverbindung.

Snippet

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.23.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:

Snippet

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.23.4. Anhänge einer E-Mail abspeichern

Speichert die Anhänge der durch strMessageId definierten E-Mail.

Snippet

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.23.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.

Snippet

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.23.6. Ordnerinformationen abrufen

Ruft Informationen zu einem Ordner des Exchangekontos ab.

Snippet

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.23.7. Ordner erstellen

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

Parameter:

Snippet

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.23.8. Anhang einem Element hinzufügen

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

Parameter:

Snippet

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.23.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()

Snippet

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.23.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()

Snippet

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.23.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()

Snippet

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.23.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)

Snippet

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.23.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()

Snippet

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.24. WebSockets

2.24.1. Versenden einer Text-Nachricht

Beispiel

import de.uplanet.lucy.server.websocket.groovy.GroovyWebSocketTopic
GroovyWebSocketTopic.sendTextMessage("D00F000000000000000000000000000000000000", "Hallo Welt!")

Snippet

import de.uplanet.lucy.server.websocket.groovy.GroovyWebSocketTopic
GroovyWebSocketTopic.sendTextMessage("<topicGUID>", "<string>")
Class GroovyWebSocketTopic

2.24.2. Versenden einer JSON-Nachricht

Beispiel

import de.uplanet.lucy.server.websocket.groovy.GroovyWebSocketTopic

def msg = [
  seq: 1,
  greet: "Hallo Welt!"
]

GroovyWebSocketTopic.sendJsonMessage("D00F000000000000000000000000000000000000", msg)

Snippet

import de.uplanet.lucy.server.websocket.groovy.GroovyWebSocketTopic

def msg = [
  seq: 1,
  greet: "<string>"
]

GroovyWebSocketTopic.sendJsonMessage(${cursor}"<topicGUID>", msg)
Class GroovyWebSocketTopic

2.25. 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.

Snippet

checkInterrupted()
Class CheckInterruptedClosure

2.26. Scheduler-Job starten

Eingabeparameter: ID bzw. GUID des Jobs.

Snippet

de.uplanet.lucy.server.scheduler.JobStarter.startJob("")

2.27. Externes Programm ausführen

Führt ein externes Programm aus. Weitere Informationen finden Sie hier.

Snippet

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())
}
Class Process

2.28. Neue GUID erzeugen

Erzeugt eine neue GUID.

Snippet

newGuid()
Class NewGuidClosure

2.29. GUID prüfen

Prüft, ob ein gegebener String eine GUID im Sinne von Intrexx ist. Im Falle, dass der übergebene Wert null ist, liefert die Methode false zurück.

Snippet

Guid.isStringRepresentation()
Class Guid

2.30. Synchronized-Skriptblock

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

Snippet

synchronized (g_mutexSelf)
{
	
}

2.31. 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.

Snippet

vh()

2.32. GUIDs parsen

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

Snippet

parseGuids()

2.33. Zeitzone des Portals ermitteln

Hier finden Sie Skript für die Ermittlung der Default-Zeitzone, die in den Portaleigenschaften in den Ländereinstellungen festgelegt ist.

Snippet

import  de.uplanet.lucy.server.DefaultTimeZone
def tz = DefaultTimeZone.get()
Class DefaultTimeZone