/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.calc.marketdata; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import com.opengamma.strata.basics.currency.Currency; import com.opengamma.strata.collect.ArgChecker; import com.opengamma.strata.data.MarketDataId; import com.opengamma.strata.data.ObservableId; /** * Mutable builder for creating instances of {@link MarketDataRequirements}. */ public final class MarketDataRequirementsBuilder { /** IDs identifying the observable market data values required for the calculations. */ private final Set<ObservableId> observables = new HashSet<>(); /** IDs identifying the non-observable market data values required for the calculations. */ private final Set<MarketDataId<?>> nonObservables = new HashSet<>(); /** IDs identifying the time series of market data values required for the calculations. */ private final Set<ObservableId> timeSeries = new HashSet<>(); /** The currencies used in the outputs of the calculations. */ private final Set<Currency> outputCurrencies = new HashSet<>(); /** * Adds requirements for time series of observable market data. * * @param ids IDs of the data * @return this builder */ public MarketDataRequirementsBuilder addTimeSeries(Collection<? extends ObservableId> ids) { ArgChecker.notNull(ids, "ids"); timeSeries.addAll(ids); return this; } /** * Adds requirements for time series of observable market data. * * @param ids IDs of the data * @return this builder */ public MarketDataRequirementsBuilder addTimeSeries(ObservableId... ids) { return addTimeSeries(Arrays.asList(ids)); } /** * Adds requirements for single values of market data. * * @param ids IDs of the data * @return this builder */ @SuppressWarnings("unchecked") public MarketDataRequirementsBuilder addValues(Collection<? extends MarketDataId<?>> ids) { ArgChecker.notNull(ids, "ids"); for (MarketDataId<?> id : ids) { if (id instanceof ObservableId) { observables.add((ObservableId) id); } else { nonObservables.add(id); } } return this; } /** * Adds requirements for single values of market data. * * @param ids IDs of the data * @return this builder */ public MarketDataRequirementsBuilder addValues(MarketDataId<?>... ids) { return addValues(Arrays.asList(ids)); } /** * Adds the output currencies. * <p> * These are used to ensure that FX rate market data is available for currency conversion. * * @param currencies the output currencies * @return this builder */ public MarketDataRequirementsBuilder addOutputCurrencies(Currency... currencies) { outputCurrencies.addAll(Arrays.asList(currencies)); return this; } /** * Adds all requirements from an instance of {@code MarketDataRequirements} to this builder. * * @param requirements a set of requirements * @return this builder */ public MarketDataRequirementsBuilder addRequirements(MarketDataRequirements requirements) { ArgChecker.notNull(requirements, "requirements"); observables.addAll(requirements.getObservables()); outputCurrencies.addAll(requirements.getOutputCurrencies()); nonObservables.addAll(requirements.getNonObservables()); timeSeries.addAll(requirements.getTimeSeries()); return this; } /** * Returns a set of market data requirements built from the data in this builder. * * @return a set of market data requirements built from the data in this builder */ public MarketDataRequirements build() { return new MarketDataRequirements(observables, nonObservables, timeSeries, outputCurrencies); } }