class CSVSpreadsheetReader implements SpreadsheetReader {

	public void read(InputStream inputStream, Range rowRange,
			Range columnRange, boolean ignoreBlankRows,
			SpreadsheetRowProcessor rowProcessor)
			throws SpreadsheetReadException {
		CsvReader csvReader = new CsvReader(new InputStreamReader(inputStream));
		csvReader.setSkipEmptyRecords(false);

		SortedMap<Integer, String> currentDataRow = new TreeMap<Integer, String>();

		try {
			while(csvReader.readRecord()) {
				int rowIndex = (int) csvReader.getCurrentRecord();
				boolean blankRow = true;
				if (rowRange.contains(rowIndex)) {
					for (int columnIndex = columnRange.getStart(); columnIndex <= columnRange.getEnd(); columnIndex++) {
						if (columnRange.contains(columnIndex)) {
							String value = csvReader.get(columnIndex);
							value = "".equals(value) ? null : value;
							if (value != null) {
								blankRow = false;
							}
							currentDataRow.put(columnIndex, value);
							if (columnIndex == columnRange.getEnd()) {
								if (!ignoreBlankRows || !blankRow) {
									rowProcessor.processRow(rowIndex, currentDataRow);
								}
								currentDataRow = new TreeMap<Integer, String>();
							}
						}
					}
				
					if (rowIndex == rowRange.getEnd()) {
						break;
					}
				}
			}
		} catch (IOException e) {
			throw new SpreadsheetReadException("Unable to read CSV file", e);
		}
	}

}