Ebben a programban egy egyetemnek szánt, leegyszerűsített közösségi alkalmazás alapjait fogjuk megvalósítani. Ez abban fog kimerülni, hogy létrehozunk egy rendszert felhasználók tárolására, illetve felhasználók közötti kapcsolatok ábrázolására.
A részfeladatok megoldása során ügyeljünk arra, hogy a megadottakon kívül egyetlen osztály se tartalmazzon más publikus metódust vagy adattagot, illetve egyik csomag se tartalmazzon más osztályokat! Ha az implementáció megköveteli, akkor az osztályok rejtett adattagokkal és metódusokkal szabadon bõvíthetõk. A megoldást egyetlen .zip
állományként kell feltölteni, amely tartalmazza a csomagnak megfelelõ könyvtárszerkezetben az összes forráskódot. A fordítás során keletkezõ .class
állományokat viszont már nem szabad mellékelni! A fordításhoz legalább a Java Standard Edition 8 használata kötelezõ.
A feladat megoldása során be kell tartani a kódolási konvenciókat.
A kódolási konvenciók közül külön kiemelendõ, hogy ha valamilyen feladat vagy ellenõrzés elvégzésére valamelyik osztály már tartalmaz megfelelõ metódust, akkor azt kell használni, nem pedig újra leprogramozni (vagy átmásolni) az adott részt. (Bizonyos helyeken ezt a feladat külön ki is emeli, de erre külön figyelmeztetés nélkül is ügyelni kell.)
A feladathoz tartozik egy letölthetõ segédlet, ahol találunk minta bemeneti fájlokat és egy azokhoz tartozó kimeneti fájlt.
Hozzunk létre NodeNotFoundException
nevű osztályt elte.hu.eltecom.graph.exceptions
csomagban. Ez legyen egy ellenőrzött kivétel, melynek egy konstruktora van, mely egy egész számot vár (int), ami egy felhasználó azonosítót jelöl. Az ősosztály konstruktorának adja át az alábbi üzenetet:
Node with id: [felhasználó_azonosító] is not found!
Hozzunk létre UnsupportedGraphOperation
nevű osztályt elte.hu.eltecom.graph.exceptions
csomagban. Ez legyen egy nem ellenőrzött kivétel, melynek egy konstruktora van, mely egy üzenetet vár egy String
változóban. Az ősosztály konstruktorának adja át a kapott üzenetet.
A felhasználók közötti kapcsolatokat gráfokban fogjuk tárolni. Egy gráfot egy interfészen keresztül fogunk használni, de adunk két implementációt is. A gráfok felhasználókat reprezentáló objektumokat fognak tárolni (User osztály), ezekről részletesen majd később. A gráfok irányított gráfok lesznek. A felhasználók közötti ismerettségeknek nem kell feltétlen kölcsönösnek lennie, megengedjük, hogy A ismerősnek jelölje B-t anélkül is, hogy ez B-re is igaz lenne.
Hozzuk létre a Graph
nevű interfészt a elte.hu.eltecom.graph
csomagban. Ennek az interfésznek a következő metódusai legyenek:
addNode
mely visszatérési érték nélküli és egy User típusú objektumot vár paraméterülNodeNotFoundException
-t.Hozzuk létre a PrintableGraph
nevű interfészt a elte.hu.eltecom.graph
csomagban. Ez származzon a Graph
interfészből. Egy metódussa legyen:
print
mely paraméter nélküli, String
visszatérési értékűHozzuk létre a Node
nevű osztályt a elte.hu.eltecom.graph
csomagban. Ez egy csúcspontot fog reprezentálni a gráfunkban, mely a csúcs értékét és szomszédait tárolja.
User
típusú, rejtett láthatóságú value
mezője, mely a csúcs értékét reprezentáljaNode
objektumokat tároló Collection
típusú, rejtett láthatóságú neighbors
mezője, mely a csúcs szomszédjait reprezentáljaUser
típusú objektumot vár paraméterül. Inicializálja a value
mezőt a paraméterként kapott objektummal, illetve a neighbors
mezőt egy ArrayList
típusú objektummalvalue
mezőhözaddNeighbor
metódust, mely egy Node
típusú objektumot kap paraméterül és teszi be a szomszédos csúcsok közéremoveNeighbor
metódust, mely egy Node
típusú objektumot kap paraméterül és veszi ki a szomszédos csúcsok közülHozzuk létre a UnlimitedGraph
nevű osztályt a elte.hu.eltecom.graph
csomagban. Ez az osztály megvalósítja a Graph
interfészt. Egy irányított gráfot valósít meg láncolt ábrázolással.
nodes
nevű, rejtett láthatóságú, Node
típusú objektumokat tároló, végleges (nem módosítható) List
típusú mezője. Ez fogja tárolni a gráf csúcsait.LinkedList
típusú objektummal inicializálja a nodes
mezőtfindNode
nevű, Node
visszatérési értékű metódusa, mely User
típusú objektumot vár paraméterül. Ez a metódus megkeresi azt a csúcsot, melynek értéke megegyezik a paraméterül kapott értékkel. Ha ilyet nem talál, akkor null
értékkel térjen vissza.Implementálja a Graph intefész metódusait, ezek során használja a findNode
metódust ahol csak lehet / érdemes.
addNode
: létrehoz egy új csúcsot melynek értéke a paraméterül kapott felhasználóremoveNode
: ha található csúcs a paraméterül adott értékkel, akkor kitörli azt, különben pedig NodeNotFoundException
-t vált ki. A törlendő csúcsot a többi csúcs szomszédjai közül is ki kell törölni.linkNodes
: ha található csúcs a paraméterül adott mindkét értékkel, akkor az első paraméter szomszédos csúcsaihoz adja a második csúcsotgetNodeNumber
: visszatér a tárolt csúcsok számávalHozzuk létre a LimitedGraph
nevű osztályt a elte.hu.eltecom.graph
csomagban. Ez az osztály megvalósítja a PrintableGraph
interfészt. Egy irányított gráfot valósít meg mátrixos ábrázolással.
nodes
nevű, rejtett láthatóságú, User
típusú objektumokat tároló, végleges (nem módosítható) tömb mezője. Ez fogja tárolni a gráf csúcsait.edges
nevű, rejtett láthatóságú, logikai értékeket tároló, végleges (nem módosítható) mátrix (tömbök tömbje) mezője. Ez fogja tárolni a gráf éleit. Ha a mátrix (i,j) értéke igaz, akkor az azt jelenti, hogy a i-dik felhasználó ismeri a j-dik felhasználótfindNode
nevű, Integer
visszatérési értékű metódusa, mely User
típusú objektumot vár paraméterül. Ez a metódus megkeresi azt a csúcsot, melynek értéke megegyezik a paraméterül kapott értékkel és visszatér annak az indexével. Ha ilyet nem talál, akkor null
értékkel térjen vissza.Implementálja a PrintableGraph intefész metódusait, ezek során használja a findNode
metódust ahol csak lehet / érdemes.
addNode
: megkeresi az első szabad helyet a gráfban (null érték a csúcsokat tároló tömbben) és beállítja értéknek a paraméterül kapott objektumot. Ha nincs a gráfban szabad hely (elérte a gráf a kezedeti limitet), akkor UnsupportedGraphOperation
-t kivételt vált ki.removeNode
: ha található csúcs a paraméterül adott értékkel, akkor kitörli azt, különben pedig NodeNotFoundException
-t vált ki. A törlendő csúcsot a többi csúcs szomszédjai közül is ki kell törölni (ezeket a kapcsolatokat reprezentáló élek értékét hamisra állítjuk).linkNodes
: ha található csúcs a paraméterül adott két értékkel, akkor az első paraméter szomszédos csúcsaihoz adja a második csúcsot (ezt a kapcsolatot reprezentáló él értéket igazra állítjuk)getNodeNumber
: visszatér a tárolt csúcsok számával (csak a valódi csúcsok számával!)print
: visszatér a gráf szöveges reprezentációjával. Figyeljünk oda a szöveg generálása közben, hogy egy gráf lehet nagyon nagy is. A formátum legyen a következő (csak valós csúcsokra):[felhasználó_1_szöveges_reprezentációja]
...
[felhasználó_n_szöveges_reprezentációja]
[csúcspont_1_szomszédainak_értékei]
...
[csúcspont_n_szomszédainak_értékei]
például: HUN A HUN B false true true false
Hozzuk létre a GraphFactory
nevű osztályt a elte.hu.eltecom.graph
csomagban.
initGraph
nevű, paraméter nélküli, Graph
visszatérési értékű metódusa. UnlimitedGraph
objektummal térjen vissza.initGraph
metódust egy int
paraméterű metódussal. Ez a paraméter a gráf méretét jelöli. Ha ez a szám 1-nél kisebb, akkor null
értékkel tér vissza, különben pedig egy LimitedGraph
objektummal.Hozzon létre egy Language
felsorolási típust a elte.hu.eltecom.user
csomagban, melynek három értéke van: HUN, ENG, GER
Hozzon létre egy User
osztályt a elte.hu.eltecom.user
csomagban.
userCounter
nevű, int típusú, 0 kezdeti értékű, rejtett láthatóságú osztály szintű mezője. Ezzel számoljuk a létrejött objektumok számátid
nevű, int típusú végleges, rejtett mezőjeuserName
nevű, String típusú mezője, mely a leszármazottak számára is elérhetőlanguage
nevű, Language típusú mezője, mely a leszármazottak számára is elérhetőid
-t a korábban létrehozott objektumok számának. (első felhasználó azonosítója 0 lesz, másodiké 1 és így tovább)id
mezőnek getter metódusauserName
mezőnek getter és setter metódusaequals
és a hashCode
metódusokat. Ezek csak az id mező alapján kalkuláljanak.írjuk felül a toString
metódust az alábbi formára:
[nyelv_kódja][szóköz][felhasználó_neve]
Hozzon létre egy AdminUser
osztályt a elte.hu.eltecom.user
csomagban. Származzon a User
osztályból.
manager
nevű, Manager
típusú rejtett mezője.kickUser
nevű, visszatérési érték nélküli metódusa, mely paraméterül kap egy User
objektumot. Ebben a metódusban törli a felhasználót a manager
segítségével.írjuk felül a toString
metódust az alábbi formára (plusz # karakter a felhasználó neve előtt):
[nyelv_kódja][szóköz]#[felhasználó_neve]
Hozzon létre egy Manager
osztályt a elte.hu.eltecom
csomagban. Ezen az osztályon keresztül fogjuk kezelni a gráfot.
graph
nevű, Graph
típusú végleges mezőjeusers
nevű, Map
típusú mezője, melyenk kulcsai Integer
, értékei User
típusúak. A felhasználókat fogja tárolni HashMap
objektummal inicializáljacreateUser
metódusa, mely egy User
objektumot vár paraméterül és tér is vissza vele, metódus visszatérési értéke User típusú
. Eltárolja a felhasználót és létrehoz egy csúcsot a gráfban.createUser
metódust, melynek egy String
és egy Language
típusú paramétere van. Ez a metódus hívja meg az előző createUser
metódust egy újonnan létrehozott User
objektummal (a paraméterek segítségével)createAdminUser
nevű metódusa, melynek egy String
és egy Language
típusú paramétere van és User
típusú visszatérési értéke. Ez hívja meg a createUser
metódust egy AdminUser
típusú objektummal.getUserById
nevű, User
visszatérési értékű metódusa, mely egy int típusú paramétert vár. Ez a paraméter a felhasználó azonosítóját jelöli. A metódus visszatér a letároltak közül a paraméterként kapott azonosítóval rendelkező User
objektummal.linkUsers
nevű metódusa, mely két User
típusú objektumot vár paraméterül. A második objektumot állítja be az első ismerősének a gráfban.deleteUser
metódusa, visszatérés nélküli, egy User
típusú paraméterrel. Ezt a felhasználót akarjuk majd törölni. Törölni kell a gráfból, illetve az eltárolt felhasználók közül is (Figyelem, addig a tároltak közül ne töröljük, amíg a gráfból nem sikerült).Hozzon létre egy FileManager
osztályt a elte.hu.eltecom.file
csomagban. Ez az osztály felel a gráf beolvasásáért illetve fájlba írásáért.
legyen egy writeGraph
osztályszintű metódusa, visszatérési érték nélkül, Manager
típusú és String
típusú paraméterekkel. A String
típusú a szükséges fájlokat tartalmazó mappa elérési útvonala. Ebben a mappában hozza létre a output.txt
fájlt és írja ki bele a gráf tartalmát a következő formátumban:
[gráf_mérete]
[felhasználó_1_szöveges_reprezentációja]
...
[felhasználó_n_szöveges_reprezentációja]
[csúcspont_1_szomszédainak_értékei]
...
[csúcspont_n_szomszédainak_értékei]
legyen egy readGraph
osztályszintű metódusa String
típusú paraméterrel és Manager
visszatérési értékkel. A String
típusú a szükséges fájlokat tartalmazó mappa elérési útvonala. Ebben a mappában található input.txt
-t fájlt olvassa be. GraphFactory
osztály int paraméterrel parametrizált metódusán keresztül hozza létre a gráfot. Hozzon létre egy Manager
típusú objektumot és ezen keresztül hozza létre a felhasználókat és a közöttük levő kapcsolatokat a fájl alapján. Amennyiben a felhasználó a nevében adminnak van jelölve, akkor az ennek megfelelő metódussal kell létrehozni.
Hozza létre a Main
osztályt a elte.hu.eltecom
csomagban. Ennek legyen egy main
metódusa, ez lesz a program belépési pontja. Parancssori argumentunként adjuk át a mappa elérési útvonalát, mely tartalmazza a bemenő fájlt. Ha nem adták át, akkor térjen vissza a program. Olvassa be a fájlt. A létrejött Manager
objektumon keresztül kérje le a felhasználót 3-as id-val. Ha ez a felhasználó admin, akkor a manageren kickUser
metódus segítségével rakja ki a rendszerből az 1 és 2 azonosítóval rendelkező felhasználókat. Hozzon létre egy Grabowski nevű felhasználót magyar nyelvvel. Ő jelölje be az admin felhasználót ismerősének. Írjak ki fájlba az gráfot ugyanabba a mappába.