/** * Copyright (C) 2016 - 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.Position; import com.opengamma.strata.product.PositionInfo; /** * Evaluates a token against a trade to produce another object. * <p> * This merges the {@link Position} and {@link PositionInfo} objects, giving priority to {@code Position}. */ public class PositionTokenEvaluator extends TokenEvaluator<Position> { @Override public Class<Position> getTargetType() { return Position.class; } @Override public Set<String> tokens(Position position) { MetaBean metaBean = JodaBeanUtils.metaBean(position.getClass()); return Sets.union(metaBean.metaPropertyMap().keySet(), position.getInfo().propertyNames()); } @Override public EvaluationResult evaluate( Position position, CalculationFunctions functions, String firstToken, List<String> remainingTokens) { MetaBean metaBean = JodaBeanUtils.metaBean(position.getClass()); // position Optional<String> positionPropertyName = metaBean.metaPropertyMap().keySet().stream() .filter(p -> p.equalsIgnoreCase(firstToken)) .findFirst(); if (positionPropertyName.isPresent()) { Object propertyValue = metaBean.metaProperty(positionPropertyName.get()).get((Bean) position); return propertyValue != null ? EvaluationResult.success(propertyValue, remainingTokens) : EvaluationResult.failure("Property '{}' not set", firstToken); } // position info Optional<String> positionInfoPropertyName = position.getInfo().propertyNames().stream() .filter(p -> p.equalsIgnoreCase(firstToken)) .findFirst(); if (positionInfoPropertyName.isPresent()) { Object propertyValue = position.getInfo().property(positionInfoPropertyName.get()).get(); return propertyValue != null ? EvaluationResult.success(propertyValue, remainingTokens) : EvaluationResult.failure("Property '{}' not set", firstToken); } // not found return invalidTokenFailure(position, firstToken); } }