AankoopManagement Deel2

Deel 2: Klasse AankoopManagement (6 punten)
Download de klasse AankoopException
. Zet deze in de default package (= rechtstreeks in de ‘src’-map van je NetBeans project) en werk ook hierin verder.
De klasse AankoopManagement bevat twee instantievariabelen en een constructor:
- De instantievariabele aankoopProcessen die de verschillende aankoopprocessen bijhoudt in een collectie. Er is geen bovengrens voor het aantal processen die bijgehouden kunnen worden en het moet mogelijk zijn om dynamisch nog extra processen toe te voegen aan de instantievariabele of ze te verwijderen (hiervoor hoef je echter geen extra methodes te voorzien). Zorg ervoor dat er geen dubbels in de collectie kunnen zitten. De objecten in de collectie zijn niet opgeslagen in een bepaalde volgorde.
- De String instantievariabele gebruiker die bijhoudt wie momenteel communiceert met het systeem.
- Een constructor met als parameter een File object die de methode leesAankoopProcessen hiermee oproept. Nadien geeft de methode een boodschap weer in de console van de vorm:
[het aantal ingeladen processen] processen ingeladen!
. De placeholder wordt vervangen door het aantal processen die ingeladen zijn door de leesAankoopProcessen-methode. Indien de leesAankoopProcessen-methode een exception gooit, wordt de boodschap Geen processen ingeladen!
weergegeven in de console.
(0,5 punt)
Voeg de volgende methodes toe:
- Een methode leesAankoopProcessen met als parameter een File object. Dit File object verwijst naar een binair bestand waarin de instantievariabele
aankoopProcessen
is opgeslagen. De methode laadt de inhoud van de variabele in en retourneert hoeveel processen er werden ingeladen. Indien er iets fout loopt bij het inlezen, wordt de gegooide exception doorgegooid door de methode. Het binaire bestand processen.bin
bevat data over 2 processen en kan je dus gebruiken om je methode te testen (maar de methode moet uiteraard ook werken voor bestanden met meer of minder processen!).
(1 punt)
- Een methode schrijfAankoopProcessen met als parameter een File object dat verwijst naar het bestand naar waar je de instantievariabele
aankoopProcessen
wenst weg te schrijven. De methode schrijft de aankoopprocessen weg naar het gegeven bestand. Indien er iets fout loopt bij het uitschrijven wordt volgende boodschap uitgeprint in de console: Het bestand kan niet uitgeschreven worden!
.
(0,5 punt)
- Een mutatormethode voor de instantievariabele
gebruiker
.
- Een methode getAankoopProces met als parameter een aankoopID. Deze methode retourneert het aankoop proces dat het aankoop order object met de opgegeven parameter bevat in zijn orders.
(0,5 punt)
- Een methode toevoegenAankoopOrder met als parameters een productID, een hoeveelheid en leveranciersID. Deze methode zal een nieuw AankoopOrder object aanmaken met de overeenkomstige parameters en de ingelogde gebruiker (= de aankoper). Vervolgens zal ze een nieuw AankoopProces object aanmaken en hieraan het nieuwe AankoopOrder object toevoegen. Hierna wordt het nieuwe AankoopProces object toegevoegd aan de instantievariabele
aankoopProcessen
. Tenslotte, geeft de methode de aankoopID terug van het nieuw aangemaakte AankoopOrder object.
(0,5 punt)
- Een methode toevoegenGoederenOntvangen met als parameters een productID, een hoeveelheid, een leveranciersID en een aankoopID. De methode registreert een nieuwe ontvangst van goederen voor het aankoop proces dat bij de gegeven aankoop ID hoort. De methode houdt ook rekening met wie het systeem momenteel gebruikt en dus de ontvangst registreert (= de voorraadbeheerder). Indien er geen aankoop proces gevonden kan worden, gooit de methode een AankoopException met als boodschap:
[aankoopID] hoort niet bij een gekend aankoop proces!
. De placeholder wordt vervangen door de gegeven aankoop ID.
(0,5 punt)
- Een methode toevoegenFactuur met als parameter een factuurID (van leverancier), een productID, een hoeveelheid, een leveranciersID en een aankoopID. De methode registreert een nieuwe factuur voor het aankoop proces dat bij de gegeven aankoop ID hoort. De methode houdt ook rekening met wie het systeem momenteel gebruikt dus de factuur registreert (= de accountant). Indien er geen aankoop proces gevonden kan worden, gooit de methode een AankoopException met als boodschap:
[aankoopID] hoort niet bij een gekend aankoop proces!
. De placeholder wordt vervangen door de gegeven aankoop ID.
(0,5 punt)
- Een methode interneControle die een HashSet van AankoopProcessen retourneert waarin alle afgeronde aankoopprocessen zijn opgenomen die aan de testen threeWayMatch en seperationOfDuties voldoen.
(1 punt)
- De methode printLog zal alle documenten voor alle aankoopprocessen weergeven (let op: het kan zijn dat er voor een aankoop proces nog geen GoederenOntvangen object of Factuur object is toegevoegd). De documenten worden chronologisch weergegeven van oud naar nieuw (dus de documenten van één processen zitten niet noodzakelijk achtereenvolgend). Per document wordt een regel van de volgende vorm uitgeprint:
[aankoopID];[prefix_van_aankoopDocument];[datumTijd];[uitvoerder]
. Indien er geen documenten in het systeem zitten, zal een lege String teruggegeven worden en de volgende boodschap in de console weergegeven worden: De log is leeg…
.
Hieronder een voorbeeld voor 4 aankoopdocumenten:
AO1;AO;2017-06-27T18:06:34.023;FRED
GO2;GO;2017-06-27T18:06:34.038;TOM
FA4;FA;2017-06-27T18:06:34.039;POL
GO5;GO;2017-06-27T18:06:34.039;POL
(1 punt)
Hierbij nog wat uitleg over de Dodona-testen voor deze oefening:
- test00objectConcept: test of de ingediende klasse de verwachte de klasse definitie heeft (interface/abstracte klasse/klasse/enum/…).
- test01inheritance: test of de ingediende klasse de verwachte superklasse heeft en de verwachte interfaces implementeert.
- test02variables_presence: test of de ingediende klasse de verwachte instantievariabelen en statische variabelen definieert.
- test03variables_staticInitialValue: test of de statische variabelen van de klasse geinitialiseerd worden met de verwachte waarde (indien van toepassing).
- test04constructorPresence: test of de ingediende klasse de verwachte constructor(en) definieert (= test geen effect!) (indien van toepassing).
- test05constructor: test of de constructor het gewenste effect heeft (indien van toepassing).
- test06constructor_zonderExceptions: test of de constructor, enkel met scenario’s waarin geen exceptions verwacht worden, het gewenste effect heeft.
- test07constructor_zonderConsole: test of de constructor het gewenste effect heeft. Er wordt niet getest op de gevraagde boodschap in de console, enkel het effect van de constructor.
- test08methodsPresent: test of de verwachte methodes aanwezig zijn in de ingediende klasse en of de methode definities overeenkomen met de verwachte definities (= test geen effect!).
- test09accessorsMutators: test of de ingediende klasse de al dan niet verwachte accessor- en mutatormethodes definieert en of deze het verwachte effect hebben.
- test10leesAankoopProcessen: test de leesAankoopProcessen-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test11leesAankoopProcessen_enkelExceptions: test de leesAankoopProcessen-methode. Er worden ook oplossingen aanvaard die enkel kunnen omgaan met de gevraagde exceptions.
- test12leesAankoopProcessen_enkelExceptions_zonderClassNotFoundException: test de leesAankoopProcessen-methode. Er worden ook oplossingen aanvaard die enkel kunnen omgaan met de gevraagde exceptions, op uitzondering van de ClassNotFoundException.
- test13leesAankoopProcessen_zonderExceptions: test de leesAankoopProcessen-methode. Er worden ook oplossingen aanvaard die enkel niet kunnen omgaan met de exception scenario’s.
- test14leesAankoopProcessen_zonderExceptions_zonderReturn: test de leesAankoopProcessen-methode. Er worden ook oplossingen aanvaard die enkel niet kunnen omgaan met de exception scenario’s en die niet de juiste waarde teruggeven.
- test15schrijfAankoopProcessen: test de schrijfAankoopProcessen-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test16schrijfAankoopProcessen_zonderExceptions: test de schrijfAankoopProcessen-methode. De methode aanvaart ook oplossingen die enkel niet kunnen omgaan met de exception scenario’s.
- test17getAankoopProces: test de getAankoopProces-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test18toevoegenAankoopOrder: test de toevoegenAankoopOrder-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test19toevoegenGoederenOntvangen: test de toevoegenGoederenOntvangen-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test20toevoegenFactuur: test de toevoegenFactuur-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test21interneControle: test de interneControle-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test22interneControle_enkelAfgerondEnDuties: test de interneControle-methode. De methode aanvaart ook oplossingen die enkel nagaan of het aankoop proces afgerond is en of er sprake is van separation of duties.
- test23interneControle_enkelAfgerondEn3Match: test de interneControle-methode. De methode aanvaart ook oplossingen die enkel nagaan of het aankoop proces afgerond is en of er sprake is van een 3-way match tussen de 3 documenten.
- test24interneControle_enkelAfgerond: test de interneControle-methode. De methode aanvaart ook oplossingen die enkel nagaan of het aankoop proces afgerond is.
- test25printLog: test de printLog-methode. Indien de test succesvol is, scoor je de maximale punten voor deze methode.
- test26printLog_zonderLege: test de printLog-methode. De methode aanvaart ook oplossingen die niet met scenario’s kunnen omgaan waarin er geen documenten beschikbaar zijn.
Let op:
- Bij de beoordeling van het examen wordt niet enkel naar de resultaten van de tests gezien. Het is niet omdat een bepaalde test niet succesvol is, dat er automatisch punten afgetrokken worden. Bij het verbeteren wordt rekening gehouden met de resultaten van de testen, maar de beoordeling is nog altijd de code zelf (niet enkel het resultaat).
- Indien er niets over punten bij een test staat, zijn de resultaten louter indicatief. De resultaten van deze testen worden bij de beoordeling meegenomen, maar staan dus niet rechtstreeks voor een bepaald aantal punten.