Konfigurácia OpenAPI API
Integrácia OpenAPI v SmartWebe funguje v dvoch smeroch:
Vstupné OpenAPI — SmartWeb sprístupňuje externé HTTP endpointy popísané OpenAPI špecifikáciou. Každá operácia je naviazaná na D2000 RPC procedúru. Prichádzajúce HTTP požiadavky sú prekladané na D2000 RPC volania.
Výstupné OpenAPI — D2000 ESL skripty môžu cez konektor bežiaci vnútri SmartWebu volať externé HTTP služby popísané OpenAPI špecifikáciou. Konektor serializuje argumenty RPC do JSON, odošle požiadavku a vráti deserializovanú odpoveď späť do D2000.
Táto stránka pokrýva oba smery. Generovanie TypeScript klienta pre D2000 RPC už nie je súčasťou OpenAPI — pozri Generovanie TypeScript klienta pre D2000 RPC.
Vstupné OpenAPI
Vstupné OpenAPI je vystavené na /api/open a zabezpečené rovnako ako server-to-server REST API (API kľúč, JWT alebo Basic auth). Pri štarte SmartWeb načíta každý nakonfigurovaný súbor špecifikácie a publikuje jeho operácie POST na /api/open/ + contextPath + cesta zo špecifikácie. Každá operácia je naviazaná na D2000 RPC procedúru určenú atribútmi x-d2-* (viď Vnorené štruktúry); ostatné HTTP metódy sa neviažu, pretože RPC volanie vždy nesie payload.
GET /api/open/<contextPath>/openapi.yaml vráti dokument, ktorý je reálne nasadený — vrátane predvolených hodnôt doplnených SmartWebom a operácií dogenerovaných z D2000 metadát. Pre príklad nižšie je to GET /api/open/edc/openapi.yaml. Report toho, čo SmartWeb zo špecifikácií postavil a čo mu v D2000 chýba, je na GET /api/open/status.md — viď Generovaná dokumentácia špecifikácie.
Konfigurácia
smartweb:
application:
openApi:
enabled: true
processName: "SELF.SMARTWEB_OPENAPI" # potrebné len pre špecifikáciu s blokom "mapping"
httpHeaders: [ ] # extra HTTP hlavičky pridané do odpovedí /api/open
specifications:
- specificationFilePath: edc_openapi_ofs.yaml # relatívne voči konfiguračnému adresáru
specificationFormat: YAML # YAML | JSON
specificationVersion: "3.0"
contextPath: edc # segment URL pod /api/open
generateDocumentation: true # predvolene zapnuté, viď koniec stránkyVlastnosť | Popis |
|---|---|
| Zapína alebo vypína vstupné API. Volanie vypnutého API skončí chybou |
| D2000 proces, pod ktorým sa prihlasuje relácia (session) na čítanie metadát. Potrebný len pre špecifikáciu s blokom |
| Extra HTTP hlavičky pridané do odpovedí |
| Cesta k súboru špecifikácie, relatívne voči konfiguračnému adresáru. Súbor je sledovaný — zmena spôsobí znovunačítanie kontextu a súbor, ktorý sa nepodarí spracovať, ponechá nasadenú predchádzajúcu verziu. |
|
|
| Segment URL, pod ktorým sú operácie publikované. Nesmie byť prázdny — špecifikácia bez neho sa nikdy nenamountuje. |
| Predvolene |
| Nepovinné — dogenerovanie operácií z D2000 RPC metadát, viď nižšie. |
[!NOTE]
URL je /api/open + contextPath + cesta napísaná v špecifikácii. Pri contextPath: edc a ceste /ofs/api/v1/contracts-changes sa operácia volá na POST /api/open/edc/ofs/api/v1/contracts-changes.
Tok požiadavky
Externý klient pošle
POST /api/open/edc/ofs/api/v1/contracts-changes.SmartWeb rozlíši URL na špecifikáciu a operáciu naviazanú na danú cestu.
Properties tela požiadavky sa stanú vstupnými parametrami RPC v poradí do hĺbky podľa schémy payloadu; property sa dá naplniť aj z HTTP hlavičky (viď nižšie).
Za ne sa doplnia výstupné parametre ako prázdne hodnoty, takže ESL procedúra dostane celú signatúru.
Zavolá sa naviazaná D2000 RPC procedúra —
x-d2-event-name+x-d2-event-rpc-name— predvolene ako konverzácia (CONVERSATION_BEGIN_END), a SmartWeb čaká na odpoveď ESL.Výstupné parametre sa serializujú späť do JSON podľa response schémy a vrátia volajúcemu.
[!IMPORTANT]
Pri x-d2-event-rpc-call-type: CONVERSATION_BEGIN_END (predvolené) je HTTP požiadavka držaná, kým ESL procedúra neodpovie cez CALL [_hTC] Result(...) ASYNC TC_E — aj zo svojho EXCEPTION_HANDLERa. Procedúra, ktorá neodpovie, necháva volajúceho čakať až do timeoutu.
Dogenerovanie operácií z D2000 metadát
Špecifikácia s blokom mapping nepublikuje len to, čo je v súbore — SmartWeb otvorí D2000 reláciu (session), načíta RPC procedúry ESL eventov a doplní ich do dokumentu ako ďalšie operácie. Blok zároveň určuje, čo sa publikuje:
- specificationFilePath: base.yaml
contextPath: discover
mapping:
allowedD2RpcEventNames: [ "E.*" ] # ESL eventy, ktoré sa publikujú
allowedD2RpcMethodNames: [ "*" ] # RPC procedúry, ktoré sa publikujú
allowedD2RpcCallModes: [ REPLY, CONVERSATION_BEGIN_END ]Mená sú vzory so zástupnými znakmi, bez rozlišovania veľkosti písmen. specificationFilePath je tu nepovinná — bez nej sa dokument postaví čisto z D2000 metadát. Zmeny v D2000 (nová RPC procedúra, zmenená definícia štruktúry) prestavajú dokument za behu.
Hodnoty z HTTP hlavičiek a stavový kód odpovede
Dva atribúty na components mapujú properties payloadu na HTTP vrstvu:
components:
x-property-in-mappings:
correlationId:
$parameterRef: "#/components/parameters/CorrelationIdHeader"
priority: PAYLOAD_THEN_PARAM # PAYLOAD_THEN_PARAM | PARAM_THEN_PAYLOAD | PARAM_ONLY
x-property-out-mappings:
result:
pattern: "^(?<httpStatusCode>[0-9]{3})?:?(?<value>.*)$"x-property-in-mappings— uvedená property sa môže naplniť z HTTP hlavičky referencovanej cez$parameterRef.priorityrozhoduje, čo vyhrá, keď hodnotu nesie payload aj hlavička.x-property-out-mappings— regulárny výraz aplikovaný na textový výstupný parameter. Pomenovaná skupinavaluesa stane hodnotou zapísanou do JSON-u, pomenovaná skupinahttpStatusCodenastaví HTTP stavový kód odpovede. Takto ESL procedúra odpovie inak než200.
Vnorené štruktúry
D2000 štruktúra je plochá tabuľka typovaných stĺpcov — bunka nemôže obsahovať ďalšiu štruktúru. Ľubovoľne hlboko vnorený JSON sa preto rozkladá relačne: rodičovská štruktúra má stĺpec s vlastným kľúčom riadka (rowId) a každá vnorená štruktúra má stĺpec odkazujúci na kľúč rodičovského riadka (parentRowId). Každá vnorená štruktúra sa odovzdáva ako samostatný parameter RPC procedúry — ESL procedúra teda dostane N plochých štruktúr a spája ich cez parentRowId == rowId.
Rozširujúce atribúty špecifikácie
Atribút | Úroveň | Význam |
|---|---|---|
| operácia ( | D2000 ESL Event, na ktorom je RPC procedúra, napr. |
| operácia ( | Nepovinné meno ESL rozhrania pri procedúrach implementujúcich rozhranie |
| operácia ( | Meno RPC procedúry; predvolene posledná časť cesty |
| operácia ( |
|
| schéma komponentu, alebo property typu pole skalárov | Označuje komponent ako D2000 štruktúru a určuje meno cieľovej |
| schéma štruktúry | Meno celočíselného stĺpca s vlastným kľúčom riadka — cieľ väzby pre vnorené štruktúry |
| schéma štruktúry | Meno celočíselného stĺpca odkazujúceho na |
| schéma property | Prebíja meno RPC parametra / stĺpca odvodené z mena JSON property; slúži na riešenie kolízií mien. Na schéme |
Príklad
components:
schemas:
EdcSyncPayload: # obálka — jej properties sú parametre RPC
type: object
properties:
subjects:
type: array
items: { $ref: "#/components/schemas/EdcSubject" }
EdcSubject:
type: object
x-d2-structure-name: "SD.EdcSubject"
x-d2-structure-rowid-column: "rowId" # tranzientný celočíselný kľúč, generuje SmartWeb
properties:
id: { type: string }
temporalData:
type: array
x-d2-name: "subjectTemporalData" # meno RPC parametra (JSON property zostáva temporalData)
items: { $ref: "#/components/schemas/EdcSubjectParametersTemporalDataItem" }
EdcSubjectParametersTemporalDataItem:
type: object
x-d2-structure-name: "SD.EdcSubjectParametersTemporalDataItem"
x-d2-structure-parent-rowid-column: "parentRowId"
properties:
id: { type: string }
name: { type: string }Pole skalárov
Pole, ktorého prvky sú skaláre, nemá v D2000 zodpovedajúcu hodnotu. Uvedením x-d2-structure-name priamo na property sa také pole namapuje na plochú SD.* štruktúru s jedným stĺpcom — jeden riadok na prvok poľa. Meno stĺpca určuje x-d2-name na items, inak sa použije meno property (x-d2-name na samotnej property naďalej pomenúva RPC parameter). Do odpovede sa taká štruktúra vypisuje späť ako pole skalárov. Platia pre ňu rovnaké pravidlá ako pre ostatné štruktúry, takže môže byť aj vnorená — potom potrebuje x-d2-structure-parent-rowid-column.
subjects: # RPC parameter "subjects" -> SD.EdcSubjectIdList
x-d2-structure-name: "SD.EdcSubjectIdList"
type: array
items: { type: string, x-d2-name: "id" } # jeden stĺpec "id", riadok na prvokDátumy
format: date-time aj format: date sa mapujú na stĺpec typu time. Hodnota date-time sa číta aj zapisuje ako úplná časová pečiatka ISO‑8601 v UTC, hodnota date ako samotný deň yyyy-MM-dd v lokálnej časovej zóne servera. Reťazcová property bez niektorého z týchto formátov zostáva textovým stĺpcom.
Požiadavky na D2000 stranu
[!IMPORTANT]
Cieľové SD.* štruktúry musia v D2000 reálne existovať a mená ich stĺpcov sa musia zhodovať s menami namapovaných properties (resp. s x-d2-name). Bunky sa do riadka ukladajú podľa mena stĺpca, takže poradie properties v špecifikácii nemusí zodpovedať poradiu stĺpcov v štruktúre a väzobné stĺpce nemusia byť prvé. Stĺpce, ktoré špecifikácia nemapuje, zostanú nevyplnené. Ak štruktúra neexistuje, chýba jej niektorý namapovaný stĺpec alebo väzobný stĺpec nie je typu integer, volanie skončí chybou, ktorá pomenuje štruktúru aj stĺpec.
Väzobné stĺpce sú tranzientné — nie sú atribútmi JSON‑u a do odpovede sa nevypisujú. Výnimkou je
rowIdnamapovaný na existujúci JSON atribút, ktorý musí byťtype: integerarequired; potom sa hodnota berie z požiadavky a vypisuje sa aj do odpovede.parentRowIdnamapovať na JSON atribút nie je dovolené.Hodnoty tranzientných
rowIdgeneruje SmartWeb jedným počítadlom na celú správu, inkrementálne od1.rowIdje jedinečné v rámci celej správy, nie v rámci jednej štruktúry — počítadlo pokračuje naprieč všetkými rodičovskými štruktúrami, takže dvaja rodičia nikdy nemajú rovnaké id aparentRowIdvždy identifikuje práve jeden riadok. ESL procedúra, ktorá tieto stĺpce vypĺňa do odpovede, musí dodržať to isté pravidlo.rowIdnačítané z atribútu payloadu SmartWeb negeneruje, o jeho jedinečnosť sa teda stará volajúci.Poradie formálnych parametrov ESL procedúry je dané špecifikáciou: prehľadávanie do hĺbky (pre‑order), teda štruktúra a hneď za ňou jej vnorené štruktúry, rekurzívne; najprv všetky vstupné parametre, potom výstupné. V rámci jednej schémy parametre kopírujú poradie deklarácie properties v súbore špecifikácie. SmartWeb signatúru procedúry negeneruje ani neprispôsobuje — smerom pravdy je špecifikácia.
[!IMPORTANT] SmartWeb odovzdáva parametre pozične a procedúru neoveruje — o signatúre si z D2000 nič nenačítava. Ako dopadne procedúra deklarovaná v inom poradí, rozhoduje strana D2000. Po každej zmene špecifikácie preto znovu skontrolujte poradie parametrov dotknutých procedúr.
Chyby v špecifikácii
Nasledujúce prípady sú tvrdou chybou načítania špecifikácie: chyba sa zaloguje a zmena sa neprejaví (zostáva nasadená predchádzajúca funkčná verzia).
rekurzívna schéma štruktúry (priamy alebo nepriamy cyklus
$ref)kolízia mien RPC parametrov v celom splošťenom strome alebo kolízia mien stĺpcov v jednej štruktúre — rieši sa atribútom
x-d2-namex-d2-structure-parent-rowid-columnnamapovaný na existujúcu JSON propertyx-d2-structure-rowid-columnnamapovaný na property, ktorá nie jetype: integeralebo nie jerequiredštruktúra s vnorenými štruktúrami bez
x-d2-structure-rowid-columnvnorená štruktúra bez
x-d2-structure-parent-rowid-columnx-d2-structure-namena property, ktorá referencuje komponent — patrí na samotný komponentx-d2-structure-rowid-columnax-d2-structure-parent-rowid-columnpomenúvajúce ten istý stĺpec
Konektor výstupného OpenAPI
Výstupný konektor umožňuje D2000 ESL skriptu volať externú HTTP službu. SmartWeb sa zaregistruje v D2000 ako proces; ESL skript zavolá RPC procedúru na tomto procese, konektor ju priradí k operácii načítanej OpenAPI špecifikácie, zapíše argumenty RPC ako telo JSON požiadavky a odošle ju. Odpoveď sa do D2000 vráti ako druhé RPC volanie.
Oba smery čítajú tie isté atribúty x-d2-* a rovnaké pravidlá vnorených štruktúr, takže jeden súbor špecifikácie môže naraz obsluhovať vstupné API aj výstupný konektor.
Konfigurácia
Každá položka openApiConnectors spúšťa jeden nezávislý konektor — vlastný D2000 proces, vlastný HTTP klient, vlastné špecifikácie.
smartweb:
application:
connectors:
openApiConnectors:
- local:
processName: "SELF.OPENAPI_CONNECTOR"
remote:
connectionUrl: "https://external-api.example.com/base/"
authType: "USERNAME_PASSWORD" # USERNAME_PASSWORD | API_KEY | OAUTH2
username: "user"
password: "secret"
# apiKey: "external-service-key" # authType: API_KEY
# realm: { ... } # authType: OAUTH2
truststore:
path: config/cert/truststore.p12
password: changeit
connectTimeout: 5000
requestTimeout: 45000
idleTimeout: 30000
addressResolutionTimeout: 5000
openApi:
enabled: true
specifications:
- specificationFilePath: external_api.yaml
specificationFormat: "YAML"
specificationVersion: "3.0"
generateDocumentation: trueVlastnosť | Popis |
|---|---|
| Meno D2000 procesu, pod ktorým sa konektor prihlasuje. ESL skript adresuje tento proces — objekt musí v D2000 existovať. |
| Základná URL externej služby. Cesta operácie zo špecifikácie sa voči nej resolvuje. |
| Autentifikácia výstupnej požiadavky — viď tabuľku nižšie. Bez nej sa neposiela žiadna autentifikačná hlavička. |
| Truststore na overenie TLS certifikátu cieľa |
| Timeouty HTTP klienta v milisekundách (predvolene 5000 / 45000 / 30000 / 5000). |
| Špecifikácie externého API — rovnaké vlastnosti ako pri vstupnom smere; |
[!IMPORTANT]
connectionUrl musí končiť lomkou. Cesta operácie sa voči nej resolvuje ako relatívna URI, takže https://host/base bez koncovej lomky stratí segment base a každé volanie ide na https://host/….
Typy autentifikácie
| Odoslaná hlavička | Vyžaduje |
|---|---|---|
(nenastavené) | žiadna | — |
|
|
|
|
|
|
|
|
|
Volanie z ESL skriptu
INT _hConn
_hConn := %StrToHBJ("SELF.OPENAPI_CONNECTOR.DCP")
CALL [(0)] E.MyEvent.myOperation(_header, _rows, _nestedRows) ASYNC ON (_hConn) TC_BE _hTCKonektor je JAPI proces, takže volanie nenesie odkaz na objekt (
[(0)]) a proces sa adresuje cez HOBJ (ON (_hConn)). D2000 registruje reláciu (session) konektora pod menomlocal.processNames príponou.DCP— to je meno objektu, ktoré rozlíši%StrToHBJ; samotné meno procesu objektom nie je a vráti neplatnú hodnotu. Objekt existuje, až keď sa konektor prihlási. RPC procedúru, ktorá je implementáciou ESL rozhrania, takto volať nemožno.Meno procedúry je
x-d2-event-name+.+x-d2-event-rpc-namedanej operácie, napísané doslova — mená objektov D2000 smú obsahovať bodku, takže sa meno preloží. Konektor ho rozdelí na poslednej bodke. Meno RPC s pomlčkou sa v ESL napísať nedá — použije sa podčiarkovník a konektor vyhľadanie zopakuje s pomlčkami.Argumenty sú pozičné, v tom istom sploštenom poradí do hĺbky ako pri vstupnom smere, a musia sa odovzdať všetky, vrátane prázdnych štruktúr.
Odpoveď nie je návratová hodnota. Konektor odpovie v konverzácii cez
on<Rpc>Response(<výstupné parametre>), resp.on<Rpc>Error(errorCode, errorMessage). Obe sú vo volajúcom skripte deklarované akoRPC PROCEDURE [_hTC, TC_E]a konverzáciu uzatvárajú. Ak procedúra neexistuje, konektor konverzáciu iba abortuje.
RPC PROCEDURE [_hTC, TC_E] onMyOperationResponse(IN RECORD NOALIAS (SD.Header) _header)
; spracovanie odpovede
END onMyOperationResponse
RPC PROCEDURE [_hTC, TC_E] onMyOperationError(IN TEXT _errorCode, IN TEXT _errorMessage)
LOGEX _errorCode + " - " + _errorMessage PRIORITY _LOG_PRTY_ERROR
END onMyOperationErrorChybové kódy
errorCode je mnemonický reťazec, nie HTTP stavový kód; niektoré kódy stav vzdialenej odpovede pripájajú.
| Príčina |
|---|---|
| K menu |
| RPC bolo zavolané s viac argumentmi, než má operácia parametrov |
| Nepodarilo sa zostaviť telo JSON požiadavky |
| Mapovanie odpovede na D2000 štruktúry zlyhalo v SmartWebe — chýbajúci stĺpec alebo väzobný stĺpec |
| Externá služba odpovedala stavom mimo 2xx |
| Odpoveď sa nepodarilo spracovať |
| Požiadavku sa nepodarilo odoslať (spojenie, DNS, timeout) |
| HTTP klient konektora nebeží |
| Nepodarilo sa získať OAuth2 access token |
Generované klientske stuby
Generovanie TypeScript klienta (structures.ts, events.ts) sa presunulo mimo OpenAPI — konfiguruje sa blokom smartweb.application.generator.d2jsapi[] a beží nad session core konektora. Kľúče clientOutputDirectory a useLegacyApi v špecifikácii boli odstránené a ich ponechanie nemá žiadny účinok. Pozri Generovanie TypeScript klienta pre D2000 RPC.
Generovaná dokumentácia špecifikácie
Ku každej spracovanej špecifikácii SmartWeb vytvorí Markdown report a poskytuje ho na tej istej ceste, na ktorej poskytuje aj samotný dokument:
URL | Vráti |
|---|---|
| nasadenú špecifikáciu daného kontextu |
| report všetkých špecifikácií instancie ( |
Napríklad http://localhost:8098/smartweb/api/open/status.md.
[!NOTE]
Report je jeden na celú instanciu, nie na kontext: patrí k súboru špecifikácie a súbory sa na kontextové
cesty nemapujú — špecifikácia výstupného konektora nie je publikovaná pod žiadnou. Ak je ten istý súbor
použitý v oboch smeroch, je v reporte raz, so sekciou pre každý smer. Žiadny súbor sa nezapisuje na disk — report sa poskladá až pri požiadavke a overí sa voči D2000 cez reláciu (session) tej istej požiadavky, teda pod právami toho, kto si ho vyžiadal (API kľúč, JWT alebo Basic auth). Vypína sa generateDocumentation: false pri danej špecifikácii.
Report je krátky — je to hlásenie, nie opis špecifikácie:
jedna veta na každý smer: YAML correctly processed s počtom naviazaných operácií, alebo YAML was NOT processed aj s doslovnou chybou mapovania,
sekcia
Structures on the D2000 side— sekcia pre každúSD.*, ktorú špecifikácia mapuje, v akomkoľvek stave: vyhovuje, nevyhovuje (chýbajúci stĺpec, zlý typ,rowId/parentRowId, ktorý nie jeInteger), v D2000 chýba, alebo ju D2000 má, ale nepublikuje (viď nižšie, aj s HOBJ). Každá z nich končí celým rozložením stĺpcov, ktoré špecifikácia na štruktúru mapuje, takže sa dá vytvoriť alebo opraviť priamo z reportu,sekcia
RPC procedures the D2000 side has to declare— ESL hlavička každej naviazanej RPC procedúry (pre vstupný smer vrátane odpovedeCALL [_hTC] Result(…) ASYNC TC_E, pre výstupný smer volanie a obe callback procedúryon<Rpc>Response/on<Rpc>Error). Hlavičky sa skladajú zo špecifikácie a neoverujú sa voči D2000 — RPC procedúra je súčasťou ESL skriptu. Výstupný parameter, ktorý by zopakoval meno vstupného, je premenovaný príponouOut(_headerOut), pretože ESL rovnaké meno parametra dvakrát nepripúšťa — parametre sa odovzdávajú pozične,sekcia
Recursion in the specification, ak súbor obsahuje rekurzívnu schému.
Ak nechýba nič, celý report má zopár riadkov. Parametre fungujúcich operácií ani stĺpce vyhovujúcich štruktúr sa nevypisujú — to je obsah samotnej špecifikácie, ktorú poskytuje openapi.yaml.
[!NOTE]
status.md odpovie aj vtedy, keď špecifikáciu vôbec nebolo možné spracovať — práve ten report je jediné miesto, ktoré povie prečo.
Chýba, alebo sa nepublikuje?
D2000 posiela definície štruktúr JAPI klientovi ako shared resources. SD.* objekt teda môže v D2000
existovať a relácia (session) o jeho definícii aj tak nemusí vedieť — typicky pri práve vytvorenej štruktúre,
ktorú ešte žiadna bežiaca D2000 strana nepoužíva. Preto sa SmartWeb pri chýbajúcej definícii spýta priamo
jadra (getObjectInfo) a report rozlíši dva stavy:
Definícia v relácii (session) | Objekt v jadre | V reporte |
|---|---|---|
je | — | overia sa stĺpce |
nie je | neexistuje |
|
nie je | existuje | is not published by D2000, aj s HOBJ a odporúčaním spustiť/prekompilovať ESL skript, ktorý ju deklaruje |
Takto sa overujú len štruktúry — RPC procedúry sa neoverujú vôbec.
[!IMPORTANT]
Kým D2000 definíciu štruktúry nepublikuje, volanie, ktoré ju mapuje, skončí chybou 500 s rovnakým
vysvetlením — nie je to problém špecifikácie, ale stavu D2000 strany.
Report je vždy aktuálny
Skladá sa pri každej požiadavke, takže netreba nič invalidovať:
súbory špecifikácií sa pri každej požiadavke overia na disku a čo sa zmenilo, sa znovu načíta — stačí súbor upraviť a znovu načítať URL, nečaká sa na sledovanie súborov,
D2000 strana sa číta v momente požiadavky — stačí vytvoriť chýbajúcu
SD.*v CNF a znova načítať URL, restart nie je potrebný,RPC procedúry sa neoverujú — ich hlavičky sú to, čo špecifikácia od D2000 strany očakáva, a vypíšu sa bez ohľadu na to, či ich D2000 deklaruje.
Ak je tá istá špecifikácia použitá v oboch smeroch (publikovaná ako vstupné API a zároveň volaná cez výstupný konektor), report má sekciu pre každý smer a jednu spoločnú sekciu Structures on the D2000 side.
[!NOTE] Overenie štruktúr voči D2000 vyžaduje reláciu (session) na D2000 — použije sa tá z požiadavky. Ak sa nedá zistiť, report sa poskytne tiež, kontrola štruktúr je však označená ako neoverená aj s dôvodom. Kvôli reportu sa žiadna ďalšia relácia (session) neotvára.
Rekurzia v špecifikácii
Komponent, ktorý odkazuje sám na seba, nemá v D2000 ekvivalent — štruktúra je plochá tabuľka a bunka nevie obsahovať ďalšiu štruktúru — takže celá špecifikácia je odmietnutá. Report v takom prípade obsahuje sekciu Recursion in the specification: cyklus ako cestu (OrgNode -> children -> OrgNode) a jeho rozvinutie na pevnú hĺbku — jeden komponent na úroveň (OrgNodeL1 … OrgNodeL3), všetky namapované na tú istú SD.*, koreň deklaruje len x-d2-structure-rowid-column, každá nižšia úroveň aj x-d2-structure-parent-rowid-column a posledná už žiadnu vnorenú property nemá.