Sun-Oracle IdM: Zobrazení approval work items všech uživatelů

V administračním rozhraní Sun Identity Manageru (dále jen IdM) na záložce Work Items -> Approvals je možnost vylistovat a následně pracovat se schvalovacími work itemy všech schvalovatelů, tzn. těch, co mají přiřazenou administrační roli „Approver Administrator“.

V jednom projektu jsme ale museli řešit problém, jak na tomto formuláři přidat možnost pracovat se všemi schvalovacími položkami, tedy i s položkami, které patří obyčejným uživatelům.
Konkrétně jde o formulář „Work Item List“, který prezentuje data z pohledu „WorkItem List View“.
Jak se dá dočíst v dokumentaci (http://docs.sun.com/app/docs/doc/820-5821/bvbjl?l=en&a=view&q=WorkItemList), tento pohled obsahuje atribut „workItems“.

Proto se nabízí řešení, naplnít tento atribut vlastním seznamem položek. Ty jde získat například použitím metody „com.waveset.ui.FormUtil.getObjectNames“ s parametrem „WorkItem“ v kombinaci s metodou „com.waveset.ui.FormUtil.getObject“. Potom je ještě potřeba vytvořit GenericObject atd. Výsledkem je, že se sice položky v seznamu objeví a pokud se podíváme na jejich detail, tak jdou i schválit. Nicméně, pokud v seznamu označíme více položek a ty chceme například schválit, nic se nestane.

Po dekompilaci (pomocí JAD) a prozkoumání příslušného view handleru (com.waveset.view.WorkItemListViewer v balíčku „idm.jar“) zjistíme, že ve výše zmiňovaném případě, je ve view handleru znovu vytvořen seznam work itemu, který se prochází položka po položce a kontroluje se, jestli je obsažena v seznamu těch námi vybraných. Proto, i když v tomto seznamu vybraných položek bude nějaká nová (od obyčejného uživatele), tak se vůbec nebude zpracovávat.

Celý problém se nakonec podařilo vyřešit vytvořením vlastního view handleru „MyWorkItemListViewer“ na základě dekompilovaného „WorkItemListVieweru“. Jediné, co bylo potřeba změnit, byla metoda „processQueryResult“. V jejím těle si přečteme hodnotu našeho parametru, který nám říká, jestli se mají zobrazit všechny položky nebo ne.

boolean getAll = view.getBoolean("getAllWorkItems");

A o pár řádku níže, kde se kontroluje, jestli „owner“ je v „controlledUsers“, tuhle hodnotu použijeme. My jsme třeba celou podmínku, která tento blok obaluje, změnili z:

if(accountId == null)

na

if(accountId == null && !getAll)

Tím pádem, pokud bude „getAll“ nastaveno na „true“, tak se vůbec nebude provádět kontrola, jestli vlastník work itemu je v seznamu „controlledUsers“.

Handler musí být umístěn v balíčku „com.waveset.view“. Aby se použil náš view handler, zmeníme v „approval/approval.jsp“ příkaz

form.setViewId("WorkItemList");

na

form.setViewId("MyWorkItemList");

Poslední věc, kterou je ještě potřeba udělat, je zajistit, aby v combo-boxu na formuláři „Work Item List“ byla možnost „All users“. Po jejím vybrání se nastaví atribut pohledu „user“ na hodnotu „null“ a také náš atribut „getAllWorkItems“. Nulová hodnota atributu „user“ zajistí, že se bude provádět kód view handleru, kde se používá náš atribut.

Pole „user“ jsme upravili následovně:

         <Field name='getAllWorkItems'>
              <Expansion>
                  <eq>
                      <ref>userCombo</ref>
                      <s>___ALL_APPROVAL_ITEMS___</s>
                  </eq>
              </Expansion>
          </Field>
          <Field name='user'>
              <Expansion>
                  <cond>
                      <eq>
                          <ref>userCombo</ref>
                          <s>___ALL_APPROVAL_ITEMS___</s>
                      </eq>
                      <null/>
                      <ref>userCombo</ref>
                  </cond>
              </Expansion>
          </Field>
          <Field name='userCombo'>
            <Display class='Select'>
              <Property name='command' value='Recalculate'/>
              <Property name='nullLabel' value='UI_APPR_JAVA_ALL_APPROVERS'/>
              <Property name='valueMap'>
                  <block>
                      <defvar name="values">
                          <list>
                              <s>___ALL_APPROVAL_ITEMS___</s>
                              <s>UI_APPR_JAVA_ALL_USERS</s>
                          </list>
                      </defvar>
                      <invoke name="sort" class="java.util.Collections">
                          <ref>users</ref>
                      </invoke>
                      <dolist name="user">
                          <ref>users</ref>
                          
                          <append name="values">
                              <ref>user</ref>
                              <ref>user</ref>
                          </append>
                      </dolist>
                      <ref>values</ref>
                  </block>
              </Property>
           <!--   
              <Property name='allowedValues' value='$(users)'/> 
              <Property name='sorted' value='true'/>
           -->
            </Display>
          </Field>