Novinky

Více než 30 IDM realizací v České republice i zahraničí

AMI Praha Spuštění workflow z pravidla – Sun Identity Manager
Spuštění workflow z pravidla –  Sun Identity Manager

Spuštění workflow z pravidla – Sun Identity Manager

Sun Identity Manager rozlišuje různé typy konfiguračních objektů. Z nich se na ukládání aplikační logiky používají v zásadě dva: workflow (TaskDefinitions) a pravidla (Rules). Každý z těchto typů má svá omezení, která definují, kde je možné daný objekt použít a co v něm můžeme provádět za příkazy. Tato omezení jsou v některých případech poměrně nepříjemná a je nutné hledat cesty, jak je obejít. Jednou z možností je volat pravidla z workflow a obráceně workflow z pravidel. První možnost je jednoduchá a v tomto článku se podíváme na tu druhou, kdy potřebujeme volat workflow z pravidla.

Motivací, proč potřebujeme volat workflow z pravidla, může být více. Zde jsou některé z nich:

  • Daná funkcionalita se snadno volá z workflow, ale nikoliv z pravidla. Např. operace z WorkflowServices, jako je checkin view, tj. uložení uživatelských účtů na koncové systémy (Resources).
  • Daná funkcionalita má složitou logiku (s cykly či podmínkami) a implementace v pravidle by byla nepřehledná.
  • Daná funkcionalita již je ve workflow implementovaná a bylo by zbytečně pracné ji předělávat do pravidla. Navíc by takovým předěláním vznikla duplicita v kódech.

 

Pro obecný postup volání workflow z pravidla potřebujeme provést následující kroky:

  1. Vytvořit pravidlo „Run Workflow“, které obaluje spuštění workflow a vrací z něj výsledek.
  2. Upravit spouštěné workflow tak, aby svůj výsledek ukládalo do tzv. NamedResult, odkud jej pak pravidlo bude moct vyzvednout. (Není nutné provádět, pokud nepožadujeme vracení výsledku.)

Vstupy pravidla „Run Workflow“ jsou následující:

  1. workflowName – Jméno spouštěného workflow.
  2. variableMap – Mapa proměnných, které se mají předat workflow jako vstupní.
  3. resultName – Jméno elementu NamedResult, kam workflow uloží svůj výsledek.

 

Výpis pravidla „Run Workflow“:
<?xml version=’1.0′ encoding=’UTF-8′?>
<!DOCTYPE Rule PUBLIC ‚waveset.dtd‘ ‚waveset.dtd‘>
<Rule id=’#ID#Rule:Run Workflow‘ name=’Run Workflow‘ >
<Comments>Pravidlo na spuštění workflow a vyzvednutí NamedResult z jeho výsledku. Tento výsledek je vrácen tímto pravidlem.</Comments>
<RunAsUser>
<ObjectRef type=’User‘ id=’#ID#Configurator‘ name=’Configurator’/>
</RunAsUser>
<RuleArgument name=’workflowName‘>
<Comments>Jméno WF, které se má spustit.</Comments>
</RuleArgument>
<RuleArgument name=’variableMap‘>
<Comments>Mapa vstupních proměnných do WF.</Comments>
</RuleArgument>
<RuleArgument name=’resultName‘>
<Comments>Jméno NamedResult z výsledku WF, které se má vyzvednout a vrátit.</Comments>
</RuleArgument>
<block>
<set name=’taskInstance‘>
<new class=’com.waveset.object.TaskInstance’/>
</set>
<invoke name=’setDefinition‘>
<ref>taskInstance</ref>
<rule name=’Get Object‘>
<argument name=’type‘ value=’TaskDefinition’/>
<argument name=’id‘ value=’$(workflowName)’/>
</rule>
</invoke>
<dolist name=’key‘>
<invoke name=’asList‘ class=’java.util.Arrays‘>
<invoke name=’toArray‘>
<invoke name=’keySet‘>
<ref>variableMap</ref>
</invoke>
</invoke>
</invoke>
<invoke name=’setVariable‘>
<ref>taskInstance</ref>
<ref>key</ref>
<get>
<ref>variableMap</ref>
<ref>key</ref>
</get>
</invoke>
</dolist>
<invoke name=’setResultLimit‘>
<ref>taskInstance</ref>
<i>3600</i>
</invoke>
<invoke name=’setOwner‘>
<ref>taskInstance</ref>
<s>Configurator</s>
</invoke>
<set name=’taskContext‘>
<new class=’com.waveset.task.TaskContext‘>
<invoke name=’getLighthouseContext‘>
<ref>WF_CONTEXT</ref>
</invoke>
</new>
</set>
<invoke name=’execute‘>
<new class=’com.waveset.workflow.WorkflowExecutor’/>
<ref>taskContext</ref>
<ref>taskInstance</ref>
</invoke>
<invoke name=’getNamedResultValue‘>
<invoke name=’getResult‘>
<ref>taskInstance</ref>
</invoke>
<ref>resultName</ref>
</invoke>
</block>
<MemberObjectGroups>
<ObjectRef type=’ObjectGroup‘ id=’#ID#All‘ name=’All’/>
</MemberObjectGroups>
</Rule>

Uvedené pravidlo vytvoří objekt taskInstance, který se skládá z taskDefinition, vstupních proměnných a několika upřesňujících parametrů. Vytvořený objekt se společně s kontextem (LighthouseContext) předá metodě execute třídy WorkflowExecutor, čímž se workflow spustí. Důležité je nastavení parametru resultLimit do taskInstance, který udává, jak dlouho vydrží výsledek workflow v IDM v sekundách. Musíme zde nastavit číslo větší než 0, aby bylo možné po skončení workflow vyzvednout jeho výsledek z NamedResult (metoda getNamedResultValue). Nastavení, aby pravidlo běželo pod uživatelem Configurator je volitelné, ale bez něj můžeme narazit na problém ve vyhodnocení uživatelských práv.

Jak již bylo řečeno, pro vracení výsledku musí spouštěné workflow ukládat svůj výsledek do NamedResult domluveného jména. To lze ve workflow provést následujícím voláním:
<Action>
<expression>
<invoke name=’addNamedResult‘>
<ref>WF_CASE_RESULT</ref>
<s>myResultName</s>
<s>myResultValue</s>
</invoke>
</expression>
</Action>

Volání pravidla Run Workflow poté vypadá např. takto:
<rule name=’Run Workflow‘>
<argument name=’workflowName‘ value=myWorkflow/>
<argument name=’resultName‘ value= myResultName />
<argument name=’variableMap‘>
<map>
<s>myInputVariable</s>
<s>testValue</s>
</map>
</argument>
</rule>