com.opengamma.strata.report.framework.expression.PositionTokenEvaluator.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.strata.report.framework.expression.PositionTokenEvaluator.java

Source

/**
 * 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);
    }

}