package fr.imag.classview.app ; import java.io.File ; // Utilisation de l"interface FileFilter // Cette interface correspond a la notion de predicat sur un fichier // Elle permet de dire, pour un fichier donne, si celui ci doit etre // selectionne ou non. import java.io.FileFilter ; import java.util.Set ; import java.util.HashSet ; import java.util.Iterator ; import fr.imag.classview.util.DisplayGraph ; /** * Calcule l'ensemble des fichiers de classes dans un repertoire donne. **/ public class ListClassFiles { /** * Fonction ajoutant l'ensemble des fichiers ou repertoires contenus * et satisfaisant le predicat donne en parametre. * Cette fonction est tres generale dans la mesure ou elle est parametree * par un filtre quelconque. * @param all ensemble des fichiers selectionnes * @param f fichier ou repertoire racine * @param filter filtre eventuel indiquant les fichiers ou repertoires a selectionner **/ private static void addSelectedFiles(Set/*!*/ all, File/*!*/ f, FileFilter/*?*/ filter) { // A completer en s'inspirant de la classe ListFiles et en utilisant la // classe java.io.FileFilter (cf la documentation javadoc). // NB. faire attention aux types précis dans la signature } /** * Retourne l'ensemble des fichiers de classes (avec l'extension .class) * contenus dans le repertoire specifie. * @param filename un nom de repertoire (ou d'un fichier) * @return l'ensemble de tous les fichiers de classes se trouvant sous * l'element specifie. **/ public static Set/*!*/ allClassFiles(String/*!*/ filename) { // A completer en utilisant la fonction addSelectedFiles ci-dessus // et en definissant un filtre (une classe implementant FileFilter). // On pourra utiliser une classe anonyme pour cela. // Une classe anonyme peut etre cree en utilisant s'inspirant // de l'exemple suivant ou C est une interface ou une classe // existante dont l'on defini ou surcharge les méthodes m1 et m2 // xxx = new C() { // public m1() { ... } // public m2() { ... } } /** * Retourne l'ensemble des noms de classes contenus dans un package donne. * @param rootdirname repertoire a partir duquel sont rechercher les fichiers * .class. Ce repetoire correspond a la racine des packages * autrement dit c'est le repertoire que l'on met typiquement * dans un CLASSPATH si l'on souhaite que le package soit * accessible. Par exemple k:\PRI\classes * @param packagename nom de package auquel on s'interresse. Ce package doit * etre disponible dans le repetoire passer en parametre. * Uniquement les classes de ce package et des sous packages * seront retournees. Par exemple pri.app * @result ensemble des noms de classes contenues dans ce package. **/ public static Set/*!*/ allClassNames( String/*!*/ rootdirname, String/*!*/ packagename ) { // A completer // On pourra utiliser pour convertir les noms de fichiers en noms // de classes les fonctions suivantes de la classe String // substring, replace, lastIndexOf } /** * Exemple d'utilisation de la methode allFiles * @param args inutilise **/ public static void main(String[] args) { final String root = "." ; Set allcf = allClassFiles(root) ; System.out.println("there are "+allcf.size()+" class files in "+root) ; for (Iterator fi=allcf.iterator(); fi.hasNext(); ) { File f = (File)fi.next() ; System.out.println(f.getPath()) ; } System.out.println(allClassNames("./classes","fr.imag.classview.app")) ; } }