Colocviu POO 2015-2016: Diferență între versiuni

De la WikiLabs
Jump to navigationJump to search
Fără descriere a modificării
Fără descriere a modificării
 
(Nu s-au afișat 9 versiuni intermediare efectuate de același utilizator)
Linia 1: Linia 1:
Să se scrie o clasă <code>seriaf.poo.colocviu.Server</code> care să accepte conexiuni de la clienți și pentru orice client care se conectează, să serializeze un obiect de tip String reprezentand un citat faimos, ales aleator dintr-un vector.
Să se scrie o interfață <code>seriaf.poo.colocviu.PasswordPolicy</code> care să definească o singură metodă: <code>boolean verify(String username, String[] oldPasswords, String newPassword)</code>.


Reguli suplimentare:
Să se scrie o clasă <code>seriaf.poo.colocviu.LengthPasswordPolicy</code>, care implementeze interfața <code>seriaf.poo.colocviu.PasswordPolicy</code> cu următoarele metode:
# Clasa <code>Server</code> trebuie aibă un constructor cu un argument de tip int: port. Constructorul nu arunca exceptii.
* Un constructor <code>LengthPasswordPolicy(int minLength, int maxLength)</code> care va arunca o excepție de tip <code>java.lang.IllegalArgumentException</code> dacă minLength e mai mic decât 0, dacă maxLength e mai mic sau egal decât 0 sau dacă minLength e mai mare ca maxLength.
# Clasa <code>Server</code> trebuie să aibă o metodă <code>String getRandomQuote()</code>, apelabilă fără un obiect de tip <code>Server</code>, și care la fiecare apel să întoarcă un String reprezentând un citat dintr-o listă de cel puțin 5 citate (scrise de voi, sau cautate pe Internet). Vezi clasa <code>java.util.Random</code>
* Metoda <code>boolean verify(String username, String[] oldPasswords, String newPassword)</code> care întoarcă ''true'' dacă '''newPassword''' are lungimea mai mare sau egală decât '''minLength''' și mai mică sau egală decât '''maxLength'''. Dacă '''newPassword''' este '''null''', metoda va întoarce ''false''
# Clasa <code>Server</code> trebuie să aibă o metodă <code>void listen()</code>, care să accepte conexiuni de la clienți într-o buclă infinită, pe portul dat constructorului, și pentru fiecare client conectat să serializeze un String obțiunt prin apelul metodei <code>String getRandomQuote()</code>. Această metodă trebuie poată arunca excepții.
# Clasa <code>Server</code> trebuie să fie executabilă, iar metoda <code>main</code> trebuie să instanțieze un obiect de tip <code>Server</code>, folosind ca port primul argument specificat la execuție și sa apeleze pentru el metoda <code>listen</code>.


Să se scrie o clasă <code>seriaf.poo.colocviu.Client</code> care să să conecteze la un Server, să citească de la server un String reprezentand un citat pe care să îl afișeze pe ecran.
Să se scrie o clasă <code>seriaf.poo.colocviu.RepeatPasswordPolicy</code>, care să implementeze interfața <code>seriaf.poo.colocviu.PasswordPolicy</code> cu următoarea metodă:
*Metoda <code>boolean verify(String username, String[] oldPasswords, String newPassword)</code> care să întoarcă ''false'' dacă '''newPassword''' este egal cu oricare din elementele din vectorul '''oldPasswords'''. *Dacă '''newPassword''' este '''null''', metoda va întoarce ''false''. Dacă '''oldPasswords''' este '''null''', metoda va întoarce ''true''.


Reguli suplimentare:
Să se scrie o clasă <code>seriaf.poo.colocviu.UserNamePasswordPolicy</code>, care implementeze interfața <code>seriaf.poo.colocviu.PasswordPolicy</code> cu următoarea metodă:
# Clasa <code>Client</code> trebuie aibă un constructor cu două argumente: String host, int port. Constructorul nu arunca exceptii.
* Metoda <code>boolean verify(String username, String[] oldPasswords, String newPassword)</code> care să întoarcă ''false'' dacă '''newPassword''' este inclus în '''username''' sau dacă '''username''' este inclus în '''newPassword'''. Dacă '''newPassword''' sau '''username''' este '''null''', metoda va întoarce ''false''.
# Clasa <code>Client</code> trebuie aibă o metodă <code>String getQuote()</code>, care să se conecteze la un server care rulează host-ul și portul specificat constructorului și să întoarcă un obiect de tip String deserializat dinspre server. Această metodă trebuie să poată arunca excepții.
 
# Clasa <code>Client</code> trebuie să fie executabilă, iar metoda <code>main</code> trebuie instanțieze un obiect de tip <code>Client</code>, folosind ca host și port primele două argumente specificate la execuție, apeleze pentru el metoda <code>getQuote</code> și să afișeze string-ul obținut pe ecran.
Să se scrie o clasă <code>seriaf.poo.colocviu.PasswordPolicySet</code>, care implementeze interfața <code>seriaf.poo.colocviu.PasswordPolicy</code> cu următoarele metode:
* Un constructor <code>PasswordPolicySet(int minPassRules)</code> care va arunca o excepție de tip <code>java.lang.IllegalArgumentException</code> dacă minPassRules e mai mic decât 0.
* O metodă void <code>addPolicy(PasswordPolicy policy)</code> care adauge '''policy''' într-o listă internă menținută în obiect.
* Metoda <code>boolean verify(String username, String[] oldPasswords, String newPassword)</code> care să întoarcă ''true'' dacă cel puțin '''minPassRules''' reguli din lista menținută întorc '''true'''. Dacă '''minPassRules''' este 0, înseamnă că '''TOATE''' regulile din listă trebuie întoarcă '''true''' pentru ca metoda să întoarcă true.
 
Pentru testare puteți folosi următoarea clasă:
<syntaxhighlight lang="java">
package seriaf.poo.colocviu;
 
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        PasswordPolicy set = createSet();
 
        Scanner scanner = new Scanner(System.in);
        System.out.print("Username: ");
        String username = scanner.next();
        System.out.print("Number of old passwords: ");
        int oldPasswordCount = scanner.nextInt();
        String[] oldPasswords = new String[oldPasswordCount];
        for (int i = 0; i < oldPasswordCount; i++) {
            System.out.printf("Old password #%d: ", i + 1);
            oldPasswords[i] = scanner.next();
        }
        System.out.print("New password: ");
        String newPassword = scanner.next();
 
        System.out.println("Password meets the password policies: " + set.verify(username, oldPasswords, newPassword));
    }
 
    private static PasswordPolicy createSet() {
        PasswordPolicySet set = new PasswordPolicySet(0);
        set.addPolicy(new LengthPasswordPolicy(6, 12));
        set.addPolicy(new RepeatPasswordPolicy());
        set.addPolicy(new UserNamePasswordPolicy());
        return set;
    }
 
}
 
</syntaxhighlight>

Versiunea curentă din 20 ianuarie 2016 09:49

Să se scrie o interfață seriaf.poo.colocviu.PasswordPolicy care să definească o singură metodă: boolean verify(String username, String[] oldPasswords, String newPassword).

Să se scrie o clasă seriaf.poo.colocviu.LengthPasswordPolicy, care să implementeze interfața seriaf.poo.colocviu.PasswordPolicy cu următoarele metode:

  • Un constructor LengthPasswordPolicy(int minLength, int maxLength) care va arunca o excepție de tip java.lang.IllegalArgumentException dacă minLength e mai mic decât 0, dacă maxLength e mai mic sau egal decât 0 sau dacă minLength e mai mare ca maxLength.
  • Metoda boolean verify(String username, String[] oldPasswords, String newPassword) care să întoarcă true dacă newPassword are lungimea mai mare sau egală decât minLength și mai mică sau egală decât maxLength. Dacă newPassword este null, metoda va întoarce false

Să se scrie o clasă seriaf.poo.colocviu.RepeatPasswordPolicy, care să implementeze interfața seriaf.poo.colocviu.PasswordPolicy cu următoarea metodă:

  • Metoda boolean verify(String username, String[] oldPasswords, String newPassword) care să întoarcă false dacă newPassword este egal cu oricare din elementele din vectorul oldPasswords. *Dacă newPassword este null, metoda va întoarce false. Dacă oldPasswords este null, metoda va întoarce true.

Să se scrie o clasă seriaf.poo.colocviu.UserNamePasswordPolicy, care să implementeze interfața seriaf.poo.colocviu.PasswordPolicy cu următoarea metodă:

  • Metoda boolean verify(String username, String[] oldPasswords, String newPassword) care să întoarcă false dacă newPassword este inclus în username sau dacă username este inclus în newPassword. Dacă newPassword sau username este null, metoda va întoarce false.

Să se scrie o clasă seriaf.poo.colocviu.PasswordPolicySet, care să implementeze interfața seriaf.poo.colocviu.PasswordPolicy cu următoarele metode:

  • Un constructor PasswordPolicySet(int minPassRules) care va arunca o excepție de tip java.lang.IllegalArgumentException dacă minPassRules e mai mic decât 0.
  • O metodă void addPolicy(PasswordPolicy policy) care să adauge policy într-o listă internă menținută în obiect.
  • Metoda boolean verify(String username, String[] oldPasswords, String newPassword) care să întoarcă true dacă cel puțin minPassRules reguli din lista menținută întorc true. Dacă minPassRules este 0, înseamnă că TOATE regulile din listă trebuie să întoarcă true pentru ca metoda să întoarcă true.

Pentru testare puteți folosi următoarea clasă:

package seriaf.poo.colocviu;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        PasswordPolicy set = createSet();

        Scanner scanner = new Scanner(System.in);
        System.out.print("Username: ");
        String username = scanner.next();
        System.out.print("Number of old passwords: ");
        int oldPasswordCount = scanner.nextInt();
        String[] oldPasswords = new String[oldPasswordCount];
        for (int i = 0; i < oldPasswordCount; i++) {
            System.out.printf("Old password #%d: ", i + 1);
            oldPasswords[i] = scanner.next();
        }
        System.out.print("New password: ");
        String newPassword = scanner.next();

        System.out.println("Password meets the password policies: " + set.verify(username, oldPasswords, newPassword));
    }

    private static PasswordPolicy createSet() {
        PasswordPolicySet set = new PasswordPolicySet(0);
        set.addPolicy(new LengthPasswordPolicy(6, 12));
        set.addPolicy(new RepeatPasswordPolicy());
        set.addPolicy(new UserNamePasswordPolicy());
        return set;
    }

}