/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package service;
import java.util.ArrayList;
import java.util.List;
import service.anotacao.Transacional;
import service.exception.AplicacaoException;
import DAO.Impl.HPDAOImpl;
import DAO.Impl.PerioPMDAOImpl;
import DAO.Impl.TecidoDAOImpl;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
import DAO.HPDAO;
import DAO.PerioPMDAO;
import DAO.TecidoDAO;
import modelo.CapacTecView;
import modelo.HP;
import modelo.PerioPM;
import modelo.Tecido;
public class CapacTecViewAppService {
// DAOs
private static HPDAO hpDAO;
private static PerioPMDAO perioPMDAO;
private static TecidoDAO tecidoDAO;
@SuppressWarnings("unchecked")
public CapacTecViewAppService() {
try {
// DAOs
hpDAO = FabricaDeDao.getDao(HPDAOImpl.class);
perioPMDAO = FabricaDeDao.getDao(PerioPMDAOImpl.class);
tecidoDAO = FabricaDeDao.getDao(TecidoDAOImpl.class);
} catch (Exception e) {
e.printStackTrace();
// O comando a seguir s� ser� usado caso haja a cria��o de um service.
// Exemplo:
// Um Service A tem dentro de si a chamada de um Service B, s� que o Service B tamb�m tem
// uma chamada para o Service A, logo um service chamaria o outro sem parar causando assim um loop infinito.
// Contudo, em termos de uso do sistemas esse erro n�o ocorreria de forma clara,
// pois a View seria carregada sem dados.
// Para evitar que esse tipo de erro gere confus�es - como o usu�rio pensar que o banco foi perdido, por exemplo -
// utilizamos o comando System.exit(1) que interrompe a aplica��o, deixando explicita a ocorr�ncia do erro.
//System.exit(1);
}
}
/**
* Constroi em memoria a lista de capacTecViews a partir da combinacao de Tecido e PerioPM
* Calcula o campo ConsumoMaximoDiario
* Seta a lista de tecidos com suas respectivas listas de capacTecViews.
* Retorna a lista de Tecido populada com as respectivas listas de CapacTecViews
*
* @return List<Tecido>
* @throws AplicacaoException
*/
public List<Tecido> recuperaListaPaginadaDeTecidosComListaDeCapacTecViews() throws AplicacaoException {
// a) Verificar se existe um HP cadastrado
List<HP> hpBD = hpDAO.recuperaListaDeHP();
if (hpBD.isEmpty()){
throw new AplicacaoException("hp.NAO_CADASTRADO");
}
//Recupera o unico hp do bd. isso eh: O elemento 0 da lista retornada na busca
HP hp = hpBD.get(0);
//Lista de todos os tecidos
List<Tecido> listaDeTecidos = tecidoDAO.recuperaListaPaginadaDeTecidos();
//Lista de periodos no intervalo do HP
List<PerioPM> listaPerioPMsHP =
perioPMDAO.recuperaIntervaloDePerioPMs(hp.getPerioPMInicPMP().getPeriodoPM(), hp.getPerioPMFinalPMP().getPeriodoPM());
//Lista de capacTecViews
List<CapacTecView> listaDeCapacTecViews;
//para cada tecido da lista de tecidos
for(Tecido tecido : listaDeTecidos){
//Cria uma nova lista zerada de capacTecViews do tecido atual
listaDeCapacTecViews = new ArrayList<CapacTecView>();
//Para cada perioPM de cada tecido, e Popula a lista de capacTecView para cada perioPM
for(PerioPM perioPM : listaPerioPMsHP){
CapacTecView capacTecView = new CapacTecView();
capacTecView.setTecido(tecido);
capacTecView.setPerioPM(perioPM);
double prodTotalU2NoPeriodo = tecido.getProducaoDiariaMaxUnidade2()*perioPM.getNumDiasUteisU2();
double formulaConsumoMaxDiario = 0;
// no caso da divisao por zero, como os valores s�o double n�o ocorre erro, apenas
// ser� mostrado o valor infinito na tela
//o try catch foi colocoda como medida de seguran�a para rastrear algum outro tipo de erro apenas
try{
formulaConsumoMaxDiario = prodTotalU2NoPeriodo / perioPM.getNumDiasUteisMatriz();
}
catch(Exception e){
e.printStackTrace();
}
capacTecView.setConsumoMaxDiarioMatriz( formulaConsumoMaxDiario );
//Inclui um capacTecView referente a combinacao atual de Tecido X PerioPM
listaDeCapacTecViews.add(capacTecView);
}
//Seta a lista do tecido atual com a sua respectiva lista de CapacTecViews
tecido.setCapacTecViews(listaDeCapacTecViews);
}
return listaDeTecidos;
}
public List<CapacTecView> recuperaListaDeCapacTecViewsPorTecido(Tecido tecido) throws AplicacaoException{
List<Tecido> listaDeTecidos = this.recuperaListaPaginadaDeTecidosComListaDeCapacTecViews();
List<CapacTecView> listaDeCapacTecViewsDoTecido = new ArrayList<CapacTecView>();
for (Tecido tecidoCorrente : listaDeTecidos){
if(tecidoCorrente.getCodTecido().equals(tecido.getCodTecido())){
listaDeCapacTecViewsDoTecido = tecidoCorrente.getCapacTecViews();
}
}
return listaDeCapacTecViewsDoTecido;
}
}