8.Zmeny verejného API medzi verziami 10.0.37 a 10.1.39
- 1 8.1. Odčlenenie balíčka sk.ipesoft.d2000.async
- 2 8.2. Zabezpečené a reverzné pripojenie JAPI
- 3 8.3. Zdieľané zdroje systému D2000
- 4 8.4. Použitie konkrétnych Table tried namiesto AnonymousTable
- 5 8.5. Podpora odľahčenej verzie štruktúrovanej UNIVAL hodnoty
- 6 8.6. Rozšírenie čítania dát z archívu o ArchiveObjectDescription
- 7 8.7. Výpočet archívnej štatistickej funkcie
- 8 8.8. Rozšírenie rozhrania AuditDataListener
- 9 8.9. Úprava logiky operácie close v rozhraniach D2Object, D2Cono, D2ProcessList, D2Session
- 10 8.10. Rozšírenie rozhrania D2SessionEventsListener
- 11 8.11. Volanie RPC implementujúcej ESL rozhranie
- 12 8.12. Test existencie RPC a SBA volania
- 13 9.13. Informácie o prihlásenom používateľovi a zmena hesla používateľa
- 14 9.14. Zmena správania pri neúspešnom vytvorení D2Session
- 15 9.15. Volanie D2Session.getIndirectInfo
- 16 9.16. Volanie D2Session.getObjectInfo vráti aktuálnu hodnotu objektu
- 17 9.17. Volanie D2Session.openObject vráti informácie o objekte
- 18 9.18. Zmena rozhrania RPCReturnContext
- 19 9.19. Zmena rozhrania SBAReturnContext
- 20 9.20. Zastaraná D2SessionUtils.getObjectHOBJByName
Verejné API sa medzi verziami 10.0.37 (d2japi-37.jar) a 10.1.39 (d2japi-10.1.39.jar) rozšírilo a v niektorých prípadoch aj zmenilo natoľko, že sú pri prechode na novšiu verziu potrebné ručné úpravy existujúceho kódu. (Pozn. verzia 10.1.38 bola vydaná len pre vnútorné potreby a nie je jej v tejto migračnej príručke venovaná pozornosť.) Nasledujúcich kapitolách je uvedený zoznam zmien, nových funkcií a návod, ako správne upraviť aplikačný kód pri migrácii aplikácie z D2000 verzie 10.0.37 na 10.1.39.
8.1. Odčlenenie balíčka sk.ipesoft.d2000.async
Pre lepšie logické usporiadanie tried bol vytvorený balíček sk.ipesoft.d2000.async ktorý obsahuje niektoré rozhrania, ktoré sa predtým nachádzali v balíčku sk.ipesoft.d2000.d2japi. Prehľad zmien dokumentuje nasledujúca tabuľka:
trieda/rozhranie | vo verzii 10.0.37 | vo verzii 10.1.39 |
|
|
|
|
|
|
|
|
|
Pri migrácii je potrebné upraviť všetky príkazy import, ktoré odkazujú na spomínané triedy/rozhrania a všetky absolútne odkazy.
8.2. Zabezpečené a reverzné pripojenie JAPI
Trieda D2Japi predstavuje vstupný bod do používania knižnice JAPI. Používa sa na pripojenie sa k bežiacemu D2000 kernelu. Pripojenie sprostredkuje proces D2Connector.exe. Vo verzii 10.0.37 bolo možné pripojenie sa iba jednou metódou createConnector(String, D2ConnectorEventsListener). Pripojenie inicioval klient JAPI a pripájal sa na počúvajúci socket procesu.
Verzia 10.1.39 pridala metódu startListeningForConnection(String , int, ServerSocketEventsListener). Metóda otvorí počúvajúci socket na strane JAPI klienta, ktorý čaká na pripojenie iniciované procesom D2Connector.exe.
Od verzie 10.1.39 je možné zabezpečiť komunikáciu medzi JAPI klientom a D2Connector.exe protokolom TLS verzie 1.2. Slúžia na to preťaženia metód createConnector a startListeningForConnection s parametrom String certificatePath, ktorý uvádza cestu k súboru s certifikátom, ktorý je použitý na zabezpečenie spojenia.
8.3. Zdieľané zdroje systému D2000
Zdieľané zdroje systému D2000 sú
stavové texty,
systémové texty (pomenovania konštánt),
transformačná paleta,
slovník,
definície štruktúr.
Od verzie 10.1.39 je možné získať ich aktuálnu konfiguráciu a notifikácie o zmenách hodnôt. Slúži na to preťaženie metódy D2Connector.createSession s parametrom SharedResourcesListener sharedResourcesListener.
8.4. Použitie konkrétnych Table tried namiesto AnonymousTable
Štruktúrovaná UNIVAL hodnota je v knižnici JAPI reprezentovaná objektom typu UnivalRecord. Atribúty UNIVAL-u sú v tomto prípade málo zaujímavé, hodnota je ďalej zabalená objektom triedy Table, ktorý je sprístupnený volaním getValue. Trieda sk.ipesoft.d2000.datatable.Table je abstraktná a pre jednoduchú tvorbu inštancií slúži odvodená trieda AnonymousTable, ktorú v základnej konfigurácii používa aj knižnica JAPI pri dekódovaní. Nevýhodou tejto triedy je, že neponúka prístup k jednotlivým bunkám pomocou identifikátora stĺpca a neumožňuje ich statickú typovú kontrolu.
Od verzie 10.1.39 je možné volaním D2Connector.registerTableClass zaregistrovať vlastnú implementáciu triedy Table (odporúčané je dediť z triedy TableBase). Konkrétna implementácia vždy reprezentuje jednu konkrétnu definíciu štruktúry s ktorou je spojená anotáciou @StructureTableDefinition. Po takejto registrácii bude JAPI dekódovať príslušné štruktúrované hodnoty ako inštancie registrovanej triedy namiesto inštancií AnonymousTable.
Pozor: Po takejto registrácii sa JAPI pri dekódovaní spolieha na to, že počet a typy stĺpcov registrovanej triedy zodpovedajú definícii štruktúry. Ak sa odlišujú, dekódovanie pravdepodobne skončí výnimkou. K odlišnosti môže dôjsť napríklad aj neskoršou zmenou konfigurácie definície štruktúry v nástroji CNF. V takom prípade je potrebné implementáciu príslušnej triedy upraviť a aplikáciu nanovo skompilovať.
8.5. Podpora odľahčenej verzie štruktúrovanej UNIVAL hodnoty
V súvislosti s vývojom projektu D2000 Web Suite bola knižnične podporená konverzia inštancie triedy Table na List<TableRowBean> a späť. TableRowBean je abstraktná trieda predstavujúca odľahčenú štruktúrovanú hodnotu s rozhraním zodpovedajúcim konvencii Java Beans. Pre dosiahnutie dobrej statickej typovej kontroly kódu bol rozšírený zoznam generických parametrov viacerých tried. Vo všetkých uvedených triedach ako aj v ich potomkoch je nový generický parameter definovaný ako B extends TableRowBean.
Table<T, R, B>TableRow<T, R, B>Column<I, S, T, R, B, C, E>TableCell<I, S, T, R, B, C, E>
Pri migrácii označí všetky miesta s nesprávnym počtom generických parametrov. Oprava spočíva v doplnení chýbajúceho generického parametra:
Pri získaní odkazu na existujúci objekt bez známeho typu pridaním „wildcard" parametra:
Column<?, ?, ?, ?, ?, ?, ?> column = record.getValue().getColumn(1);Pri vytváraní objektu špecifikovaním všeobecného typu
TableRowBean: UnivalRecord<AnonymousTable, AnonymousTableRow, TableRowBean> record = new UnivalRecordValue<>(...);
8.6. Rozšírenie čítania dát z archívu o ArchiveObjectDescription
Čítanie dát z archívu bolo rozšírené o konfiguráciu príslušného archívneho bodu. Konfigurácia je zapuzdrená rozhraním ArchiveObjectDescription. Z objektu je možné prečítať informácie o názve objektu, jeho popise, technických jednotkách, type hodnoty, periodicite a iných informáciách potrebných pre zobrazenie hodnoty pravidlami systému D2000.
8.6.1. Rozšírenie rozhrania ArchiveDataListener
Pribudla metóda void onArchiveObjectDescription(ArchiveObjectDescription), ktorou implementátor získa konfiguráciu. Ak nenastala chyba pri prístupe do archívu, metóda je zavolaná vždy ako prvá. Samotné dáta z archívu sú volaním metódy onArchiveData sprístupnené až následne.
Pri migrácii je potrebné rozšíriť všetky implementácie rozhrania ArchiveDataListener o spomínanú metódu. Implementácia metódy môže byť prázdna.
8.6.2. Rozšírenie rozhrania ArchiveDataProvider
Rozhranie ArchiveDataProvider umožňuje alternatívny prístup k dátam z archívu. Bolo rozšírené o metódu getDescription(), ktorá sprístupňuje konfiguráciu príslušného archívneho bodu. Táto zmena je spätne kompatibilná.
Okrem toho boli obidve preťaženia metódy waitForData() doplnené o kontrolované výnimky InterruptedException, D2JapiException, ktoré umožňujú zachytiť vínimočné stavy, ktoré pri čakaní na dáta mohli nastať. Je to zmena správania oproti predošlej verzii, kde boli tieto výnimočné stavy v tichosti zamlčané.
Pri migrácii je potrebné blok kódu, ktorý tieto dáta spracúva obaliť do try... catch... alebo deklarovať kontrolované výnimky v metóde, ktorá k dátam pristupuje.
8.7. Výpočet archívnej štatistickej funkcie
Od verzie 10.1.39 je podporené volanie archívnych štatistických funkcií z JAPI. Ide o ekvivalent ESL akcie CALCSTATFUNCARR. Slúži na to volanie D2Session.getArchiveValuesThroughStatisticalFunction.
8.8. Rozšírenie rozhrania AuditDataListener
Rozhranie AuditDataListener bolo rozšírené o metódu void onError(String comment), ktorá je zavolaná, ak pri prístupe k dátam došlo k chybe.
Pri migrácii je potrebné doplniť všetky implementácie o danú metódu. Implementácia metódy môže byť prázdna, ale jej zavolaním sa signalizuje ukončenie zasielania samotných dát.
8.9. Úprava logiky operácie close v rozhraniach D2Object, D2Cono, D2ProcessList, D2Session
Tieto rozhrania sú si navzájom podobné v tom, že reprezentujú určitý zdroj platformy D2000, ktorý v čase mení svoj stav a registrovaným klientom o tom v reálnom čase posiela notifikácie. Posiela ich tak dlho, kým klient nepožiada o ukončenie odberu notifikácií, alebo kým daný zdroj nezanikne. Za distribúciu notifikácií ako aj udržiavanie zoznamu registrovaných odberateľov je zodpovedný Kernel. (V prípade CONO je zodpovedný samotný proces produkujúci správy). V knižnici JAPI slúži na zrušenie registrácie v týchto rozhraniach metóda close().
Vo verzii 10.0.37 sa kanál považoval za uzatvorený zavolaním metódy close() okamžite. To však nezodpovedá stavu v systéme D2000, pretože zavolaním metódy sa len odosiela správa so žiadosťou o zrušenie registrácie. V čase medzi zavolaním close() a spracovaním správy kernelom ešte môžu prichádzať notifikácie o zmene hodnoty.
Z toho dôvodu je signatúra metódy vo verzii 10.1.39 FutureEvent<Void> close(). Volaním operácie sa kanál neuzatvorí automaticky, ale až vtedy, keď je doručená odpoveď potvrdzujúca uzatvorenie. Dovtedy ešte stále môžu prichádzať notifikácie. Doručenie potvrdenia je signalizované tým, že návratový Future objekt nadobudne hodnotu.
Pri migrácii je nutné sa uistiť, že po zavolaní close()sa následné príkazy nespoliehajú, že bol kanál okamžite uzatvorený. Pokiaľ je v kóde takéto miesto, je potrebné pred ním spraviť nasledovné:
FutureEvent<Void> futureCloseResult = openedObject.close();
... // tento kód sa na uzatvorenie ešte nespolieha
futureResult.get(); // čakanie na potvrdenie uzatvorenia
... // nasleduje miesto, na ktorom už musí platiť, že bol kanál
skutočne uzatvorený