Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni4 pagine

Directory

Il documento tratta la ristrutturazione di un'applicazione per la gestione di file e directory, evidenziando problemi di implementazione e proponendo soluzioni. Vengono presentate domande riguardanti l'implementazione di classi astratte, gestione dei permessi e test di funzionalità. Il documento richiede anche la creazione di diagrammi e metodi per migliorare la struttura e la funzionalità del codice esistente.

Caricato da

vagig72489
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
4 visualizzazioni4 pagine

Directory

Il documento tratta la ristrutturazione di un'applicazione per la gestione di file e directory, evidenziando problemi di implementazione e proponendo soluzioni. Vengono presentate domande riguardanti l'implementazione di classi astratte, gestione dei permessi e test di funzionalità. Il documento richiede anche la creazione di diagrammi e metodi per migliorare la struttura e la funzionalità del codice esistente.

Caricato da

vagig72489
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

NOME __________________________________ COGNOME____________________________________

MATRICOLA _______________________________

Una software house sta ristrutturando una applicazione; in particolare, deve essere migliorato il codice per la
gestione di file e directory. Una directory contiene una collezione di file. File e directory hanno un nome, un
proprietario, una dimensione; la dimensione di una directory è data dalla somma delle dimensioni dei file in essa
contenuti. Ad ogni file e directory sono associati due insiemi: uno modella gli utenti che hanno permesso di lettura,
l’altro gli utenti che hanno permesso di modifica.

Domanda 1 (10%) Il programma non funziona correttamente: il metodo boolean puoLeggere(Utente u)


(e analogamente il metodo boolean puoModificare(Utente u)) della classe File (e analogamente gli
omonimi metodi della classe Directory) nel seguente test ritorna false, mentre ci si aspetta che ritorni true.

public boolean test() {


File f = new File(“prova”, 20, new Utente(“admin”));
[Link](new Utente(“lettore”));
return [Link](new Utente(“lettore”));
}
Spiegare (in poche righe) il motivo di questa anomalia e scrivere il codice per risolvere il problema. È possibile
modificare le classi date e/o introdurne di nuove, se necessario; ovviamente non è possibile modificare il test.

Domanda 2 (30%) Ci si è resi conto che l’implementazione attuale ha vari limiti. Innanzitutto, una directory può a
sua volta contenere altre directory. Un progettista ci suggerisce di introdurre una classe astratta Risorsa, che
deve essere estesa da File e Directory. Una directory contiene quindi una collezione di oggetti Risorsa.
Scrivere il codice della classe astratta Risorsa e riscrivere (per intero) il codice delle classi File e Directory
affinché la estendano correttamente.

Domanda 3 (30%) Un altro limite dell’implementazione attuale deriva dal fatto che oltre ai permessi di lettura e
modifica, a file e directory possono essere associati altri permessi (ad es. cancellazione, esecuzione, etc.). Per
ovviare a questo problema ci viene suggerito di creare la classe Permesso, che modella una tipologia di permesso
e della quale ci viene fornita una bozza (vedi codice), e di sostituire i due insiemi possonoLeggere e
possonoModificare con una mappa Map<Permesso, Set<Utente>> permessi, che associa una
tipologia di permesso ad un insieme di utenti (per i quali vale la tipologia di permesso specificata nella chiave).
Completare il codice della classe Permesso e riscrivere il codice della classe Risorsa per implementare queste
modifiche. Si suggerisce di:

• sostituire i metodi boolean puoLeggere(Utente utente) e


boolean puoModificare(Utente utente) con il metodo
boolean haIlPermesso(Permesso permesso, Utente utente);
• sostituire i metodi abilitaLettura(Utente utente) e
abilitaModifica(Utente utente) con il metodo
void concediPermesso(Permesso permesso, Utente utente)

Domanda 4 (10%) Dato il seguente metodo, disegnare il diagramma oggetti quando l’applicazione arriva
all’istruzione marcata con il commento /*******/
public void dummy() {
List< Permesso> permessi = new LinkedList<Permesso>();
Permesso p1 = new Permesso("lettura");
Permesso p2 = new Permesso("scrittura");
Permesso p3 = new Permesso("modifica");
[Link](p2);
[Link](p1);
p1 = p3;
[Link]("esecuzione");
[Link](new Permesso ("cancellazione"));
[Link](p2);
[Link]("scrittura"); /*******/
}
Domanda 5 (10%) Aggiungere alla classe Risorsa il metodo List<Permesso> permessiDi(Utente
utente), che restituisce la lista dei permessi associati all’utente passato come parametro; i permessi della lista
devono essere ordinati alfabeticamente; non è possibile modificare la classe Permesso.

Domanda 6 (10%) Scrivere una classe di test per la classe Directory (nella versione ottenuta realizzando le
modifiche della domanda 3). Il test deve offrire almeno 3 test case per testare la correttezza del metodo
concediPermesso(Permesso permesso, Utente utente) e 3 test case per testare la correttezza del
metodo List<Permesso> permessiDi(Utente utente).
import [Link].*;
public class File {
private int dimensioni;
private Utente proprietario;
private String nome;
private List<Utente> possonoLeggere;
private List<Utente> possonoModificare;

public File(String nome, int dimensioni, Utente proprietario) {


[Link] = nome;
[Link] = dimensioni;
[Link] = proprietario;
[Link] = new ArrayList<Utente>();
[Link] = new ArrayList<Utente>();
}

public Utente getProprietario() {


return [Link];
}

public String getNome() {


return [Link];
}

public int getDimensioni() {


return [Link];
}

public void setDimensioni(int dimensioni) {


[Link] = dimensioni;
}

public boolean puoLeggere(Utente utente){


return [Link](utente);
}

public boolean puoModificare(Utente utente){


return [Link](utente);
}

public void abilitaLettura(Utente utente) {


[Link](utente);
}

public void abilitaModifica(Utente utente) {


[Link](utente);
}

public int hashcode(){


return [Link]();
}

public boolean equals(Object that) {


File f = (File) that;
return [Link]([Link]());
}
}

public class Utente {


private String nome;

public Utente(String nome) { [Link] = nome; }

public void setNome(String nome) { [Link] = nome; }

public String getNome() { return [Link]; }


}
public class Permesso {

public String nome;

public Permesso(String nome) { [Link] = nome; }


public void setNome(String nome) { [Link] = nome; }
public String getNome() { return [Link]; }
}

import [Link].*;

public class Directory {


private Utente proprietario;
private String nome;
private List<Utente> possonoLeggere;
private List<Utente> possonoModificare;
private Set<File> files;

public Directory(String nome, Utente proprietario) {


[Link] = nome;
[Link] = proprietario;
[Link]= new ArrayList<Utente>();
[Link] = new ArrayList<Utente>();
[Link] = new HashSet<File>();
}

public Utente getProprietario() {


return [Link];
}

public String getNome() {


return [Link];
}

public int getDimensioni() {


int dimensioni = 0;
for(File file : [Link])
dimensioni += [Link]();
return dimensioni;
}

public boolean puoLeggere(Utente utente){


return [Link](utente);
}

public boolean puoModificare(Utente utente){


return [Link](utente);
}

public void abilitaLettura(Utente utente) {


[Link](utente);
}

public void abilitaModifica(Utente utente) {


[Link](utente);
}

Potrebbero piacerti anche