1. A.A 2005/2006 C.D.L ITPS
Alunni Centrone Sergio, Gadaleta Fabio
Gruppo BaelSoft Production
Corso di Studio : Programmazione
Analisi, progettazione, codifica e test di un caso di studio.
È stata commissionata la realizzazione del seguente programma :
Realizzare attraverso opportune classi (>1) le seguenti funzionalità di un micro motore di ricerca personale
VIRGINIO Desktop
1. indicizzazione delle parole presenti nei file contenuti in una cartella indicata dall'utente (txt o testo di
pagine html).
per ogni parola dovrà essere associata la lista delle posizioni (path) dei file
tali info risiederanno in un opportuno file indice del motore.
a scelta è possibile trascurare le parole troppo comuni (stopword) di cui esistono liste
2. ricerca OR: su input di una o più stringhe, vanno restituite le posizioni di tutti i file in cui compaia
almeno una delle stringhe.
3. ricerca AND: su input di una o più stringhe, vanno restituite le posizioni di tutti i file in cui compaiano
tutte le stringhe.
1. Analisi
Per una realizzazione efficiente del progetto sono stati chiesti al committente alcuni esempi
dell’utilizzo del micro motore di ricerca :
Data la cartella in cui sono presenti 2 file che contengono le seguenti stringhe
• File1 conterrà “ciao come va”
• File 2 conterrà “va tutto bene “
Dopo l’indicizzazione il file indice di Virginio Desktop conterrà :
ciao percorso file 1
come percorso file1
va percorso file1 percorso file 2
tutto percorso file 2
bene percorso file 2
2. nel caso in cui nel file siano presenti articoli, preposizioni o simboli vari di punteggiatura, saranno
considerati come stopword e saranno ignorate al momento dell’indicizzazione.
Quando verrà eseguita una nuova indicizzazione il contenuto del file sarà soprascritto.
Per le 2 ricerche richieste si agirà circa allo stesso modo :
si prende in input una o piu parole da trovare separate dalla virgola e le si ricercheranno in tutti i
file della directory specificata. La differenza tra le ricerche e che una restituisce la posizione di tutti
i file che contengano almeno una delle parole inserite (se viene chiesto di ricercare più di una
parola), mentre la seconda, restituisce tutte le posizioni dei file che contengono tutte le parole
inserite.
Esempio fornito dal committente :
Ricerca or
Inserisci la stringa da ricercare : come ,va
La stringa è presente nel file : percorso file 1 percorso file 2
Ricerca and
Inserisci la stringa da ricercare : come, va
La stringa è presente nel file : percorso file 1.
Dopo un’attenta analisi della traccia commissionata sono risultati i seguenti dati di input :
• Il precorso della directory che contiene i file
• Le stringhe da ricercare
I dati di output saranno
• Il file indice del micro motore
• I risultati delle ricerche effettuate
Per quel che riguarda i casi limite, ne sono stati identificati i seguenti:
Riguardo all’acquisizione del percorso della directory
• Il percorso della directory inserito non è valido perché la cartella specificata non esiste
• Il percorso della directory inserito non è valido perché la cartella specificata è in realtà un
file di testo o un file html
• Il percorso della directory inserito non contiene file txt o html o non vi e' nessun file al suo
interno
• I file contenuti all’interno della directory sono entrambi vuoti
Riguardo la parola da cercare
• La parola o le parole cercate non sono presenti in nessun file
Riguardo altri aspetti:
3. • All’inizio dell’esecuzione del programma il file di indice non esiste; viene creato dopo
l’indicizzazione
• Nel file ci sono 2 parole uguali
Progettazione
Per l’implementazione del programma e stata scelta una tecnica ibrida che usa sia lo sviluppo top-
down che quello bottom-up .
Una prima scomposizione del problema individua le seguenti parti :
Virgilio Desktop (main)
Indicizzazione Ricerca boolena
AND OR
Da questo schema sono state poi individuate le classi base per l’organizzazione del programma:
• Classe Virgilio Desktop
• Classe Indicizzazione
• Classe Ricerca Booleana
Queste sono legate tra loro tramite le seguenti relazioni:
Parole[ ]
Virginio Desktop Indicizzazione
(main)
Percorso File
Stringa da cercare File Trovati [ ]
Parole [ ]
Ricerca Booleana
4. Il main avrà il compito di interfacciarsi con l’utente, quindi presenterà un piccolo menù da cui
scegliere l’operazione da effettuare.
Provvede inoltre ad effettuare il salvataggio dell’indicizzazione sul file indice del motore di ricerca.
Le variabili principali utilizzate da questa classe saranno:
• Percorso (Stringa): memorizza il percorso di un file
• Scelta (Stringa) : memorizza la scelta del menù
• Index (File) : file in cui sono memorizzate tutte le parole dei file nella cartella specificata
Da qui saranno inoltre lanciate tutte le stampe a video (indicizzazione e ricerca ) e gestite tutte le
eccezioni lanciate dai vari metodi e costruttori della altri classi.
La classe indicizzazione si occuperà invece di aprire e leggere uno alla volta tutti i file presenti nella
directory specificata.
Per ogni file controllerà se la parola letta sarà gia contenuta nell’ hashmap di appoggio usato per
contenere le parole lette.
Se non lo è aggiungerà la nuova parola con il percorso del file, altrimenti aggiungerà solo il
percorso.
E previsto anche il caso in cui ci siano più parole uguali nello stesso file e viene gestito prendendo
in considerazione solo la prima parola e ignorando tutte le altre.
In questa classe si è preferito l’uso dell’ Hashmap perché c’e un risparmio notevole di codice e di
tempo. Infatti con essa non è necessario passare in rassegna un eventuale vettore usato per questo
scopo e si risparmia anche la scrittura del codice corrispondente.
Inoltre questa classe prevede il controllo delle stopword.
Le variabili e le strutture dati principali usate in questa classe sono :
• Files[] (File) : è un array che contiene i nomi di tutti i file presenti nella directory
specificata
• Parola [] : un vettore formato da una piccola classe secondaria che è composta da un campo
che contiene la parola (String), e da un altro che contiene i percorsi dei file (ArrayList
<String>)
• Percorso : variabile stringa ricevuta dal main
• Index : hashmap che contiene l’indicizzazione dei file e viene restituita al main.
La classe ricerca si occupa di eseguire le 2 ricerche booleane.
Prendendo in input le parole da ricercare separate da una virgola, per la ricerca OR controlla se nel
hashmap presente in memoria sono presenti file che contengono almeno una delle parole digitate.
Se non viene trovata alcuna parola viene restituito il valore null.
5. Nella ricerca AND vengono trovati tutti i file che contengono tutte le parole digitate anche qui nel
caso non ce ne siano sarà restituito il risultato null.
Le variabili usate saranno:
• Indice (Hashmap ) : rappresenta la struttura su cui saranno eseguite le ricerche
• Parole [] (String) : Array ottenuto con il metodo split della classe String per separare le
parole da ricercare
• Risultato ricerca [] (String): Contiene tutti i percorsi dei file su cui sono presenti le parole.
I casi limite trovati nell’analisi del progetto sono stati tutti considerati e gestiti attraverso il lancio
delle eccezione dove possibile o attraverso messaggi all’utente.
6. Raffinamento dell’algoritmo
Indicizzazione
- Inizio
Indicazione della directory con i file da indicizzare (percorso tipo String)
o Indicizzazione dei file
Controllo se il percorso è una directory
Controllo se la directory non è vuota
Controllo se la directory contiene file txt o file html
o In caso negativo (in uno dei tre casi): lancio un eccezione
Fine del programma con messaggio di errore
o In caso affermativo (soddisfo le tre condizioni)
Apro i file contenuto nella cartella
Memorizzo ogni parola in un dizionario (indice tipo HashMap)
Salvo i dati in un file (Indice.txt tipo File documento di testo)
- Fine
Ricerca e visualizzazione
- Inizio
Tipo di scelta da effettuare nel menù principale
o Scelta della visualizzazione dell’indicizzazione
Scorre tutto il dizionario con le parole indicizzato precedentemente
Stampa ad uno ad uno tutte le parole fintanto che il dizionario non è arrivato
alla fine
Ritorna al menù principale
o Scelta della Ricerca binaria OR
Chiede in input la stringa di parole da ricercare (separate da “,”)
Divide la stringa di parole in singole parole (frase.split)
Controlla per ogni parola data in input se ci sono le corrispondenti parole nel
dizionario
• In caso negativo
o Torna al menù principale con una segnalazione di errore
• In caso affermativo
o Per ogni parola trovata memorizza in un vettore dei risultati il
percorso del file in cui si trova la parola fintanto che non
7. scorre tutto il dizionario (risultatoRicerca tipo
ArrayList<String>)
o Stampa il vettore dei risultati a video
o Ritorna al menù principale
o Scelta della Ricerca binaria AND
Chiede in input la stringa di parole da ricercare (separate da “,”)
Divide la stringa di parole in singole parole (frase.split)
Trova per la prima parola le occorrenza nel dizionario
• In caso negativo
o Torna al menù principale con segnalazione di errore
• In caso affermativo
o Mette nel vettore dei risultati i percorsi dei file in cui la parola
occorre
Continua con le altre parole da ricercare nel caso ci fossero
• In caso negativo
o Stampa a video i risultati della ricerca e torna al menù
principale
• In caso affermativo
o Continua con la ricerca della parola nel dizionario
In caso negativo
• Torna al menù principale con una segnalazione
di errore
In caso affermativo
• Controlla se il percorso della parola è uguale ad
uno (o più) percorsi che si trova nel vettore dei
risultati
o In caso negativo
Torna al menù principale con
segnalazione di errore
o In caso affermativo
Aggiorna il vettore dei risultati
(Si continua come per il punto precedente fino al termine delle parole da
ricercare date in input)
Stampa a video del vettore dei risultati
8. Torna al menù principale
o Scelta di uscita dal programma
Termina il programma chiudendo il file Indice.txt
- Fine
Codifica
La codifica avverrà in linguaggio java per permettere una maggiore portabilità del software.
Per il codice leggere l’allegato cartaceo o digitale.
Test
Il programma è stato analizzato con il metodo della scatola nera.
9. CASI TIPICI:
(i dati immessi sono tutti validi)
I file contengono le seguenti parole:
file1 : tutto a posto nn preoccuparti
file2 : ciao come va la il lo la
Mostra indicizzazione :
11. CASI LIMITE:
Il percorso della directory inserito non è valido perché la cartella specificata non esiste:
I
Il percorso della directory inserito non è valido perché la cartella specificata è in realtà un file di
testo o un file html
12. Il percorso della directory inserito non contiene file txt o html o non vi e' nessun file al suo interno
La parola o le parole cercate non sono presenti in nessun file