001 /******************************************************************************
002 * Copyright (C) MActor Developers. All rights reserved. *
003 * ---------------------------------------------------------------------------*
004 * This file is part of MActor. *
005 * *
006 * MActor is free software; you can redistribute it and/or modify *
007 * it under the terms of the GNU General Public License as published by *
008 * the Free Software Foundation; either version 2 of the License, or *
009 * (at your option) any later version. *
010 * *
011 * MActor is distributed in the hope that it will be useful, *
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
014 * GNU General Public License for more details. *
015 * *
016 * You should have received a copy of the GNU General Public License *
017 * along with MActor; if not, write to the Free Software *
018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
019 ******************************************************************************/
020 package org.mactor.framework.data;
021
022 import java.io.File;
023 import java.io.FileReader;
024 import java.io.IOException;
025 import java.io.LineNumberReader;
026
027 import org.mactor.framework.MactorException;
028 import org.mactor.framework.spec.ProjectContext;
029
030 public class CsvDataProvider implements DataProvider {
031 private String dataSourceConnectionSpec;
032 CsvDataProvider(String dataSourceConnectionSpec) {
033 this.dataSourceConnectionSpec = dataSourceConnectionSpec;
034 }
035 public DataTable loadData() throws MactorException {
036 File source = ProjectContext.getGlobalInstance().getAbsolutePath(dataSourceConnectionSpec);
037 if (!source.exists())
038 throw new MactorException("The specifed file does not exist '" + source.getAbsolutePath() + "'");
039 try {
040 LineNumberReader fr = null;
041 try {
042 fr = new LineNumberReader(new FileReader(source));
043 String header = fr.readLine();
044 if (header == null)
045 throw new MactorException("Invalid file format. The file '" + source.getAbsolutePath() + "' is empty");
046 String[] cols = header.split(";");
047 if (cols == null || cols.length == 0)
048 throw new MactorException("Invalid file format. The file '" + source.getAbsolutePath() + "' does not contains any columns (colums must be seperated by the ';' character)");
049 DataTable table = new DataTable();
050 for (String col : cols)
051 table.addColumn(col.trim());
052 int colCount = cols.length;
053 for (;;) {
054 String line = fr.readLine();
055 if (line == null)
056 break;
057 line = line.trim();
058 if (line.length() == 0)
059 continue;
060 if (line.startsWith("#")) // skip comments
061 continue;
062 String[] cells = line.split(";");
063 int count = cells == null ? 0 : cells.length;
064 if (count != colCount)
065 throw new MactorException("Invalid file format. The file '" + source.getAbsolutePath() + "' contains an invalid number of columns on line '" + fr.getLineNumber()
066 + "'. Expected " + colCount + "' columns, but was '" + count + "'");
067 table.addRow(cells);
068 }
069 return table;
070 } finally {
071 if (fr != null)
072 fr.close();
073 }
074 } catch (IOException ioe) {
075 throw new MactorException("Failed to read the file '" + source.getAbsolutePath() + "'. Error:" + ioe.getMessage(), ioe);
076 }
077 }
078 }