/* Date: October 25, 2010 * Template: PluginScreenJavaTemplateGen.java.ftl * generator: org.molgenis.generators.ui.PluginScreenJavaTemplateGen 3.3.3 * * THIS FILE IS A TEMPLATE. PLEASE EDIT :-) */ package plugins.mazeexperiment; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Vector; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.db.Query; import org.molgenis.framework.db.QueryRule; import org.molgenis.framework.db.QueryRule.Operator; import org.molgenis.framework.ui.PluginModel; import org.molgenis.framework.ui.ScreenController; import org.molgenis.framework.ui.ScreenMessage; import org.molgenis.maze.MazeData; import org.molgenis.util.CsvFileReader; import org.molgenis.util.CsvReaderListener; import org.molgenis.util.Entity; import org.molgenis.util.Tuple; public class rawdataimporter extends PluginModel<Entity> { /** * @author A.S. Boerema */ private static final long serialVersionUID = 3045772744420484691L; private boolean success; //private String fileName; private List<String> fileNames = new ArrayList<String>(); private List<String> origFileNames = new ArrayList<String>(); private int pcId; private String fileList; //private int duplicateCtr; public String getFileList() { return fileList; } public void setFileList(String fileList) { this.fileList = fileList; } /** * the method that takes care of loading a data file. * * @author A.S. Boerema * @param Database * @param pc Id * @param unit Id * @return boolean succes * */ private boolean loadDataFile(final Database db, int year, int month, int day, final String fileName, final int pc, final int unit) throws Exception{ try{ //check existing records for the current day: Query<MazeData> q; q = db.query(MazeData.class); q.addRules(new QueryRule("year", Operator.EQUALS, year)); q.addRules(new QueryRule("month", Operator.EQUALS, month)); q.addRules(new QueryRule("day", Operator.EQUALS, day)); q.addRules(new QueryRule(Operator.SORTASC,"hour, minute, second, milisecond")); //List<MazeData> existingData = q.find()day; final int existingRows = q.count(); /*db.beginTx(); Query<BinaryChannelData> bcdq; bcdq = db.query(BinaryChannelData.class); bcdq.addRules(new QueryRule("channelid", Operator.EQUALS, this.currChlId)); bcdq.addRules(new QueryRule(Operator.SORTASC,"timestamp")); List<BinaryChannelData> channelSwitchData = bcdq.find(); db.commitTx(); */ final ArrayList<MazeData> newRecords = new ArrayList<MazeData>(); // create a list for the new records File file = new File(fileName); CsvFileReader reader = new CsvFileReader(file); // set headers manually because they are not provided in the fiel // set them on fake numbers to handle the variable amount of spaces used to separted fields. This result in incorrect field detection and needs to be corrected later. List<String> fakeFields = Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","21","22","23","24","25","26","27","28","29","30","31"); //List<String> realFields = Arrays.asList("year","month","day","hour","minute","second,","milisecond","port0","port1","port2","port3","port4","port5"); reader.setColnames(fakeFields); reader.disableHeader(false); reader.parse(new CsvReaderListener() { int lineCtr = 0; public void handleLine(int line_number, Tuple tuple) throws DatabaseException, ParseException, IOException { //System.out.println("parsed line " + line_number + ": " + tuple.toString()); lineCtr++; if(lineCtr > existingRows){ //iterate over the fields and check for null. MazeData newRow = new MazeData(); int fieldSequence=0; String field=""; for (int i=0; i<32; i++){ field = tuple.getString("UNNAMED"+Integer.toString(i)); //logger.debug("field "+ Integer.toString(i) + " " +field); if(field != null){ fieldSequence++; switch(fieldSequence){ // year case 1: newRow.setYear(Integer.parseInt( field )); //logger.info("Set Year = " + field); break; //month case 2: newRow.setMonth(Integer.parseInt( field )); //logger.info("Set Month = " + field); break; //day case 3: newRow.setDay(Integer.parseInt( field )); //logger.info("Set Day = " + field); break; //hour case 4: newRow.setHour(Integer.parseInt( field )); //logger.info("Set Hour = " + field); break; //minute case 5: newRow.setMinute(Integer.parseInt( field )); //logger.info("Set Minute = " + field); break; //second case 6: newRow.setSecond(Integer.parseInt( field )); //logger.info("Set second = " + field); break; //millisecond case 7: newRow.setMilisecond(Integer.parseInt( field )); //logger.info("Set millisecond = " + field); break; //Port0 case 8: newRow.setPort0(Integer.parseInt( field )); //logger.info("Set port0 = " + field); break; //Port1 case 9: newRow.setPort1(Integer.parseInt( field )); break; //Port2 case 10: newRow.setPort2(Integer.parseInt( field )); break; //Port3 case 11: newRow.setPort3(Integer.parseInt( field )); break; //Port4 case 12: newRow.setPort4(Integer.parseInt( field )); break; //Port5 case 13: newRow.setPort5(Integer.parseInt( field )); //logger.info("Set port5 = " + field); break; default: logger.debug("actually this switch should never reach default..."); break; }//end switch }//endif }//end for // add the extra fields: newRow.setPcid(pc); newRow.setUnitid(unit); newRow.setConversiontype(0); // Set conversiontype to 0 (is not converted) upon import. //add to the db newRecords.add(newRow); } } }); // add all new rows to the database db.add(newRecords); return true; } catch(Exception e) { e.printStackTrace(); return false; } } public rawdataimporter(String name, ScreenController<?> parent) { super(name, parent); } @Override public String getCustomHtmlHeaders() { return "<link rel=\"stylesheet\" style=\"text/css\" href=\"res/css/animaldb.css\">"; } @Override public String getViewName() { return "plugins_mazeexperiment_rawdataimporter"; } @Override public String getViewTemplate() { return "plugins/mazeexperiment/rawdataimporter.ftl"; } @Override public void handleRequest(Database db, Tuple request) { // clear the old messages ScreenMessage msg = null; this.setMessages(new Vector<ScreenMessage>()); // clear messsages try { String action = request.getString("__action"); if( action.equals("cancel") ) { this.setFileList(null); this.fileNames.clear(); this.origFileNames.clear(); } if (action.equals("loadMazeDataFile1")) { // show a list of the files to be imported // and add them to a listobject for further processing // get the first file if(request.getString("mazedatafile").equals(null)) { msg = new ScreenMessage("You did not enter a filename",null,false); } else { //FIXME: you sure this is not OriginalFileName ? this.fileNames.add(0,request.getString("mazedatafile")); this.origFileNames.add(0,request.getString("mazedatafileOriginalfilename")); // get the rest of the files if present List<String> fields = request.getFields(); int requestSize = request.size(); int fileCtr = 1; for (int i = 1; i <= requestSize; i++) { String mazedatafile = "mazedatafile" + Integer.toString(fileCtr); String mazedatafileOriginalfilename = "mazedatafile"+ Integer.toString(fileCtr) + "Originalfilename"; if(fields.contains(mazedatafile)){ this.fileNames.add(fileCtr,request.getString(mazedatafile)); this.origFileNames.add(fileCtr,request.getString(mazedatafileOriginalfilename)); } fileCtr++; } String fileList ="<p>you uploaded the following files:</p><p><ol>"; for (String file : this.origFileNames ) { fileList = fileList +"<li>" + file + "</li>"; } fileList = fileList+ "</ol></p><p> Do you want to import the data in the database? </p>"; this.setFileList(fileList); } } if( action.equals("loadMazeDataFile2") ) { int fileCtr = 0; for (String file: this.fileNames) { String fileName = this.origFileNames.get(fileCtr); int extensionStart = fileName.indexOf("."); int unitId = Integer.parseInt(fileName.substring(extensionStart-1, extensionStart)); int year = Integer.parseInt(fileName.substring(0,4)); int month = Integer.parseInt(fileName.substring(4,6)); int day = Integer.parseInt(fileName.substring(6,8)); this.success = this.loadDataFile(db, year, month, day, file, this.pcId, unitId); if (this.success) { msg = new ScreenMessage("The file \"" + this.origFileNames.get(fileCtr) +"\" Is succesfully imported",null,true); this.getMessages().add(msg); }else { msg = new ScreenMessage("The file \"" + this.origFileNames.get(fileCtr) +"\" could not be imported",null,false); this.getMessages().add(msg); } fileCtr++; } // prepare for next upload this.setFileList(null); this.fileNames.clear(); this.origFileNames.clear(); } } catch(Exception e) { e.printStackTrace(); msg = new ScreenMessage("Something went horribly wrong.. ",null,false); this.getMessages().add(msg); //e.g. show a message in your form } // add status messages to the screen } @Override public void reload(Database db) { // { // Database db = this.getDatabase(); // Query q = db.query(Experiment.class); // q.like("name", "test"); // List<Experiment> recentExperiments = q.find(); // // //do something // } // catch(Exception e) // { // //... // } } }