package com.yami.trading.huobi.tradingview.api;
|
|
import com.yami.trading.huobi.tradingview.api.model.TickerData;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.CompletableFuture;
|
|
public class TickerSubscription {
|
private final String simpleOrProName;
|
private final TradingViewAPI api;
|
private final List<UpdateListener> updateListeners = new ArrayList<>();
|
|
private long due;
|
|
private TickerData tickerData;
|
|
private boolean destroyed = false;
|
|
public TickerSubscription(TradingViewAPI api, String simpleOrProName) {
|
this.api = api;
|
this.simpleOrProName = simpleOrProName;
|
refreshDue();
|
}
|
|
public void updateData(TickerData tickerDataPatch) {
|
if (this.tickerData == null) {
|
this.tickerData = tickerDataPatch;
|
} else {
|
this.tickerData = this.tickerData.merge(tickerDataPatch);
|
}
|
this.tickerData.setLastUpdated(new Date());
|
|
for (UpdateListener listener : new ArrayList<>(updateListeners)) {
|
listener.onUpdate(this.tickerData);
|
}
|
}
|
|
public CompletableFuture<TickerData> fetch() {
|
refreshDue();
|
return api.ensureRegistered(this).thenApply(v -> tickerData);
|
}
|
|
public boolean isCanBeDestroyed() {
|
return due < System.currentTimeMillis() && updateListeners.isEmpty();
|
}
|
|
private void refreshDue() {
|
this.due = System.currentTimeMillis() + 5000;
|
}
|
|
public void addUpdateListener(UpdateListener listener) {
|
updateListeners.add(listener);
|
if (destroyed) {
|
destroyed = false;
|
api.ensureRegistered(this);
|
}
|
}
|
|
public String getSimpleOrProName() {
|
return simpleOrProName;
|
}
|
|
public TradingViewAPI getApi() {
|
return api;
|
}
|
|
public List<UpdateListener> getUpdateListeners() {
|
return updateListeners;
|
}
|
|
public long getDue() {
|
return due;
|
}
|
|
public void setDue(long due) {
|
this.due = due;
|
}
|
|
public TickerData getTickerData() {
|
return tickerData;
|
}
|
|
public void setTickerData(TickerData tickerData) {
|
this.tickerData = tickerData;
|
}
|
|
public boolean isDestroyed() {
|
return destroyed;
|
}
|
|
public void setDestroyed(boolean destroyed) {
|
this.destroyed = destroyed;
|
}
|
|
public void removeUpdateListener(UpdateListener listener) {
|
updateListeners.remove(listener);
|
}
|
}
|