/*
*
* 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.List;
import modelo.Modelo;
import modelo.TecModel;
import modelo.Tecido;
import service.anotacao.Transacional;
import service.exception.AplicacaoException;
import DAO.ModeloDAO;
import DAO.TecModelDAO;
import DAO.TecidoDAO;
import DAO.Impl.ModeloDAOImpl;
import DAO.Impl.TecModelDAOImpl;
import DAO.Impl.TecidoDAOImpl;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
/**
*
* TecModelAppService � uma classe de servi�o que possui as regras de neg�cio para manipular inicialmente
* a entidade TecModel. Estas manipula��es incluem quando necess�rio chamadas as interfaces DAOs,
* outras classes de servi�o e acessos a informa��es do BD.
*
* A classe TecModelAppService fora criada para atender ao Padr�o MVC, Model Vision Control , sendo a mesma uma
* classe de servi�o que � capaz de efetuar: controle de transa��o, ou seja esta classe possui o recurso de
* abrir transa�ao, commitar e fechar uma transa�ao atrav�s de um interceptador de servi�o.
* Neste interceptador ser� definido se o m�todo � transacional ou n�o e em fun��o desta informa��o
* o interceptador ir� usar ou n�o uma transa��o.
*
* @author marques.araujo
*
*/
public class TecModelAppService {
// DAOs
private static TecModelDAO tecModelDAO;
private static ModeloDAO modeloDAO;
private static TecidoDAO tecidoDAO;
@SuppressWarnings("unchecked")
public TecModelAppService() {
try {
// DAOs
tecModelDAO = FabricaDeDao.getDao(TecModelDAOImpl.class);
modeloDAO = FabricaDeDao.getDao(ModeloDAOImpl.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);
}
}
/**
* Inclui TecModel, ou seja, inclui modelo na lista de modelos que usam
* aquele recurso em particular
* Verifica antes se este modelo j� havia sido incluido na lista de
* TecModel deste recurso
*
* @param TecModel
* @throws AplicacaoException
*/
@Transacional
public long inclui(TecModel tecModel)
throws AplicacaoException
{
long retorno = -1;
TecModel tecModelBD = null;
// verifica se existe o tecido
try
{ tecidoDAO.getPorIdComLock(tecModel.getTecido().getId());
}
catch(ObjetoNaoEncontradoException e)
{ throw new AplicacaoException("tecido.NAO_ENCONTRADO");
}
// verifica se existe o modelo
try
{ modeloDAO.getPorIdComLock(tecModel.getModelo().getId());
}
catch(ObjetoNaoEncontradoException e)
{ throw new AplicacaoException("modelo.NAO_ENCONTRADO");
}
// verifica se o tecido j� � usado neste modelo
try {
tecModelBD = tecModelDAO.recuperaTecModelPorTecidoEModelo(tecModel.getTecido(), tecModel.getModelo());
throw new AplicacaoException("recModel.ENCONTRADO_MODELO");
} catch (ObjetoNaoEncontradoException ob) {
//Recurso e modelo foram setados em RecModelActions no Inclui
retorno = tecModelDAO.inclui(tecModel).getId();
}
return retorno;
}
@Transacional
public void altera(TecModel tecModel) {
tecModelDAO.altera(tecModel);
}
/**
* baseado em modelo - usei lock - verificar se � para ser desse jeito
* @param umTecModel
* @throws AplicacaoException
*/
@Transacional
public void exclui(TecModel umTecModel) throws AplicacaoException {
TecModel tecModel = null;
try {
tecModel = tecModelDAO.getPorIdComLock((umTecModel.getId()));
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("tecModel.NAO_ENCONTRADO");
}
tecModelDAO.exclui(tecModel);
}
/**
* Usa um m�todo do DAO para recuperar um TecModel juntamente com o seu modelo
* @author marques.araujo
* @param TecModel
* @return TecModel
* @throws AplicacaoException
*/
public TecModel recuperaTecModelComModelo(TecModel tecModel) throws AplicacaoException {
try {
return tecModelDAO.recuperaTecModelComModelo(tecModel);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("TecModel.NAO_ENCONTRADO");
}
}
public List<TecModel> recuperaListaDeTecModelsComRecursoComModelos() throws AplicacaoException{
List<TecModel> tecModels = tecModelDAO.recuperaListaDeTecModelsComTecidoComModelos();
if (tecModels.size() == 0) {
throw new AplicacaoException("N�o foram encontrados Modelos que usam o Tecido ");
} else {
return tecModels;
}
}
/**
*
* Usa TecModelDAO para recuperar lista de todos os TecModels. Retorna um List
* de TecModels
* @author marques.araujo
* @return List<TecModel>
* @throws AplicacaoException
*/
public List<TecModel> recuperaListaDeTecModels() throws AplicacaoException {
List<TecModel> tecModels = tecModelDAO.recuperaListaDeTecModels();
if (tecModels.size() == 0) {
throw new AplicacaoException("N�o foram encontrados Modelos que usam o Tecido ");
} else {
return tecModels;
}
}
/**
* Executa uma busca por todos os TecModels paginando o resultado
* baseado em familia
*
* @return List<TecModel>
*/
public List<TecModel> recuperaListaPaginadaDeTecModels() {
return tecModelDAO.recuperaListaPaginadaDeTecModels();
}
/**
* Executa uma busca pelos TecModels de um determinado Tecido,
* paginando o resultado
*
*
* @return List<TecModel>
*/
public List<TecModel> recuperaListaPaginadaDeTecModelsPorTecido() {
// System.out.println("==============metodo recuperaListaPaginadaDeTecModelsPorTecido()=========");
return tecModelDAO.recuperaListaPaginadaDeTecModelsPorTecido();
}
public List<TecModel> recuperaListaDeTecModelsComModelos () {
return tecModelDAO.recuperaListaDeTecModelsComModelos();
}
/**
* Este m�todo � respons�vel por retornar um TecModel a partir do seu respectivo Modelo.
* @author marques.araujo
* @param String
* @return TecModel
* @throws AplicacaoException
*
*/
public TecModel recuperaTecModelPorCodModelo(String codModelo) throws AplicacaoException {
TecModel tecModelBD = null;
try {
tecModelBD = tecModelDAO.recuperaTecModelPorCodModelo(codModelo);
} catch (ObjetoNaoEncontradoException exc) {
throw new AplicacaoException("TecModel.NAO_ENCONTRADO");
}
return tecModelBD;
}
public List<TecModel> recuperaTecModelPorDescrModelo(String descrModelo) {
return tecModelDAO.recuperaTecModelPorDescrModelo(descrModelo);
}
public TecModel recuperaTecModelPorTecidoEModelo(Tecido tecido, Modelo modelo) throws ObjetoNaoEncontradoException{
return tecModelDAO.recuperaTecModelPorTecidoEModelo(tecido, modelo);
}
}