/** * 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 java.util.List; import java.util.Optional; import java.util.Set; import org.joda.beans.Bean; import org.joda.beans.JodaBeanUtils; import org.joda.beans.MetaBean; import com.google.common.collect.Sets; import com.opengamma.strata.calc.runner.CalculationFunctions; import com.opengamma.strata.product.Trade; import com.opengamma.strata.product.TradeInfo; /** * Evaluates a token against a trade to produce another object. * <p> * This merges the {@link Trade} and {@link TradeInfo} objects, giving priority to {@code Trade}. */ public class TradeTokenEvaluator extends TokenEvaluator<Trade> { @Override public Class<Trade> getTargetType() { return Trade.class; } @Override public Set<String> tokens(Trade trade) { MetaBean metaBean = JodaBeanUtils.metaBean(trade.getClass()); return Sets.union(metaBean.metaPropertyMap().keySet(), trade.getInfo().propertyNames()); } @Override public EvaluationResult evaluate( Trade trade, CalculationFunctions functions, String firstToken, List<String> remainingTokens) { MetaBean metaBean = JodaBeanUtils.metaBean(trade.getClass()); // trade Optional<String> tradePropertyName = metaBean.metaPropertyMap().keySet().stream() .filter(p -> p.equalsIgnoreCase(firstToken)) .findFirst(); if (tradePropertyName.isPresent()) { Object propertyValue = metaBean.metaProperty(tradePropertyName.get()).get((Bean) trade); if (propertyValue == null) { return EvaluationResult.failure("Property '{}' not set", firstToken); } return EvaluationResult.success(propertyValue, remainingTokens); } // trade info Optional<String> tradeInfoPropertyName = trade.getInfo().propertyNames().stream() .filter(p -> p.equalsIgnoreCase(firstToken)) .findFirst(); if (tradeInfoPropertyName.isPresent()) { Object propertyValue = trade.getInfo().property(tradeInfoPropertyName.get()).get(); if (propertyValue == null) { return EvaluationResult.failure("Property '{}' not set", firstToken); } return EvaluationResult.success(propertyValue, remainingTokens); } return invalidTokenFailure(trade, firstToken); } }