001 package com.mockrunner.jdbc;
002
003 import java.io.File;
004 import java.util.List;
005
006 import com.mockrunner.mock.jdbc.MockResultSet;
007 import com.mockrunner.util.common.FileUtil;
008 import com.mockrunner.util.common.StringUtil;
009
010 /**
011 * Can be used to create a <code>ResultSet</code> based on
012 * a table specified in a CSV file. You can specify the delimiter
013 * of the columns (default is <i>";"</i>). Furthermore you can specify if the first line
014 * contains the column names (default is <code>false</code>) and if
015 * the column entries should be trimmed (default is <code>true</code>).
016 * The file can be specified directly or by its name. The class
017 * tries to find the file in the absolut or relative path and
018 * (if not found) by calling <code>getResource</code>. Note that the
019 * file must exist in the local file system and cannot be loaded from
020 * inside a jar archive.
021 */
022 public class FileResultSetFactory implements ResultSetFactory
023 {
024 private File file = null;
025 private String fileName = null;
026 private String delimiter = ";";
027 private boolean firstLineContainsColumnNames = false;
028 private boolean trim = true;
029
030 public FileResultSetFactory(String fileName)
031 {
032 this.file = new File(fileName);
033 this.fileName = fileName;
034 }
035
036 public FileResultSetFactory(File file)
037 {
038 this.file = file;
039 this.fileName = file.getAbsolutePath();
040 }
041
042 /**
043 * Get the <code>File</code> being used to read in the
044 * <code>ResultSet</code>. Returns <code>null</code> if
045 * the file does not exist.
046 * @return the file
047 */
048 public File getFile()
049 {
050 if(file.exists() && file.isFile())
051 {
052 return file;
053 }
054 else
055 {
056 return FileUtil.findFile(fileName);
057 }
058 }
059
060 /**
061 * Set the delimiter. Default is <i>";"</i>.
062 * @param delimiter the delimiter
063 */
064 public void setDelimiter(String delimiter)
065 {
066 this.delimiter = delimiter;
067 }
068
069 /**
070 * Set if the first line contains the column names.
071 * Default is <code>false</code>.
072 */
073 public void setFirstLineContainsColumnNames(boolean firstLineContainsColumnNames)
074 {
075 this.firstLineContainsColumnNames = firstLineContainsColumnNames;
076 }
077
078 /**
079 * Set if the column entries should be trimmed.
080 * Default is <code>true</code>.
081 */
082 public void setTrim(boolean trim)
083 {
084 this.trim = trim;
085 }
086
087 public MockResultSet create(String id)
088 {
089 MockResultSet resultSet = new MockResultSet(id);
090 List lines = null;
091 File fileToRead = getFile();
092 if(null == fileToRead)
093 {
094 throw new RuntimeException("File " + fileName + " not found.");
095 }
096 lines = FileUtil.getLinesFromFile(fileToRead);
097 int firstLineNumber = 0;
098 if(firstLineContainsColumnNames)
099 {
100 String firstLine = (String)lines.get(firstLineNumber);
101 firstLineNumber++;
102 String[] names = StringUtil.split(firstLine, delimiter, trim);
103 for(int ii = 0; ii < names.length; ii++)
104 {
105 resultSet.addColumn(names[ii]);
106 }
107 }
108 for(int ii = firstLineNumber; ii < lines.size(); ii++)
109 {
110 String line = (String)lines.get(ii);
111 String[] values = StringUtil.split(line, delimiter, trim);
112 resultSet.addRow(values);
113 }
114 return resultSet;
115 }
116 }