/******************************************************************************* * Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University * as Operator of the SLAC National Accelerator Laboratory. * Copyright (c) 2011 Brookhaven National Laboratory. * EPICS archiver appliance is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. *******************************************************************************/ package org.epics.archiverappliance.utils.imprt; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.lang.reflect.Constructor; import java.util.Iterator; import org.apache.log4j.Logger; import org.epics.archiverappliance.Event; import org.epics.archiverappliance.config.ArchDBRTypes; import org.epics.archiverappliance.data.DBRTimeEvent; import au.com.bytecode.opencsv.CSVReader; import edu.stanford.slac.archiverappliance.PB.data.DBR2PBTypeMapping; /** * The iterator for a CSV backed event stream * @author mshankar * */ class CSVEventStreamIterator implements Iterator<Event> { private static Logger logger = Logger.getLogger(CSVEventStreamIterator.class.getName()); private String csvFileName; private ArchDBRTypes dbrtype; private LineNumberReader linereader; private CSVReader csvreader; private Event nextEvent; private Constructor<? extends DBRTimeEvent> eventConstructor; public CSVEventStreamIterator(String fileName, ArchDBRTypes type) throws IOException { this.csvFileName = fileName; this.dbrtype = type; linereader = new LineNumberReader(new FileReader(fileName)); csvreader = new CSVReader(linereader); eventConstructor = DBR2PBTypeMapping.getPBClassFor(dbrtype).getSerializingConstructor(); assert(eventConstructor != null); } @Override public boolean hasNext() { nextEvent = readNextEvent(); if(nextEvent != null) return true; return false; } @Override public Event next() { return nextEvent; } @Override public void remove() { throw new UnsupportedOperationException("We do not support the remove method in this iterator"); } public void close() { try { csvreader.close(); csvreader = null; } catch (Exception ex) { } } private Event readNextEvent() { try { String [] line = csvreader.readNext(); if(line == null || line.length < 5) return null; CSVEvent csvEvent = new CSVEvent(line, dbrtype); return (Event) eventConstructor.newInstance(csvEvent); } catch(Exception ex) { logger.error("Exception parsing CSV file " + csvFileName + " in line " + (linereader.getLineNumber()-1), ex); } return null; } }