br.ufg.inf.es.saep.sandbox.infraestrutura.Avaliador Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of saep-dominio Show documentation
Show all versions of saep-dominio Show documentation
Modelo de Domínio do Sistema de Apoio à Elaboração
de Pareceres (SAEP), composto por um único 'bounded context'.
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);
}
}
}