/** * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.report.framework.expression; import static com.opengamma.strata.collect.Guavate.toImmutableList; import static com.opengamma.strata.collect.Guavate.toImmutableSet; import java.util.List; import java.util.Locale; import java.util.Set; import java.util.stream.Stream; import com.google.common.collect.ImmutableSet; import com.opengamma.strata.calc.runner.CalculationFunctions; import com.opengamma.strata.market.param.CurrencyParameterSensitivities; import com.opengamma.strata.market.param.CurrencyParameterSensitivity; /** * Evaluates a token against currency parameter sensitivities. * <p> * Tokens are matched against the name and currency code of the sensitivities. * All strings are converted to lower case before matching. */ public class CurrencyParameterSensitivitiesTokenEvaluator extends TokenEvaluator<CurrencyParameterSensitivities> { @Override public Class<?> getTargetType() { return CurrencyParameterSensitivities.class; } @Override public Set<String> tokens(CurrencyParameterSensitivities sensitivities) { return sensitivities.getSensitivities().stream() .flatMap(this::tokensForSensitivity) .collect(toImmutableSet()); } @Override public EvaluationResult evaluate( CurrencyParameterSensitivities sensitivities, CalculationFunctions functions, String firstToken, List<String> remainingTokens) { List<CurrencyParameterSensitivity> matchingSensitivities = sensitivities.getSensitivities().stream() .filter(sensitivity -> matchesToken(sensitivity, firstToken)) .collect(toImmutableList()); switch (matchingSensitivities.size()) { case 0: return invalidTokenFailure(sensitivities, firstToken); case 1: return EvaluationResult.success(matchingSensitivities.get(0), remainingTokens); default: return EvaluationResult.success(CurrencyParameterSensitivities.of(matchingSensitivities), remainingTokens); } } private Stream<String> tokensForSensitivity(CurrencyParameterSensitivity sensitivity) { return ImmutableSet.of( sensitivity.getCurrency().getCode(), sensitivity.getMarketDataName().getName()) .stream() .map(v -> v.toLowerCase(Locale.ENGLISH)); } private boolean matchesToken(CurrencyParameterSensitivity sensitivity, String token) { return token.equalsIgnoreCase(sensitivity.getCurrency().getCode()) || token.equalsIgnoreCase(sensitivity.getMarketDataName().getName()); } }