Diferență între revizuiri ale paginii „POO Lab Lucrarea 3”
De la WikiLabs
Jump to navigationJump to search (Anularea modificării 5545 făcute de Radu Hobincu (Discuție)) |
|||
(Nu s-au afișat 10 versiuni intermediare efectuate de același utilizator) | |||
Linia 13: | Linia 13: | ||
== Cerințe == | == Cerințe == | ||
− | # Realizați o clasă numită '''ServerConfig''' care are ca rol citirea dintr-un fișier de configurare a unor parametri, pe care îi vom folosi ulterior în aplicația server. Această clasă trebuie să respecte următoarele constrângeri: | + | # Realizați o clasă numită '''seriaf.poo.server.config.ServerConfig''' (seriaf.poo.server.config este numele pachetului) care are ca rol citirea dintr-un fișier de configurare a unor parametri, pe care îi vom folosi ulterior în aplicația server. Această clasă trebuie să respecte următoarele constrângeri: |
#* Clasa trebuie să dispună de doi constructori: | #* Clasa trebuie să dispună de doi constructori: | ||
#*# Unul cu un argument de tip String care va reprezenta fișierul de configurare citit | #*# Unul cu un argument de tip String care va reprezenta fișierul de configurare citit | ||
#*# Unul fără argumente, care va considera implicit fișierul de configurare ca fiind ''server.conf''. | #*# Unul fără argumente, care va considera implicit fișierul de configurare ca fiind ''server.conf''. | ||
#* Obiectele de tip '''ServerConfig''' trebuie să citească fișierul de configurare și apoi să expună parametrii citiți din fișier prin metode. | #* Obiectele de tip '''ServerConfig''' trebuie să citească fișierul de configurare și apoi să expună parametrii citiți din fișier prin metode. | ||
− | #* | + | #* Constructorii din clasa '''ServerConfig''' trebuie să arunce excepții dacă apar probleme la citirea sau interpretarea fișierului de configurare: |
− | #*# '''IOException''' dacă fișierul specificat nu există sau nu se poate citi (această excepție este aruncată de către metodele care aparțin claselor de tip stream, deci nu este necesară decât aruncarea ei mai departe). | + | #*# '''java.io.IOException''' dacă fișierul specificat nu există sau nu se poate citi (această excepție este aruncată de către metodele care aparțin claselor de tip stream, deci nu este necesară decât aruncarea ei mai departe). |
− | #*# '''InvalidFormatException''' dacă cel puțin o linie din fișier nu corespunde formatului așteptat (acest tip de excepție nu există și va trebui creat). | + | #*# '''seriaf.poo.server.exceptions.InvalidFormatException''' dacă cel puțin o linie din fișier nu corespunde formatului așteptat (acest tip de excepție nu există și va trebui creat). |
− | #*# '''UnknownKeyException''' dacă în fișier există configurată o proprietate necunoscută (acest tip de excepție nu există și va trebui creat). | + | #*# '''seriaf.poo.server.exceptions.UnknownKeyException''' dacă în fișier există configurată o proprietate necunoscută (acest tip de excepție nu există și va trebui creat). |
− | #*# '''MissingKeyException''' dacă din fișier lipsește una din proprietățile așteptate (acest tip de excepție nu există și va trebui creat). | + | #*# '''seriaf.poo.server.exceptions.MissingKeyException''' dacă din fișier lipsește una din proprietățile așteptate (acest tip de excepție nu există și va trebui creat). |
#* Clasa trebuie să fie imutabilă. | #* Clasa trebuie să fie imutabilă. | ||
# Următoarele proprietăți sunt singurele valide, care trebuie să existe în fișierul de configurare: | # Următoarele proprietăți sunt singurele valide, care trebuie să existe în fișierul de configurare: | ||
− | #* TCP_PORT - reprezintă portul TCP pe care server-ul e configurat să accepte conexiuni | + | #* TCP_PORT - reprezintă portul TCP pe care server-ul e configurat să accepte conexiuni și poate fi citit din obiectele de tip ServerConfig prin metoda '''int getTcpPort()''' |
− | #* MAX_CLIENTS - reprezintă numărul maxim de clienți pe care serverul îl poate deservi | + | #* MAX_CLIENTS - reprezintă numărul maxim de clienți pe care serverul îl poate deservi, și care poate fi citit din obiectele de tip ServerConfig prin metoda '''int getMaxClients()''' |
# Realizați un test pentru această clasă (care constă în citirea unui fișier și afișarea pe ecran a valorilor citite) pe care să-l plasați în metoda main din clasa '''Main'''. | # Realizați un test pentru această clasă (care constă în citirea unui fișier și afișarea pe ecran a valorilor citite) pe care să-l plasați în metoda main din clasa '''Main'''. | ||
Linia 39: | Linia 39: | ||
Un exemplu de fișier de configurare: | Un exemplu de fișier de configurare: | ||
<syntaxhighlight lang="xorg_conf"> | <syntaxhighlight lang="xorg_conf"> | ||
− | #this is a | + | #this is a comment line |
− | # this is | + | # this is another comment line, which should be ignored, followed by a line with spaces, that should also be ignored |
− | + | ||
+ | MAX_CLIENTS=100 | ||
TCP_PORT=9000 | TCP_PORT=9000 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | '''Note:''' | ||
+ | * Cele trei tipuri de excepții care trebuie definite au implementări foarte simple. Trebuie definite ca niște clase care extind clasa '''Exception''', și nu este nevoie să conțină decât definiția unui constructor cu un argument de tip String care nu face altceva decât să apeleze constructorul superclasei. | ||
+ | * Fișierele predate vor fi implementările Java a următoarelor clase: '''ServerConfig''', '''Main''', '''Message''', '''PrivateMessage''', '''InvalidFormatException''', '''UnknownKeyException''' și '''MissingKeyException'''. | ||
+ | * Următoarele clase și metode vă pot fi de folos în realizarea temei. Căutați-le în documentația API: | ||
+ | ** String.trim | ||
+ | ** String.charAt | ||
+ | ** String.contains | ||
+ | ** String.startsWith | ||
+ | ** String.equals | ||
+ | ** String.split | ||
+ | ** Integer.parseInt | ||
+ | ** BufferedReader.readLine | ||
+ | * Din cauza faptului că puteți avea două obiecte de tip '''String''' diferite (cu referințe diferite) dar care conțin același text, iar operatorul == compară referințele, modul corect prin care se compară două String-uri este prin apelarea metodei equals: | ||
+ | <syntaxhighlight lang="java"> | ||
+ | String a = "abc"; | ||
+ | String b = new String(a); | ||
+ | if(a == b) { // <- incorect, evaluarea va întoarce false | ||
+ | //... | ||
+ | } | ||
+ | if(a.equals(b)) { // <- corect, evaluarea va întoarce true | ||
+ | //... | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight > | ||
+ | |||
+ | Predare: | ||
+ | * Codul se va preda și corecta automat pe platforma [http://homework.dcae.pub.ro/WebObjects/Web-CAT.woa WebCat]. | ||
+ | * <font color="red">'''Atenție:'''</font> Orice nerespectare ale indicațiilor de predare poate duce la pierderea în totalitate a punctajului. | ||
+ | |||
+ | '''<font color="red">Atenție: Temele vor fi verificate anti-plagiat cu soft-uri specializate. Orice temă copiată va fi penalizată (atât sursa cât și copia) cu 100% din punctaj, fără posibilitate de refacere.</font>''' |
Versiunea curentă din 28 octombrie 2017 23:50
Noțiuni și cunoștințe necesare
- Paradigma Obiect-Orientare; Clase și obiecte
- Noțiuni despre Java
- Realizarea și execuția unui program Java
- Sintaxa limbajului Java; Structura lexicală a unui program
- Convenții de programare
- Noțiuni avansate de programare obiect-orientată
- Java Application Programming Interface (API)
- Tratarea excepțiilor
- Stream-uri de Input/Output
Cerințe
- Realizați o clasă numită seriaf.poo.server.config.ServerConfig (seriaf.poo.server.config este numele pachetului) care are ca rol citirea dintr-un fișier de configurare a unor parametri, pe care îi vom folosi ulterior în aplicația server. Această clasă trebuie să respecte următoarele constrângeri:
- Clasa trebuie să dispună de doi constructori:
- Unul cu un argument de tip String care va reprezenta fișierul de configurare citit
- Unul fără argumente, care va considera implicit fișierul de configurare ca fiind server.conf.
- Obiectele de tip ServerConfig trebuie să citească fișierul de configurare și apoi să expună parametrii citiți din fișier prin metode.
- Constructorii din clasa ServerConfig trebuie să arunce excepții dacă apar probleme la citirea sau interpretarea fișierului de configurare:
- java.io.IOException dacă fișierul specificat nu există sau nu se poate citi (această excepție este aruncată de către metodele care aparțin claselor de tip stream, deci nu este necesară decât aruncarea ei mai departe).
- seriaf.poo.server.exceptions.InvalidFormatException dacă cel puțin o linie din fișier nu corespunde formatului așteptat (acest tip de excepție nu există și va trebui creat).
- seriaf.poo.server.exceptions.UnknownKeyException dacă în fișier există configurată o proprietate necunoscută (acest tip de excepție nu există și va trebui creat).
- seriaf.poo.server.exceptions.MissingKeyException dacă din fișier lipsește una din proprietățile așteptate (acest tip de excepție nu există și va trebui creat).
- Clasa trebuie să fie imutabilă.
- Clasa trebuie să dispună de doi constructori:
- Următoarele proprietăți sunt singurele valide, care trebuie să existe în fișierul de configurare:
- TCP_PORT - reprezintă portul TCP pe care server-ul e configurat să accepte conexiuni și poate fi citit din obiectele de tip ServerConfig prin metoda int getTcpPort()
- MAX_CLIENTS - reprezintă numărul maxim de clienți pe care serverul îl poate deservi, și care poate fi citit din obiectele de tip ServerConfig prin metoda int getMaxClients()
- Realizați un test pentru această clasă (care constă în citirea unui fișier și afișarea pe ecran a valorilor citite) pe care să-l plasați în metoda main din clasa Main.
Fișierul de configurare citit de clasa ServerConfig este un fișier text, format din linii de forma următoare:
PROPERTY=value
- Orice linie care începe cu caracterul #, precedat sau nu de spații sau caractere "tab", se consideră a fi comentariu și nu se ia în considerare.
- Liniile din fișier care nu conțin nici un caracter printabil, ci doar spații și/ sau tab-uri, nu se iau în considerare.
- Nu se iau în considerare spațiile (sau tab-urile) de la începutul sau sfârșitul liniilor.
Un exemplu de fișier de configurare:
#this is a comment line
# this is another comment line, which should be ignored, followed by a line with spaces, that should also be ignored
MAX_CLIENTS=100
TCP_PORT=9000
Note:
- Cele trei tipuri de excepții care trebuie definite au implementări foarte simple. Trebuie definite ca niște clase care extind clasa Exception, și nu este nevoie să conțină decât definiția unui constructor cu un argument de tip String care nu face altceva decât să apeleze constructorul superclasei.
- Fișierele predate vor fi implementările Java a următoarelor clase: ServerConfig, Main, Message, PrivateMessage, InvalidFormatException, UnknownKeyException și MissingKeyException.
- Următoarele clase și metode vă pot fi de folos în realizarea temei. Căutați-le în documentația API:
- String.trim
- String.charAt
- String.contains
- String.startsWith
- String.equals
- String.split
- Integer.parseInt
- BufferedReader.readLine
- Din cauza faptului că puteți avea două obiecte de tip String diferite (cu referințe diferite) dar care conțin același text, iar operatorul == compară referințele, modul corect prin care se compară două String-uri este prin apelarea metodei equals:
String a = "abc";
String b = new String(a);
if(a == b) { // <- incorect, evaluarea va întoarce false
//...
}
if(a.equals(b)) { // <- corect, evaluarea va întoarce true
//...
}
Predare:
- Codul se va preda și corecta automat pe platforma WebCat.
- Atenție: Orice nerespectare ale indicațiilor de predare poate duce la pierderea în totalitate a punctajului.
Atenție: Temele vor fi verificate anti-plagiat cu soft-uri specializate. Orice temă copiată va fi penalizată (atât sursa cât și copia) cu 100% din punctaj, fără posibilitate de refacere.