View
5
Download
0
Category
Preview:
Citation preview
17 november 2014
STAGEVERSLAG
TEST GUIDANCE FOR THENEDAP TEST AUTOMATION TOOL
Jeroen Vonk
NEDAPUniversity of Twente
Comité:Daan van Beek MSc (Nedap)dr.ir. Axel Belinfante (FMT, University of Twente)Gijs Kant MSc (FMT, University of Twente)
Pagina 1
Inhoudsopgave
1 Stage bij Nedap 31.1 AEOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 NTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Stage-inhoud 5Mogelijke oplossingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 TestAdvisor 63.1 Statespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Statespace grootte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 BDD representatie van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Transities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Functies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 Statische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Functies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Opslag gegevens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Verkennen van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Travelers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 Conclusie 144.1 Tijdsbesteding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2 Behaalde resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3 Aanbevelingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Voltooiing van NTA2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Gebruik van een bestaande modelchecker . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Test Guidance op basis van eerdere verkenningen . . . . . . . . . . . . . . . . . . . . . . 15
Pagina 2
Hoofdstuk 1
Stage bij Nedap
In het kader van mijn master Computer Science heb ik de afgelopen periode stage gelopen bij NedapSecurity. Gedurende een twintigtal weken ben ik bezig geweest met het ontwerpen van een systeemom het automatisch testen van software te versnellen. Het systeem, Nedap Test Automation (NTA),is een in-house test tool ontworpen door Daan van Beek. De lezer van dit verslag wordt geacht eenminimale kennis te beschikken betreffende model checken, inhoudende dat de gebruiker bekend is mettermen als: (bounded) model checking, model driven tests, use cases, en (Reduced Ordered) BinaryDecision Diagrams (BDD’s) 1.
1.1 AEOS
Het doel van NTA is het "Model Driven" testen van de AEOS-dashboard. AEOS is het integrale be-veiligingssysteem van Nedap. AEOS is een volledig softwareplatform dat met behulp van zogehetencontrollers een veelvoud aan functies kan vervullen. Dit kan toegangscontrole, al dan niet met RFID,inbraakdetectie, of het beheer van persoonlijke kluisjes zijn. Om personen in het systeem in te voeren ofbepaalde rechten toe te kennen, is er een dashboard. Het AEOS-dashboard is een in flash ontwikkeldeapplicatie. Dit dashboard communiceert vervolgens met de achterliggende back-end van AEOS. Ge-zien AEOS continu doorontwikkeld wordt, en sommige van deze nieuwe functies ook invloed hebben ophet functioneren van het dashboard is het noodzakelijk dat het dashboard getest wordt. Het testen vanhet dashboard gebeurde voorheen handmatig. Echter, neemt dit handmatige testen veel tijd in beslag.Dit betreft voornamelijk het testen of reeds geïmplementeerde functionaliteiten beïnvloed worden doornieuwe functies, de zogeheten regressie-testen.
1.2 NTA
Om deze regressietesten te vergemakkelijken is er besloten om een automatisch test-systeem te ont-werpen, NTA. NTA kan grafische interfaces bekijken en beïnvloeden. Daarmee kan NTA het gedragvan een gebruiker of handmatig tester emuleren. Om dit te doen heeft NTA een intern model van hette testen systeem. Door gelijktijdig een functie uit te voeren op het model als in de werkelijkheid kanNTA discrepanties tussen het model en de werkelijkheid detecteren. Zodra een fout gevonden is kan ditbetekenen dat er of: een fout in het model zit, of dat er een functionaliteit niet meer naar verwachtingwerkt. Mits je een goed model hebt zal het tweede het geval zijn.
Het model is non-deterministisch en bevat cykels. Het beste kan het gezien worden als een opeen-volging van verschillende use-cases, waarbij na de executie van een use-case één of meerdere andereuse-cases geselecteerd kunnen worden. Dit scala aan use-cases kunnen door de cykels en het non-determinisme in het model zeer complexe testen genereren, die een handmatig tester niet zo snel zouuitvoeren.
Een voorbeeld van een simpele login is getoond in Figuur 1.2. (Voor een uitgebreidere uitleg vanhet model verwijs ik naar hoofdstuk 3.3)
Tevens bevat NTA de mogelijkheid om variabelen te gebruiken. Hiermee kan er bijvoorbeeld be-paald worden of een use-case uitgevoerd kan worden. Een voorbeeld is het onthouden of de huidigeingelogde gebruiker al dan niet een administrator is. Het zou immers voor te stellen zijn dat bepaaldetesten enkel uitgevoerd dienen te worden wanneer er momenteel een administrator is ingelogd. Dezevariabelen tezamen met de huidige positie in het model zijn te beschouwen als de huidige staat van hetmodel in NTA.
1Daan van Beek, NTA NodeTypes
Pagina 3
Pagina 4
Hoofdstuk 2
Stage-inhoud
Doordat de tool het dashboard, of "System Under Test"(SUT), via de grafische interface benaderd iser soms sprake van een pauze in de executie. Zo kan de SUT bijvoorbeeld nog een scherm moetenladen. Daaruit kunnen we twee dingen concluderen:
• NTA zal niet altijd de volledige rekenkracht van de computer gebruiken.
• Het uitvoeren van tests neemt veel tijd in beslag, dus het is zaak zoveel mogelijk diverse testsbinnen een gegeven tijd uit te voeren.
Gedurende deze stage is het doel te kijken naar mogelijkheden om de executie van de hoeveelheidnuttige tests door NTA te vergroten. Wanneer het model enkel deterministisch zou zijn, dan zou dezeversnelling puur in de executie van de tests gevonden moeten worden. Het versnellen van de testsis niet wenselijk. De testmethode dient namelijk de interactie en invoer van een normale gebruiker tesimuleren. Wanneer de tests uitzonderlijk snel zouden worden uitgevoerd dan kan het gedrag van deSUT niet representatief zijn voor normaal gebruik.
Omdat de tests echter ook enig non-determinisme bevatten, is daar ruimte om enkele verbeteringendoor te voeren. De aanwezigheid van een keuze welke test of pad gekozen dient te worden na dehuidige test is aan NTA. Een random keuze garandeert uiteindelijk volledige dekking van het model(coverage), mits er een aanzienlijke hoeveelheid testen worden gedraaid.
Wellicht zou er een manier zijn om deze keuzes dusdanig te maken dat er; geen tests wordenovergeslagen, maar dat een voldoende verkenning van de tests sneller gegarandeerd zou zijn. Het doelis dus, gegeven een bepaalde testtijd meer diverse testen te kunnen uitvoeren. Door deze verhoogdecoverage zou de kans op het detecteren van bugs omhoog gaan. Voor het berekenen van de prioriteitvan de uit te voeren tests zou de idle-tijd van NTA gebruikt kunnen worden.
Mogelijke oplossingen
Na enig overleg hebben wij besloten dat hiervoor enkele oplossingen waren.Een optie is om de verkende paden, of tests, bij te houden. Hiermee zou een eerder genomen
pad een mindere voorkeur kunnen krijgen om te verkennen of bijvoorbeeld volledig uitgesloten kunnenworden. Probleem is echter dat bepaalde paden een noodzaak zijn om te nemen, wanneer iemand debereikbare paden na dat punt wenst te bereiken.
Een andere oplossing is om alle mogelijke toekomstige paden te verkennen. Hierbij zou bij pun-ten met een keuze beide opties verkend worden. Gezien het legio van de beslissingen niet non-deterministisch zijn, zou op deze manier een groot deel van het model verkend kunnen worden middelsbounded model checking. Op basis van deze verkenning zou vervolgens een geïnformeerde keuzekunnen worden gemaakt voor het te volgen pad. Deze keuze zou naar alle waarschijnlijkheid een aan-zienlijke verbetering zijn ten opzichte van de huidige random-tactiek, bij het kiezen van een vervolgpadvanaf een non-deterministische keuze.
De laatste oplossing, met een statische analyse, bied potentieel de meeste snelheidswinst. Te-vens lag deze oplossing in het verlengde van de interesses en voorkennis van zowel de stagiair alsbegeleider.
Pagina 5
Hoofdstuk 3
TestAdvisor
Het doel van de stage is gesteld een zogeheten "Test Advisor"te ontwerpen voor NTA. Deze Test Advisordient op beslissingspunten een statische analyse te doen van het onderliggende model om te bepalenwat de meest geschikte keuze is om de exploratie te vervolgen.
Nota bene, bij deze exploratie zullen wij het gedrag van het model nabootsen, om te kunnen be-palen welke nodes bereikbaar zijn. Wij zijn dus in feite een model van het model aan het exploreren.Hierbij kunnen wij mogelijk gedrag van het originele systeem als non-deterministisch beschouwen. Eenvoorbeeld hiervan is of een tekstveld al dan niet zichtbaar is in een GUI. Derhalve zullen we beidemogelijkheden verkennen. Wel kunnen we de staat van variabelen modelleren. Met deze variabelenkunnen we de uitkomst van zogeheten guards uitrekenen. Daardoor kunnen bepaalde executiepadenbij voorbaat uitgesloten worden aangezien deze door de guards (in combinatie met de huidige staat vande variabelen) niet bereikbaar zullen zijn. Hiermee zal de statespace drastisch verminderd worden.
3.1 Statespace
Het model bevat een groot aantal mogelijke paden. Gezien het gebruikelijk is dat het model cykelsbevat, zijn er een oneindig aantal mogelijk paden. Een oneindig grote statespace is uiteraard nietvolledig te verkennen. Dit is zowel qua tijd als opslagruimte een onmogelijkheid. Een manier om tochbinnen afzienbare tijd tot een geschikt advies tijd te genereren voor NTA is om het model slechts deelste doorzoeken. Deze methode van enkel een deel van het model verkennen is ook bekend als boundedmodel-checking. Gegeven dat NTA bij een non-deterministisch punt is beland, zal de Test Advisor eenbounded model-check doen vanaf dat punt. Alle mogelijke paden zullen verkend worden, de bound kanof een maximale zoekdiepte behelzen, of een maximale tijd die de Test Advisor mag besteden aan hetzoeken. Na deze zoektocht zal er een verzameling van bereikbare nodes zijn. Uit deze verzamelingkan vervolgens volgens een nader te bepalen metriek een doelnode gekozen worden. Gegeven dit doelkan vervolgens het te nemen pad beredeneerd worden startend op de huidige positie van NTA. De tegebruiken metriek voor het kiezen van een node kan simpel zijn; uit de bereikbare nodes willekeurig eennode kiezen, maar er kan ook een complexere methode bedacht worden. Bij een complexe methodezou er bijvoorbeeld rekening gehouden kunnen worden met eerdere verkenningen van NTA (coverage)en de kans op het succesvol bereiken van deze node.
Statespace grootte
De huidige representatie van het model in NTA is een honderdtal megabytes groot. Wanneer wij boun-ded checking zouden willen doen zou dat inhouden dat er twee keuzes zijn. Of wij exploreren 1 padper keer, na elke exploratie het model terug brengend in de originele staat. Dit zou weinig tot geenextra ruimte kosten, ten slotte hoeven wij enkel na elke verkenning enkel de bereikbare nodes op teslaan. Een sequentiële exploratie zou echter veel tijd kosten. De tweede optie is de verkenning vanmeerdere paden gelijktijdig plaats te laten vinden. Bij een dergelijke parallelle verkenning zou bij elke(non-deterministische) keuze beide paden verkend moeten worden. Om beide paden te verkennen zoudus het model gedupliceerd moeten worden bij een dergelijke keuze. De grootte van het model in achtnemende is het makkelijk om te zien dat in een dergelijk geval het geheugenlimiet van de computeraanzienlijk sneller bereikt zou worden voordat het model voldoende diep verkend is. Daarom zou in eendergelijk geval de gehele verkenning een vruchteloze operatie zijn.
Een geschikte oplossing voor deze statespace explosie is het reduceren van het formaat van hetmodel. Dit kan door enkel de relevante informatie op te slaan in ons kopie. Deze relevante informa-tie zou enkel de beschrijving van de paden zijn die er in het model aanwezig zijn - en de relevantevariabelen. Deze variabelen zijn nodig omdat deze mede bepalen welke paden toegankelijk zijn. Alle
Pagina 6
andere functionaliteiten die in het model zitten hoeven wij niet in het model over te nemen. Deze ove-rige functionaliteiten zijn bijvoorbeeld de nodige code en data in het model die nodig zijn om de SUTte besturen. Naast deze reductie kunnen we ook kiezen om de kopie op een alternatieve wijze op teslaan. Het gebruik van Binary Decision Diagrams (BDD’s) is hiervoor zeer geschikt. Een BDD is eenboomstructuur (graaf) waar bij elk niveau in de boom een binaire variabele representeert. Bij elk knoopin deze boom is de keuze tussen twee takken, één waarbij de gerepresenteerde variabele waar is, enéén tak waarbij de variabele onwaar is. Onderaan deze boom zijn de bladeren met enkel de waardeWAAR of ONWAAR. Elk pad wat eindigt in een WAAR blad is een geldige staat voor de keuze vanwaardes voor de gerepresenteerde variabele in de BDD. Één enkele BDD kan dus een veelvoud aangeldige staten representeren.
3.2 BDD representatie van het model
Gezien elk decimaal getal ook in het binaire stelsel omgezet kan worden, kunnen wij in de BDD getallenopslaan. Middels het toepassen van zogeheten relaties op de BDD kunnen we dan dit getal aanpassen.Het originele model zou dan versimpeld kunnen worden als een graaf, elke vertex met zijn eigen uniekenummer. De BDD representeert deze huidige vertex in de variabele V{} met V{} ⊆ Vertices. Geziende aard van de BDD kan een enkele BDD nu een set van momenteel bereikbare vertices beschrijven.Gegeven dat wij bij vertex 3 of 1 starten met verkennen (V{} = 1, 3). Vervolgens passen wij een relatieR toe die de transitie van vertex 3 of 8 naar vertex 4 of 5 beschrijft. Rv : V{3,8} → V{4,5}. Na toepassingop deze relatie zal de BDD als volgt veranderen:
V{1,3}Rv−−→ V{1,4,5}
Na deze transitie zullen vertex 4 & 5 dus ook bereikbaar zijn.
Variabelen
Wij kunnen nu ook de BDD verrijken door alle variabelen uit het model in de BDD te laden. Dit kanop een vergelijkbare manier als de vertex. Gegeven een variabele vi uit het model met de mogelijkewaarden wi,j ∈ vi die vi kan aannemen. Nu kunnen wij een variabeleWi ∈ {0..j} maken waarbijWi(j)de waarde van wi,j vertegenwoordigd. De zo verkregen BDD bevat dus V en W. De BDD zal nu duselke mogelijke variabele combinatie en vertex positie kunnen opslaan. Hiermee kunnen we met dezeBDD dus één of meerdere states van het systeem weergeven.
Transities
Zoals eerder aangegeven hebben we reeds een relatie Rv om een transitie van de ene naar de anderevertice aan te geven. Echter deze vertex is niet de volledige beschrijving van een state. Wat er mo-menteel nog mist bij deze relatie is een tweetal elementen. Beide elementen hebben betrekking op devariabelen (W) die tevens deel uitmaken van de state. Een eerste element is dat de transitie de waardevan een variabele kan veranderen.
RW :W →W ′
Een tweede element is het feit dat een transitie alleen toegestaan kan zijn wanneer een variabele eenbepaalde waarde heeft. Dit zijn zogeheten ’guards’.
Rg :W
Tezamen kunnen wij dus een relatie R definiëren die als volgt is samengesteld:
R = Rv ∧RW ∧Rg
Een transitie in de BDD zal dus gecodeerd worden als:
{V,W} R−→ {V ′,W ′}
Functies
NTA ondersteund ook nog het gebruik van functie-aanroepen. Dit gebeurt middels de JumpAndRe-turn-node, een voorbeeld van een functie aanroep is te zien in Figuur 3.2. Functies zouden zonderproblemen in de bovenstaande structuur geïmplementeerd kunnen worden. Immers, op het momentdat een functie wordt aangeroepen kan de code van de desbetreffende functie worden ingevoegd op
Pagina 7
die positie, of ïnlining". Dit zou echter zorgen voor veel extra states. Idealiter zouden we de functiona-liteit van functieaanroepen verplaatsen naar de relaties over de BDD. Gezien functies geen variabelenmee krijgen, en tevens geen waarde retourneren is dit relatief simpel. Met een simpele stack in de BDDkunnen wij bij een functieaanroep de locatie van de aanroep opslaan. Op het moment dat de functiebeëindigt wordt zal de executie verder gaan vanaf het punt waar de functie is aangeroepen.
Wij definiëren in de BDD een set van variabele Si met i = 0..n en n de maximale diepte waarin defuncties genest zullen worden. Deze n zullen we met behulp van een statische analyse kunnen achter-halen. Si zal vervolgens de waarde bevatten van de vertex waar een functie aanroep vanaf is gedaan.Een relatie R met betrekking tot een functie-aanroep zal dus ook een element Rs bevatten. Deze Rs
geeft aan hoe de stack gemanipuleerd dient te worden. Gegeven drie vertices:
• Vs: De plek waar de functie aangeroepen wordt
• Vr: De plek waar na de functie verder gegaan dient te worden
• Vfs: Het begin van de functie
• Vfr: Het einde van de functie
• V∅: Gebruikt om een leeg element in de stack aan te geven.
Bij een functie aanroep zal deze dus in de vorm zijn van:
V = Vs ∧ Sd = V∅ → V = Vfs ∧ Sd = Vr ∧ d = d− 1
Hierbij is d de huidige top van de stack Bij het retourneren ziet de relatie er als volgt uit:
V = Vfr ∧ Sd = Vr → V = Vr ∧ Sd = V∅ ∧ d = d + 1
3.3 Statische Analyse
Wij hebben hierboven een simpele weergave gegeven hoe wij het model willen representeren in eenBDD. Tevens is er beschreven welke informatie uit het model in de BDD gebruikt zal worden. Echter,wij hebben nog niet gekeken hoe de data nodig voor de BDD uit het model wordt geëxtraheerd. Debenodigde informatie zal middels een statische analyse uit het model gehaald worden.
Pagina 8
Variabelen
Voor de variabelen willen wij weten welke waardes alle variabelen kunnen aannemen. Pas als wehiervan een bovengrens hebben bepaald kunnen wij de variabele in de BDD opslaan. Indien wij eenvariabele vinden die maar één mogelijke waarde kan aannemen, dan is deze variabele als statisch tebeschouwen. In plaats van de variabele in de BDD aan te maken kunnen we dan overal de desbetref-fende variabele vervangen met zijn waarde.
Functies
Voor functies willen we de volgorde van geneste functie-aanroepen bepalen. Zodoende kunnen we hetminimale formaat van de stack bepalen voor de BDD. Ook kan op deze manier de relatie voor elkemogelijke functie-aanroep gegenereerd worden.
Model
Het originele model bestaat uit een aantal submodellen. Deze submodellen bevatten vervolgens zoge-naamde ModelElements (ME’s). Een ModelElement is middels lijnen verbonden aan één of meerdereandere ME’s. Elke ME heeft een specifieke functie in het model 1. Een ME kan ook een Guard bevatten,dit is een expressie die geëvalueerd wordt tot een booleaanse waarde. Alleen wanneer deze expressieWAAR is zal NTA deze ME verkennen. Als laatste kan een ME een expressie bevatten, deze expressiekan bepalend zijn voor het gedrag van het ModelElement. Het kan bepalen welke lijnen vanuit dezeME gevolgd mogen worden (deterministisch gedrag) of bijvoorbeeld de waarde aanpassen van eenvariabele.
Opslag gegevens
In Figuur 3.3 staat een simpele weergave van het model. Om informatie met betrekking tot het modelop te slaan hebben we een aantal klassen ontworpen die informatie bevatten over het model, de ME’s,en de variabelen in het model. Op deze manier kunnen we op een makkelijke manier informatie opslaanin het model, zonder het model heel erg aan te hoeven passen. ModelInfo bevat algemene informatieover het model. Ook wordt hier relevante informatie opgeslagen met betrekking tot de voortgang van destatische analyse. VertexInfo is gekoppeld aan een ModelElement, zijnde een groep die ModelElemen-ten bevat, of een losse node. in VertexInfo wordt onder andere informatie opgeslagen met betrekkingtot het type node.
1Daan van Beek, NTA NodeTypes
Pagina 9
De laatste hulpklasse VariableInfo, bevat alle mogelijke waarde die een variabele kan aannemen. Naastdeze waarde wordt ook opgeslagen welke waardes andere variabelen dienen aan te nemen om dezewaarde aan te nemen. Men neme bijvoorbeeld een variabele a en een variabele b, van b is bekend datdeze de waarde 1 of 2 kan aannemen. a komt voor in drie expressies: a = 5, a = b, en a = 3 ∗ b. Van akan nu vermeld worden dat het de volgende waardes kan aannemen:
• a = 5
• a = 1 gegeven b = 1
• a = 2 gegeven b = 2
• a = 3 gegeven b = 1
• a = 6 gegeven b = 2
Ook wordt er in VariableInfo opgeslagen of een variabele refereert naar een andere variabele (verge-lijkbaar met pointers).
Analyse
In plaats van één enkele functie om het gehele model te analyseren is er gekozen dit in stappen te doen.Een probleem bij de analyse is dat NTA ontwikkeld is naar gelang wat nodig was bij het testen. NTAheeft dus geen zeer duidelijke omschrijving van het innerlijk functioneren van de tool. Bij het uitvoerenvan expressies kunnen er dus ambiguïteiten optreden. An sich is dit geen probleem, NTA functioneerttenslotte naar behoren. Maar bij het vertalen van het model naar een BDD dient het exacte gedrag vanNTA geïmiteerd te worden. Mocht dit niet het geval zijn dan kan het zijn dat de NTA Test Advisor (NTA2)bepaalde bestaande paden niet kan bereiken. Of zelfs niet bestaande paden verkend en adviseert.
Recycling van functies
Om het gedrag van NTA zo exact mogelijk na te bootsen zullen we voor zover mogelijk gebruik makenvan de bestaande functies in NTA. Een eerste functie in NTA is de functie die expressies evalueert.Deze functie, calculate(), retourneert een string met daarin de geëvalueerde expressie. De functiewordt recursief aangeroepen op een expressie. Een expressie bestaat vervolgens uit een linker- enrechtergedeelte. Men neme bijvoorbeeld de expressie a = b + 3, dit evalueert tot:
=
+
3b
a
Wanneer wij de calculate functie aanroepen, dan zal de waarde van b opgehaald worden. Vervol-gens wordt de waarde van 3 opgehaald. Dan wordt de operator + uitgevoerd op b & 3. De variabele awordt geladen. En vervolgens wordt het resultaat van de som opgeslagen in a. Wij willen echter voorde statische analyse alle mogelijke waardes van een variabele weten. Daarom hebben wij de func-tie calculate() omgeschreven naar: calculate(boolean calculateStatic=false). Wanneer deboolean calculateStatic ge-enabled is, dan zal calculate alle mogelijke waardes uitrekenen, gegevende mogelijke waardes van de variabeles. Deze mogelijke waardes voor de variabele zijn opgeslagen inde klasse VariableInfo.
Verkennen van het model
Zoals eerder vermeld zullen wij het model in stappen verkennen. Om NTA zelf minimaal aan te hoe-ven passen hebben we gekozen voor een soort visitor-pattern. Elk ModelElement zal een functietraverseModelElement(func) krijgen die aangeroepen zal worden met een functie visitModelElement()als argument en vervolgens:
• visitModelElement() aanroept met het huidige ModelElement als argument
• visitModelElement() zal vervolgens de verzamelde data opslaan in het VertexInfo-object gekop-peld aan dit ModelElement
• traverseModelElement() aanroept voor alle ModelElementen verbonden met dit ModelElement,hetzij via een normale verbinding, hetzij via een functie-aanroep (jumpAndReturn).
Pagina 10
Voor expressies hebben wij eenzelfde patroon gebruikt. Echter, waar de traversal-functie voor ME’seen top-down benadering gebruikt, zullen expressies bottom-up geëvalueerd worden. Er zal dus eerstde traversal-functie aangeroepen worden voor de linker- en rechter-subexpressie. Vervolgens wordt devisitExpression() aangeroepen voor de huidige expressie. Resultaten zullen, indien van toepassing,opgeslagen worden in VariableInfo.
Travelers
Het model zal in een paar iteraties verkend worden met verscheidende travelers, de gebruikte travelersworden in de volgorde gebruikt waarin deze hieronder zijn beschreven. Elk van deze ModelElement-travelers zal worden aangeroepen op het initiële ModelElement van het model. Vervolgens zullen dezerecursief door het model heen gaan, totdat elk element bezocht is. De Expression-travelers zullenindien nodig worden aangeroepen worden door een ME-traveler op de expressie van het betreffendeModelElement.
GraphEdges
Deze klasse zorgt ervoor dat alle verbindingen tussen de ME’s opgeslagen worden in VertexInfo. Tevensslaat het op of een klasse een JumpAndReturn is. Indien dat het geval is, dan wordt dit tezamen metde locatie opgeslagen in VertexInfo.
GraphReturns
Nadat alle verbindingen zijn opgeslagen worden alle JumpAndReturns geanalyseerd. Zodra deze func-tie een JumpAndReturn tegenkomt zal hij zichzelf recursief aanroepen op de locatie waar de JumpAnd-Return heen wijst. De recursie wordt beëindigd zodra de functie een Return tegen komt. Op dezemanier kunnen we de maximale diepte van functies achterhalen. Deze diepte wordt opgeslagen - engebruikt om het formaat van de functie-stack van de BDD te bepalen. Ook worden alle mogelijke func-tiecalls met hun huidige recursiediepte opgeslagen. Met deze informatie kan uiteindelijk de relatie voorde BDD worden aangemaakt die stack manipuleert. Waarmee de BDD de functiecalls emuleert zonderalle functies te hoeven inlinen.
VariableAssignments
De VariabeleAssignments-klasse, evalueert of het huidige ModelElement een variabeletoewijzing doet.Dit kan of doordat het ModelElement een zogeheten MultipleOptionsChooser is, of omdat de expressievan de huidige ME een BecomesExpression bevat. Een MultipleOptionsChooser (MOC) heeft als ar-gument (expressie), een variabele en een lijst van waardes. De MOC zal uit de lijst een waarde randomkiezen en toekennen aan de variabele.
Becomes De ExpressionTraveler Becomes kijkt of een expressie een instantie is van een becomes-Expression. Vervolgens wordt de linkerkant van de expressie geëvalueerd om te weten te komen aanwelke variabele een waarde toegekend dient te worden. Laten we deze variabele "LHS-var"noemen.De rechterzijde kan of een expressie zijn, of het kan een pointer zijn naar een andere variabele.
RetrieveVars Met behulp van de expressionTraveler RetrieveVars wordt gekeken welke variabelen inde rechter subexpressie zitten. Vervolgens wordt in de VariableInfo van LHS-var worden opgeslagendat LHS-var afhankelijk is van deze variabelen.
Pagina 11
VariableBounds
Nu alle afhankelijkheden voor de variabelen zijn uitgeplozen kunnen wij proberen een upperbound temaken voor de waardes die een variabele kan aannemen. Dit wordt gedaan door de "TravExprBounds-klasse
TravExprBounds Het verkennen van de expressie met behulp van de TravExprBounds-klasse kanhet best worden uitgelegd met behulp van een stuk psuedo-code. Zie hiervoor de code in Listing 3.1.
1 while ( not VariableBounds . al lBound )VariableBounds . al lBound = true
3 f o r a l l (ME as me)bound = true
5 i f (me. expression instanceof BecomesExpression )f o r a l l (me. expression . i n f o ( ) . usedVar iables as var )
7 i f ( not var . isBound ( ) )bound = fa lse
9 i f ( bound )i n f o . addValues (me. expression . c a l c u l a t e ( ) )
11 elseVariableBounds . al lBound = fa lse
Listing 3.1: Pseudo code voor het verkennen van de bounds van variabelen
Alleen wanneer all variabelen waar een LHS-var van af hangt bounded zijn kan de waarde voor dezevariabele uitgerekend worden. Dit proces zal dus herhaald worden tot er geen ongebonden variabelenmeer zijn.
VariableReferences
Wij hebben momenteel voor elke variabele de mogelijke waardes uitgerekend. We missen echter nogeen aantal waardes. Er is namelijk nog geen rekening gehouden met het gebruik van pointers. Ophet moment dat a bijvoorbeeld naar b wijst, en er een andere waarde aan a wordt toegekend zal dezeeigenlijk aan b worden toegekend. VariableReferences zal voor elke LHS-var recursief een functieaanroepen. Deze functie zal alle mogelijke waarden van deze LHS-var toevoegen aan alle variabelenwaar LHS-var naar kan refereren. De functie wordt vervolgens weer aangeroepen op de gerefereerdevariabelen. Aan het einde hebben we een bovengrens bepaald voor elke variabele, rekening houdendemet pointers.
StaticVars
Nu we een bovengrens hebben bepaald kunnen we kijken of er variabelen geëlimineerd kunnen worden.Indien de bovengrens bestaat uit precies één waarde dan is de variabele statisch. StaticVars-travelergaat alle variabelen na, en markeert deze variabelen. Bij het bouwen van de BDD kunnen deze varia-belen dan genegeerd worden, en vervangen worden met de waarde van de variabele.
For loops
Na alle bovenstaande analyses is er nog een constructie in NTA waar we geen rekening mee hebbengehouden. Te weten de Groups, en specifiek de foreach-group. De foreach zal een loop-variabelevoor elke waarde uit een gegeven list initialiseren - en de ModelElements in de foreach-group voorelke waarde van die variabele uitvoeren. Er is voor gekozen om deze loops uit te vouwen (loop un-rolling) teneinde ze in de BDD te passen. In een eerste poging is er getracht de uitgevouwde loopsin het NTA-model onder te brengen. Dit bleek echter niet mogelijk om alleen lokaal te doen geziende aard van NTA. NTA wil namelijk elke verandering aan het model doorgeven aan de server, zodatalle andere clients eenzelfde model hebben. Hierna is besloten om zodra de bovengrens van alle va-riabelen is uitgerekend, er een boolean in ModelInfo wordt aangepast. Deze boolean geeft aan datbij het verkennen van het model ook in de for-groups gekeken dient te worden. Bij de verkenning zalelke foreach dus geinitialiseerd worden met elke mogelijke waarde uit de lijst. Gezien de forloop ookweer invloed kan hebben op de waardes van variabelen worden bovenstaande ME-travelers allemaalopnieuw uitgevoerd, deze keer rekening houdende met foreach-groups. Mogelijke problemen hierbij isdat alle initialisaties van foreach-executies onderling moeten worden verbonden in de BDD. Verder zaler bij een JumpAndReturn uit een foreach-group een inlining van die code vereist zijn. Verder is het ooktoegestaan om foreach-groups in for-each-groups te plaatsen. Dit alles heeft gedurende de stage eenaanzienlijke hoeveelheid tijd gekost om te doorgronden en proberen te vangen in code.
Pagina 12
BuildBDD
De BuildBDD traveler zet de informatie in de Info-klasses om in een BDD. Dit gebeurt door achtereen-volgens de variabelen en stack aan te maken. Vervolgens worden alle relaties toegevoegd. Als laatstewordt de BDD in de begin-state gezet. Gegeven deze BDD en de gegenereerde relaties kan het modelverkend gaan worden.
DotBuilder
De DotBuilder is een klasse die .dot-bestanden kan lezen. Deze bestanden beschrijven een graaf.Het gegenereerde dot-bestand is een grafische weergave van hoe de ModelElement-travelers doorhet model heen gaan. Een voorbeeld van een dergelijke weergave is te zien in Figuur 4.3 & 4.3.Deze figuren zijn het best te bekijken in de PDF, daar er dan ingezoomd kan worden. Tevens is ditdus een weergave van hoe het model door de BDD geinterpreteerd zal worden. Deze klasse is puurontworpen om in de ontwerpfase visuele feedback te hebben over hoe het model geanalyseerd wordt.Op vergelijkbare wijze kan er ook een graaf worden gecreëerd die alle variabelen en hun onderlingenverbanden toont.
Pagina 13
Hoofdstuk 4
Conclusie
In de vorige hoofdstukken is uitgeweid over verscheidende dingen. Het probleem is aangeduid, zijndeeen model gedreven testtool die naar mate het model groter wordt aanzienlijk complexer wordt. Eris gekeken naar wat een mogelijke oplossing zou zijn om dit tegen te gaan. We hebben uiteindelijkvoor een van deze oplossingen gekozen om deze gedurende een twintigtal weken uit te werken. Ditidee is hierboven uitgelegd, tezamen met een uitweiding hoe deze oplossing binnen de code van NTAuitgevoerd dient te worden. Uiteraard zijn er ook nog subtiliteiten die niet in dit rapport beschreven zijn,daar deze zichzelf wijzen wanneer iemand de code zou doornemen.
4.1 Tijdsbesteding
Gedurende de eerste weken heb ik mij bekend gemaakt met mijn werkomgeving en NTA. Ik heb eerstals gebruiker met NTA kennis gemaakt om een idee te krijgen van de functionaliteiten van NTA. Hierbijwas ik ook zeer geholpen door de tutorials geschreven door Daan van Beek, die zowel diende om mijbekend te maken met het systeem als documentatie, en een goed handvat om de werking van hetsysteem te doorgronden. Gedurende deze weken hebben we ook in overleg de exacte opdracht vormgegeven. De contouren van de opdracht waren reeds tijdens onze eerste gesprekken voor aanvangvan de stage bepaald. Om bij de exacte invulling als stagair ook meer mee te kunnen denken waseen eerste kennismaking met NTA echter onmisbaar. De weken hierna heb ik literatuur gelezen metbetrekking tot model driven testing, en BDD’s. Verder heb ik een aantal papers over JTorx bestudeerd.JTorx is een model driven test-tool, ontwikkeld door Axel Belinfante. Met deze tool ben ik reeds bekendvia een vak dat ik heb gevolgd in het kader van mijn master, en het leek mij nuttig deze tool nogmaalste bekijken in het kader van mijn huidige opdracht. Gelijktijdig ben ik begonnen met een raamwerk ommet behulp van JavaBDD van een graaf een BDD te kunnen maken. Later ook met de toevoeging vanvariabelen, stacks, transitierelaties en een methode om een pad te bepalen gegeven een beginnode enéén van de bereikbare nodes die met behulp van de transitierelaties te bereiken is. Na dit raamwerkben ik begonnen met het ophalen van informatie uit het model. In eerste instantie met behulp van veleextra (nieuwe) functies binnen het bestaande model. Later met behulp van "Travelersëen methode dieerg op het bekende visitors-pattern lijkt. Waarbij het model gedecoreerd werd met klasses waar deverkregen informatie in opgeslagen werd. Hierna is er nog een aantal weken nodig geweest om destatische analyse van variabelen correct te implementeren, en nog enige tijd om pointers te kunnenanalyseren. Een veelvoud aan weken is vervolgens besteed aan het verkennen van for-loops. Eerstdoor deze binnen het model uit te vouwen. Later door deze op een andere manier te verkennen metbehulp van de travelers. Dit zorgde echter weer voor de nodige complicaties in het creëren van deBDD. Rond dat punt was echter de tijd voor mijn stage inmiddels ten einde gelopen. Reste mij enkelnog verslaglegging en een (interne) presentatie. Bij de presentatie heb ik de inhoud van dit project ende behaalde resultaten toegelicht. Ook heb ik toen een aantal mogelijk in de toekomst te volgen ideeenbesproken, waaronder de haalbaarheid en wenselijkheid voor het afronden van deze benadering.
4.2 Behaalde resultaten
Helaas is het niet gelukt gegeven de tijd die voor de stage stond de gehele opdracht af te ronden. Ge-lukkig hebben we wel alsnog nuttige resultaten kunnen behalen. Allereerst kunnen we met de statischeanalyse nuttige informatie over het model extraheren. Deze informatie kan worden gebruikt voor deverkenning van het model, zij het met behulp van BDD’s of op een andere manier. Ook kunnen er doorde traveller-klasses makkelijk bepaalde functionaliteiten aan NTA worden toegevoegd. Deze functiona-liteiten waren voorheen al bedacht en gewenst verklaard. Het implementeren van deze functionaliteitenzonder het traveler-raamwerk kosten echter dusdanig veel tijd dat deze onderaan de featurelijst waren
Pagina 14
beland. Een feature waar men aan kan denken is bijvoorbeeld opzoeken waar een variabele exactgebruikt wordt, en wat de impact is wanneer een gebruiker een variabele zou wijzigen. Momenteel ishet verwijderen of aanpassen van een variabele een zeer precaire klus, gezien de neveneffecten nietgoed zichtbaar zijn. Men zou dus of op blind vertrouwen een variabele moeten aanpassen, of eenvolledige kennis van het model hebben. In de praktijk betekend dit dat in een dergelijk geval vaak eennieuwe variabele geïntroduceerd wordt. Dit zal in de toekomst een hoop legacy variabelen, en dus eenonnodig grote state-space kunnen opleveren. Gedurende deze stage zijn er ook al een aantal bugs enonvolledigheden in NTA gevonden en opgelost. Ook kunnen we nu een (veel) betere schatting makenvan de haalbaarheid om NTA een op BDD-gebaseerde test-advisor te geven. Indien dat het geval iszou ook het raamwerk voor de BDD generatie kunnen gebruikt worden als basis hiervoor. Het is echterdiscutabel of een op BDD’s gebaseerde advisor een wijze keuze is in retrospect.
4.3 Aanbevelingen
Indien dit gelukt zou zijn zou het een zeer efficiënte en misschien wel de beste oplossing zijn om eengoed advies uit te brengen aan NTA. Het probleem is echter dat de implementatie perfect dient te zijn,dit omdat er anders geen enkele garantie kan worden gedaan over de verkenning van het model mochtde BDD een fout bevatten. De complexiteit van dit project is wellicht uit te drukken door te trachten eennaam te bedenken voor wat de NTA2eigenlijk is. Het is een test guidance advisor voor een model basedtesting tool, gebaseerd op het verkennen van een model van het model middels een BDD. Misschienwel een:
"BDD-based meta-Model Exploration based Test Guidance Tool for a Model Based Test Tool"
Ook al zou deze tool correct werken, dan nog zou NTA2in sommige aspecten complexer zijn dan NTAzelf. Dit klinkt niet als een wenselijke eigenschap. Al helemaal niet wanneer in de toekomst het gedragvan NTA wijzigt, dit kan bijvoorbeeld door een uitbreiding van functionaliteiten komen, of door de intro-ductie van een extra NodeType. Maar ook iets simpels als een bug-fix kan ervoor zorgen dat het gedragvan NTA2niet meer overeenkomt met NTA. Wat zou vereisen dan iemand deze functionaliteit dus ook inNTA2aanpast.
Voltooiing van NTA2
Daargelaten dat de volledige correcte implementatie van een BDD-based Test advisor nog een aan-zienlijke hoeveelheid werk zou betekenen. Mede doordat NTA nog wat ambiguïteiten bevat, verwachtik dat NTA nog wel een aantal verassingen in petto heeft die de vlekkeloze implementatie van NTA2inde weg zullen staan. Met betrekking tot de implementatie van foreach-Nodes stel ik voor deze ook inde BDD te encoderen, zoals bij JumpAndReturns ook gedaan is. Het uitrollen van for-loops lijkt eennodeloos ingewikkelde zaak te worden, ondanks dat dit op het eerste gezicht eenvoudig lijkt.
Gebruik van een bestaande modelchecker
Een andere optie is om de verkregen informatie van de statische analyse in een model te stoppen datdoor een traditionele modelchecker kan worden verkend. Persoonlijk lijkt mij dit geen heel goed idee. Ditomdat een volwaardige modelchecker NTA een stuk complexer maakt en dat nog steeds al het gedragvan NTA een vertaalslag dient te maken van NTA-model naar een andere modelleertaal. Daargelatendat deze modelchecker bounded reachability checking op een manier implementeert die voor ons doelbruikbaar is.
Test Guidance op basis van eerdere verkenningen
Ondanks dat een benadering met test-guidance op basis van (bounded) verkenning van de state-spacewaarschijnlijk het beste advies genereert denk ik dat in de praktijk een andere keuze handiger is. Mo-menteel verkend NTA heel oppervlakkig door te kijken of de aangrenzende nodes al zijn bezocht, enkiest de helft van de tijd voor de minst bezochte node. Om te zorgen dat wel elke node eventueel geko-zen wordt zal NTA de andere helft van de tijd een willekeurige richting kiezen. Ik denk dat wanneer indeze oppervlakkige keuze de huidige waarde van de variabelen mee wordt genomen, welke verkregenkunnen worden met de statische analyse, dat er al een iets betere keuze kan worden gemaakt. Eengrotere verbetering verwacht ik wanneer de coverage van het model centraal wordt opgeslagen. Ophet moment dat er getest wordt zal NTA namelijk met meerdere instanties tegelijkertijd draaien. Ik denkdat wanneer van al deze instanties centraal wordt bijgehouden waar ze zijn geweest, dat er vanuit diecentrale plek een betere en snellere coverage bereikt kan worden. Deze server zou dan ook kunnenmeewegen in de te kiezen richting voor NTA. In plaats van 5 instanties die allemaal op vergelijkbare
Pagina 15
manier door het model gaat zou de server de verschillende instanties kunnen sturen om gezamelijk hetmodel te verkennen. Met behulp van de statische analyse zou op de server van te voren al kunnenworden bepaald of een bepaalde node wel of niet bereikbaar is, dit zou onnodig verkennen kunnenminimaliseren. Ook zou deze server verdachte plekken in het model in kaart kunnen brengen. Dit zijnplekken waar NTA of nooit komt, of maar een enkele keer. Dit kan meewegen in de beslissing om dezeplekken te verkennen. Wanneer op een dergelijke manier het model wordt verkent zal dit zorgen voor:een minder complex systeem voor de test-advisor dan de BDD-oplossing Een robuuste verkenner diegrotendeels ongevoelig is voor de interne werking van NTA. Tenslotte hoeven we niks te weten daar-van, we sturen enkel op basis op verkregen data over het bezoeken van locaties. En hiervoor zoudenreguliere algorithmen kunnen worden gebruikt voor het verkennen van grafen. Ik denk dat dit redelijkmakkelijk te passen is binnen de huidige structuur van NTA. De complexiteit van de verkenningstac-tieken zou in eerste instantie tamelijk simpel kunnen zijn, maar zou eenvoudig uit te breiden zijn. Integenstelling tot de BDD-oplossing, wat meer een alles-of-niets-benadering is. Tevens denk ik dat erdan ook verschillende verkenningstechnieken gebruikt kunnen worden door verschillende instanties vanNTA.
Pagina 16
2463
1530
4
1513
898
1399
899
900
1533
755
2724
2313
2726
187
2728
2727
2729
2683
2659
2660
2499
2514
2513
2500
2501
2502
2503
2672
2673
1
2716
2720
1712
2723
2714
2718
2
2721
74
62
65
55
242
2571
1713
66
2573
1708
183
162
1890
75
600
2592
2575
1957
2576
165
124
1892
92
597
116
120
159
952
880
852
881
865
2741
2021
2019
2018
2407
2020
2736
1014
1008
1005
2408
1011
1012
1013
18
87
1009
84
1010
15
85
185
824
86
161
2412
823
1252
298
1098
534
559
1261
1282
1278
1271
297
303
1097
1099
535
537
558
560
1512
1479
1487
1477
1293
1288
1255
2413
1297
1298
1290
1345
1289
1461
1291
1299
1294
1346
1296
1026
1440
1295
1384
1385
1439
2015
1386
1387
1388
1462
1427
1428
1430
1429
1431
1
830
831
308
833
832
1030
1
2
2
2
1038
1
1021
2
1031
2
851
2
1447
1039
1022
1445
334
1333
1337
573
1338
1316
2442
1340
1319
2431
1342
1328
438
2432
1435
1
446
1329
2
1356
3
464
3
1377
2
1331
3
1363
2
327
465
1378
449
1362
439
440
444
441
1320
442
443
628
2
1321
3
1327
574
1317
580
577
1318
581
576
578
584
2
587
3
457
3
435
3
1357
2
1494
2
13732
331
459
437
1358
1495
1374
582
1109
575
1661
1110
583
1662
1111
1663
1664
1665
579
1375
2441
1365
2429
460
1
2430
1434
461
1366
2
1368
3
1371
1359
2440
1347
1433
332
1
328
1348
2
1350
3
2439
1302
1443
1463
1221
1442
1453
1996
1454
1987
1457
1991
1458
1459
2013
2014
1311
1460
1313
1382
1314
1024
1
2016
834
837
313
836
835
1025
2
1062
2
1028
2
1659
3
1090
3
2022
2
919
2
1263
2
1042
316
1132
1474
1125
866
1264
1989
1990
1993
2006
2
2012
2
2017
4
417
2
1995
2
2007
3
1994
2
2008
3
2024
4
1052
1186
980
1041
1080
625
1182
1448
1449
1100
1451
1450
1103
538
1444
2
2
1241
541
400
544
542
401
566
563
565
543
564
1262
1508
1484
1465
1486
1478
1
1485
1254
1260
1469
1488
290
1489
1259
1491
1492
1493
1496
1497
1498
1499
1500
1501
1641
1642
1643
1470
2
2
2
1475
3
281
285
2023282283284
280
278279
1087
1088
1490
1089
533
4
10934
1003
1004
368
369 370
1631
1632
1633
1562
1656
1561
1585
1584
1678
1587
2027
1597
1599
1588
2037
1600
1602
2640
1603
2643
2642
1590
1679
1591
1606
1592
1607
1658
1593
1636
2026
1611
1608
1564
1609
4
4
1666
2
1629
4
886
1628
1610
1660
2635
2639
2636
2637
2638
1649
2231
2631
2632
1601
2227
2633
2230
1594
1595
1596
1565
1567
1580
1578
1569
1572
1575
1573
1582
1576
1574
1650
2641
1577
1586
1598
1639
1644
1653
1645
1651
373
992
590
1065
522
1084
524
260
1085
589
528
261
525
591
529
530
1466
1481
2
1467
3
1483
592
593
264
1086
1502
1506
106
1507
2038
2071
2041
2072
2057
2052
2055
2059
2136
107
2101
2074
1
1
1
652
2
2004
2
1
1
647
2
654
2
1
1
1
2098
2133
2088
300
2106
2093
2127
9572005
947
2414
953
955
306
2107
3
2096
2097
2100
2089
3
2094
4
2064
2067
2066
2063
2060
2065
2068
2061
2070
3
2069
2062
2080
2081
2091
2082
2092
2083
2084
2134
2135
2138
2073
2137
3
2139
2045
2075
2044
2051
2043
2076
3
2077
2046
2078
2047
994
1476
1472
372
294
295
296
1094
1473
3
1091
1092
1070
307
1096
1068
2196
416
1127
1951
821
364
429
1131
1952
336
402
894
432
431
2438
1129
850
617
2197
618
1071
1069
1
1067
1
1037
1072
620
2417
2030
2028
1073
2426
2032
2422
2425
2416
2421
2420
2419
2423
596
377
595
2424
2418
2415
626
2
598
382
1
3
619
3
1077
3
1683
623
1078
911
1684
820
1833
1845
398
383
2
2
2
385
384
389
388
392
796
390
391
1237
1238
798
1227
802
807
1228
808
799
810
809
804
800
817
805
801
1116
797
615
397
982
985
399
1112
806
1113
803
814
811
812
815
816
1114
1115
813
1231
1235 3
3
394
395
456
603
602
605
604
607
606
608
1118
1119
1081
616
613
614
610
609
612
1120
611
1082
1121
1844
1842
3
2577
2
1846
1705
1847
1700
1843
1817
2010
2579
1818
1819
1820
1821
4
1956
2
1823
2
1717
1888
1701
1702
1703
1704
1706
4
1822
2 2
1834
1801
2031
1075
1076
2035
2036
1079
2029
621
622
2033
2034
624
838
840
839
842
844
825
843
822
1
2
1034
1
81
1133
1170
1177
1168
1171
2
1169
1165
1172
1173
1174
1175
1176
1183
1184
1185 1188
1192
1196
3
1190
1191
1193
1194
1141
1195
1179
1142
4
1151
1152
1153
1154
1155
1156
1157
1158
1161
1159
1162
1160
5
1181
4
1145
1143
1146
1147
1148
5
1150
4
1197
1198
1199
1201
1200
1203
1202
1204
4
1135
1136
1137
1134
3
1955
2435
1948
1953
2434
2141
1932
1934
1931
1936
1937
1933
1941
1935
2149
1954
2294
2150
1950
2146
2148
2147
2
2151
360
361
344
345
346
347
348
349
350
353
352
354
2
2
356
363
1942
1938
2159
2152
2172
2157
2158
2155
2153
2226
407
409
408
757
410
2
415
2
403
413
758
759
2176
2177
2179
2182
2178
2180
2188
2156
2189
2190
3
2166
3
2174
3
2170
3
2165
2173
2169
2191
2192
2195
2193
2183
2184
2181
2185
2186
2194
2187
2175
776
775
774
778
783
779
784
785
786
787
788
789
792
790
793
2
760
2
770
780
782
781
1939
1943
2168
2171
510
512
511
519
518
2
480
2
481
769
768
516
1940
1944
2167
488
490
818
819
491
499
496
492
493
494
495
767
498
2
477
2
476
766
503
2433
2140
2143
2144
2145
2142
2
433
434
2289
2288
453
2
2286
2287
2291
2290
2201
2292
2211
2210
2204
2206
2209
2215
2295
2205
2212
2214
2213
2207
2300
2299
2208
3
2221
3
2274
3
2280
3
2270
3
2262
3
2305
3
2277
3
2219
2273
2279
2269
2261
2304
2276
2296
2302
2301
2216
2203
2298
2297 2307
2303
469
2
479
895
319
2199
357
2220
358
2217
2218
2198
473
359
320
2264
2265
2266
2271
2272
322
2
2268
2275
2267
2281
2278
761
762
764
2250
771
2251
772
2255
2256
2257
2260
2258
2259
2263
2285
773
777
2284
506
2244
507
508
509
2245
2248
2246
2247
2249
763
765
484
2283
485
2242
2241
2240
2235
2236
2239
2238
2237
2234
2243
486
487
2232
404
2233
405
472
406
2282
2223
2225
2224
2222
309
1242
1239
1243
1240
546
547
475
568
548
474
311
1104
569
549
551
550
1
1
1
1
552
1105
571
570
572
1107 1106
1108
312
1244
167
166
1826
174
1828
999
1841
1835
1854
1836
1838
1848
1862
1855
1856
1870
1863
1850
1852
1878
1871
1864
1858
1860
1886
1872
1879
1866
1868
1880
1887
1874
1876
1875
1877
1873
1884
1882
1
1885
1883
1881
1867
1869
1865
1859
1861
1857
1851
1853
1849
1837
1839
1840
1000
169
168
176
170
175
177
2409
2406
2410
2405
2739
2738
2737
2740
2731 2713
2707
2710
2694
2693
2695
2698
2717
2696
2709
2711
2705
1
2701
2702
2704
2703
2
2699
1015
91
1016
88
89
186
90
163
14
83
1006
80
1007
184
1017
164
82
1018
1033
1083
1020
1036
2310
1044
2312
1045
1405
1046
1047
1048
1049
1050
1057
1
1056
2311
1023
1040
1
16
860
862
859
863
864
921
967
948
854
855
856
857
858
867
912
868
913
869
914
870
871
872
874
873
876
877
878
879
882
875
883
884
885
887
888
889
892
949
1
651
649
2003 650
648
655
2002
653
656
960
657
956
958
736
966
965
1
969
641
642
643
644
645
713
670
711
671
661
672
706
674
675
707
676
677
959
680
2
646
662
663
668
664
660
1214
751
712
3
998
3
722
3
698
723
1999
665
667
669
2000
666
1216
2001
1997
1215
739
963
961
737
740
684
685
686
687
688
699
700
742
964
2
743
702
744
968
717
718
719
720
721
724732
725
729
726
733
734
735
728
748
727
738
962
2
730
731
1893
1895 1894
1913
1914
1915
1916
1917
1918
1919
1921
1920
1922
19241923
1925
1927
1926
1928
1
2630
2581
2580
2583
2582
1
2586
2578
2587
1810
18091813
1811
1815
1812
1814
1807
1806
1808
1805
1803
1804
1799
1798
1797
1800
1796
1795
1791
1792
1793
1790
1788
1789
1785
1787
1784
1786
1783
1781
1782
1780
1725
1724
1715
1721
1716
1779
1777
1778
1
1794
1802
56
640
2551
2552
57
58
59
60
61
63
1
188
189
2556
2555
190
192
193
194
199
195
196
198
200
201
202
203
205
206
207
208
209
210
211212
213
27191
983 981
24
23
22
2715
1
637
639
217
2554
2553
218
219
220
221
222
223
224
225
226
227
228
229
2722
1
1538
1514
1
Figuur 4.1: Weergave van het NTA-model zoals verkend door NTA2
Pagina 17
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.host:host
NO
NO
NO
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeContractor
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:identification
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor2:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.entrances
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeVisitor
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department:value
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.userBlok:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed3:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setMobilePhoneNo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee1:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findFreeFieldDefinition:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.user
"userAdministrator"
NO
NO
NO
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userReadOnly
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userVisitorsOnly
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userReplaceOnly
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userAdministrator
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userBadgeOnly
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userNoFunctions
NO
NO
YES
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.badgeXS105
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:setIdentification
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:badgeID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockToken
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.userBosse:visit
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate:value
2013-09-14
YES
NO
NO
2013-09-14
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeContractor:setId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addVisitor:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addCarrierAuthorizations:setCarrierId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.temporary
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.dashBoard.carrier:visit
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findEmployee
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken:setBadgeNumberTo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken:setBadgeNumberFrom
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.visit.findVisit
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.withdrawToken:setBadgeNumber
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor2:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addCarrierAuthorizations:setTemplateId.TemplateAuthorisationOnline
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:mode
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findDepartment
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.AEPUAvailable
true
NO
YES
NO
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findCar
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkMode
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.main.currentField
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.user:monitorPresenceViewPresenceVehicles
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime:value
2014-08-21T16:01:21
YES
NO
NO
2014-08-21T16:01:21
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setIdentification
YES
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findFreeFieldDefinition:setName
NO
NO
NO
Department
freeBoolean
Language
freeTime
freeDateTime
PersonnelNr
freeDate
freeStringLookup
freeString
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:lastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:licensePlate
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.userBlok
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findContractor
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findVisitor
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.badgeEditorOpenSuccess
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.unblockToken:setIdentifierType
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.userBosse:lastName
Bosse
YES
NO
NO
Bosse
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:getId.ContractorInfo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed3:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.environmentPrepared
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department:name
Department
YES
NO
NO
Department
name:
default:
persistent:
static:
referencedto:
local.personVehicle.reloadCarrier
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier2:created
NO
NO
NO
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addEmployee
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:middleName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkListEmployee
bulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3
NO
NO
YES
bulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee3:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addContractor
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate:name
freeDate
YES
NO
NO
freeDate
name:
default:
persistent:
static:
referencedto:
global.badgeXS17
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.carrierVehicle
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed1:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken:setReason
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee3:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor3:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup:name
freeStringLookup
YES
NO
NO
freeStringLookup
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addCarrierAuthorizations
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockCarrierRequest:setCarrierId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.removeCar
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.dashBoard.replace:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier3:created
NO
NO
NO
true
name:
default:
persistent:
static:
referencedto:
global.user:username
NO
NO
NO
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
local.httpLoginProcedure.password
aeosrules
NO
NO
NO
aeosrules
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkListContractor
bulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3
NO
NO
YES
bulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3
name:
default:
persistent:
static:
referencedto:
global.userOeveren:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findDepartment:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.presence
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.currentInterface
dashboard
NO
YES
NO
dashboard
name:
default:
persistent:
static:
referencedto:
local.personVehicle.removeVisitor
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findBlockReason:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeCar
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.badge
NO
NO
NO
clean
name:
default:
persistent:
static:
referencedto:
global.badgeXS86
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.badgeXS23
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.badgeXS59
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.user:password
NO
NO
NO
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken:setIdentifierTypeTo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.replace
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.badgeXS96
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.badgeXS46
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
global.badgeXS38
clean
NO
NO
YES
clean
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeCar:setId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee2
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeContractor:setValue
NO
NO
NO
2014-08-21T16:01:21
15:02
value1
2013-09-14
testString
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addCar
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee1
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.carrier
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.userBosse
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.userOeveren
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor3:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.user:entranceEntranceProvideAccess
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee3
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addEmployee:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.httpLoginProcedure.username
administrator
NO
NO
NO
administrator
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.user:personVisitorSearch
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:getId.EmployeeInfo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addVisitor
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.assignToken:setCarrierId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.success
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addCar:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.unblockCarrierRequest
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean:value
true
YES
NO
NO
true
name:
default:
persistent:
static:
referencedto:
global.userOeveren:host
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.removeContractor
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockToken:setIdentifierType
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor3:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier3
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor3
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor3
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier2
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor2
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor2
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier1
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor1
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor1
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeEmployee:setDefinitionId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeCar:setDefinitionId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken:setIdentifierTypeFrom
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed1
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replace
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeVisitor:setId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.carrier:lastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean:name
freeBoolean
YES
NO
NO
freeBoolean
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed3
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.replace:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed2
NO
NO
YES
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:lastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime:name
freeDateTime
YES
NO
NO
freeDateTime
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo:value
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.user:monitorEventMonitorTextEvents
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeEmployee:setValue
NO
NO
NO
2014-08-21T16:01:21
15:02
value1
2013-09-14
testString
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.withdrawToken
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.dashBoard.badge:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findIdentifierType:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeCar:setValue
NO
NO
NO
2014-08-21T16:01:21
15:02
value1
2013-09-14
testString
true
name:
default:
persistent:
static:
referencedto:
global.htmlEnabled
false
NO
YES
NO
false
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed1:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.carrierVehicle:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.success
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor1:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.dashBoard.replace
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replaceToken
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString:value
testString
YES
NO
NO
testString
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:setLastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockCarrierRequest:setReason
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeEmployee:setId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:visit
NO
NO
NO
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkList
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkListMixed
bulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3
NO
NO
YES
bulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkListVisitor
bulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3
NO
NO
YES
bulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime:name
freeTime
YES
NO
NO
freeTime
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeVisitor:setDefinitionId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:created
NO
NO
NO
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.bulkCarrier1:created
NO
NO
NO
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.assignToken:setIdentifierType
YES
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee2:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setLanguage
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.host:lastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.user:personVisitorSearchVisits
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setMiddleName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:mobile
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor3:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed2:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findBlockReason:setName
NO
NO
NO
Carrier Replacement
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee2:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDate:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.removeEmployee
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockToken:setReason
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString:mandatory
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language:name
Language
YES
NO
NO
Language
name:
default:
persistent:
static:
referencedto:
local.loginProcedure.username
administrator
NO
NO
NO
administrator
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
global.userBlok:host
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.user:monitorPresenceViewPresencePersons
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.unblockToken
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.user:monitorEventMonitorPhotoEvents
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.dashBoard.carrier:mode
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor1:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:attachment
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:identification
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setFirstName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.visit.removeVisitRequest
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeBoolean:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.photoEvents
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:getId.VisitorInfo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findFreeFieldDefinition
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findIdentifierType
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.assignToken:setBadgeNumber
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setLastName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.host
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setLicenceNumber
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.loginProcedure.password
aeosrules
NO
NO
NO
aeosrules
"userAdministrator"
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:blocked
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.mode
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language:value
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.dashBoard.carrier
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.badge:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor2:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:firstName
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.visitSelected
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeVisitor:setValue
NO
NO
NO
2014-08-21T16:01:21
15:02
value1
2013-09-14
testString
true
name:
default:
persistent:
static:
referencedto:
local.dashBoard.badge
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.visit.findVisit:getId.VisitInfo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:mode
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor2:blocked
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.userBosse:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.findBlockReason
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.dashBoard.carrier:blocked
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.department:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeStringLookup:value
value1
YES
NO
NO
value1
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findTemplate:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeDateTime:readable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.replace:ID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentFreeField:DefinitionId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeEmployee
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeString:name
freeString
YES
NO
NO
freeString
name:
default:
persistent:
static:
referencedto:
local.createEmployee.changeContractor:setDefinitionId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.detailedEvents
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkContractor1:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setPersonnelNo
NO
NO
NO
512
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.badge
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.freeTime:value
15:02
YES
NO
NO
15:02
name:
default:
persistent:
static:
referencedto:
local.createEmployee.replicateMode
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier:created
NO
NO
NO
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentFreeField:value
NO
NO
NO
2014-08-21T16:01:21
15:02
value1
2013-09-14
testString
true
name:
default:
persistent:
static:
referencedto:
local.personVehicle.withdrawToken:setIdentifierType
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.textEvents
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.createEmployee.mode
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.carrier:host
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.currentRequest:setDepartmentId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.language:writeable
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockToken:setBadgeNumber
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.unblockToken:setBadgeNumber
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.quickLaunch.carrier:badgeID
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkMixed2:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.person
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
local.mainButtons.widgets.upcomingVisits
false
NO
NO
NO
false
true
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkVisitor1:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
local.personVehicle.assignToken
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.addContractor:getId
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.createEmployee.carrier
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.currentRequest:getId.CarInfo
NO
NO
NO
name:
default:
persistent:
static:
referencedto:
global.bulkEdit.bulkEmployee1:created
NO
NO
NO
true
false
name:
default:
persistent:
static:
referencedto:
global.fieldPermissions.personnelNo:name
PersonnelNr
YES
NO
NO
PersonnelNr
name:
default:
persistent:
static:
referencedto:
local.createEmployee.findTemplate
NO
YES
NO
name:
default:
persistent:
static:
referencedto:
local.personVehicle.blockCarrierRequest
NO
YES
NO
Figuur 4.2: Weergave van de variabelen na statische analyse door NTA2
Pagina 18
Recommended