// =========================================================================== // CONTENT : CLASS FileFinder // AUTHOR : Manfred Duchrow // VERSION : 1.2 - 14/02/2003 // HISTORY : // 02/12/2001 duma CREATED // 23/01/2002 duma added -> findFile() // 14/02/2003 duma added -> 3 File[] findFiles() methods // // Copyright (c) 2001-2003, by Manfred Duchrow. All rights reserved. // =========================================================================== package org.pf.file; // =========================================================================== // IMPORTS // =========================================================================== import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * Helper class with convenient methods to find files. * * @author Manfred Duchrow * @version 1.2 */ public class FileFinder implements FileHandler { // ========================================================================= // CONSTANTS // ========================================================================= // ========================================================================= // INSTANCE VARIABLES // ========================================================================= private List collectedFiles = null ; protected List getCollectedFiles() { return collectedFiles ; } protected void setCollectedFiles( List newValue ) { collectedFiles = newValue ; } // ========================================================================= // CLASS METHODS // ========================================================================= // ========================================================================= // CONSTRUCTORS // ========================================================================= /** * Initialize the new instance with default values. */ protected FileFinder() { super() ; this.setCollectedFiles( new ArrayList() ) ; } // FileFinder() // ========================================================================= // PUBLIC CLASS METHODS // ========================================================================= /** * Tries to find the file with the given Name on the classpath. * If the file was found and really exists, then it will be returned. * In all other cases null will be returned. */ public static File findFileOnClasspath( String filename ) { ClassLoader cl = null ; File file = null ; URL url = null ; try { cl = FileFinder.class.getClassLoader() ; if ( cl == null ) { // System.out.println( "No classloader found !\n<P>" ) ; return null ; } url = cl.getResource( filename ) ; if ( url == null ) { // System.out.println( "Settings file '" + filename + "' not found in CLASSPATH !!!" ) ; } else { file = new File( url.getFile() ) ; // System.out.println( "Settings file '" + file.getAbsolutePath() + "' exists: " + file.exists() ) ; if ( ! fileExists( file ) ) file = null ; } } catch ( Exception ex ) { // ex.printStackTrace() ; } return file ; } // findFileOnClasspath() // ------------------------------------------------------------------------- /** * Tries to find the file with the given Name. * First it looks if the file exists directly under the given name. * If not, it searches the classpath to find it. * If the file was found and really exists, then it will be returned. * In all other cases null will be returned. */ public static File findFile( String filename ) { File aFile = null ; aFile = new File( filename ) ; if ( fileExists( aFile ) ) return aFile ; aFile = findFileOnClasspath( filename ) ; return aFile ; } // findFile() // ------------------------------------------------------------------------- /** * Return all files that match the given pattern(s) start searching in the * specified dir. Searches in all sub directories as well. * More than one pattern can be specified in parameter <i>pattern</i>. * They have to be separated by ';'. * * @param dir The directory to start searching (must not be null) * @param pattern The pattern(s) the filenames must match (must not be null ) * @return All file found that matched to at least one of the patterns * @throws IllegalArgumentException If <i>dir</i> or <i>pattern</i> is null */ public static File[] findFiles( String dir, String pattern ) { return findFiles( dir, pattern, true ) ; } // findFiles() // ------------------------------------------------------------------------- /** * Return all files that match the given pattern(s) start searching in the * specified dir. Look into sub directories if <i>recursive</i> is true. * More than one pattern can be specified in parameter <i>pattern</i>. * They have to be separated by ';'. * * @param dir The directory to start searching (must not be null) * @param pattern The pattern(s) the filenames must match (must not be null ) * @param recursive If false, only <i>dir</i> is searched, otherwise all sub directories as well * @return All file found that matched to at least one of the patterns * @throws IllegalArgumentException If <i>dir</i> or <i>pattern</i> is null */ public static File[] findFiles( String dir, String pattern, boolean recursive ) { return findFiles( dir, pattern, recursive, (char)0 ) ; } // findFiles() // ------------------------------------------------------------------------- /** * Return all files that match the given pattern(s) start searching in the * specified dir. Look into sub directories if <i>recursive</i> is true. * Use the given digit wildcard in patterns to match single digits in * filenames.<br> * More than one pattern can be specified in parameter <i>pattern</i>. * They have to be separated by ';'. * * @param dir The directory to start searching (must not be null) * @param pattern The pattern(s) the filenames must match (must not be null ) * @param recursive If false, only <i>dir</i> is searched, otherwise all sub directories as well * @param digitWildcard The wildcard character for digit representation in the pattern(s) * @return All file found that matched to at least one of the patterns * @throws IllegalArgumentException If <i>dir</i> or <i>pattern</i> is null */ public static File[] findFiles( String dir, String pattern, boolean recursive, char digitWildcard ) { FileFinder finder ; Character digitChar = null ; if ( dir == null ) throw new IllegalArgumentException( "FileFinder.findFiles(): dir is null" ) ; if ( pattern == null ) throw new IllegalArgumentException( "FileFinder.findFiles(): pattern is null" ) ; if ( digitWildcard > 0 ) digitChar = new Character(digitWildcard) ; finder = new FileFinder() ; return finder.collectFiles( dir, pattern, recursive, digitChar ) ; } // findFiles() // ------------------------------------------------------------------------- // ========================================================================= // PRIVATE CLASS METHODS // ========================================================================= private static boolean fileExists( File file ) { boolean success = false ; if ( file != null ) { try { FileLocator locator = FileLocator.create( file ) ; success = locator.exists() ; } catch ( Exception ex ) { // nothing to do here } } return success ; } // fileExists() // ------------------------------------------------------------------------- // ========================================================================= // INTERFACE FileHandler METHODS // ========================================================================= /** * This method is called for each file, that a FileWalker instance finds. * It must return true, if the FileWalker should continue. To stop the * calling FileWalker it can return false. * * @param The file, currently found by the FileWalker instance * @return true to continue, false to terminate processing of files */ public boolean handleFile( File file ) { this.getCollectedFiles().add( file ) ; return true ; } // handleFile() // ------------------------------------------------------------------------- /** * This method is called for whenever an exception occurs in walking through * the directories. <br> * The method must return true, if the FileWalker should continue. To stop the * calling FileWalker it can return false. * * @param ex The exception to handle * @param The file, currently found by the FileWalker instance * @return true to continue, false to terminate processing of files */ public boolean handleException( Exception ex, File file ) { // System.out.println( "Problem with '" + file + "'" ) ; // System.out.println( ex ) ; return false ; } // handleException() // ------------------------------------------------------------------------- /** * This method is called for each directory, that a FileWalker finished to walk through. * It must return true, if the FileWalker should continue. To stop the * calling FileWalker it can return false. * * @param dir The directory, the FileWalker has finished to walk through * @return true to continue, false to terminate processing of files */ public boolean directoryEnd( File dir ) { return true ; } // directoryEnd() // ------------------------------------------------------------------------- /** * This method is called for each directory, that a FileWalker starts to walk through. * It must return true, if the FileWalker should continue. To stop the * calling FileWalker it can return false. * * @param dir The directory, the FileWalker is starting to walk through * @param count The number of files and directories the FileWalker found in the directory * @return true to continue, false to terminate processing of files */ public boolean directoryStart( File dir, int count ) { return true ; } // directoryStart() // ------------------------------------------------------------------------- // ========================================================================= // PROTECTED INSTANCE METHODS // ========================================================================= protected File[] collectFiles( String dir, String pattern, boolean recursive, Character digitWildcard ) { FileWalker fileWalker ; List list ; fileWalker = new FileWalker( this ) ; if ( digitWildcard != null ) fileWalker.setDigitWildcardChar( digitWildcard.charValue() ) ; fileWalker.walkThrough( dir, pattern, recursive ) ; list = this.getCollectedFiles() ; return (File[])list.toArray( new File[list.size()]) ; } // collectFiles() // ------------------------------------------------------------------------- } // class FileFinder