FacebookUitgebreid Deel3
Deel 3: Klasse Facebook
- Voeg een instantievariabele accounts toe die elke Account bijhoudt aan de hand van diens login. De login is de sleutel om de bijhorende Account op te kunnen vragen. Deze collectie stelt alle geregistreerde gebruikers van Facebook voor. Er is geen bovengrens voor het aantal accounts die bijgehouden kunnen worden en het moet mogelijk zijn om dynamisch nog extra accounts 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.
Let op: deze variabele staat niet in het klassediagram. Je gaat dus zelf moeten bedenken wat het type van deze variabele is. Zo zal het ook op het examen zijn.
- Maak een constructor voor de klasse zonder parameters die de collectie van accounts initialiseert als een lege collectie.
- Maak een constructor voor de klasse met een String als parameter. De meegegeven String stelt de bestandsnaam van een CSV-bestand voor dat ingelezen zal worden. De constructor initialiseert de instantievariabele ‘accounts’ met de accounts die uitgelezen worden uit het bestand. De constructor kan twee verschillende exceptions gooien: FileNotFoundException en FacebookException. De FileNotFoundException wordt gegooid indien de meegegeven bestandsnaam niet naar een bestaand bestand verwijst. De FacebookException wordt gegooid indien er dubbele accounts in het ingelezen bestand zitten (gooi deze met het bestand als parameter) of de input om eender welke andere redenen corrupt blijkt (bv. minder dan 6 velden per lijn).
Het volgende bestand kan gebruikt worden om je methode te testen: accountsVoorbeeld.csv
.
- Voeg een accessormethode voor de collectie van accounts toe.
- Maak een methode addAccount die zes Strings als parameters heeft. De methode maakt een nieuw Account aan aan de hand van de meegegeven Strings. Indien de login van de gegeven account al in gebruik is, wordt een FacebookException gegooid met het Account object. Alternatief, voegt de methode de gegeven account toe aan de collectie van accounts.
- Maak een methode addFriendship die een Account object en een String als parameters heeft. De methode gaat na of het meegegeven Account object en de meegegeven login bestaande accounts voorstellen. Indien niet, zal een FacebookException gegooid worden met de login van de account die niet gevonden kan worden. Indien wel, worden de twee accounts vrienden van elkaar gemaakt.
- Maak een methode removeFriendship die twee Strings als parameters heeft. De methode verbreekt de vriendschap tussen de Account die horen bij de meegegeven logins. Indien een van de logins niet bestaat, zal een FacebookException gegooid worden met de login van de account die niet gevonden kan worden. De methode geeft ‘true’ terug als er daadwerkelijk een vriendschap verbroken werd, anders ‘false’ (in het geval dat ze voorafgaande al geen vrienden waren).
- Maak een methode addPost die twee Strings en een Account object als parameters heeft. Indien de login van account op wiens wall de post moet komen bestaat (=eerste String), het meegegeven Account object bestaat (=maker van de post), de post gemaakt is door de account van de wall of door een rechtstreekse vriend van de account van de wall, wordt de post gemaakt (=tweede String) en toegevoegd aan de wall van de account van de wall. Indien een van deze voor voorwaarden niet voldaan is, zal een FacebookException gegooid worden met, respectievelijk, de login van account van de wall, de login van de meegegeven Account of het aangemaakte Post object.
- Maak een methode search die een Integer als parameter heeft. De methode zoekt het Post object met de overeenkomstige postID. Indien er geen Post gevonden kan worden met de gegeven postID, geeft de methode ‘null’ terug.
- Maak een methode like die een String en een Post object als parameters heeft. Indien de meegegeven login bestaat en het meegeven Post object bestaat, wordt de like voor het meegeven Post object toegevoegd aan de collectie van likes van account die behoort bij de meegegeven login. Alternatief zal een FacebookException gegooid worden met, respectievelijk, de login van account of de ‘postID’ van het meegegeven Post object.
- Maak een methode removeLike die een String en een Integer als parameters heeft. Indien de meegegeven ‘login’ en/of ‘postID’ niet bestaan, zal een FacebookException gegooid worden met, respectievelijk, de ‘login’ of de ‘postID’. Indien ze wel bestaan, verwijdert de methode de like van het Account object die bij de meegegeven ‘login’ hoort voor het Post object dat bij de meegegeven ‘postID’ hoort. Indien de post daadwerkelijk geliket was door de account (=dus er is iets verwijderd) wordt ‘true’ teruggegeven, alternatief wordt ‘false’ teruggegeven.
- Maak een methode getNewsFeed die een Account object als parameter heeft. De methode geeft de newsfeed terug voor het meegegeven Account object. Indien de account niet bestaat, wordt een FacebookException gegooid worden met de ‘login’ van het meegegeven Account object. De newsfeed is een collectie van Post objecten, gesorteerd van nieuw naar oud. In de newsfeed zitten zowel de posts van de wall van de meegegeven account, als de posts van de walls van diens vrienden.
- Maak een methode exportAccountsDataFile die een String als parameter heeft. De methode schrijft de variabele
accounts
uit als data bestand. Het data bestand heeft als naam de meegegeven String. De methode gooit een IOException indien het bestand niet uitgeschreven kan worden.
TIP: Het is dus niet de bedoeling dat je een CSV-bestand probeert aan te maken! Indien je niet weet wat met een data bestand bedoeld wordt, zoek het dan eerste eens op in je cursus.
- Maak een methode importAccountsDataFile die een String als parameter heeft. De methode leest het data bestand met de meegegeven naam in en voegt de ingelezen data toe aan de variabele
accounts
. Indien de meegegeven bestandsnaam verwijst naar een bestand dat niet bestaat, zal de volgende boodschap uitgeprint worden in de console: Het bestand [bestandsnaam] bestaat niet!
. Bij eender welke andere Exception die gegooid zou worden (door de Java functionaliteit om data bestanden in te lezen) zal volgende boodschap uitgeprint worden in de console: Het bestand [bestandsnaam] kan niet ingelezen worden!
. De placeholder zal in beide gevallen vervangen worden door de meegegeven naam van het bestand.
TIP: Ook hier gaat het dus over een data bestand en niet over een CSV-bestand!
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).
- test04constructor: test of de constructor het gewenste effect heeft (indien van toepassing).
- test05constructor_String_correctFile: test of de constructor met een String als parameter het gewenste effect heeft in scenario’s waarin een naam van een geldig bestand meegegeven wordt.
- test06constructor_String_emptyFile: test of de constructor met een String als parameter het gewenste effect heeft in scenario’s waarin een naam van een leeg bestand meegegeven wordt.
- test07constructor_String_nonexistentFile: test of de constructor met een String als parameter het gewenste effect heeft in scenario’s waarin een naam van een niet-bestaand bestand meegegeven wordt.
- test08constructor_String_corruptFile: test of de constructor met een String als parameter het gewenste effect heeft in scenario’s waarin een naam van een corrupt bestand meegegeven wordt.
- test09constructor_String_corruptFile: test of de constructor met een String als parameter het gewenste effect heeft in scenario’s waarin een naam van een corrupt bestand meegegeven wordt.
- test10methodsPresent: test of de verwachte methodes aanwezig zijn in de ingediende klasse en of de methode definities overeenkomen met de verwachte definities (= test geen effect!).
- test11accessorsMutators: test of de ingediende klasse de al dan niet verwachte accessor- en mutatormethodes definieert en of deze het verwachte effect hebben.
- test12addAccount: test de addAccount-methode.
- test13addAccount_enkelException: test de addAccount-methode enkel met scenario’s waarin een exception verwacht wordt.
- test14addFriendship: test de addFriendship-methode.
- test15addFriendship_enkelExceptions: test de addFriendship-methode enkel met scenario’s waarin een exception verwacht wordt.
- test16removeFriendship: test de removeFriendship-methode.
- test17removeFriendship_enkelExceptions: test de removeFriendship-methode enkel met scenario’s waarin een exception verwacht wordt.
- test18addPost: test de addPost-methode.
- test19addPost_enkelExceptions: test de addPost-methode enkel met scenario’s waarin een exception verwacht wordt.
- test20search: test de search-methode.
- test21like: test de like-methode.
- test22like_enkelExceptions: test de like-methode enkel met scenario’s waarin een exception verwacht wordt.
- test23removeLike: test de removeLike-methode.
- test24removeLike_enkelExceptions: test de removeLike-methode enkel met scenario’s waarin een exception verwacht wordt.
- test25getNewsFeed: test de getNewsFeed-methode.
- test26getNewsFeed_enkelEigenWall: test de getNewsFeed-methode, maar aanvaart ook oplossingen die enkel de posts van de wall van de meegegeven account teruggeven.
- test27getNewsFeed_enkelWallVanVrienden: test de getNewsFeed-methode, maar aanvaart ook oplossingen die enkel de posts van de walls van de vrienden van de meegegeven account teruggeven.
- test28getNewsFeed_enkelExceptions: test de getNewsFeed-methode enkel met scenario’s waarin een exception verwacht wordt.
- test29exportAccountsDataFile: test de exportAccountsDataFile-methode.
- test30exportAccountsDataFile_enkelExceptions: test de exportAccountsDataFile-methode enkel met scenario’s waarin een exception verwacht wordt.
- test31importAccountsDataFile: test de importAccountsDataFile-methode.