package org.marketcetera.orderloader;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVStrategy;
import org.marketcetera.util.unicode.UnicodeInputStreamReader;
import org.marketcetera.util.unicode.DecodingStrategy;
import org.marketcetera.util.misc.ClassVersion;
import static org.marketcetera.orderloader.Messages.*;
/* $License$ */
/**
* Processes a CSV file and generates trade objects from it.
*
* @author anshul@marketcetera.com
* @version $Id: OrderParser.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.0.0
*/
@ClassVersion("$Id: OrderParser.java 16154 2012-07-14 16:34:05Z colin $")
public class OrderParser {
/**
* Creates a parser instance that parses the orders and processes
* them using the supplied delegate.
*
* @param inProcessor the delegate to use for creating orders from
* each row and processing them. Cannot be null
*/
public OrderParser(RowProcessor inProcessor) {
if(inProcessor == null) {
throw new NullPointerException();
}
mProcessor = inProcessor;
}
/**
* Returns the total number of lines processed.
*
* @return the total number of lines processed.
*/
public int getNumLines() {
return mNumLines;
}
/**
* Returns the total number of blank lines.
*
* @return the total number of blank lines.
*/
public int getNumBlankLines() {
return mNumBlankLines;
}
/**
* Returns the total number of lines with comments.
*
* @return the total number of lines with comments.
*/
public int getNumComments() {
return mNumComments;
}
/**
* Parses rows out of the supplied file and uses the processors to
* process them.
*
* @param inStream the input stream with csv input containing orders.
* The stream is closed when this method returns.
*
* @throws IOException if there was an error opening the supplied file or
* if the file had no orders to send.
* @throws OrderParsingException if the file didn't have the
* column headers specified correctly or if the file didn't have any orders.
*/
public void parseOrders(InputStream inStream)
throws IOException, OrderParsingException {
UnicodeInputStreamReader reader = null;
try {
reader = new UnicodeInputStreamReader(
inStream, DecodingStrategy.SIG_REQ);
String[][] rows = new CSVParser(reader,
CSVStrategy.EXCEL_STRATEGY).getAllValues();
boolean isProcessorInit = false;
if (rows != null) {
for(String[] row : rows) {
mNumLines++;
//Ignore empty lines.
if(row.length == 0 || row.length == 1 &&
row[0].trim().isEmpty()) {
mNumBlankLines++;
} else if (row[0].startsWith(COMMENT_MARKER)) {
mNumComments++;
} else {
if(isProcessorInit) {
getProcessor().processOrder(mNumLines, row);
} else {
getProcessor().initialize(row);
isProcessorInit = true;
}
}
}
}
if(getProcessor().getTotal() < 1) {
throw new OrderParsingException(ERROR_NO_ORDERS);
}
} finally {
if(reader != null) {
reader.close();
}
if(inStream != null) {
inStream.close();
}
}
}
/**
* Returns the processor being used for processing rows.
*
* @return the processor being used for processing rows.
*/
RowProcessor getProcessor() {
return mProcessor;
}
public static final String COMMENT_MARKER = "#"; //$NON-NLS-1$
private int mNumLines = 0;
private int mNumBlankLines = 0;
private int mNumComments = 0;
private final RowProcessor mProcessor;
}