br.ufg.inf.es.saep.sandbox.dominio.AvaliadorService 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'.
/*
* Copyright (c) 2016. Fábrica de Software - Instituto de Informática (UFG)
* Creative Commons Attribution 4.0 International License.
*/
package br.ufg.inf.es.saep.sandbox.dominio;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Serviço de avaliação automática de RADOC.
*/
public class AvaliadorService {
private AvaliaRegraService regraService;
public AvaliadorService(AvaliaRegraService regraService) {
this.regraService = regraService;
}
/**
* Realiza avaliação dos itens fornecidos.
*
* @param regras Sequência de regras a serem avaliadas.
*
* @param relatos Conjunto de relatos sobre os quais a avaliação
* das regras será executada.
*
* @return Resultados produzidos pela avaliação.
*/
public Map avalia(List regras, List relatos) {
// Obtém itens na ordem em que devem ser avaliados.
List ordenados = OrdenacaoService.ordena(regras);
// Retém valores produzidos pela avaliação.
Map contexto = new HashMap<>();
// Identifica grupos de relatos pelo tipo, ou seja,
// agrupa todos os "libros sem corpo editorial", "ensino graduação",
// e assim sucessivamente.
Map> relatosPorTipo = montaRelatosPorTipo(relatos);
for (Regra regra : ordenados) {
//Regra regra = item.getRegra();
// A avaliação da regra de um item pode depender dos
// relatos correspondentes. Nesse caso, recupere-os.
String tipo = regra.getTipoRelato();
List considerados = relatosPorTipo.get(tipo);
// Avalie a regra, para o contexto disponível.
Valor valor = regraService.avaliaRegra(regra, contexto, considerados);
String variavel = regra.getVariavel();
contexto.put(variavel, valor);
}
return contexto;
}
/**
* Dado um conjunto de relatos, agrupa-os por tipo.
*
* @param relatos Conjunto de relatos.
*
* @return Dicionário que reúne os relatos fornecidos pelos tipos
* correspondentes.
*/
private Map> montaRelatosPorTipo(List relatos) {
Map> relatosPorTipo = new HashMap<>();
for (Relato relato : relatos) {
String tipo = relato.getTipo();
List lista = relatosPorTipo.get(tipo);
if (lista == null) {
lista = new ArrayList<>();
relatosPorTipo.put(tipo, lista);
}
lista.add(relato);
}
return relatosPorTipo;
}
}