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
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:
•   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
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.
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.
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
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
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.
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 :
Effettuare la ricerca OR




Effettuare la ricerca AND
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
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

Virginio Desktop Analisi

  • 1.
    A.A 2005/2006 C.D.LITPS 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 incui 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 ANDvengono 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 ildizionario (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 datiimmessi 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 :
  • 10.
    Effettuare la ricercaOR Effettuare la ricerca AND
  • 11.
    CASI LIMITE: Il percorsodella 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 delladirectory 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