Coverage Report - org.melati.poem.csv.CSVFilesProcessor
 
Classes in this File Line Coverage Branch Coverage Complexity
CSVFilesProcessor
0%
0/45
0%
0/14
2.667
 
 1  
 /*
 2  
  * $Source$
 3  
  * $Revision$
 4  
  *
 5  
  * Copyright (C) 2001 Myles Chippendale
 6  
  *
 7  
  * Part of Melati (http://melati.org), a framework for the rapid
 8  
  * development of clean, maintainable web applications.
 9  
  *
 10  
  * Melati is free software; Permission is granted to copy, distribute
 11  
  * and/or modify this software under the terms either:
 12  
  *
 13  
  * a) the GNU General Public License as published by the Free Software
 14  
  *    Foundation; either version 2 of the License, or (at your option)
 15  
  *    any later version,
 16  
  *
 17  
  *    or
 18  
  *
 19  
  * b) any version of the Melati Software License, as published
 20  
  *    at http://melati.org
 21  
  *
 22  
  * You should have received a copy of the GNU General Public License and
 23  
  * the Melati Software License along with this program;
 24  
  * if not, write to the Free Software Foundation, Inc.,
 25  
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
 26  
  * GNU General Public License and visit http://melati.org to obtain the
 27  
  * Melati Software License.
 28  
  *
 29  
  * Feel free to contact the Developers of Melati (http://melati.org),
 30  
  * if you would like to work out a different arrangement than the options
 31  
  * outlined here.  It is our intention to allow Melati to be used by as
 32  
  * wide an audience as possible.
 33  
  *
 34  
  * This program is distributed in the hope that it will be useful,
 35  
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 36  
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 37  
  * GNU General Public License for more details.
 38  
  *
 39  
  * Contact details for copyright holder:
 40  
  *
 41  
  *     Myles Chippendale <mylesc@paneris.org>
 42  
  */
 43  
 package org.melati.poem.csv;
 44  
 
 45  
 import java.util.Vector;
 46  
 import java.io.File;
 47  
 import java.io.Writer;
 48  
 import java.io.IOException;
 49  
 
 50  
 import org.melati.poem.Database;
 51  
 import org.melati.poem.PoemBugPoemException;
 52  
 import org.melati.poem.PoemThread;
 53  
 import org.melati.poem.Table;
 54  
 
 55  
 /**
 56  
  * A class to define a sequence of {@link CSVTable}s and process them by
 57  
  * parsing the files and writing the data to the database.
 58  
  * 
 59  
  * @author MylesC AT paneris.org
 60  
  *  
 61  
  */
 62  
 public class CSVFilesProcessor {
 63  
 
 64  0
   protected Vector<CSVTable> tables = new Vector<CSVTable>();
 65  0
   Database db = null;
 66  
 
 67  
   /**
 68  
    * Constructor.
 69  
    * 
 70  
    * @param db the target database
 71  
    */
 72  0
   public CSVFilesProcessor(Database db) {
 73  0
     this.db = db;
 74  0
   }
 75  
 
 76  
   /**
 77  
    * Convenience method.
 78  
    * 
 79  
    * @param tablename the name of a POEM table
 80  
    * @param file a CSV file, with first line containing field names
 81  
    * @return a new CSVTable
 82  
    */
 83  
   public CSVTable addTable(String tablename, File file) {
 84  0
     return addTable(db.getTable(tablename), file);
 85  
   }
 86  
 
 87  
   /**
 88  
    * Add a table to this processor.
 89  
    * 
 90  
    * @param tab a POEM table
 91  
    * @param file a CSV file, with first line containing field names
 92  
    * @return a new CSVTable
 93  
    */
 94  
   public CSVTable addTable(Table<?> tab, File file) {
 95  0
     if (!file.exists())
 96  0
       throw new RuntimeException("File not found: " + file.getPath());
 97  0
     CSVTable table = new CSVTable(tab, file);
 98  0
     tables.addElement(table);
 99  0
     return table;
 100  
   }
 101  
 
 102  
   /**
 103  
    * Load all the data from the files, empty the tables if necessary and then
 104  
    * write the new data into the tables.
 105  
    * <p>
 106  
    * Write a report of the progress to the Writer.
 107  
    * 
 108  
    * @param writeOnFly flag whether to write down to db when all files read in
 109  
    *          if set then it is the programmers responsibility to ensure that
 110  
    *          there are no references to yet to be created fields
 111  
    * @param emptyTables flag whether to remove remains from last run
 112  
    * @param recordDetails flag passed in to table.report
 113  
    * @param fieldDetails flag passed in to table.report
 114  
    * @param output to write report to
 115  
    * @throws IOException if file stuff goes wrong
 116  
    * @throws CSVParseException if csv file has an error
 117  
    * @throws NoPrimaryKeyInCSVTableException not thrown
 118  
    * @throws CSVWriteDownException thrown when a persistent cannot be created
 119  
    */
 120  
   public void process(boolean writeOnFly, boolean emptyTables,
 121  
       boolean recordDetails, boolean fieldDetails, Writer output)
 122  
       throws IOException, CSVParseException, NoPrimaryKeyInCSVTableException,
 123  
       CSVWriteDownException {
 124  
 
 125  0
     output.write("Trying to get exclusive lock on the database\n");
 126  0
     db.beginExclusiveLock();
 127  0
     output.write("Got exclusive lock on the database!!!\n");
 128  
 
 129  
     // Delete all records from the tables, if necessary
 130  0
     if (emptyTables) {
 131  0
       for (int i = 0; i < tables.size(); i++) {
 132  0
         CSVTable t = (CSVTable) tables.elementAt(i);
 133  0
         t.emptyTable();
 134  0
         output.write("Emptied table :" + t.getName() + "\n");
 135  0
         System.err.println("Emptied table :" + t.getName());
 136  
       }
 137  0
       PoemThread.writeDown();
 138  
     }
 139  
 
 140  
 
 141  
     // Load in data
 142  0
     for (int i = 0; i < tables.size(); i++) {
 143  0
       CSVTable t = ((CSVTable) tables.elementAt(i));
 144  0
       t.load(writeOnFly);
 145  0
       output.write("Loaded table :" + t.getName() + "\n");
 146  0
       System.err.println("Loaded table :" + t.getName());
 147  
     }
 148  
 
 149  
     // We must have loaded in all the data before we
 150  
     // try writing records, otherwise Foreign Key lookups
 151  
     // defined in this set of CSVs won't work
 152  0
     if (!writeOnFly) {
 153  0
       writeData(output);
 154  0
       output.write("Written records\n");
 155  
     }
 156  
 
 157  0
     db.endExclusiveLock();
 158  
 
 159  0
     output.write("Ended exclusive lock on the database!!!\n");
 160  0
     output.write("***** REPORT ******\n");
 161  
 
 162  
     // Write a report about how many records are in each table
 163  0
     for (int i = 0; i < tables.size(); i++)
 164  0
       ((CSVTable) tables.elementAt(i)).report(recordDetails, fieldDetails,
 165  
           output);
 166  
 
 167  0
   }
 168  
   /**
 169  
    * With write on the fly false.
 170  
    * <p>
 171  
    * Load all the data from the files, empty the tables if necessary and then
 172  
    * write the new data into the tables.
 173  
    * <p>
 174  
    * Write a report of the progress to the Writer.
 175  
    * 
 176  
    * @param emptyTables flag whether to remove remains from last run
 177  
    * @param recordDetails flag passed in to table.report
 178  
    * @param fieldDetails flag passed in to table.report
 179  
    * @param output to write report to
 180  
    * @throws IOException if file stuff goes wrong
 181  
    * @throws CSVParseException if csv file has an error
 182  
    * @throws NoPrimaryKeyInCSVTableException not thrown
 183  
    * @throws CSVWriteDownException thrown when a persistent cannot be created
 184  
    */
 185  
   public void process(boolean emptyTables, boolean recordDetails,
 186  
                       boolean fieldDetails, Writer output) 
 187  
       throws IOException,
 188  
       CSVParseException, NoPrimaryKeyInCSVTableException, CSVWriteDownException {
 189  0
     process(false, emptyTables, recordDetails, fieldDetails, output);
 190  0
   }
 191  
 
 192  
   /**
 193  
    * @param o output log to write to
 194  
    * @throws NoPrimaryKeyInCSVTableException
 195  
    * @throws CSVWriteDownException
 196  
    */
 197  
   protected void writeData(Writer o) throws NoPrimaryKeyInCSVTableException,
 198  
       CSVWriteDownException {
 199  0
     for (int i = 0; i < tables.size(); i++) {
 200  0
       CSVTable t = (CSVTable) tables.elementAt(i);
 201  
       try {
 202  0
         o.write("Writing " + t.getName() + ".\n");
 203  0
       } catch (IOException e) {
 204  0
         throw new PoemBugPoemException("Problem writing log", e);
 205  0
       }
 206  0
       t.writeRecords();
 207  
     }
 208  0
   }
 209  
 
 210  
 }
 211