All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.ufg.inf.es.saep.sandbox.infraestrutura.Avaliador Maven / Gradle / Ivy

Go to download

Modelo de Domínio do Sistema de Apoio à Elaboração de Pareceres (SAEP), composto por um único 'bounded context'.

There is a newer version: 1.0.6
Show newest version
package br.ufg.inf.es.saep.sandbox.infraestrutura;

import br.ufg.inf.es.saep.sandbox.dominio.*;
import com.udojava.evalex.Expression;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * Implementação do serviço de avaliação de regra usando a ferramenta
 * Java Expression
 * Evaluator.
 */
public class Avaliador implements AvaliaRegraService {

    @Override
    public Valor avaliaRegra(Regra regra, Map contexto, List relatos) {
        switch (regra.getTipo()) {
            case Regra.PONTOS:
                float pontosPorRelato = regra.getPontosPorItem();
                float total = pontosPorRelato * relatos.size();
                total = ajustaLimites(regra, total);

                return new Valor(total);

            case Regra.EXPRESSAO:
                float valor = avaliaExpressao(regra, contexto, regra.getExpressao());
                valor = ajustaLimites(regra, valor);

                return new Valor(valor);

            case Regra.SOMATORIO:
                float somatorio = somatorio(regra, relatos);

                somatorio = ajustaLimites(regra, somatorio);

                return new Valor(somatorio);

            case Regra.MEDIA:
                float parcial = somatorio(regra, relatos);
                parcial /= relatos.size();

                parcial = ajustaLimites(regra, parcial);

                return new Valor(parcial);
        }

        return new Valor(-999f);
    }

    private float somatorio(Regra regra, List relatos) {
        float somatorio = 0;
        Expression exp = new Expression(regra.getExpressao());

        for (Avaliavel relato : relatos) {
            for (String variavel : regra.getDependeDe()) {
                Valor valor = relato.get(variavel);
                if (valor == null) {
                    continue;
                }

                float valor1 = valor.getFloat();
                exp.setVariable(variavel, new BigDecimal(valor1));
            }

            try {
                somatorio += exp.eval().floatValue();
            } catch (RuntimeException rex) {
                throw new AvaliacaoRegraException("Falha na avalição de regra: " + rex.getMessage());
            }
        }

        return somatorio;
    }

    private float ajustaLimites(Regra regra, float valor) {
        if (valor < regra.getValorMinimo()) {
            return regra.getValorMinimo();
        }

        if (valor > regra.getValorMaximo()) {
            return regra.getValorMaximo();
        }

        return valor;
    }

    private float avaliaExpressao(Regra regra, Map contexto, String expressao) {
        Expression exp = new Expression(expressao);

        defineContexto(regra, contexto, exp);

        try {
            BigDecimal valor = exp.eval();
            return valor.floatValue();
        } catch (RuntimeException re) {
            throw new AvaliacaoRegraException("Avaliação de expressão: " + re.getMessage());
        }
    }

    private void defineContexto(Regra regra, Map contexto, Expression exp) {
        List utilizadas = regra.getDependeDe();

        // Recuperar o contexto
        for (String dependeDe : utilizadas) {
            Valor valor = contexto.get(dependeDe);

            // Variável pode não estar disponível no contexto.
            // Provavelmente acarretará erro de execução.
            if (valor == null) {
                continue;
            }

            float real = valor.getFloat();
            BigDecimal bd = new BigDecimal(real);
            exp.setVariable(dependeDe, bd);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy