package org.cryptocoinpartners.module;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.StringUtils;
import org.cryptocoinpartners.schema.Book;
import org.cryptocoinpartners.schema.BookFactory;
import org.cryptocoinpartners.schema.Exchange;
import org.cryptocoinpartners.schema.Listing;
import org.cryptocoinpartners.schema.Market;
import org.cryptocoinpartners.schema.Trade;
import org.cryptocoinpartners.schema.TradeFactory;
import org.joda.time.Instant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;
import com.xeiam.xchange.currency.CurrencyPair;
@SuppressWarnings("UnusedDeclaration")
@Singleton
public class ReadTicksCsv {
public static List<String> headers = new ArrayList<>(
Arrays.asList(new String[] { "listing", "exchange", "base", "quote", "prompt", "time", "last", "vol" }));
private SimpleDateFormat timeFormat;
private CSVReader reader;
private List csvEntries;
private final boolean allowNa;
private Exchange exchange;
private Listing listing;
private Market market;
private CurrencyPair pair;
private final Book.Builder bookBuilder = new Book.Builder();
private final SaveMarketData dbPersistance = new SaveMarketData();;
@Inject
public ReadTicksCsv(Context context, Configuration config, TradeFactory tradefactory, BookFactory bookFactory) {
final String filename = config.getString("readtickscsv.filename");
if (!StringUtils.isNotBlank(filename))
throw new ConfigurationError("You must set the property readtickscsv.filename");
allowNa = config.getBoolean("readtickscsv.na", false);
String timeFormatStr = config.getString("readtickscsv.timeFormat", "yyMMddHHmmss");
try {
timeFormat = new SimpleDateFormat(timeFormatStr);
} catch (NullPointerException e) {
throw new ConfigurationError("The input date format must be specified in the property readtickscsv.timeFormat");
} catch (IllegalArgumentException e) {
throw new ConfigurationError("The format is invalid: readtickscsv.timeFormat=" + timeFormatStr + "\n" + e.getMessage());
}
try {
reader = new CSVReader(new FileReader(filename), ',', '\"', 1);
// ColumnPositionMappingStrategy<CsvTrade> strat = new ColumnPositionMappingStrategy();
// strat.setType(CsvTrade.class);
// String[] columns = new String[] { "market", "time", "price", "volume" }; // the fields to bind do in your JavaBean
// strat.setColumnMapping(columns);
//
// CsvToBean csv = new CsvToBean();
// List list = csv.parse(strat, reader);
// //
ColumnPositionMappingStrategy<CsvTrade> mappingStrategy = new ColumnPositionMappingStrategy<CsvTrade>();
mappingStrategy.setType(CsvTrade.class);
// the fields to bind do in your JavaBean
String[] columns = new String[] { "listing", "exchange", "base", "quote", "prompt", "time", "last", "vol", "bidprice1", "bidvol1", "askprice1",
"askvol1" };
mappingStrategy.setColumnMapping(columns);
CsvToBean<CsvTrade> csv = new CsvToBean<CsvTrade>();
List<CsvTrade> trades = csv.parse(mappingStrategy, reader);
Iterator<CsvTrade> it = trades.iterator();
while (it.hasNext()) {
CsvTrade csvtrade = it.next();
Instant instant = new Instant(csvtrade.getTime());
if (exchange == null || !exchange.toString().equals(csvtrade.getExchange())) {
exchange = Exchange.forSymbolOrCreate(csvtrade.getExchange());
market = null;
}
if (listing == null || !listing.toString().equals(csvtrade.getListingAsString())) {
listing = Listing.forSymbol(csvtrade.getListingAsString());
market = null;
}
if (pair == null || !pair.toString().equals(csvtrade.getCurrencyPair())) {
pair = new CurrencyPair(csvtrade.getBase(), csvtrade.getQuote());
market = null;
}
if (market == null)
market = market.findOrCreate(exchange, listing);
Trade trade = tradefactory.fromDoubles(market, instant, instant, csvtrade.getTime().toString(), csvtrade.getLast(), csvtrade.getVol());
Book book = bookFactory.create(instant, instant, csvtrade.getTime().toString(), market);
book.addBid(BigDecimal.valueOf(csvtrade.getBidprice1()), BigDecimal.valueOf(csvtrade.getBidvol1()));
book.addAsk(BigDecimal.valueOf(csvtrade.getAskprice1()), BigDecimal.valueOf(csvtrade.getAskvol1()));
book.build();
context.publish(book);
context.publish(trade);
}
} catch (IOException e) {
throw new ConfigurationError("Could not read file " + filename);
}
}
public static class CsvTrade {
private String exchange;
private String listing;
private Long time;
private double last;
private double vol;
private String base;
private String quote;
private String prompt;
private double bidprice1;
private double bidvol1;
private double askprice1;
private double askvol1;
public String getExchange() {
return exchange;
}
public String getListingAsString() {
if ((getPrompt()) == null)
return base + "." + quote;
return base + "." + quote + "." + prompt;
}
public String getBase() {
return base;
}
public String getPrompt() {
if (prompt.isEmpty())
return null;
return prompt;
}
public String getQuote() {
return quote;
}
public String getCurrencyPair() {
// TODO Auto-generated method stub
return base + "/" + quote;
}
public String getListing() {
return listing;
}
public void setExchange(String exchange) {
this.exchange = exchange;
}
public void setListing(String listing) {
this.listing = listing;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public void setBase(String base) {
this.base = base;
}
public void setQuote(String quote) {
this.quote = quote;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public double getLast() {
return last;
}
public void setLast(double last) {
this.last = last;
}
public double getBidprice1() {
return bidprice1;
}
public void setBidprice1(double bidprice1) {
this.bidprice1 = bidprice1;
}
public double getBidvol1() {
return bidvol1;
}
public void setBidvol1(double bidvol1) {
this.bidvol1 = bidvol1;
}
public double getAskprice1() {
return askprice1;
}
public void setAskprice1(double askprice1) {
this.askprice1 = askprice1;
}
public double getAskvol1() {
return askvol1;
}
public void setAskvol1(double askvol1) {
this.askvol1 = askvol1;
}
public double getVol() {
return vol;
}
public void setVol(double vol) {
this.vol = vol;
}
}
protected static Logger log = LoggerFactory.getLogger("org.cryptocoinpartners.csvReader");
}