/** * 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 com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.data.MarketDataId; import com.opengamma.strata.data.MarketDataName; import com.opengamma.strata.data.NamedMarketDataId; import com.opengamma.strata.data.scenario.MarketDataBox; import com.opengamma.strata.data.scenario.ScenarioPerturbation; /** * Encapsulates a rule or set of rules to decide whether a perturbation applies to a piece of market data. * <p> * A {@link ScenarioPerturbation} encapsulates a specific change to a piece of market data, such as a parallel shift. * An implementation of this filter interface defines when the perturbation should be used. * For example, a filter could apply to all yield curves whose currency is USD, or quoted prices * of equity securities in the energy sector. * <p> * Implementations must be immutable and thread-safe beans. * * @param <T> the type of the market data handled by the filter * @param <I> the type of the market data ID handled by the filter */ public interface MarketDataFilter<T, I extends MarketDataId<T>> { /** * Obtains a filter that matches any value with the specified identifier type. * * @param <T> the type of market data handled by the filter * @param type the type that is matched by this filter * @return a filter matching the specified type */ public static <T> MarketDataFilter<T, MarketDataId<T>> ofIdType(Class<? extends MarketDataId<T>> type) { return new IdTypeFilter<T>(type); } /** * Obtains a filter that matches the specified identifier. * * @param <T> the type of market data handled by the filter * @param id the identifier that is matched by this filter * @return a filter matching the specified identifier */ public static <T> MarketDataFilter<T, MarketDataId<T>> ofId(MarketDataId<T> id) { return new IdFilter<T>(id); } /** * Obtains a filter that matches the specified name. * * @param <T> the type of market data handled by the filter * @param name the name that is matched by this filter * @return a filter matching the specified name */ public static <T> MarketDataFilter<T, NamedMarketDataId<T>> ofName(MarketDataName<T> name) { return new NameFilter<T>(name); } //------------------------------------------------------------------------- /** * Returns the type of market data ID handled by this filter. * <p> * This should correspond to the type parameter {@code I}. * * @return the type of market data ID handled by this filter */ public abstract Class<?> getMarketDataIdType(); /** * Applies the filter to a market data ID and the corresponding market data value * and returns true if the filter matches. * * @param marketDataId the ID of a piece of market data * @param marketData the market data value * @param refData the reference data * @return true if the filter matches */ public abstract boolean matches(I marketDataId, MarketDataBox<T> marketData, ReferenceData refData); }