Montag, 7. Januar 2013

Fälle für Benutzer selektieren

Ich habe letzte Woche einen Prozess so umgestellt, dass er als reiner Hintergrund-Prozess als Benutzer SYSTEM startet. Ein Problem das sich dadurch ergab war, dass die Prozesse in unserem angepassten WorkflowUI nicht mehr in der Fall-Übersicht des Benutzer als "Meine"-Prozesse erschien.

Die eigentliche Selektion findet in der Methode findCases in der Klasse ch.ivyteam.ivy.workflow.ui.utils.WorkflowUIAccessPermissionHandler statt. Dieser Methode kann ein Integer "caseDisplayMode" mitgegeben werden, welcher den Benutzer-Filter steuert:
  • 0 stands for your cases
  • 1 stands for team cases
  • 2 stands for all application cases (ivy.wf)
  • 3 any query cases: it means find all cases that fit to the received criteria (property filter)

Um "Meine"-Prozesse anzuzeigen, wird der Wert 0 übergeben. Die Methode findCases verwendet dann die Ivy-Session Methode findInvolvedCases. Als Involviert gilt ein User wenn:
  • he is the creator of the case
  • he has worked or is working on a task of the case.
  • he can work on a task of the case. Either because he is the activator of the task or the activator of the task is a role he owns.
Wird nun ein Prozess komplett im Hintergrund gestartet, z.Bsp. über ein Event Start, und läuft anschliessend weiter im Hintergrund (als Benutzer SYSTEM), kann er daher nicht direkt einem Benutzer zugeordnet werden.

Zum Ändern des Erstellers eines Cases habe ich keine API Methode gefunden. Daher habe ich momentan folgendes implementiert:
  • Beim Starten des Prozesses über ein File basierter Event Start wird der "Besitzer" des Prozesses aus der Datei gelesen (wurde in diesem Fall bereits mitgeliefert) und in den Case Daten (hier als businessCreatorUser) gespeichert
  • Bei der Anzeige habe ich eine zusätzliche Option "Besitzer" implementiert, welche als caseDisplayMode 3 angibt und einen entsprechende Filter übergibt:
IPropertyFilter filter = in.propertyFilter;
if(in.caseDisplayMode == 3) {
    filter =  ivy.wf.createCasePropertyFilter(
       ch.ivyteam.ivy.workflow.CaseProperty.BUSINESS_CREATOR_USER,
     ch.ivyteam.logicalexpression.RelationalOperator.EQUAL,
     ivy.session.getSessionUserName());
}