All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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"
                    )
            );
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy