test guidance for the nedap test automation tool17 november 2014 stageverslag test guidance for the...

of 18/18
17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University 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

Post on 30-Sep-2020

0 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • 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 Rsgeeft 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

    NONONO

    true

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeContractor

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:identification

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor2:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.mainButtons.widgets.entrancesfalseNONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeVisitor

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.department:value

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.userBlok:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed3:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.currentRequest:setMobilePhoneNo

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee1:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.findFreeFieldDefinition:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.user"userAdministrator"

    NONONO

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userReadOnly

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userVisitorsOnly

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userReplaceOnly

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userAdministrator

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userBadgeOnly

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.userNoFunctions

    NONOYES

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS105cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.currentRequest:setIdentification

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:badgeID

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.blockToken

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.userBosse:visit

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate:value2013-09-14

    YESNONO

    2013-09-14

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeContractor:setId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addVisitor:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addCarrierAuthorizations:setCarrierId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.temporary

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.dashBoard.carrier:visit

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findEmployee

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken:setBadgeNumberTo

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken:setBadgeNumberFrom

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.visit.findVisit

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.withdrawToken:setBadgeNumber

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor2:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDateTime:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addCarrierAuthorizations:setTemplateId.TemplateAuthorisationOnline

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.carrier:mode

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.findDepartment

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.AEPUAvailabletrueNOYESNO

    true

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findCar

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkMode

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.main.currentField

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeTime

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeString

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.language

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.department

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDateTime

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeBoolean

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.personnelNo

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeStringLookup

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.user:monitorPresenceViewPresenceVehicles

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDateTime:value2014-08-21T16:01:21

    YESNONO

    2014-08-21T16:01:21

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.currentRequest:setIdentification

    YESNONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.findFreeFieldDefinition:setName

    NONONO

    DepartmentfreeBooleanLanguagefreeTime

    freeDateTimePersonnelNr

    freeDatefreeStringLookup

    freeString

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:lastName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.carrier:licensePlate

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.userBlok

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.currentRequest

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findContractor

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findVisitor

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.badgeEditorOpenSuccess

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.unblockToken:setIdentifierType

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.userBosse:lastNameBosseYESNONO

    Bosse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.currentRequest:getId.ContractorInfo

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed3:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.environmentPreparedfalseNONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.department:nameDepartment

    YESNONO

    Department

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.reloadCarrier

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier2:created

    NONONO

    true

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addEmployee

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.carrier:middleName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeTime:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.personnelNo:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkListEmployeebulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3

    NONOYES

    bulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee3:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addContractor

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate:namefreeDate

    YESNONO

    freeDate

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS17cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.carrierVehicle

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed1:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken:setReason

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee3:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor3:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeStringLookup:namefreeStringLookup

    YESNONO

    freeStringLookup

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addCarrierAuthorizations

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeString:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.blockCarrierRequest:setCarrierId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.removeCar

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.dashBoard.replace:ID

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier3:created

    NONONO

    true

    name:default:

    persistent:static:

    referencedto:

    global.user:username

    NONONO

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    local.httpLoginProcedure.passwordaeosrules

    NONONO

    aeosrules

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeTime:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkListContractorbulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3

    NONOYES

    bulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3

    name:default:

    persistent:static:

    referencedto:

    global.userOeveren:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.findDepartment:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.mainButtons.widgets.presencefalseNONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDateTime:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.currentInterfacedashboard

    NOYESNO

    dashboard

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.removeVisitor

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeBoolean:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findBlockReason:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeCar

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.badge

    NONONO

    clean

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS86cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS23cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS59cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.user:password

    NONONO

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken:setIdentifierTypeTo

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.quickLaunch.replace

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS96cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS46cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    global.badgeXS38cleanNONOYES

    clean

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeCar:setId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeString:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee2

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeContractor:setValue

    NONONO

    2014-08-21T16:01:21

    15:02value1

    2013-09-14testString

    true

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addCar

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee1

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.quickLaunch.carrier

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.userBosse

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.userOeveren

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor3:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.language:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.user:entranceEntranceProvideAccess

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee3

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addEmployee:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.httpLoginProcedure.usernameadministrator

    NONONO

    administrator

    "userAdministrator"

    name:default:

    persistent:static:

    referencedto:

    global.user:personVisitorSearch

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.currentRequest:getId.EmployeeInfo

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.currentRequest

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addVisitor

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.assignToken:setCarrierId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.department:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.success

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:ID

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.addCar:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.personnelNo:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.unblockCarrierRequest

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeBoolean:valuetrueYESNONO

    true

    name:default:

    persistent:static:

    referencedto:

    global.userOeveren:host

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.removeContractor

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.blockToken:setIdentifierType

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor3:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier3

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor3

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor3

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier2

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor2

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor2

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier1

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor1

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkVisitor1

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeEmployee:setDefinitionId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeStringLookup:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeCar:setDefinitionId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken:setIdentifierTypeFrom

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed1

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replace

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeVisitor:setId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.quickLaunch.carrier:lastName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.personnelNo:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeBoolean:namefreeBoolean

    YESNONO

    freeBoolean

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed3

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.quickLaunch.replace:ID

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed2

    NONOYES

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.carrier:lastName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDateTime:namefreeDateTime

    YESNONO

    freeDateTime

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.personnelNo:value

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.user:monitorEventMonitorTextEvents

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.language:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeEmployee:setValue

    NONONO

    2014-08-21T16:01:21

    15:02value1

    2013-09-14testString

    true

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.withdrawToken

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.dashBoard.badge:ID

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findIdentifierType:getId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeCar:setValue

    NONONO

    2014-08-21T16:01:21

    15:02value1

    2013-09-14testString

    true

    name:default:

    persistent:static:

    referencedto:

    global.htmlEnabledfalseNOYESNO

    false

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed1:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeStringLookup:readable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.carrierVehicle:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.success

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor1:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.dashBoard.replace

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.department:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeTime:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.replaceToken

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeString:valuetestString

    YESNONO

    testString

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.currentRequest:setLastName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.blockCarrierRequest:setReason

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeEmployee:setId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:visit

    NONONO

    false

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkList

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkListMixedbulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3

    NONOYES

    bulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkListVisitorbulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3

    NONOYES

    bulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeTime:namefreeTime

    YESNONO

    freeTime

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.changeVisitor:setDefinitionId

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.carrier:created

    NONONO

    false

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.bulkCarrier1:created

    NONONO

    true

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.assignToken:setIdentifierType

    YESNONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee2:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeBoolean:writeable

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.currentRequest:setLanguage

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.quickLaunch.host:lastName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.user:personVisitorSearchVisits

    NONONO

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.currentRequest:setMiddleName

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeStringLookup:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.createEmployee.carrier:mobile

    NONONO

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkContractor3:created

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkMixed2:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.findBlockReason:setName

    NONONO

    Carrier Replacement

    name:default:

    persistent:static:

    referencedto:

    global.bulkEdit.bulkEmployee2:blocked

    NONONO

    falsetrue

    name:default:

    persistent:static:

    referencedto:

    global.fieldPermissions.freeDate:mandatory

    NONONO

    truefalse

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.removeEmployee

    NOYESNO

    name:default:

    persistent:static:

    referencedto:

    local.personVehicle.blockToken:setReason

    NONONO

    name:de