...
Anotácia @ReturnValue slúži na previazanie návratovej hodnoty metódy s návratovou hodnotou niektorého z parametrov. Parameter anotácie name = "result" indikuje, že to má byť návratová hodnota 2. parametra zo zoznamu formálnych parametrov kvôli zhode v identifikátoroch. Typ návratovej hodnoty Integer zodpovedá typu formálneho parametra podľa tabuľky v kapitole 4.1.1. Dôležitou podmienkou je, aby bol formálny parameter označený ako vstupno-výstupný.
Anotácia 1. parametra metódy @ParameterValue indikuje, že hodnota tohto parametra má byť premenená na vstupnú hodnotu 1. formálneho parametra (podľa parametra anotácie name = "value"). Typ hodnoty String zodpovedá typu formálneho parametra podľa tabuľky v kapitole 5v kapitole 4.1.1.
Zaujímavý je tiež fakt, že pre 2. formálny parameter (result) nie je definované mapovanie vstupnej hodnoty. V takomto prípade je pri volaní RPC procedúry nastavený 2. parameter na neplatnú (invalidnú) hodnotu.
4.3.2.2. Mapovanie vstupno-výstupného parametra
| Blok kódu | ||||
|---|---|---|---|---|
| ||||
@RPC(name = "Square", |
...
parameters = |
...
{ @Parameter(name = "v", type = ParameterType.real) |
...
}) |
...
@ReturnValue(name = "v") |
...
public Double sqare_1( |
...
@ParameterValue(name = "v") Double value); |
...
@RPC(name = "Square", |
...
parameters = |
...
{ @Parameter(name = "v", type = ParameterType.real) |
...
}) |
...
public void sqare_2( |
...
@ParameterValue(name = "v") InOut<Double> value); |
Metódy square_1 a square a square_2 mapujú obidve tú istú RPC (je to dovolené). V porovnaní s predošlým príkladom je však niekoľko odlišností v použití anotácie @RPC a @Parameter:
- parameter
RPC.asynchronousnie je uvedený, lebo je nepovinný a v takom prípade nadobúda automaticky hodnotufalse. - parameter
Parameter.inOutnie je uvedený, lebo je nepovinný a v takom prípade nadobúda automaticky hodnotutrue.
Metódy square_1 a square a square_2 sa vzájomne odlišujú spôsobom, akým mapujú parameter volania:
square_1rozdeľuje vstupnú a výstupnú časť parametra RPC procedúry na vstupný parameter a návratovú hodnotu metódy.square_2ponecháva vstupnú aj výstupnú časť parametra RPC procedúry v parametri metódy. Pretože Java ako jazyk nemá vstupno-výstupné parametre, parameter metódyvalueje deklarovaný s typomInOut<Double>.
Knižnica JAPI použije parameter metódy ako vstupno-výstupný (pri volaní prečíta jeho vstupnú hodnotu a po skončení nastaví jeho výstupnú hodnotu) vtedy, ak sú splnené nasledovné podmienky.
- formálny parameter RPC procedúry je definovaný ako vstupno-výstupný
- parameter metódy je deklarovaný s typom
InOut<>. Generický parameter typu musí zodpovedať typu formálneho parametra. - nepovinný parameter anotácie
@ParameterValue.directionnebol uvedený, čiže automaticky nadobudol hodnotuParameterDirectionType.derived. (Rovnaké správanie by bolo dosiahnuté, keby bol explicitne nastavený na hodnotuderivedaleboinout.)
4.3.2.3. Mapovanie synchrónnej procedúry s odloženým vyhodnotením výsledku
...
| Blok kódu | ||||
|---|---|---|---|---|
| ||||
RPC(name = "Square", |
...
parameters = |
...
{ @Parameter(name = "v", type = ParameterType.real) |
...
}) |
...
@ReturnValue(name = "v") |
...
public Future<Double> sqare_3( |
...
@ParameterValue(name = "v") Double value); |
Metóda square_3 sa od metódy square_1 odlišuje typom návratovej hodnoty. Keď je typ návratovej hodnoty deklarovaný ako Future, volanie metódy nie je blokujúce, tak ako pri bežnej synchrónnej RPC, ale skončí hneď. Výsledok je uložený vo Future objekte, ktorého .get() metóda zabezpečí synchrónnosť volania.
4.3.2.4. Mapovanie parametra so štruktúrovaným typom
@RPC(name = "Redim",
parameters =
{
@Parameter(name = "n", type = ParameterType.integer, inOut = false),
@Parameter(name = "r", type = ParameterType.record, recordType = Person.class)
})
@ReturnValue(name = "r")
public List<Person> redim(
@ParameterValue(name = "n") Integer length,
@ParameterValue(name = "r") List<Person> data);
Metóda redim mapuje RPC, ktorej druhým formálnym parametrom je štruktúrovaná hodnota. Pre správne mapovanie je typ parametra v anotácii nastavený na @Parameter.type = ParameterType.record a nepovinný parameter anotácie @Parameter.recordType = Person.class. Použitá definícia štruktúry SD.Person a jej mapovanie triedou Person pochádza z kapitoly 5.2.1.
Pri použití metódy redim bude pre účely návratovej hodnoty vytvorená nová inštancia typu List<Person> a jej prvky budú nové inštancie typu Person napriek tomu, že majú rovnaký obsah ako inštancie, ktoré boli použité ako parametre.
...