In 3 Het drie-lagen model is al uitgelegd hoe SIM’s, UGM’s en BSM’s met elkaar verweven zijn. In dit hoofdstuk beschrijven we hoe deze modellen daadwerkelijk vervaardigd kunnen worden. Als handige start kan het template Enterprise Architect bestand als basis worden genomen. Dit bevat een initiële folder structuur en verder alleen modellen die je nodig zou kunnen hebben, bijv. modellen voor datatypes en berichtsoorten.
Bij het verwerken van de vervaardigde modellen met Imvertor kunnen er foutmeldingen en waarschuwingen optreden. Voor goedkeuring dient elk model vrij te zijn van foutmeldingen en waarschuwingen. Een lijst met de meeste mogelijke foutmeldingen kan “hier”:https://imvertor.armatiek.nl/imvertor-executor/dashboard/wikis/msg gevonden worden. Ook in hoofdstuk 8 Veel voorkomende fouten vind je een aantal veel voorkomende fouten en een uitleg hoe daarmee om te gaan.
4.2. Het opstellen van een horizontaal Semantisch InformatieModel
4.3. Het opstellen van een horizontaal GegevensUitwisselingsModel
4.4. Het opstellen van een koppelvlak
In dit hoofdstuk beschrijven we hoe we binnen VNG-realisatie i.h.k.v. de Nieuwe Aanpak omgaan met het beheer van onze modellen. Het aantal modellen dat we in beheer hebben neemt vlug toe en aangezien de relaties tussen deze modellen een spaghetti aan afhankelijkheden oplevert is het van groot belang dat de procedure voor het gezamenlijk werken aan deze modellen voor iedereen duidelijk is en ook toegepast wordt. Omdat bij dat beheer SVN een centraal onderdeel is zijn hieronder de belangrijkste SVN handelingen beschreven. In de paragraaf daaronder beschrijven we de te hanteren procedure waarbij je gebruik maakt van de beschreven SVN handelingen.
Randvoorwaarde om SVN binnen Enterpise Architect te kunnen gebruiken is dat Tortoise SVN geïnstalleerd is en en dat Enterprise Architect is geconfigureerd om de repository met Informatiemodellen, Gegevensmodellen en Berichtmodellen te kunnen gebruiken. Zie onder 1 Installatie de paragraaf SVN configureren voor EA.
Als er een nieuw model wordt gemaakt in Enterprise Architect, om het even of dat nu een SIM, UGM of BSM is, en dat model moet opgenomen worden in de SVN-repository, dan moet op het niveau van de model-package aangegeven worden dat deze package opgenomen moet worden in de repository.
In Enterprise Architect 15.1 kan dit menu gevonden worden via het menu Publish > Model Exhange > Package Control > Configure > Package Control….
De bestandsnaam voldoet daarbij aan de volgende conventie: [Modeltype] [Domein (al dan niet als afkorting)].xml
Modeltype is daarbij gelijk aan ‘SIM’, ‘UGM’ of ‘BSM’. Enkele voorbeelden hiervan zijn ‘SIM RSGB.xml’ of ‘BSM Bevraging Bewoning.xml’.
Randvoorwaarde voor het ophalen van een model uit de repository in Enterprise Architect is dat er een standaard projecten structuur aanwezig is in het EA-bestand. Om te waarborgen dat dit het geval is dien je bij het aanmaken van een nieuw EA bestand een kopie te maken van het EA Template bestand dat je kunt vinden in de folder die je n.a.v. de tweede bullet van de sectie SVN configureren voor EA hebt aangemaakt of gekozen.
Het ophalen van een model wordt gedaan door een Get package uit te voeren:
Het model wordt nu binnengehaald en onder de package gezet die je in de eerste stap hebt geselecteerd.
Let op: Het binnenhalen van een stelsel aan packages dient in de juiste volgorde te gebeuren. Dus eerst de SIM packages waar andere SIM packages van afhankelijk zijn, daarna die andere SIM packages en daarna hetzelfde voor de UGM packages en tenslotte het BSM package. Voor het bepalen van de juiste volgorde verwijs ik naar het Supplieroverzicht. De in dit overzicht op het laagste niveau voorkomende modellen (de modellen die het verste inspringen) moeten als eerste binnengehaald worden.
Een model dat is opgehaald is altijd ingechecked. Als je een model wilt bewerken moet je het uitchecken. Dat doe je als volgt:
Na het aanbrengen van de wijzigingen kan je het model weer inchecken en dat doe je als volgt :
Modellen die je opgenomen hebt in je EA-bestand worden niet automatisch bijgewerkt. Op het moment dat iemand anders in een model een wijziging heeft aangebracht moet die wijziging pro-actief opgehaald worden. Je kunt de laatste versie van een specifiek model ophalen door het volgende te doen.
Als je alle modellen die in jouw EA-betand zitten wilt updaten (aanrader) dan kies je in de bovenstaande situatie voor de keuze “Get All Latest”.
Indien je een model uit je EA-bestand wilt verwijderen kan dat door de package te verwijderen.
Let op: een model dat in Version Control is opgenomen kan later weer opgehaald worden (zie boven). Echter een model of package dat niet in Version Control is opgenomen wordt hiermee definitief verwijderd en is niet meer terug te halen.
Let op 2: Pas wel op met de volgorde van weggooien en vooral inladen. Als je een model verwijderd waarnaar vanuit een ander model verwezen wordt dan zijn in laatstgenoemd model in de diagrammen de verwijzingen naar eerstgenoemd model weg. Deze verwijzingen komen niet meer terug. Dus als je zo’n eerstgenoemd model verwijderd, verwijder dan eerst alle modellen die daarnaar verwijzen en laad ze (indien gewenst) ‘van boven naar beneden’ weer opnieuw in.
De meeste modellen hebben een afhankelijkheid van andere modellen. Op die andere modellen vindt beheer plaats en het kan dus voorkomen dat je n.a.v. het beschikbaar komen van een nieuwe versie in je EA bestand de oude versie van een model moet vervangen door een nieuwe versie van datzelfde model. In principe wordt van elke versie een tag vastgelegd (zie volgende hoofdstuk) en vervangen van een model betekent dus eigenlijk dat je een model dat verwijst naar een specifieke tag verwijdert en de nieuwe tag voor dat model weer inleest. De modellen zijn echter d.m.v. traces aan elkaar gelinkt en bij het vervangen van een model wil je niet dat deze traces verloren gaan. Om dat te voorkomen moet je de volgende procedure hanteren:
Daarmee is de nieuwe versie weer beschikbaar in EA en zijn de traces behouden. Nu dien je je eigen model(len) weer in lijn te brengen met het zojuist vervangen model.
Zie ook het bijgaande Presentatie Procedure modellenbeheer. Deze presentatie is echter slechts ter ondersteuning, de onderstaande procedure is in die zin normatief.
Het is bij het laden van de benodigde modellen van groot belang dat je de modellen in de juiste volgorde in EA ophaalt. Om die reden dien je voordat je gaat ophalen een goed beeld te hebben van de benodigde modellen en van de volgorde van ophalen. Hiervoor is de tabel ‘Tags model-supplier overzicht’ die je hier vindt onontbeerlijk. Deze tabel wordt regelmatig ververst dus het is verstandig dit bestand steeds weer opnieuw te downloaden. Welke modellen je nodig hebt is o.a. afhankelijk van de rol waarin je een model gebruikt.
Indien je als beheerder een bestaand model gaat bewerken dan moet je dat model zoeken in de ‘trunk’ of in de ‘branches’ folder van de repository. Wil je van scratch af aan een nieuw model gaan opbouwen dan haal je geen model op uit de trunk’ of ‘branches’ folder maar dan ga je juist een nieuw model in de trunk plaatsen. Over het algemeen zul je echter de meeste modellen alleen als gebruiker op willen halen. Dit zijn de modellen waar jij zelf niet verantwoordelijk voor bent en in dat geval zoek je in de ‘tags’ folder en daarvoor is de eerder genoemde tabel handig. Je mag er trouwens vanuit gaan dat de modellen die in de tags folder staan ook aanwezig zijn op de Imvertor server. De eigenaar van een model heeft immers de verantwoording om dat model op de Imvertor server te processen voordat hij/zij een verzoek tot het aanmaken van een tag plaatst.
Binnen SVN maken we gebruik van tags om een opname te maken van onze modellen op een formeel moment. Een voorbeeld van zo’n moment is de start van een openbare consultatie maar het kan ook zijn dat je je model rijp genoeg acht voor het eerste gebruikt door je collega’s. Een tag is altijd een read-only bestand. Op een tag kunnen dus geen wijzigingen meer worden aangebracht. Zitten er fouten in een tag dan is de enige remedie deze te vervangen door een andere tag. Voorwaarde voor het vervaardigen van een tag is dat deze minimaal foutvrij door Imvertor komt.
Zo ga je te werk:
Branches worden vervaardigd om versies van modellen met de status ‘in gebruik’ apart op te slaan teneinde evt. patches te kunnen ontwikkelen. Dit kan dus (in principe) alleen met modellen die in de trunk de status ‘in gebruik’ hebben bereikt. Hier is de voorwaarde dat het model fout- en waarschuwingsvrij door Imvertor komt.
Hoe ga je te werk.
Noot Dit hoofdstuk moet nog verder worden ingevuld.
Een horizontaal Semantisch Informatiemodel (ook wel Conceptueel Informatiemodel genoemd) is een modellering van de realiteit van objecten die een meervoudige toepassing kennen. De objecten in zo’n model hebben dus in meerdere domeinen een toepassing. Door deze objecten in een horizontaal Semantisch Informatiemodel te definiëren zorgen we er voor dat niet steeds opnieuw het wiel uitgevonden hoeft te worden en dat ze overal waar ze gebruikt worden op eenzelfde wijze worden gespecificeerd.
In een horizontaal GegevensUitwisselingsmodel worden die gegevens op UGM niveau uitgewerkt die een meervoudige toepassing kennen. Als in een verticaal GegevensUitwisselingsModel dan wordt verwezen naar entiteiten en attributen uit een horizontaal GegevensUitwisselingsModel zorgt dat er voor dat deze gegevens in alle koppelvlakken (ongeacht of dat nu gaat om een StUF of een REST JSON koppelvlak) op eenzelfde wijze worden gespecificeerd.
Zoals in hoofdstuk Het drie-lagen model al is uitgelegd zijn SIM’s en UGM’s sterk met elkaar verweven. In het geval van een UGM kan die verwevenheid initieel al voor een groot deel geautomatiseerd worden vastgelegd. Voer daarvoor de werkinstructie ‘Werkinstructie SIM omzetten naar UGM’ zoals beschreven in Werkinstructies uit. Dit zorgt er voor dat alle stereotypes die in feite nog tot het MIG behoren worden omgezet naar stereotypes die tot het MUG behoren. Zo krijgt een class met het stereotype ‘Objecttype’ het stereotype ‘Entiteittype’ toegekend en een attribuut met het stereotype ‘Attribuutsoort’ het stereotype ‘Element’. Daarnaast worden er automatisch traces gecreëerd tussen de gerelateerde componenten in het SIM en het UGM.
Het UGM is daarmee bijna klaar om verder verwerkt te worden tot een volwaardig UGM. Dat wil zeggen dat voor SIM logische structuren omgezet worden naar structuren die technisch beter verwerkt kunnen worden. Dat gebeurd op basis van een aantal 421 Technische en implementatie-overwegingen . Eerst moeten er echter een aantal handelingen uitgevoerd worden die onafhankelijk zijn van de gewenste uitvoer (yaml of StUF) en een aantal handelingen die specifiek zijn voor de gewenste uitvoer.
Om Imvertor in staat te stellen de gelegde traces te interpreteren moet duidelijk zijn naar welke modellen de traces leiden. Voer daarvoor de volgende handelingen uit:
Voer vervolgens de volgende acties uit:
Vraag: Wat is hiervan de functie?
De volgende handelingen zijn alleen van toepassing indien het uiteindelijke doel het genereren van yaml schema’s is:
Stereotype SIM | Stereotype UGM |
---|---|
Objecttype_proxy | Entiteittype |
Gegevensgroep_proxy | Groep compositie |
Attribuutsoort_proxy | Element |
Noot: Nagaan of dit soort karakters niet door Imvertor worden verwijderd. Indien dat het geval is dan is deze handeling niet noodzakelijk al kan je er voor kiezen om in het UGM de juiste benamingen te gebruiken.
Noot: Nagaan of dit nodig is voor yaml. Zo ja dan kan deze handeling naar de generieke handelingen. Deze handeling moet dan ook uit de andelingen voor StUF gehaald worden.
Noot: Nagaan of dit nodig is voor yaml.
Vraag: Waaraan moet de naamgeving van deze tagged values voldoen. Het gaat me niet zozeer om het patroon maar meer of in de naam ook de semantiek van de relatie tot uiting moet komen. Dus moet het ‘medewerkers’ zijn of ‘contactvoerendemedewerkers’? Bij meerdere relaties naar dezelfde resource lijkt me de laatste i.i.g. van toepassing.
De volgende handelingen zijn alleen van toepassing indien het uiteindelijke doel het genereren van StUF schema’s is:
_. Stereotype SIM | _. Stereotype UGM |
Objecttype_proxy | Entiteittype |
Gegevensgroep_proxy | Groep compositie |
Attribuutsoort_proxy | Element |
Noot: Nagaan of dit soort karakters niet door Imvertor worden verwijderd. Indien dat het geval is dan is deze handeling niet noodzakelijk al kan je er voor kiezen om in het UGM de juiste benamingen te gebruiken.
Noot: Volgens mij zijn spaties in enumeraties in XML-Schema wel toegestaan. Indien dat zo is dan is bovenstaande handeling niet nodig.
NB: Eigenlijk moeten een aantal handmatige stappen al in het SIM geregeld zijn, want nu moet het elke keer handmatig overnieuw gedaan worden.
Hier kunnen we documenteren welke overwegingen er zijn toegepast bij het opstellen van het UGM. Daarbij kan gebruik gemaakt worden van voorbeelden.
In mijn beleving wordt dit hoofdstuk wat vroeger het “verStUFfingsdocument” was.
Noot: Nee, dat klopt niet. Hier wordt uitgelegd wat de gedachte achter de creatie van een UGM is (in feite ook de gedachte achter het verStUFfingsdocument). In de volgende paragrafen moet dan uitgelegd worden welke methodes er bij het creëren van een UGM kunnen worden gehanteerd. Het zou kunnen dat deze pagina voor het yaml deel uiteindelijk vervangen wordt door de API Best Practices. Op zijn minst voor de principes, wellicht dat hier dan alleen nog wat handreikingen worden gedaan m.b.t. de wijze waarop in de praktijk met de API Best Practices in de UGM’s moet worden omgegaan.
Een voorzet voor de API Best Practices wordt hier gedaan.
Het komt af en toe voor dat in een Informatiemodel een objectclass middels meerdere ‘isEen’ relaties verwijst naar andere objectclasses. Het lijkt er dan op dat de objectclass meerdere supertypeclasses heeft. In de met deze relaties gekoppelde objectclasses zijn dan attributen aangebracht die specifiek zijn voor het betreffende type. Binnen UGM zal je deze ‘isEen’ relaties waarschijnlijk willen oplossen. Dat kun je doen door de betreffende attributen op te nemen in de verwijzende entiteit en daarnaast een ‘xxxType’ attribuut op te nemen waarmee je bij de instantiërende resource kunt aangeven om wat voor type het gaat. Dat attribute kent dan als datatype een enumeratie.
Bij het vervaardigen van een informatiemodel baseren we ons op de realiteit. Sterker nog, een informatiemodel is niet anders dan een model van de realiteit. De realiteit is echter complex en bij het modelleren simplificeer je de realiteit vooral kijkend naar wat je nodig hebt om de userstories in te kunnen vullen. Af en toe zal je daarbij een voorschot nemen op mogelijk in de toekomst in te vullen userstories met als gevolg dat er objectclasses in het informatiemodel worden opgenomen die je (nog) niet nodig hebt. In het UGM, waarin we alleen dat modelleren wat we voor de userstories technisch nodig hebben worden de entiteiten die relateren aan deze objectclasses dan ook verwijderd.
Alle resources moeten m.b.v. een uuid op te vragen zijn en alle resources worden ook met een unieke url ontsloten. Om die reden wordt aan alle entiteiten in het UGM de attributen ‘uuid’ en ‘url’ toegevoegd.
Noot: Dit hoofdstuk moet door Henri gevuld worden. Eigenlijk moeten we de term ‘VerStUFfen’ uitfaseren.
Hier komt een uitleg m.b.t. de overwegingen om objecttypen samen te voegen of plat te slaan in andere objecttypen, gegevensgroepen te koppelen en (technische) attributen toe te voegen.
In een domeinspecifiek SIM wordt (meestal) ergens een koppeling gemaakt met het RSGB of het RGBZ. Over het algemeen zal 1 of meer objecten uit het RSGB of het RGBZ ook voorkomen in het domeinspecifieke SIM. Eventueel ook met een aantal domeinspecifiek toegevoegde attributen.
In het domeinspecifieke SIM wordt deze relatie gelegd door een objecttype op te nemen met dezelfde naam als de naam die in het SIM RSGB of het SIM RGBZ wordt gehanteerd en deze als Stereotype “Proxy” op te nemen. In deze klasse worden de gewenste attribuutsoorten die reeds in het RSGB gedefinieerd zijn ook opgenomen, maar ook in dit geval met de stereotype “Proxy”. Bij beide proxies (zowel de objecttypen als de attribuutsoorten) worden geen eigenschappen opgenomen en wordt voor het ophalen van deze eigenschappen een trace aangelegd tussen de “Proxy” klassen en het objecttype uit het RSGB dat als bron dient.
Eventuele toe te voegen attribuutsoorten (die we in het RSGB dus nog niet kennen) worden in de Proxy-klasse opgenomen met het stereotype “Attribuutsoort”. Bij deze toegevoegde attribuutsoorten moeten wel alle eigenschappen worden opgenomen die nodig zijn om de attribuutsoort eenduidig te kunnen definiëren.
Daarnaast kunnen in een koppelvlak-specifiek SIM objecttypen worden toegevoegd die onderling, (maar ook met de Proxy-klassen) gerelateerd kunnen zijn. Deze toegevoegde objecttypen hebben ook het stereotype objecttype. Dat ziet er bijvoorbeeld als volgt uit. De beige objecttypen zijn domeinspecifiek en de blauwe objecttypen zijn onderdeel van het SIM RSGB.
Het bovenstaande is een voorbeeld van een Informatiemodel dat ten grondslag ligt aan het UitwisselingsGegevensModel (UGM) dat wordt opgesteld t.b.v. een koppelvlak. Bij het maken van een domeinspecifiek (of koppelvlakspecifiek) UGM wordt enerzijds hergebruik gemaakt van entiteittypen die al eerder gemodelleerd zijn en anderzijds worden er nieuwe entiteittypen geïntroduceerd naar aanleiding van nieuw in het domeinspecifieke informatiemodel gedefinieerde objecttypen.
Voor die objecttypen die in het domeinspecifieke informatiemodel als proxy zijn opgenomen wordt gekeken naar het UGM waarin de betreffende objecttypen al eerder zijn vormgegeven tot entiteittype. Hierbij zijn “verStUFfingsregels” toegepast. De kans is zeer groot dat de overwegingen om objecttypen samen te voegen, gegevensgroepen te koppelen of (technische) attributen toe te voegen die eerder van toepassing waren ook bij het maken van het domeinspecifieke UGM van toepassing zullen zijn.
Kort samengevat geldt dat voor elk Proxy-objecttype dat opgenomen is in het domeinspecifieke SIM het corresponderende entiteittype gekopieerd wordt uit het “generieke” UGM. (Het UGM dat is afgeleid van het SIM waarnaar de Proxy verwijst). Vervolgens wordt dit gekopieerde entiteittype op maat gemaakt voor het domeinspecifieke UGM. Attributen worden verwijderd als deze niet voorkomen in het koppelvlak en attribuutsoorten die in een Proxy klasse zijn toegevoegd worden in het entiteittype toegevoegd als attribuut.
Noot: Op de nieuwe entiteittypen die naar aanleiding van nieuw in het domeinspecifieke informatiemodel gedefinieerde objecttypen in het domeinspecifieke UGM worden geïntroduceerd kan net zoals de entiteittypen in de “generieke” UGM’s natuurlijk ook een verStUFfingsslag van toepassing zijn. Daarvoor gelden dezelfde technieken als voor het verStUFfen van entiteittypen in de “generieke” UGM’s (zie de voorgaande paragraaf).
In dit hoofdstuk beschrijven we hoe je tot de technische specificaties van een koppelvlak kunt komen. Althans wat betreft de StUF XML-Schema’s en OAS3 specificatie. Een koppelvlakspecificatie bestaat immers uit meer dan alleen een van deze componenten. Denk onder andere aan de functionele documentatie maar ook aan een ‘Getting started’.
Voor zowel StUF XML-Schema’s als een OAS3 specificatie is het uitgangspunt dat er een valide UGM en dus ook een valide SIM voor het koppelvlak voor handen is. De paragrafen Opstellen van een Koppelvlak-informatiemodel en opstellen van een koppelvlak-UitwisselingsGegevensModel gaan daar dieper op in. De details over het modelleren van berichtspecificaties staan beschreven in paragraaf 433 opstellen van een koppelvlak-BerichtStructuurModel .
Voor het zover is moeten echter de onderstaande stappen genomen worden.
VNG Realisatie vult een rol in als het gaat om het in beeld krijgen van de behoefte aan koppelvlakken. Dat kan vanuit twee perspectieven.
Vanuit een architectuur-benadering kan geconstateerd worden dat het voor de hand ligt om tussen twee referentiecomponenten een koppelvlak met een specifiek doel te definiëren. Volgend daarop zal altijd getoetst moeten worden of de behoefte aan deze koppelvlakspecificatie ook bestaat dan wel gemeenten ervan bewust moeten worden gemaakt wat de effecten zijn als een dergelijk koppelvlak wordt gedefinieerd. Uiteindelijk moet er bij de gemeenten draagvlak zijn voor een koppelvlak.
Vanuit de dagelijkse praktijk van gemeenten kan de behoefte aan een koppelvlak worden gedefinieerd. Hierbij kunnen concrete uitwisselingsproblemen of een concrete functionele (uitbreidings-)wens ten grondslag liggen. De hier gedefinieerde behoefte aan een koppelvlak zal altijd moeten worden afgebeeld op de architectuur. Welke referentiecomponenten spelen hier een rol, Is de behoefte wel een reëel koppelvlak-issue of wordt er een probleem opgelost dat is ontstaan omdat er niet onder architectuur is gewerkt etc….
Noot: Dit lijkt mij ook een perspectief dat benoemt moet worden. Wellicht kan dit ook beschouwd worden als een concrete behoefte maar die behoefte leeft misschien heel ergens anders dan bij de gemeenten.
Het uitwerken van een koppelvlak is in feite een investeringsbeslissing. Daarbij zal een afweging gemaakt moeten worden van de voor- en de nadelen vanuit het perspectief van de gemeenten. Daarnaast wordt in kaart gebracht welke resources er nodig zijn, hoe actueel het op te lossen probleem is en hoe groot de impact op het gemeentelijk applicatie-landschap zal zijn.
Noot: De investeringsbeslissing kan n.m.m. in het geval van een wettelijke eis mogelijk helemaal niet liggen bij de gemeenten. Ik kan me zelfs voorstellen dat het budget door een andere partij ter beschikking wordt gesteld.
Werkgroepdeelnemers uitnodigen. Wens is altijd een goede gemeentelijke vertegenwoordiging, aangevuld met relevante leveranciers. Er moeten op voorhand werkafspraken gemaakt worden over de volgende zaken :
Noot: Inmiddels werken we op een andere wijze. Werkgroepen zijn vervangen door communities waarin vertegenwoordigers van zowel gemeenten als leveranciers kunnen deelnemen. De gebruikte tooling moet het werken in communities ondersteunen en om die reden wordt inmiddels gebruik gemaakt van zowel GitHub als GitLab. Veelal wordt een agile werkwijze gehanteerd waarbij bij de opstart van het project voorzien is in de rollen benodigd voor de gekozen agile werkwijze. Zo is er bij een scrum werkwijze bijv. voorzien in een Project Owner en een Scrum Master. Met het verschuiven van de traditionele keuze voor StUF als koppelvlak techniek door REST API’s zijn ook de op te leveren producten gewijzigd. Een belangrijke deliverable is voortaan de Referentie Implementatie. Tenslotte is ook de kwaliteitscontrole en het goedkeuringsproces flink gewijzigd. De kwaliteit van de opgeleverde Referentie Implementatie en de OAS3 specificatie wordt gedurende de ontwikkeling van de nieuwe standaarden gecontroleerd in een of meerdere API-Labs en de goedkeuring van deze producten is niet meer bij een Regiegroep belegd. Het lijkt me daarom goed deze paragraaf te herschrijven en de titel te wijzigen. Wel moet er aandacht zijn voor die trajecten die nog wel de oude werkwijze hanteren en die nog wel de oude producten opleveren.
Door de werkgroep zullen de functionele eisen en wensen ten aanzien van het koppelvlak gedefinieerd moeten worden. Hierbij dienen de volgende aspecten in acht genomen te worden :
Noot: In het kader van het werken met communities, het intensiever betrekken van gemeenten bij de ontwikkeling van koppelvlakken en een agile aanpak wordt tegenwoordig vaak gestart met het definiëren van userstories. Dit zorgt er voor dat iedereen die dat wil zijn invloed kan pakken en de richting die de ontwikkeling van een koppelvlak neemt kan beïnvloeden. De aanpak is immers transparanter omdat het verwerken van de userstories in alle openheid gebeurd.
Op basis van de functionele eisen en wensen of de userstories wordt geïnventariseerd welke informatie-objecttypen, -relatietypen en -attribuuttypen er voor het koppelvlak nodig zijn. Deze worden vervolgens vastgelegd in een Semantisch InformatieModel dat specifiek voor het koppelvlak in beeld brengt om welke informatie het gaat.
Het opstellen van een verticaal informatiemodel wijkt in feite niet af van het opstellen van een horizontaal informatiemodel. In principe kan een verticaal informatiemodel ook op zichzelf staan en geen relatie hebben met enig ander (horizontaal of verticaal) informatiemodel. wat het een verticaal informatiemodel maakt is dat haar toepassing alleen een specifiek koppelvlak betreft.
In een verticaal informatiemodel is het mogelijk dat er “hergebruik” wordt gemaakt van objecttypen uit een horizontaal of ander verticaal informatiemodel. Dit wordt gedaan door in het informatiemodel een objecttype op te nemen met dezelfde naam als de naam in het gerelateerde informatiemodel en deze met de stereotype ‘objecttype_proxy’ op te nemen. In deze klasse worden alleen de (in het gerelateerde informatiemodel gedefinieerde) attribuutsoorten opgenomen die gewenst zijn, maar met het stereotype ‘Attribuutsoort_proxy’. Bij beide proxies (zowel de objecttypen als de attribuutsoorten) worden geen eigenschappen opgenomen en wordt voor het ophalen van deze eigenschappen een trace aangelegd tussen de “Proxy” componenten en de componenten in het gerelateerde informatiemodel dat als bron dient. Voor gegevensgroeptypes geldt hetzelfde alleen wordt daarvoor het stereotype ‘Gegevensgroeptype_proxy’ gebruikt.
Eventuele aan de proxy objecttypes en gegevensgroeptypes toe te voegen attribuutsoorten (die in het gerelateerde informatiemodel dus nog niet aanwezig zijn) worden in deze proxy-classes opgenomen met het stereotype ‘Attribuutsoort’. Bij deze toegevoegde attribuutsoorten moeten wel alle eigenschappen worden opgenomen die nodig zijn om de attribuutsoort eenduidig te definiëren. Aangezien deze attribuutsoorten geen basis hebben in een ander informatiemodel en dus eigenlijk zelf als bron fungeren moet er op dit soort attributen de tagged value ‘Is afgeleid’ gedefinieerd worden met de waarde ‘Nee’.
Het onderstaande voorbeeld moet nog vervangen worden door een concreter praktijk-voorbeeld.
![Dom spec SIM][Dom-spec-SIM]
In een domeinspecifiek SIM wordt vrijwel altijd een koppeling gemaakt met een horizontaal Informatiemodel (bijv. RSGB of RGBZ). Over het algemeen zullen een aantal objecttypen uit die horizontale informatiemodellen ook voorkomen in het domeinspecifieke SIM. Het is mogelijk dat deze objecttypen worden aangevuld met een aantal domeinspecifieke attribuutsoorten. Daarnaast zullen er ook domeinspecifieke objecttypen met hun attribuutsoorten opgenomen kunnen worden in een domeinspecifiek SIM.
In het domeinspecifieke SIM wordt de relatie naar het horizontale model (supplier-model) gelegd door een objecttype op te nemen met dezelfde naam als de naam die in het horizontale model (bijv. het SIM RSGB of het SIM RGBZ) wordt gehanteerd. In deze klasse worden de gewenste attribuutsoorten die reeds in het horizontale informatiemodel gedefinieerd zijn ook opgenomen. Er worden tussen het domeinspecifieke informatiemodel en het horizontale informatiemodel traces aangelegd tussen de objecttypen en de attribuutsoorten.
Vraag: Is dit niet ook een situatie dat er proxy types gebruikt moeten worden?
“Hiervoor wordt het traceability-script zonder transformatie” gebruikt.
Vraag: Klopt dit wel?
Eventuele toe te voegen attribuutsoorten (die we in het horizontale informatiemodel dus nog niet kennen) worden aan het objecttype toegevoegd met het stereotype ‘Attribuutsoort’. Bij deze toegevoegde attribuutsoorten moeten alle eigenschappen worden opgenomen die nodig zijn om de attribuutsoort eenduidig te definiëren.
Daarnaast kunnen in een koppelvlak-specifiek SIM objecttypen met hun relaties worden toegevoegd. Deze objecttypen kunnen onderling ook nog gerelateerd zijn. Deze toegevoegde objecttypen hebben ook het stereotype ‘Objecttype’.
Het maken van een informatiemodel is een denkproces dat gaandeweg en met voortschrijdend inzicht doorlopen wordt. Daarover gaan we hier inhoudelijk niets zeggen. Uiteindelijk wordt het KV-informatiemodel vastgelegd als UML-model in Enterprise Architect. Daarvoor wordt de volgens werkwijze gehanteerd:
Noot: Ik betwijfel of de tagged value ‘Is afgeleid’ daar wel nodig is.
Noot: Zonodig moet de bovenstaande procedure uitgebreid worden.
Noot: Onderstaande moet n.m.m. opgenomen worden in paragraaf 4.3.2 over het opstellen van een Koppelvlak UitwisselingsGegevensModel.
Met bovenstaande procedure creëren we een Informatiemodel dat ten grondslag zal liggen aan het UitwisselingsGegevensModel (UGM) dat later opgesteld wordt. Bij het maken van een domeinspecifiek (of koppelvlakspecifiek) UMG wordt enerzijds hergebruik gemaakt van entiteittypen die al eerder gemodelleerd zijn en anderzijds worden er nieuwe entiteittypen geïntroduceerd naar aanleiding van nieuw gedefinieerde objecttypen.
Voor die objecttypen die als proxy opgenomen zijn in het koppelvlak-specifieke informatiemodel wordt gekeken naar het UGM waarin de betreffende objecttypen al eerder zijn vormgegeven tot entiteittype. Hierbij zijn “verstuffingsregels” toegepast. De kans is zeer groot dat de overwegingen om objecttypen samen te voegen, gegevensgroepen te koppelen of (technische) attributen toe te voegen die eerder van toepassing waren ook bij het maken van het koppelvlak-specifieke UGM van toepassing zullen zijn.
Kort samengevat geldt dat voor elk Proxy-objecttype dat opgenomen is in het koppelvlak-specifieke SIM het corresponderende entiteittype wordt gekopieerd uit het “generieke” UGM. (Het UGM dat is afgeleid van het SIM waarnaar de Proxy verwijst). Vervolgens wordt dit gekopieerde entiteittype op maat gemaakt voor het koppelvlak-specifieke UGM. Attributen worden verwijderd als deze niet voorkomen in het koppelvlak en attribuutsoorten die in een Proxy klasse zijn toegevoegd worden in het entiteittype toegevoegd als attribuut.
![Dom spec UG<][Dom-spec-UGM]
Op basis van het koppelvlak Semantisch InformatieModel en eventueel te hergebruiken deel of delen van horizontale Uitwisselingsgegevensmodellen wordt een een koppelvlak UitwisselingsGegevensModel opgesteld.
Het UitwisselingsGegevensModel (UWM) van een koppelvlak omvat alle entiteittypen, elementen en relaties die binnen de berichten van het koppelvlak van belang zijn en gebruikt worden. Dit uitwisselingsmodel is enerzijds een uitwerking van het Semantisch InformatieModel (SIM) van een koppelvlak (Veritcaal informatiemodel, zie ook 431 Opstellen van een Koppelvlak-informatiemodel ) en waar van toepassing een selectie uit een horizontaal UGM.
In de praktijk zal een verticaal UGM gebaseerd worden op een kopie van het horizontale UGM waarop het gebaseerd is. Voor een koppelvlak dat voor het grootste deel
(zo niet alle) gegevens bevat die onderdeel uitmaken van het RSGB betekent dit dat er gewerkt wordt op basis van een kopie van het horizontale UGM BG. In dit
horizontale UGM zijn namelijk alle verstuffings-regels toegepast. Objecttypen zijn samengevoegd vanuit toepassings-perspectief en relaties zijn, waar nodig,
specifieker benoemd dan in het SIM. Verder zijn datatypen omgezet naar een formeel (te interpreteren) patroon.
Al deze bovenstaande kennis en het daadwerkelijk doorvoeren daarvan in het UGM wordt hergebruikt door het package van het horizontale UGM te kopiëren. Dat is dan ook de eerste slag naar een verticaal UGM. Vervolgens moeten de properties van het nieuwe package aangepast worden. Geef het een nieuwe naam, een nieuwe alias (de namespace uri van het nieuwe koppelvlak), wijzig de author en indien van toepassing het versienummer en de phase.
Indien op dit moment al duidelijk is of en zo ja welke objecten, attributen en relaties je niet nodig hebt dan kun je die nu al gaan verwijderen. Dit mag ook nog op een later moment maar hoe kleiner het model hoe sneller de volgende stap zal verlopen.
De objecten, attributen en associations van het nieuwe model tracen nog naar het SIM waar het originele UGM van was afgeleid. Ze moeten nu echter gaan verwijzen naar de gerelateerde objecten, attributen en relaties in het originele UGM. Hiervoor dien je het script ‘Set traceability with transformations’ uit te voeren op het nieuwe package (zie de handreikingen voor een beschrijving hoe je dit kunt doen).
Vervolgens kun je op basis van het verticale SIM het verticale UGM aanpassen. Dat wil zeggen dat de volgende acties moeten worden ondernomen:
Noot Is er voor het hierboven beschreven proces een script die een Copy/Paste uitvoert, de omzetting doet van de stereotypes en de traces plaatst? Of moet dit in dit geval handmatig gebeuren?
Vuistregels :
Noot De eerste vuistregel is ook van toepassing op een horizontaal UGM en moet dus ook in de beschrijving terugkomen van het opstellen van zo’n UGM. De tweede vuistregel is voor het opstellen van een BSM en moet daarheen verhuizen zodra we die gaan opstellen. We moeten trouwens checken of deze vuistregel ook gevalideerd wordt.
Noot Volgens mij is deze paragraaf nog niet van toepassing.
Een choice wordt in UML vormgegeven door een XOR op relaties. Dat betekent dat een choice tussen twee entiteittypen vormgegeven wordt door een XOR op de relaties van het basis entiteittype met de twee gerelateerde entitiettypen. Een choice tussen twee gegevensgroeptype wordt vormgegeven door een XOR op de relaties tussen het basisentiteittype of gegevensgroeptype enerzijds en de gerelateerde gegevensgroeptypen anderzijds. Als er een choice gemaakt moet worden tussen twee enkelvoudige attributen dan wordt dit gerealiseerd door deze twee attributen ieder in een gegevensgroeptype te plaatsen en vervolgens een XOR te maken op de relaties met die gegevensgroeptyepen. Mogelijk vinden we in de toekomst een betere oplossing, maar voor nu wordt deze constructie gehanteerd.
Bij het definieren van een UGM model kunnen zich speciale situaties voordoen. We hebben deze situaties elders beschreven. Hieronder een overzicht met een link naar de betreffende locatie:
Op basis van het koppelvlak UitwisselingsGegevensModel wordt een koppelvlak BerichtStructuurModel opgesteld. Hierbij spelen ook eventueel opgestelde userstories weer een belangrijke bron van informatie.
Voor het supplier-model geldt dat dit in een imvertor-run gedraaid moet zijn voordat het koppelvlak-model gedraaid wordt. Anders kent imvertor het supplier-model niet en kan er geen derivation plaatsvinden.
####### Bij STUF
Voor de berichten waarbij er vanuit een (fundamentele) entiteit een relatie naar zichzelf is gelegd is het van belang dat er een aangepaste entiteit wordt aangemaakt. Als voorbeeld de natuurlijk Persoon (NPS) die de recursieve relatie “heeftAlsKind” kent. Er wordt een NPS-kind (naamgeving is nog niet besproken en vastgesteld) of een NPS-kerngegevens gemaakt op basis van de NPS-entiteit die al in het bericht zit.
####### Bij REST/JSON Voor een recursieve relatie wordt net als bij StUF koppelvlakken een aangepaste entiteit aangemaakt. Uitgaande van een voorbeeld waarbij ‘Persoon’ entiteit een link naar zichzelf heeft wordt het volgende gedaan:
Bij het modelleren van vraag antwoord combinatie (lv/la) dient de “start”-relatie uit de lv altijd naar dezelfde klasse te verwijzen als de “object”- relatie uit het la-bericht. Gelijk, vanaf en totEnMet verwijzen altijd naar een ander complextype dan de Start. Voor scope loopt de discussie nog of deze naar hetzelfde complexType als antwoord mag verwijzen.
Voor elke entiteitklasse, gegevensgroeklasse en elke relatie wordt per bericht slechts 1 complextype aangemaakt. Uitzondering daarop zijn de historieFormeel, en historieFormeelRelatie historieMaterieel en de kerngegevens bij de gerelateerde.
Selecteer de knop “Generate”
+ _Johan : Tot hier gekomen…. Rest is under construction_+
Generiek berichttype koppelen aan de content
Creëer een package met de naam van het bericht. Geef deze package het gewenste bericht type. Keuze uit :
Specifiek bericht (vrij bericht of een specifiek bericht o.b.v. generieke structuur) maken en koppelen aan de content
*Genereer de bericht-content (knop “Generate”)
[Dom-spec-SIM]” https://kinggemeenten.plan.io/attachments/download/159542/Dom-spec%20SIM.JPG [Dom-spec-UGM]: https://kinggemeenten.plan.io/attachments/download/159479/Dom-spec%20UMG.JPG