/*
*
* 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.HashMap;
import java.util.List;
import exception.relatorio.RelatorioException;
import modelo.Tecido;
import modelo.TipoUsuario;
import modelo.Usuario;
import relatorio.Relatorio;
import relatorio.RelatorioFactory;
import service.anotacao.Transacional;
import service.exception.AplicacaoException;
import util.Digesto;
import DAO.UsuarioDAO;
import DAO.Impl.UsuarioDAOImpl;
import DAO.controle.FabricaDeDao;
import DAO.exception.ObjetoNaoEncontradoException;
/**
*
* UsuarioAppService � uma classe de servi�o que possui as regras de neg�cio para manipular inicalmente
* entidade Usuario. 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 UsuarioAppService 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 UsuarioAppService {
// DAOs
private UsuarioDAO usuarioDAO;
public UsuarioAppService() {
try {
// DAOs
usuarioDAO = FabricaDeDao.getDao(UsuarioDAOImpl.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);
}
}
public Usuario recuperaPorLoginESenha(String login, String senha) throws AplicacaoException {
Usuario usuario;
try {
senha = Digesto.gerarDigestoMD5Correto(senha);
usuario = usuarioDAO.recuperaPorLoginESenha(login, senha);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException("usuario.ERRO_LOGIN_SENHA_INEXISTENTES");
}
return usuario;
}
@Transacional
public void inclui(Usuario usuario, String confirmacaoSenha) throws AplicacaoException {
// if (!usuarioCadastrador.getTipoUsuario().getTipoUsuario().equals(TipoUsuario.ADMINISTRADOR)) {
// throw new AplicacaoException("usuario.NAO_POSSUI_PERMISSAO");
// }
try {
usuarioDAO.recuperaPorLogin(usuario.getLogin());
throw new AplicacaoException("usuario.LOGIN_EXISTENTE");
} catch (ObjetoNaoEncontradoException e) {
}
if (usuario.getSenha().equals(confirmacaoSenha)) {
String senha = Digesto.gerarDigestoMD5Correto(usuario.getSenha());
usuario.setSenha(senha);
usuario.setNome(usuario.getNome().toUpperCase());
usuarioDAO.inclui(usuario);
} else {
throw new AplicacaoException("usuario.SENHA_CONFIRMACAO_ERRADA");
}
}
@Transacional
public void altera(Usuario usuario, Usuario usuarioAlterador, String confirmacaoSenha) throws AplicacaoException {
if (!usuarioAlterador.getTipoUsuario().getTipoUsuario().equals(TipoUsuario.ADMINISTRADOR)) {
throw new AplicacaoException(2,"usuario.NAO_POSSUI_PERMISSAO");
}
try {
// Faz uma busca utilizando o ID do usu�rio que est� sendo editado e o salva na vari�vel usuarioExistente.
Usuario usuarioExistente = usuarioDAO.getPorIdComLock(usuario.getId());
/* O if verifica se o usuario que foi encontrado no banco possui um login diferente
do usu�rio que est� sendo editado neste momento.
Uma fez que o m�todo equals retorne false - indicando que os logins s�o diferentes - o operador
de nega��o (!) o transforma em true fazendo que as linhas dentro do if sejam executadas.
A primeira linha de c�digo dentro do if() faz uma busca por login, caso ele encontre algum resultado
uma exce��o � gerada. Isso se deve ao fato de que, se existe um login igual no banco, ele pertence
a um usu�rio diferente.
*/
if(!usuarioExistente.getLogin().equals(usuario.getLogin())){
usuarioDAO.recuperaPorLogin(usuario.getLogin());
throw new AplicacaoException("usuario.LOGIN_EXISTENTE");
}
} catch (ObjetoNaoEncontradoException e) {
}
if (usuario.getSenha().equals(confirmacaoSenha)) {
try {
usuarioDAO.getPorIdComLock(usuario.getId());
String senha = Digesto.gerarDigestoMD5Correto(usuario.getSenha());
usuario.setSenha(senha);
usuario.setNome(usuario.getNome().toUpperCase());
usuarioDAO.altera(usuario);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException(0, "usuario.NAO_ENCONTRADO");
}
}else{
throw new AplicacaoException("usuario.SENHA_CONFIRMACAO_ERRADA");
}
}
/*
O m�todo alteraSenha foi posto entre coment�rios, pois foi descoberto que ele n�o est� sendo
utilizado em nenhum momento do sistema.
@Bruno.oliveira
*/
/* @Transacional
public void alteraSenha(String senhaAtual, Usuario usuario, String confirmacaoSenha) throws AplicacaoException {
try {
Usuario usuarioBD = usuarioDAO.getPorIdComLock(usuario.getId());
senhaAtual = Digesto.gerarDigestoMD5Correto(senhaAtual);
String senhaUsuario = usuarioBD.getSenha();
if (!senhaAtual.equals(senhaUsuario)) {
usuario.setSenha(senhaUsuario);
throw new AplicacaoException(0,"usuario.SENHA_ATUAL_ERRADA");
}
String novaSenha = usuario.getSenha();
if (!novaSenha.equals(confirmacaoSenha)) {
usuario.setSenha(senhaUsuario);
throw new AplicacaoException(1,"usuario.SENHA_CONFIRMACAO_ERRADA");
}
novaSenha = Digesto.gerarDigestoMD5Correto(novaSenha);
usuarioBD.setSenha(novaSenha);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException();
}
} */
@Transacional
public void exclui(Usuario usuario) throws AplicacaoException {
Usuario usuarioBD = null;
try {
usuarioBD = usuarioDAO.getPorIdComLock(usuario.getId());
usuarioDAO.exclui(usuarioBD);
} catch (ObjetoNaoEncontradoException e) {
throw new AplicacaoException();
}
}
public List<Usuario> recuperaUsuarios() {
return usuarioDAO.recuperaListaDeUsuarios();
}
public List<Usuario> recuperaUsuariosComTipo() {
return usuarioDAO.recuperaListaDeUsuariosComTipo();
}
public List<Usuario> recuperaPorNome(String nome) {
return usuarioDAO.recuperaListaPaginadaPorNome(nome);
}
public Usuario recuperaComPlanos(Usuario usuario) throws ObjetoNaoEncontradoException {
return usuarioDAO.recuperaComPlanos(usuario);
}
public List<Usuario> recuperaListaDeUsuarios() throws AplicacaoException
{
List<Usuario> usuarios = usuarioDAO.recuperaListaDeUsuarios();
if (usuarios.size() == 0)
{ throw new AplicacaoException("Usu�rios n�o encontrados.");
}
else
{ return usuarios;
}
}
/**
* Este m�todo � respons�vel or gerar relat�rio simples.
* @param List<Tecido>
* @return void
* @throws AplicacaoException
*/
@SuppressWarnings("unchecked")
public void gerarRelatorio(List<Usuario> listaDeUsuarios) throws AplicacaoException {
System.out.println("Antes do metodo getRelatorio dentro de gerarRelatorio de UsuarioAppService");
Relatorio relatorio = RelatorioFactory.getRelatorio(Relatorio.RELATORIO_LISTAGEM_DE_USUARIOS);
if(relatorio != null)
System.out.println("A variavel do tipo Relatorio e difente de null em UsuarioAppService");
System.out.println("Depois do metodo getRelatorio dentro de gerarRelatorio de UsuarioAppService");
try{
relatorio.gerarRelatorio(listaDeUsuarios, new HashMap());
} catch (RelatorioException re){
throw new AplicacaoException("Usuario.RELATORIO_NAO_GERADO");
}
}
}