Virginio Desktop Codifica

11
VIRGINIO.CLASS /** * Questo programma gestisce un piccolo motore di ricerca denominato * Virginio Desktop. Esso indicizza una lista di parole presente * nei file di una cartella e, a seconda della scelta fatta in un * apposito menù, può eseguire una ricerca booleana per OR o per AND * ed esegue automaticamente l'indicizzazione delle parole nei file * nella directory indicata in input dall'utente. */ // Importazione del pacchetto di utilità delle libreria di Java import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.*; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Classe principale del programma */ public class Virginio { /** * Metodo per richiamare la stampa dell'indice * @param indice dizionario HashMap contenente le parole indicizzate */ private static void stampaIndice(HashMap<String, Parola> indice) { //il parametro valori sara' uguale al valore presente nel dizionario in quella posizione Collection<Parola> valori = indice.values(); //ciclo for che serve per visualizzare tutte le parole con i relativi file in cui è presente la parola for(Iterator<Parola> iterator = valori.iterator(); iterator.hasNext();) { Parola parola = iterator.next(); System.out.println("\nparola: " + parola.getParola()); ArrayList<String> paths = parola.getPath(); for(int i = 0; i < paths.size(); i++) { //Stampa di tutte le paths System.out.println("\t" + paths.get(i)); } } } /** * per richiamare la stampa dei risultati delle ricerche Metodo * @param risultati ArrayList che contiene le paths */ private static void stampaRisultati(ArrayList<String> risultati) { System.out.println("La ricerca ha restituito i seguenti files:"); i nto che l'ArrayList non e' finito ... //F nta for(int i = 0; i < risultati.size(); i++) {

description

 

Transcript of Virginio Desktop Codifica

VIRGINIO.CLASS /** * Questo programma gestisce un piccolo motore di ricerca denominato * Virginio Desktop. Esso indicizza una lista di parole presente * nei file di una cartella e, a seconda della scelta fatta in un * apposito menù, può eseguire una ricerca booleana per OR o per AND * ed esegue automaticamente l'indicizzazione delle parole nei file * nella directory indicata in input dall'utente. */ // Importazione del pacchetto di utilità delle libreria di Java import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.util.*; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Classe principale del programma */ public class Virginio { /** * Metodo per richiamare la stampa dell'indice * @param indice dizionario HashMap contenente le parole indicizzate */ private static void stampaIndice(HashMap<String, Parola> indice) { //il parametro valori sara' uguale al valore presente nel dizionario in quella posizione Collection<Parola> valori = indice.values(); //ciclo for che serve per visualizzare tutte le parole con i relativi file in cui è presente la parola for(Iterator<Parola> iterator = valori.iterator(); iterator.hasNext();) { Parola parola = iterator.next(); System.out.println("\nparola: " + parola.getParola()); ArrayList<String> paths = parola.getPath(); for(int i = 0; i < paths.size(); i++) { //Stampa di tutte le paths System.out.println("\t" + paths.get(i)); } } } /** * per richiamare la stampa dei risultati delle ricerche Metodo * @param risultati ArrayList che contiene le paths */ private static void stampaRisultati(ArrayList<String> risultati) { System.out.println("La ricerca ha restituito i seguenti files:"); i nto che l'ArrayList non e' finito ... //F nta for(int i = 0; i < risultati.size(); i++) {

//... stampa i risultati nella posizione indicata dall'indice i System.out.println((i+1) + ") " + risultati.get(i)); } } /** * Main della classe Virginio */ public static void main(String[] args) { //Costruzione dell'input Scanner in = new Scanner(System.in); //dare in input la cartella da indicizzare System.out.println("Inserisci il percorso della cartella"); String percorso = in.next(); //Inizio dell'indicizzazione System.out.println("Indicizzazione in corso"); //HashMap dichiarato "null" HashMap<String,Parola> indice = null; //Provare e se il programma prosegue verso un errore cattura l'eccezione try { //Costruiamo un indicizzatore dando come parametro il percorso Indicizzazione indexer = new Indicizzazione(percorso); //Mettiamo nel dizionario il risultato dell'indicizzazione indice = indexer.indicizza(); System.out.println("Indicizzazione completata e salvata sul file."); //Salva l'indicizzazione su un file di nome indice FileOutputStream f = new FileOutputStream("Indice.txt"); ObjectOutput s = new ObjectOutputStream(f); s.writeObject(indice); //Costruzione del nuovo oggetto Ricerca dando in input l'HashMap indice Ricerca ricerca = new Ricerca(indice); // Costruzione del menù con le varie scelte boolean done = false; while (!done) {

System.out.println("************************************************************");

System.out.println("* *"); System.out.println("* VIRGINIO DESKTOP *"); System.out.println("* by BaelSoft Production *"); System.out.println("* *");

System.out.println("************************************************************");

System.out.println(" "); System.out.println(" __________________________________________________________ "); System.out.println("| |");

System.out.println("| Cosa vuoi fare? |");

System.out.println("| Inserisci: 1 per eseguire la visualizzazione dell'indicizzazione |"); System.out.println("| 2 per eseguire la ricerca booleana OR |");

System.out.println("| 3 per eseguire la ricerca booleana AND |"); System.out.println("| |"); System.out.println("| Q (quit) per uscire |");

System.out.println("|__________________________________________________________|");

String scelta =in.next(); //Caso di scelta = "1" if (scelta.equals("1")) { //Visualizzazione dell'indicizzazione stampaIndice(indice); } //Caso di scelta = "2" else if (scelta.equals("2")) { //Inserimento delle parole da ricercare System.out.print("Inserisci le parole da ricercare separate da ' , ': "); String frase = in.next(); //Effettuare la ricerca OR e inserire i risultati nell'ArrayList omonima ArrayList<String> risultati = ricerca.ricercaOR(frase); //Caso in cui non ha trovato nessun risultato if(risultati == null) { System.out.println("Le parole cercate non hanno prodotto risultati"); } ampa dei risultati //St else stampaRisultati(risultati); } //Caso di scelta = "3" else if (scelta.equals("3")) { //Inserimento delle parole da ricercare System.out.print("Inserisci le parole da ricercare separate da ',': "); String frase = in.next(); //Effettuare la ricerca OR e inserire i risultati nell'ArrayList omonima ArrayList<String> risultati = ricerca.ricercaAND(frase); Caso in cui no trovato nessun risultato // n ha if(risultati == null) { System.out.println("Le parole cercate non hanno prodotto risultati"); } ampa dei risultati //St else stampaRisultati(risultati); } } //Caso di scelta = "q" else if (scelta.equalsIgnoreCase("q"))

{ //Terminazione del programma s.close(); System.out.println("Programma Terminato"); done = true; } //Caso in cui la scelta non sia una delle proposte precedenti else { //Segnalazione di errore System.out.println("Scelta sbagliata. Riprova per favore"); } } } //Cattura l'eccezione in caso il file non è trovato catch (FileNotFoundException e) { System.out.println(e.getMessage()); } tura l'eccezione in caso ci sono errori di Input/Output //Cat catch (IOException e) { System.out.println(e.getMessage()); } } }

INDICIZZAZIONE.CLASS //Importazione dei vari pacchetti import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Classe Indicizzazione */ public class Indicizzazione { /** * Costruttore con lancio dell'eccezione in caso di file non trovato * @param per percorso della directory da indicizzare * @throws FileNotFoundException eccezione lanciata in caso di directory non trovata */ public Indicizzazione(String per) throws FileNotFoundException { percorso = new File(per); //Casi limite: 1 - se il percorso esiste // if(!percorso.exists()) throw new FileNotFoundException("La cartella non esiste"); 2 - se il percorso e' una directory // if (!percorso.isDirectory()) throw new FileNotFoundException("Il percorso inserito non e' una directory"); //3 - se la directory contiene file txt o html files = percorso.listFiles(new ValidFileFilter()); if(fil == 0) es.length throw new IllegalArgumentException("La cartella non contiene file txt o html"); //in questo caso si accettano solo file txt o file html } /** * Creazione di un indicizzatore/dizionario di tipo HashMap * @return ritorna l'hashMap indicizzato * @throws IOException lancio dell'eccezione in caso di errori nei dati */ public HashMap<String, Parola> indicizza() throws IOException { //costruzione dell'indice HashMap<String, Parola> indice = new HashMap<String, Parola>(); //scorre tutta la directory fino a che non controlla tutti i file for (int i = 0; i < files.length; i++) { System.out.println("indicizzazione parole del file: " + files[i]); File file = files[i]; //FileReader fr = new FileReader(file); Scanner in = new Scanner(file); while (in.hasNext()) { String parola = in.next(); //Verifica se la parola è una stopWord. if(!Ricerca.isStopword(parola))

{ Verifica che la parola sia gia presente nell'indice // if (indice.containsKey(parola)) { Parola word = (Parola) indice.get(parola); //Recupera la lista dei path che contengono la parola ArrayList<String> listaPath = word.getPath(); if(!listaPath.contains(file.getCanonicalPath())) word.AggiungiFile(file.getCanonicalPath()); } else { //Inseriamo la nuova parola nel dizionario Parola word = new Parola(parola, file.getCanonicalPath()); indice.put(parola, word); } } } } return indice; } //Parametri della classe Indicizzazione private File[] files; private File percorso; }

RICERCA.CLASS //Importazione delle librerie necessarie per la classe import java.util.ArrayList; import java.util.HashMap; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Classe Ricerca */ public class Ricerca { /** * Costruzione delle stopwords */ public static String[] stopwords = { "il","lo","la","i","gli","le", "di","a","da","in","con","su","per","tra","fra", "non","no","si", "della","delle","dei","degli", "alla","alle","ai","agli", "dalla","dalle","dai","dagli", "sulla","sulle","sui","sugli", ".",",",":",";","_","<",">","^","?","'",")","=","(","/","\"","\\" }; /** * Costruttore della classe Ricerca */ public Ricerca(HashMap<String, Parola> index) { indice = index; } /** * Metodo per la ricerca OR * @param frase stringa di caratteri per la ricerca data in input * @return restituisce "null" se non trova risultati altrimenti il risultato della ricerca */ public ArrayList<String> ricercaOR(String frase) { //Divide la frase data in parole separate da " , " String[] parole = frase.split(","); ArrayList<String> risultatoRicerca = new ArrayList<String>(); n o della ricerca OR //I izi for(int i = 0; i < parole.length; i++) { String parola = parole[i]; //Controllo se la parola è una stopword if(!isStopword(parola)) { //Controllo se l'HashMap contiene la parola if(indice.containsKey(parola)) { Parola word = (Parola) indice.get(parola); addPathsOR(risultatoRicerca,word.getPath()); } } } //Restituisco "null" se il risultato della ricerca è vuoto

if(risultatoRicerca.size() == 0) return null; imenti restituisco il risultato della ricerca //altr return risultatoRicerca; } /** * Questo metodo aggiunge (per la ricerca OR) i percorsi dei file al risultato della ricerca * @param risultatoRicerca risultato delle parole cercate * @param paths percorso del file in cui si trova la parola ricercata */ private void addPathsOR(ArrayList<String> risultatoRicerca, ArrayList<String> paths) { for(int i = 0; i < paths.size(); i++) { String path = paths.get(i); if(!risultatoRicerca.contains(path)) risultatoRicerca.add(path); } } /** * per la ricerca AND Metodo * @param frase stringa di caratteri per la ricerca data in input * @return restituisce "null" se non trova risultati altrimenti il risultato della ricerca */ public ArrayList<String> ricercaAND(String frase) { String[] parole = frase.split(","); ArrayList<String> risultatoRicerca = new ArrayList<String>(); boolean trovato = false; int i; for(i = 0; i < parole.length && !trovato; i++) { String parola = parole[i]; if(!isStopword(parola)) { if(indice.containsKey(parola)) { Parola word = (Parola) indice.get(parola); risultatoRicerca.addAll(word.getPath()); trovato = true; } else /** * nella ricerca AND tutte le parole devono essere contenute * almeno in un file. Se questo nn avviene, il risultato della ricerca * è "null", cioè la ricerca fallisce. */ return null; } } for(; i < parole.length; i++) { String parola = parole[i]; if(!isStopword(parola)) { if(indice.containsKey(parola)) {

Parola word = (Parola) indice.get(parola); addPathsAND(risultatoRicerca, word.getPath()); } else /** * nella ricerca AND tutte le parole devono essere contenute * almeno in un file. Se questo nn avviene, il risultato della ricerca * è "null", cioè la ricerca fallisce. */ return null; } if(risultatoRicerca.size() == 0) return null; } return risultatoRicerca; } /** * Questo metodo aggiunge (per la ricerca AND) i percorsi dei file al risultato della ricerca * @param risultatoRicerca risultato delle parole cercate * @param paths percorso del file in cui si trova la parola ricercata */ private void addPathsAND(ArrayList<String> risultatoRicerca, ArrayList<String> paths) { for (int i=0; i < risultatoRicerca.size();) { if (!paths.contains(risultatoRicerca.get(i))) risultatoRicerca.remove(i); else i++; } } /** * dichiarazione metodo privato per le stopwords che controlla * se la stringa contiene stopwords o se non le contiene. * In caso affermativa esso restituisce un valore boolean true * che gli dice che la parola fa parte del vettore stopwords * altrimenti continua la ricerca fino alla fine del vettore e non * restituisce solo * @param parola * @return */ public static boolean isStopword(String parola) { boolean trovato = false; for(int j= 0; j < stopwords.length && !trovato; j++) { if(parola.equalsIgnoreCase(stopwords[j])) trovato = true; } return trovato; } //Parametri della classe Ricerca private HashMap<String, Parola> indice; }

VALIDFILEFILTER.CLASS //Importazione dei vari pacchetti import java.io.File; import java.io.FileFilter; import java.io.IOException; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Costruzione della classe per verificare se i file sono file txt o html */ public class ValidFileFilter implements FileFilter { public boolean accept(File file) { //Tentare le istruzioni senno restituisce un'eccezione try { Controlla se i file sono txt o html // if(file.getCanonicalPath().endsWith("txt") || file.getCanonicalPath(). t tm") || file.getCanonicalPath().endsWith("html")) endsWi h("h return true; } //Cattura l'eccezione in caso l'Input o l'Output sono errati (o non trova file di quel genere) catch (IOException e) { e.printStackTrace(); } o orna falso //Senn ' rit return false; } }

PAROLA.CLASS //importazione dei pacchetti che serviranno alla classe import java.io.Serializable; import java.util.ArrayList; /** * @author BaelSoft Production®: Centrone Sergio e Gadaleta Fabio * Costruzione della classe Parola con serializzazione (per il salvataggio nel file) */ public class Parola implements Serializable { truttori della classe Parola // Cos public Parola(String parola) { this.parola = parola; } /** * @param parola stringa dei file * @param filePath percorso in cui si trova la stringa */ public Parola(String parola, String filePath) { this(parola); files = new ArrayList<String>(); files.add(filePath); } //Metodi della classe Parola public ArrayList<String> getPath() { return files; } /** * Aggiunge il percorso del file * @param filePath percorso del file */ public void AggiungiFile(String filePath) { files.add(filePath); } /** * Questo metodo serve a restituire parola * @return ridà ciò che contiene parola */ public String getParola() { return parola; } //Parametri della classe Parola public String parola; private ArrayList<String> files; }