...
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.asynchronous
nie je uvedený, lebo je nepovinný a v takom prípade nadobúda automaticky hodnotufalse
. - parameter
Parameter.inOut
nie 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_1
rozdeľuje vstupnú a výstupnú časť parametra RPC procedúry na vstupný parameter a návratovú hodnotu metódy.square_2
ponechá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ódyvalue
je 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.direction
nebol uvedený, čiže automaticky nadobudol hodnotuParameterDirectionType.derived
. (Rovnaké správanie by bolo dosiahnuté, keby bol explicitne nastavený na hodnotuderived
aleboinout
.)
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.
...