001    package com.mockrunner.util.common;
002    
003    import java.io.File;
004    import java.io.FileNotFoundException;
005    import java.io.FileReader;
006    import java.net.URL;
007    import java.net.URLDecoder;
008    import java.util.List;
009    
010    import com.mockrunner.base.NestedApplicationException;
011    
012    public class FileUtil
013    {
014        /**
015         * Reads all lines from a text file and adds them to a <code>List</code>.
016         * @param file the input file
017         * @return the <code>List</code> with the file lines
018         */
019        public static List getLinesFromFile(File file)
020        {
021            List resultList = null;
022            FileReader reader = null;
023            try
024            {
025                reader = new FileReader(file);
026                resultList = StreamUtil.getLinesFromReader(reader);
027            }
028            catch(FileNotFoundException exc)
029            {
030                throw new NestedApplicationException(exc);
031    
032            }
033            finally
034            {
035                if(null != reader)
036                {
037                    try
038                    {
039                        reader.close();
040                    }
041                    catch(Exception exc)
042                    {
043                        throw new NestedApplicationException(exc);
044                    }
045                }
046            }
047            return resultList;
048        }
049        
050        /**
051         * Tries to open the file from its absolute or relative path. If the file
052         * doesn't exist, tries to load the file with <code>getResource</code>.
053         * Throws a <code>FileNotFoundException</code> if the file cannot be found.
054         * @param fileName the file name
055         * @return the file as reader
056         * @throws FileNotFoundException if the cannot be found
057         */
058        public static File findFile(String fileName) throws FileNotFoundException
059        {
060            File file = new File(fileName);
061            if(isExistingFile(file)) return file;
062            fileName = fileName.replace('\\', '/');
063            file = new File(fileName);
064            if(isExistingFile(file)) return file;
065            URL fileURL = FileUtil.class.getClassLoader().getResource(fileName);
066            file = decodeFileURL(fileURL);
067            if(null != file) return file;
068            fileURL = FileUtil.class.getResource(fileName);
069            file = decodeFileURL(fileURL);
070            if(null != file) return file;
071            throw new FileNotFoundException("Could not find file: " + fileName);
072        }
073        
074        private static File decodeFileURL(URL fileURL)
075        {
076            if(fileURL != null)
077            {
078                File file = new File(fileURL.getFile());
079                if(isExistingFile(file)) return file;
080                file = new File(URLDecoder.decode(fileURL.getFile()));
081                if(isExistingFile(file)) return file;
082            }
083            return null;
084        }
085        
086        private static boolean isExistingFile(File file)
087        {
088            return (file.exists() && file.isFile());
089        }
090    }