io.mstream.trader.simulation.stocks.datafeed.DataFeedDatesRepository Maven / Gradle / Ivy
package io.mstream.trader.simulation.stocks.datafeed;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixObservableCommand;
import io.mstream.trader.simulation.stocks.DateRange;
import io.mstream.trader.simulation.stocks.DatesRepository;
import io.mstream.trader.simulation.stocks.datafeed.client.DataFeedClient;
import rx.Observable;
import javax.inject.Inject;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
class DataFeedDatesRepository
implements DatesRepository {
private final DataFeedClient dataFeedClient;
private final DateTimeFormatter dateFormatter;
@Inject
public DataFeedDatesRepository(
DataFeedClient dataFeedClient,
DateTimeFormatter dateFormatter
) {
this.dataFeedClient = dataFeedClient;
this.dateFormatter = dateFormatter;
}
@Override
public Observable getAll() {
return new GetAllCommand().observe();
}
private Observable datesWithinRange(DateRange dateRange) {
return Observable.create(
observer -> {
LocalDate dateFrom = LocalDate.parse(
dateRange.getFrom(),
dateFormatter
);
LocalDate dateTo = LocalDate.parse(
dateRange.getTo(),
dateFormatter
);
LocalDate date = dateFrom;
while (!date.isAfter(dateTo)) {
observer.onNext(date);
date = date.plusDays(1);
}
observer.onCompleted();
}
);
}
private class GetAllCommand
extends HystrixObservableCommand {
GetAllCommand() {
super(HystrixCommandGroupKey.Factory.asKey("DataFeed"));
}
@Override
protected Observable construct() {
return dataFeedClient
.getDates()
.limit(2)
.buffer(2)
.map(dates ->
new DateRange(
dates.get(0),
dates.get(1)
)
)
.flatMap(DataFeedDatesRepository.this::datesWithinRange);
}
@Override
protected Observable resumeWithFallback() {
return datesWithinRange(
new DateRange(
"2015-01-01",
"2016-01-01"
)
);
}
}
}