Dette dokument er ment som en vejledning til anvendelse af den Nationale Afprøvningsplatform (NAP).
På baggrund af dokumentet, er det muligt for leverandører af både lægepraksissystemer og afprøvningsprojekter, at udvikle systemer som integrerer med NAP.
I følgende beskrives opsætningstrinene for at komme i gang med NAP platformen, hvis man vil oprette et ny projekt som skal ind i NAP'en.
Krav til software:
Docker skal være installeret, da opsætningen foregår via docker-compose.
Et docker netværk kaldet nap_net skal laves (`docker network create nap_net`)
Komponenterne fra https://svn.nspop.dk/svn/components/nap/ skal hentes ned.
OBS vi har ikke nogen distributionskanal for denne executeable endnu. Så foreløbigt:
Kør `mvn install -P generateexecutable` og start den executable det bliver generate i /target.
Login ved at trykke på localhost og bruge default login credentials. Dette vil trække en SAMLassertion fra STS på test1. Du kan bruge denne i 30 min.
Skriv et cpr nummer på en test person (Eksempelvis "2708599967", som er et hyppigt anvendt test cpr nummer). Du kan nu browse rundt i fanerne.
For at fanen "afprøvningsplatformen" fungere, skal Nap-Compose og Nap-Lobby startes, som er de næste trin i opsætning.
Dette vil hoste lobbyen på http://localhost:8080/nap/lobby/web/, som er den url hosten kigger efter.
Ideen med nap-compose er, at denne reverse proxy fungerer som en NSP loadbalancer med path rewriting.
For at starte denne reverse proxy køres `docker-compose up`. Dette vil åbne port 8080 på localhost.
Nap-lobby er kataloget for de afprøvningsprojekter, der findes i nappen.
Kør `docker-compose up` fra compose/test. Med Nap-compose kørende, er denne nu tilgængelig for nap-host-java.
For at at Lobby skal vise nogen projekter skal den have forbindelse til Nap-admin.
Kør `docker-compose up` fra compose/test. Med Nap-compose kørende, er denne nu tilgængelig for Lobbyen og projekter bliver vist
Der ligger et Developer projekt, der hurtigt kan sætte gang i anvendelsen af NAP - platformen som udviklingsmiljø.
Hvis dette projekt trykkes på, vil java-host åbne en hvilken som helst applikation der hostes på lokalhost:4600.
Når en ny applikation skal ind på platformen, er der 2 steder platformen skal konfigureres før det fungerer.
Denne reverse proxy konfigureres ved at opdatere nap-httpd.conf.
<VirtualHost *:8080> ServerName nap
ProxyPass /nap/reference/web/services/main http://napreffacade:8080
ProxyPassReverse /nap/reference/web/services/main http://napreffacade:8080
ProxyPass /nap/reference/web http://naprefweb:8080
ProxyPassReverse /nap/reference/web http://naprefweb:8080
</VirtualHost>
Lav en konfiguration magen til ovenfor hvor reference og naprefweb udskiftes efter ønske.
Urlen skal dog passe med, den url der indsættes nedenfor
For at dit projekt skal vises i lobbyen, skal projektet optræde i din lokale napadmindb.
Du kan gøre dette med sql inserts direkte eller opdatere compose/db/migration/V2__insert_data_localhost.sql med en kopi af nedenstående, som bare opdateres med dit nye info
|
database og flyway skal således køres igen med `docker-compose up & docker-compose down`
I det følgende beskrives, hvordan man som værtssystem-/ LPS udvikler, skal integrerer NAP platformen ind i det respektive system.
Der er ikke noget som skal opsættes ved siden af, hvis man benytter sig af produktions/test miljøet.
For at kommunikere med NAP'en skal det givne værtssystem/LPS opsættes, således den lytte på specifikke beskeder fra SDK'et.
I det nedenstående vil eksemplerne tage udgangspunkt i java, og der kan derfor også tages udgangspunkt i nap-host-java, hvis der er brug for insipiration.
INDSÆT LINK
For at kunne kommunikere med SDK'et, gøres brug af et Webview, hvori man kan indlejre javascript på den indlæste HTML side, da det er den måde SDK'et fungere på.
I nedenstående eksempel, tilføjes "NAPBridge" på "window" variablen, som er i global scope på den indlæste HTML side.
final JSObject window = (JSObject) webEngine.executeScript("window"); window.setMember("NAP", napBridge) |
En implementering af NAP Bridge kan se således ud:
public class NAPBridge { private JSObject bridge; /** * Transforming a JSON string into a NAPMessage and sending it to subscribers. * @param rawEventString */ public void send(String rawEventString) { try { System.out.println(this.getClass().getName() + " send(): " + rawEventString); NAPMessage msg = objectMapper.readValue(rawEventString, NAPMessage.class); notifyListeners(msg); } catch (IOException ioException) { System.out.println(this.getClass().getName() + " " + ioException); } } /** * Sets the bridge to act as a callback. * @param bridge */ public void setCallback(JSObject bridge) { System.out.println(this.getClass().getName() + " setCallBack(): " + bridge); this.bridge = bridge; } }} |
Et JS objekt, som bridge variablen er, gør at man kan eksekvere javascript metoder og undersøge javascript properties.
Derudover er der implementeret to metoder, som er send() og setCallback(), det er disse to metoder som SDK'et kalder til.
Send() gør brug af et internt subscribe pattern, som notificere dem som lytter og en implementering af de indkommende beskeder, kunne se således ud:
private void handleBridgeCallBacks(NAPMessage napMessage) { System.out.println("Bridge got type NAPMessageType" + napMessage.getEvent().getNAPEventType()); switch (napMessage.getEvent().getNAPEventType()) { case WebAppOpen: try { WebApp webApp = this.getWebAppById( Configuration.getInstance().getNapAdminUrl(this.environment), FHIRResoureValueGetter.getWebAppId(napMessage), this.base64EncodedSAMLToken ); if (webApp != null) { Platform.runLater(() -> this.webAppPane.openURL(webApp.getManifest().getUrl())); } } catch (ConnectException e) { System.err.println("Kunne ikke oprette forbindelse til serveren"); } catch (Exception e) { e.printStackTrace(); } break; case PatientOpen: sendCurrentPatient(txfCPR.getText(), napMessage.getDate(), napMessage.getId()); break; case SessionOpen: sendToken(napMessage); break; case SessionClose: sendSessionClosed(napMessage); break; case SessionError: sendSessionError(napMessage); } } |
Når der skal sendes en NAP besked, kan der så gøres brug af bridgen. Call() tager imod en string, som angiver hvilken metode man vil kalde, her "handle", da det er den variable som SDK'et lytter på. Metoden sender en string representation af et JSON objekt, her af typen NAPMessage.
if(napBridge.bridge != null) { this.napBridge.bridge.call("handle", eventRawJSONString); } |
For at se de projekter der er tilgængelige, skal NAP Lobby Web integreres med det nuværende system.
Start Nap lobby web på test
Start Nap admin
Derefter skal den ind i NAP'en og være som projekt.
Inspiration kan bruges NAP Java host som simulere et LPS system.
NOTE: INTRODUKTION TIL VISIONER OG HVORDAN DET SKAL BRUGES.