Instanciação de DAOs

O que acham disso? Sejam sinceros. E pacientes (não sou experiente, tô afim de aprender, e tem gente que costuma socar a coisa hehehe…) :wink:

@Entity
public class Usuario {

        public static final String QUERY_FIND_BY_DOCUMENTO = "from Usuario as USU where USU.documento = ?";
	
      //atributos...


	//getters & setters...
		
	public boolean notInvalid(){
		return (this != null && (!StringUtil.isNullOrEmpty(this.getMatricula())));
	}
	
	public static Usuario apresentarCredenciais(String strDocumento, String strSenha) {
		return ControladorDeAcesso.validarCredenciais(strDocumento, strSenha);
	}
	
}	
public abstract class ControladorDeAcesso {
    
    private static final IRepository objRepositoryUsuario = new Repository(Usuario.class);
    
    /**
     * Caso as credenciais forem autenticadas, retorna-se o objeto Usuario.
     * @param strDocumento
     * @param strSenha
     * @return Usuario
     */
    public static Usuario validarCredenciais(final String strDocumento, final String strSenha) {
        
        final Object[] objParameter = { strDocumento };
        
        try {
            final Usuario objUser = (Usuario) ControladorDeAcesso.objRepositoryUsuario.executeQuerySingle(Usuario.QUERY_FIND_BY_DOCUMENTO, objParameter);
            if( ((objUser != null) && !objUser.isBloqueado())){
            	if(!StringUtil.isNullOrEmpty(objUser.getSenha())){
            		return (objUser.getSenha().equals(strSenha)) ? objUser : null;
            	}
            	return (objUser.getMatricula().equals(strSenha)) ? objUser : null;
            }
            
        }
        catch (final Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }
 	public String logar(){
 		
 		String strDocumento = input.getString("txtDocumento");
 		String strSenha = input.getString("txtSenha");
 		
 		Usuario objUsuario = Usuario.apresentarCredenciais(strDocumento,strSenha);
 		
 		return objUsuario.notInvalid() ? SUCCESS : ERROR;
 		
 	}

Eu poderia ter (claro que poderia, mas digo, é correto?) o procedimento existente no ControladorDeAcesso, diretamente no Usuario? Digo, posso instanciar um DAO diretamente no Usuario?

Na minha opinião não, e ainda acho que o método apresentarCredenciais(String strDocumento, String strSenha) não deveria estar no Usuario, nem aquela query.

Vamos discutir a alternativa abaixo.

[code]public interface UsuarioRepository {
Usuario obterUsuario(String documento);
}

public class Usuario {
// Injetando a implementação do repositório
private UsuarioRepository usuarioRepository;

// Atributos e métodos

public static Usuario efetuarLogin(String documento, String senha) throws LoginException {
    Usuario u = usuarioRepository.obterUsuario(documento);

    if (u == null) {
        throw new LoginException("Usuário não encontrado.");
    }

    if (senha.equals(u.getSenha()) {
        throw new LoginException("Usuário ou senha inválidos.");
    }

    return u;
}

}[/code]
E pra usar no seu action:

[code]public String logar() {
String documento = input.getString(“txtDocumento”);
String senha = input.getString(“txtSenha”);

try {
    Usuario u = Usuario.efetuarLogin(documento, senha);
    return SUCCESS;
} catch (LoginException e) {
    // Faça um tratamento melhor para esta exceção.
    return ERROR;
}

}[/code]
Se não quiser manter o método na classe Usuario, pode criar um service que faça isso, uma classe LoginService por exemplo.

Boa Tarso!
Uma pergunta,

public interface UsuarioRepository {  
    Usuario obterUsuario(String documento);  
} 

A implementação do UsuarioRepository seria um DAO?:
EXEMPLO:

	public Usuario obterUsuario(String documento) {
		try {
			EntityManager entityManager = HibernateFactory.getEntityManager();
			Usuario instance = (Usuario) entityManager.find(Usuario.class, documento);
			entityManager.close();
			return instance;
		} catch (WhateverExceptionMFExample e) { // motivo da edição: ISTO É UM EXEMPLO INÚTIL...
			//DoWhateverHere;
		}
	}

abraço!

Não contribuindo com nada, mas:

} catch (RuntimeException re) { throw re; } WTF?