DictionaryService.java

package org.vlaskin.moexiss.service.dictionary;

import lombok.extern.slf4j.Slf4j;
import org.vlaskin.moexiss.entity.BoardGroupResponse;
import org.vlaskin.moexiss.entity.BoardResponse;
import org.vlaskin.moexiss.entity.DictionaryResponse;
import org.vlaskin.moexiss.entity.DurationResponse;
import org.vlaskin.moexiss.entity.EngineResponse;
import org.vlaskin.moexiss.entity.MarketResponse;
import org.vlaskin.moexiss.entity.SecurityCollectionResponse;
import org.vlaskin.moexiss.entity.SecurityGroupResponse;
import org.vlaskin.moexiss.entity.SecurityTypeResponse;
import org.vlaskin.moexiss.entity.base.EntityType;
import org.vlaskin.moexiss.http.MoexHttpTransport;
import org.vlaskin.moexiss.response.Response;
import org.vlaskin.moexiss.response.ResponseUtils;
import org.vlaskin.moexiss.service.BaseService;

import java.io.IOException;
import java.util.List;

/** Сервис справочников торговых систем, рынков, режимов торгов и типов инструментов. */
@Slf4j
public final class DictionaryService extends BaseService
{
    /** Создаёт сервис для официального адреса MOEX ISS. */
    public DictionaryService()
    {
        super();
    }

    /**
     * Создаёт сервис для заданного адреса и транспорта.
     *
     * @param baseUrl базовый адрес сервера
     * @param httpTransport HTTP-транспорт
     */
    public DictionaryService(String baseUrl, MoexHttpTransport httpTransport)
    {
        super(baseUrl, httpTransport);
    }

    /**
     * Возвращает все справочники MOEX ISS одним запросом.
     */
    public DictionaryResponse getAll() throws IOException
    {
        Response response = getResponse();
        return DictionaryResponse.builder()
                .engines(ResponseUtils.convertTo(EntityType.TRADING_SYSTEM, response))
                .markets(ResponseUtils.convertTo(EntityType.MARKET, response))
                .boards(ResponseUtils.convertTo(EntityType.BOARD, response))
                .boardGroups(ResponseUtils.convertTo(EntityType.BOARD_GROUP, response))
                .durations(ResponseUtils.convertTo(EntityType.DURATION, response))
                .securityTypes(ResponseUtils.convertTo(EntityType.SECURITY_TYPE, response))
                .securityGroups(ResponseUtils.convertTo(EntityType.SECURITY_GROUP, response))
                .securityCollections(ResponseUtils.convertTo(EntityType.SECURITY_COLLECTION, response))
                .build();
    }

    /**
     * Возвращает торговые системы.
     */
    public List<EngineResponse> getEngines() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.TRADING_SYSTEM, getResponse("engines"));
    }

    /**
     * Возвращает рынки торговых систем.
     */
    public List<MarketResponse> getMarkets() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.MARKET, getResponse("markets"));
    }

    /**
     * Возвращает режимы торгов.
     */
    public List<BoardResponse> getBoards() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.BOARD, getResponse("boards"));
    }

    /**
     * Возвращает группы режимов торгов.
     */
    public List<BoardGroupResponse> getBoardGroups() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.BOARD_GROUP, getResponse("boardgroups"));
    }

    /**
     * Возвращает доступные интервалы свечей.
     */
    public List<DurationResponse> getDurations() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.DURATION, getResponse("durations"));
    }

    /**
     * Возвращает типы ценных бумаг.
     */
    public List<SecurityTypeResponse> getSecurityTypes() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.SECURITY_TYPE, getResponse("securitytypes"));
    }

    /**
     * Возвращает группы ценных бумаг.
     */
    public List<SecurityGroupResponse> getSecurityGroups() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.SECURITY_GROUP, getResponse("securitygroups"));
    }

    /**
     * Возвращает коллекции ценных бумаг.
     */
    public List<SecurityCollectionResponse> getSecurityCollections() throws IOException
    {
        return ResponseUtils.convertTo(EntityType.SECURITY_COLLECTION,
                getResponse("securitycollections"));
    }

    private Response getResponse(String... only) throws IOException
    {
        StringBuilder requestBuilder = new StringBuilder(baseUrl).append("/iss/index.json");
        pasteBasicRequestParams(requestBuilder, only);

        log.debug("Request: {}", requestBuilder);
        return getAndParseResponse(requestBuilder, Response.class);
    }
}