XPRESS language v Sun IdM (Oracle Waveset)

V tomto článku vám představím XPRESS language. Nejdřív si zde ukážeme, jaký typ programovacího jazyka XPRESS je a jakou má syntaxi. Dále si jazyk popíšeme a ukážeme, k čemu se používá. V textu je také připraveno několik ukázek základních příkazů a úryvky z kódu.

Co to je?

XPRESS language je funkcionální programovací jazyk se syntaxí založenou na XML. Jelikož je XPRESS funkcionální, tak se řadí do třídy neprocedurálních (deklarativních) jazyků. Všechny akce jsou tedy definovány jako funkce se vstupními argumenty a s výstupem. Každá funkce buď vrací hodnotu, nebo provede operaci nad jedním z argumentů.

XPRESS se používá v Oracle Wavesetu (či v Sun Identity Manageru) ve formulářích, pravidlech a workflow. Většinou se v něm píší jednoduché výpočty či logické podmínky, ale je zde možné volat i funkce z Javy či Javascriptu.

Pro tyto operace by bylo možné použít i například Javu. Ale je zde několik důvodů proč byl použit XPRESS:

  • Oracle Waveset používá XML u všech svých objektů, tím pádem je vhodnější použít také XML přístup pro akce. Také se díky tomu dá vložit kus kódu například do workflow.
  • Díky němu se dají opravy a aktualizace objektů provádět pouze re-importem a není třeba redeployovat např. jar soubory či restartovat server. Toto se hodí především u produkčního prostředí.

Prefixová notace

Jak jsem zmínil v předchozí kapitole, všechny akce jsou v XPRESSu definovány jako funkce. Není zde tedy rozdíl mezi voláním funkce a tím, co se např. v jazyku C nazývá výrazovým operátorem („+“,“-“). Tím pádem zde vzniká způsob zápisu zvaný prefixová notace. Například jednoduchý výraz zapsaný v jazyce C (používajícím infixovou notaci) vypadá takto:

x == 5

Pokud bychom ovšem použili prefixovou notaci, vypadal by takto:

== x 5

A pokud by byly možné pouze funkce, vypadalo by to takto:

equals(x, 5)

XML syntaxe

K zápisu je využívána XML syntaxe. Názvy XML tagů jsou jednotlivé funkce, které mají být zavolány. Vložené prvky jsou pak argumenty dané funkce. Pro každý prvek je zde otevírací a uzavírací tag (např. ). Pokud nejsou ve funkci žádné argumenty, lze použít i tento zápis: .

Příklad zápisu

<add> 
  <ref>counter</ref> 
  <i>10</i> 
</add>

V tomto příkladu tedy tag znázorňuje, že voláme funkci pojmenovanou add, používanou pro sčítání. Této funkci jsou předány dva argumenty:

  • První argument: hodnota je zde vrácena funkcí ref. Argument předaný funkci ref je řetězec znaků, který vyjadřuje název proměnné. Hodnota vrácená funkcí ref, je tedy současná hodnota proměnné counter.
  • Druhý argument: zde je hodnota vrácena funkcí i. Argument předaný funkci i je řetězec znaků, který vyjadřuje číslo (integer). Funkce proto i v tomto případě vrací hodnotu 10.

Hodnota vrácená funkcí add je tedy hodnota 10, zvětšená o hodnotu proměnné counter.

Základní funkce

Zde ukáži několik příkladů základních funkcí z XPRESS jazyku.

Funkce list

<list>
   <s>apples</s>
   <s>oranges</s>
   <s>wiper blades</s>
</list>

Touto funkcí vytvoříme list. Jako argumenty bere funkce prvky, které v daném listu budou. To jsou v tomto případě Stringy, definované funkcí s.

Zde je pár příkladů funkcí pro práci s listem:

  • append, appendAll – slouží pro připojení jedné hodnoty (či celého listu v případě appendAll) k listu. Záleží zde na použití: v případě, že se použije atribut name se jménem listu, je připojena hodnota do daného listu. Pokud není atribut name vyplněn, je první argument list a vytvoří se kopie daného listu.
  • contains – zjišťuje, zda list obsahuje zadanou hodnotu.
  • get – vrátí hodnotu n-tého prvku z listu. Indexování začíná na 0.
  • indexOf – vrátí index daného prvku, pokud se nachází v listu. Pokud ne vrátí -1.
  • insert – vloží prvek do listu, ostatní prvky jsou „odsunuty“, aby uvolnily místo pro nový prvek.
  • remove – odstraní zadaný prvek z listu. Argumenty jsou použity stejně jako u append.
  • removeAll – z prvního listu odstraní prvky druhého listu
  • retainAll – vrátí společné prvky listů zadaných v argumentech.

Aritmetické funkce – add, sub, mult, div, mod

V XPRESSu je samozřejmě možné provádět základní matematické operace jako sčítání (add), odčítání (sub), násobení (mult) a dělení (div). Je zde i funkce pro modulo (mod). Všechny tyto funkce přijímají libovolný počet argumentů a provádějí danou operaci nad nimi. Všechny argumenty, které nejsou typu integer, jsou na integer převedeny.

<mult> 
  <i>7</i> 
  <i>3</i> 
  <i>2</i> 
</mult>

Tato funkce provede násobení s čísly 7,3 a 2, výsledek je tedy 42.

Logické výrazy

Jsou zde samozřejmě i funkce pro logické výrazy. Zastoupeno je hodně klasických výrazů, s jakými se setkáte v ostatních programovacích jazycích.

Několik příkladů:

  • and – logický součin
  • or – logický součet
  • cmp – porovnání dvou stringů (pro case insensitive porovnání je ncmp)
  • eq, neq – test na rovnost či nerovnost, datový typ prvního argumentu určuje jak test proběhne. Možnosti:
    • string – ostatní argumenty jsou převedeny na string a je provedeno porovnání stringů
    • integer – ostatní argumenty jsou převedeny na integer a je provedeno porovnání integerů
    • object – ostatní argumenty musí být objekty
  • gt, gte, lt, lte – větší než, větší nebo rovno než, menší než, menší nebo rovno než
  • not – vrátí opačnou logickou hodnotu argumentu

Většina těchto funkcí vrací 1 či 0, tedy true nebo false. Výjimkou jsou funkce cmp, ncmp, and a or.

V případě cmp a ncmp vrací pozitivní integer, pokud je hodnota prvního argumentu lexikograficky menší než druhého argumentu, negativní integer v opačném případě a 0, pokud jsou si argumenty rovny.

Pokud se and vyhodnotí jako true, je vrácena hodnota posledního argumentu, jinak je vrácena nula.  Pokud se or vyhodnotí jako true, je vrácena hodnota prvního argumentu, který byl vyhodnocen jako true. Jinak je také vrácena nula.

Funkce pro manipulaci se stringem

I pro manipulaci se stringy je zde připraveno pár základních funkcí. Zde je pár příkladů:

  • indexOf – vrátí pozici stringu uvnitř jiného stringu
  • concat – spojí dva či více stringů do jednoho
  • length – vrátí délku stringu, také vrací počet prvků v listu
  • split – rozdělí string (první argument) do více stringů podle oddělovače (druhý argument), funkce vrací list stringů

 Podmínka, iterační funkce a block

Funkce block

Slouží k seskupení více příkazů do bloku. Hodnota tohoto bloku je hodnota jeho posledního argumentu.

<block>
    <s>Hello there!</s>
    <add> <i>100</i> <i>2</i> </add>
    <i>42</i>
</block>

Hodnota vrácená touto funkcí je 42.

Podmínka

Velmi podobná if funkcím z Javy či C. Název funkce je cond.

<cond>
     <gt>
      <ref>age</ref>
       <i>40</i>
     </gt>
   <s>old</s>
   <s>young</s>
</cond>

Iterační funkce

Funkce se nazývá dolist. Iteruje přes prvky v listu. Hodnota proměnné zadané v atributu name je hodnota, kterou lze referovat prvek z listu ve smyčce. Hodnota prvního argumentu je list, přes který se iteruje, zbytek jsou výrazy, které se mají provést.

<dolist name=’el’>
  <ref>someList</list>
  <cond>
    <gt>
      <ref>el</ref>
      <i>10</i>
    </gt>
    <ref>el</ref>
  </cond>
</dolist>

Funkce pro práci s Javou a Javascriptem

Invoke

Zavolá metodu na Java objektu či třídě.

Statická metoda

<invoke class=’class name’ name=’method name’>
   <!--method argument 0 -->
   <!--method argument n-->
</invoke>

V atributu class je předáno jméno třídy, v atributu name jméno metody. Argumenty funkce jsou pak jednotlivé argumenty pro metodu.

Instanční metoda

<invoke class=’method name’>
   <!--the object to invoke the method on -->
   <!--method argument 0 -->
   <!--method argument n-->
</invoke>

V atributu name je předáno jméno metody (v dokumentaci Oracle je špatně napsáno, že se jméno dává do atributu class). První argument je jméno objektu a další argumenty funkce jsou argumenty posílané do metody.

New

Vytvoří instanci Java třídy. Jméno třídy je předáno v atributu class a musí být zapsáno s úplnou cestou (např. java.util.ArrayList).

<new class=’classname’/>
  <!--constructor argument 0-->
  <!--constructor argument n-->
</new>

Script

Do této funkce lze vložit fragment JavaScriptu. Hodnota této funkce je hodnota posledního výrazu v JavaScriptu. Uvnitř skriptu lze použít objekt env k přistupování k proměnným v hostitelské aplikaci.

<script>
   var arg1 = env.get(’arg1’);
   arg1 + 100;
</script>

Závěr

V článku byl představen jazyk XPRESS a ukázany základní funkce. Pokud budete potřebovat další informace či funkce, doporučuji se podívat do dokumentace od Oraclu (http://docs.oracle.com/cd/E19225-01/821-0378/bvbps/index.html), ze které jsem ostatně vycházel i já. Případně můžete kontaktovat i mě na adrese adam.lenger@bcvsolutions.eu.