jnidzwetzki/bitfinex-v2-wss-api-java

View on GitHub
src/main/java/com/github/jnidzwetzki/bitfinex/v2/BitfinexApiCallbackListeners.java

Summary

Maintainability
A
0 mins
Test Coverage
/*******************************************************************************
 *
 *    Copyright (C) 2015-2018 Jan Kristof Nidzwetzki
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 *
 *******************************************************************************/
package com.github.jnidzwetzki.bitfinex.v2;

import java.io.Closeable;
import java.util.Collection;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexBalanceUpdate;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexCandle;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexExecutedTrade;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexMyExecutedTrade;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexOrderBookEntry;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexPosition;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexSubmittedOrder;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexTick;
import com.github.jnidzwetzki.bitfinex.v2.entity.BitfinexWallet;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexAccountSymbol;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexCandlestickSymbol;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexExecutedTradeSymbol;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexOrderBookSymbol;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexStreamSymbol;
import com.github.jnidzwetzki.bitfinex.v2.symbol.BitfinexTickerSymbol;

/**
 * Main registry of events listeners happening within integration with bitfinex exchange
 */
public class BitfinexApiCallbackListeners {

    protected final Queue<Consumer<BitfinexConnectionStateEnum>> connectionStateConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Runnable> connectionSuccessConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Runnable> connectionFailedConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Runnable> disconnectionSuccessConsumers = new ConcurrentLinkedQueue<>();

    protected final Queue<Consumer<BitfinexStreamSymbol>> subscribeChannelConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Consumer<BitfinexStreamSymbol>> unsubscribeChannelConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, BitfinexSubmittedOrder>> newOrderConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, Collection<BitfinexSubmittedOrder>>> submittedOrderConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, Collection<BitfinexPosition>>> positionConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, BitfinexMyExecutedTrade>> tradeConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, Collection<BitfinexWallet>>> walletConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexCandlestickSymbol, Collection<BitfinexCandle>>> candlesConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexExecutedTradeSymbol, Collection<BitfinexExecutedTrade>>> executedTradesConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexOrderBookSymbol, Collection<BitfinexOrderBookEntry>>> orderbookEntryConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexOrderBookSymbol, Collection<BitfinexOrderBookEntry>>> rawOrderbookEntryConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexAccountSymbol, BitfinexBalanceUpdate>> balanceUpdateConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<BiConsumer<BitfinexTickerSymbol, BitfinexTick>> tickConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Consumer<BitfinexAccountSymbol>> authSuccessConsumers = new ConcurrentLinkedQueue<>();
    protected final Queue<Consumer<BitfinexAccountSymbol>> authFailedConsumers = new ConcurrentLinkedQueue<>();

    /**
     * registers listener for notifications on connection state
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onConnectionStateChange(final Consumer<BitfinexConnectionStateEnum> listener) {
        connectionStateConsumers.offer(listener);
        return () -> connectionStateConsumers.remove(listener);
    }

    /**
     * registers a listener for connection state change (Connection or Reconnection success)
     * @param listener of event
     * @return hook to this listener
     */
    public Closeable onConnectionSuccess(final Runnable listener) {
        connectionSuccessConsumers.offer(listener);
        return () -> connectionSuccessConsumers.remove(listener);
    }

    /**
     * registers a listener for connection state change (Connection or Reconnection fail)
     * @param listener of event
     * @return hook to this listener
     */
    public Closeable onConnectionFailed(final Runnable listener) {
        connectionFailedConsumers.offer(listener);
        return () -> connectionFailedConsumers.remove(listener);
    }

    /**
     * registers a listener for connection state change (disconnect or disconnected by remote)
     * @param listener of event
     * @return hook to this listener
     */
    public Closeable onDisconnect(final Runnable listener) {
        disconnectionSuccessConsumers.offer(listener);
        return () -> disconnectionSuccessConsumers.remove(listener);
    }

    /**
     * registers listener for subscribe events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onSubscribeChannelEvent(final Consumer<BitfinexStreamSymbol> listener) {
        subscribeChannelConsumers.offer(listener);
        return () -> subscribeChannelConsumers.remove(listener);
    }

    /**
     * registers listener for unsubscribe events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onUnsubscribeChannelEvent(final Consumer<BitfinexStreamSymbol> listener) {
        unsubscribeChannelConsumers.offer(listener);
        return () -> unsubscribeChannelConsumers.remove(listener);
    }

    /**
     * registers listener for my order notifications
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onMyOrderNotification(final BiConsumer<BitfinexAccountSymbol, BitfinexSubmittedOrder> listener) {
        newOrderConsumers.offer(listener);
        return () -> newOrderConsumers.remove(listener);
    }

    /**
     * registers listener for user account related events - submitted order events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onMySubmittedOrderEvent(final BiConsumer<BitfinexAccountSymbol, Collection<BitfinexSubmittedOrder>> listener) {
        submittedOrderConsumers.offer(listener);
        return () -> submittedOrderConsumers.remove(listener);
    }

    /**
     * registers listener for user account related events - position events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onMyPositionEvent(final BiConsumer<BitfinexAccountSymbol, Collection<BitfinexPosition>> listener) {
        positionConsumers.offer(listener);
        return () -> positionConsumers.remove(listener);
    }

    /**
     * registers listener for user account related events - executed trades (against submitted order) events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onMyTradeEvent(final BiConsumer<BitfinexAccountSymbol, BitfinexMyExecutedTrade> listener) {
        tradeConsumers.offer(listener);
        return () -> tradeConsumers.remove(listener);
    }

    /**
     * registers listener for user account related events - wallet change events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onMyWalletEvent(final BiConsumer<BitfinexAccountSymbol,Collection<BitfinexWallet>> listener) {
        walletConsumers.offer(listener);
        return () -> walletConsumers.remove(listener);
    }

    /**
     * registers listener for candlesticks info updates
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onCandlesticksEvent(final BiConsumer<BitfinexCandlestickSymbol, Collection<BitfinexCandle>> listener) {
        candlesConsumers.offer(listener);
        return () -> candlesConsumers.remove(listener);
    }

    /**
     * registers listener for general trades executed within scope of exchange instrument (ie. tBTCUSD)
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onExecutedTradeEvent(final BiConsumer<BitfinexExecutedTradeSymbol, Collection<BitfinexExecutedTrade>> listener) {
        executedTradesConsumers.offer(listener);
        return () -> executedTradesConsumers.remove(listener);
    }

    /**
     * registers listener for orderbook events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onOrderbookEvent(final BiConsumer<BitfinexOrderBookSymbol, Collection<BitfinexOrderBookEntry>> listener) {
        orderbookEntryConsumers.offer(listener);
        return () -> orderbookEntryConsumers.remove(listener);
    }

    /**
     * registers listener for raw orderbook events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onRawOrderbookEvent(final BiConsumer<BitfinexOrderBookSymbol, Collection<BitfinexOrderBookEntry>> listener) {
        rawOrderbookEntryConsumers.offer(listener);
        return () -> rawOrderbookEntryConsumers.remove(listener);
    }

    /**
     * registers listener for balance update events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onBalanceUpdateEvent(BiConsumer<BitfinexAccountSymbol, BitfinexBalanceUpdate> listener) {
        balanceUpdateConsumers.offer(listener);
        return () -> balanceUpdateConsumers.remove(listener);
    }

    /**
     * registers listener for tick events
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onTickEvent(final BiConsumer<BitfinexTickerSymbol, BitfinexTick> listener) {
        tickConsumers.offer(listener);
        return () -> tickConsumers.remove(listener);
    }

    /**
     * registers listener for event of successful authentication with api-key
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onAuthenticationSuccessEvent(final Consumer<BitfinexAccountSymbol> listener) {
        authSuccessConsumers.offer(listener);
        return () -> authSuccessConsumers.remove(listener);
    }

    /**
     * registers listener for event of failed authentication with api-key
     * @param listener of event
     * @return hook of this listener
     */
    public Closeable onAuthenticationFailedEvent(final Consumer<BitfinexAccountSymbol> listener) {
        authFailedConsumers.offer(listener);
        return () -> authFailedConsumers.remove(listener);
    }

}