Java tutorial
/******************************************************************************* * Copyright (c) 2006 - 2011 SJRJ. * * This file is part of SIGA. * * SIGA is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SIGA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with SIGA. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package br.gov.jfrj.siga.cp.bl; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import sun.misc.BASE64Encoder; import br.gov.jfrj.siga.base.AplicacaoException; import br.gov.jfrj.siga.base.Correio; import br.gov.jfrj.siga.base.Criptografia; import br.gov.jfrj.siga.base.GeraMessageDigest; import br.gov.jfrj.siga.base.util.CPFUtils; import br.gov.jfrj.siga.base.util.MatriculaUtils; import br.gov.jfrj.siga.cp.CpConfiguracao; import br.gov.jfrj.siga.cp.CpIdentidade; import br.gov.jfrj.siga.cp.CpModelo; import br.gov.jfrj.siga.cp.CpPerfil; import br.gov.jfrj.siga.cp.CpServico; import br.gov.jfrj.siga.cp.CpSituacaoConfiguracao; import br.gov.jfrj.siga.cp.CpTipoConfiguracao; import br.gov.jfrj.siga.cp.CpTipoIdentidade; import br.gov.jfrj.siga.dp.CpOrgaoUsuario; import br.gov.jfrj.siga.dp.DpLotacao; import br.gov.jfrj.siga.dp.DpPessoa; import br.gov.jfrj.siga.dp.dao.CpDao; public class CpBL { CpCompetenciaBL comp; public CpCompetenciaBL getComp() { return comp; } public void setComp(CpCompetenciaBL comp) { this.comp = comp; } private CpDao dao() { return comp.getConfiguracaoBL().dao(); } public CpIdentidade alterarIdentidade(CpIdentidade ident, Date dtExpiracao, CpIdentidade identidadeCadastrante) throws AplicacaoException { try { Date dt = dao().consultarDataEHoraDoServidor(); CpIdentidade idNova = new CpIdentidade(); try { PropertyUtils.copyProperties(idNova, ident); } catch (Exception e) { throw new AplicacaoException("Erro ao copiar as propriedades da identidade anterior."); } idNova.setIdIdentidade(null); idNova.setDtExpiracaoIdentidade(dtExpiracao); dao().iniciarTransacao(); CpIdentidade id = (CpIdentidade) dao().gravarComHistorico(idNova, ident, dt, identidadeCadastrante); dao().commitTransacao(); return id; } catch (Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("No foi possvel cancelar a identidade.", 9, e); } } public void cancelarIdentidade(CpIdentidade ident, CpIdentidade identidadeCadastrante) throws AplicacaoException { try { Date dt = dao().consultarDataEHoraDoServidor(); CpIdentidade idNova = new CpIdentidade(); try { PropertyUtils.copyProperties(idNova, ident); } catch (Exception e) { throw new AplicacaoException("Erro ao copiar as propriedades da identidade anterior."); } idNova.setIdIdentidade(null); idNova.setDtCancelamentoIdentidade(dt); idNova.setHisDtFim(dt); dao().iniciarTransacao(); dao().gravarComHistorico(idNova, ident, dt, identidadeCadastrante); dao().commitTransacao(); } catch (Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("No foi possvel cancelar a identidade.", 9, e); } } public void bloquearIdentidade(CpIdentidade ident, CpIdentidade identidadeCadastrante, boolean fBloquear) throws AplicacaoException { CpTipoConfiguracao tpConf = dao().consultar(CpTipoConfiguracao.TIPO_CONFIG_FAZER_LOGIN, CpTipoConfiguracao.class, false); Date dt = dao().consultarDataEHoraDoServidor(); CpConfiguracao confOld = null; try { CpConfiguracao confFiltro = new CpConfiguracao(); confFiltro.setCpIdentidade(ident); confFiltro.setCpTipoConfiguracao(tpConf); confOld = comp.getConfiguracaoBL().buscaConfiguracao(confFiltro, new int[] { 0 }, null); if (confOld.getCpIdentidade() == null) confOld = null; } catch (Exception e) { e.printStackTrace(); } CpConfiguracao conf = new CpConfiguracao(); conf.setCpIdentidade(ident); conf.setCpSituacaoConfiguracao(dao().consultar( fBloquear ? CpSituacaoConfiguracao.SITUACAO_NAO_PODE : CpSituacaoConfiguracao.SITUACAO_IGNORAR_CONFIGURACAO_ANTERIOR, CpSituacaoConfiguracao.class, false)); conf.setCpTipoConfiguracao(tpConf); conf.setHisDtIni(dt); dao().iniciarTransacao(); if (confOld != null) { confOld.setHisDtFim(dt); dao().gravarComHistorico(confOld, identidadeCadastrante); } dao().gravarComHistorico(conf, identidadeCadastrante); dao().commitTransacao(); try { comp.getConfiguracaoBL().limparCache(tpConf); } catch (Exception e) { e.printStackTrace(); } } public void bloquearPessoa(DpPessoa pes, CpIdentidade identidadeCadastrante, boolean fBloquear) throws AplicacaoException { try { dao().iniciarTransacao(); CpTipoConfiguracao tpConf = dao().consultar(CpTipoConfiguracao.TIPO_CONFIG_FAZER_LOGIN, CpTipoConfiguracao.class, false); Date dt = dao().consultarDataEHoraDoServidor(); CpConfiguracao confOld = null; try { CpConfiguracao confFiltro = new CpConfiguracao(); confFiltro.setDpPessoa(pes); confFiltro.setCpTipoConfiguracao(tpConf); confOld = comp.getConfiguracaoBL().buscaConfiguracao(confFiltro, new int[] { 0 }, null); } catch (Exception e) { e.printStackTrace(); } CpConfiguracao conf = new CpConfiguracao(); conf.setDpPessoa(pes); conf.setCpSituacaoConfiguracao(dao().consultar( fBloquear ? CpSituacaoConfiguracao.SITUACAO_NAO_PODE : CpSituacaoConfiguracao.SITUACAO_IGNORAR_CONFIGURACAO_ANTERIOR, CpSituacaoConfiguracao.class, false)); conf.setCpTipoConfiguracao(tpConf); conf.setHisDtIni(dt); if (confOld != null) { confOld.setHisDtFim(dt); dao().gravarComHistorico(confOld, identidadeCadastrante); } dao().gravarComHistorico(conf, identidadeCadastrante); for (CpIdentidade ident : dao().consultaIdentidades(pes)) { if (fBloquear && ident.isBloqueada() == false) bloquearIdentidade(ident, identidadeCadastrante, true); } comp.getConfiguracaoBL().limparCache(tpConf); dao().commitTransacao(); } catch (Exception e) { dao().rollbackTransacao(); e.printStackTrace(); } } public void configurarAcesso(CpPerfil perfil, CpOrgaoUsuario orgao, DpLotacao lotacao, DpPessoa pes, CpServico servico, CpSituacaoConfiguracao situacao, CpTipoConfiguracao tpConf, CpIdentidade identidadeCadastrante) throws AplicacaoException { Date dt = dao().consultarDataEHoraDoServidor(); CpConfiguracao confOld = null; try { CpConfiguracao confFiltro = new CpConfiguracao(); confFiltro.setCpGrupo(perfil); confFiltro.setDpPessoa(pes); confFiltro.setLotacao(lotacao); confFiltro.setOrgaoUsuario(orgao); confFiltro.setCpServico(servico); confFiltro.setCpTipoConfiguracao(tpConf); confOld = comp.getConfiguracaoBL().buscaConfiguracao(confFiltro, new int[] { 0 }, null); if (confOld != null && !confOld.isEspecifica(confFiltro)) confOld = null; } catch (Exception e) { e.printStackTrace(); } CpConfiguracao conf = new CpConfiguracao(); conf.setCpGrupo(perfil); conf.setDpPessoa(pes); conf.setLotacao(lotacao); conf.setOrgaoUsuario(orgao); conf.setCpServico(servico); conf.setCpSituacaoConfiguracao(situacao); conf.setCpTipoConfiguracao(tpConf); conf.setHisDtIni(dt); dao().iniciarTransacao(); if (confOld != null) { confOld.setHisDtFim(dt); dao().gravarComHistorico(confOld, identidadeCadastrante); } dao().gravarComHistorico(conf, identidadeCadastrante); dao().commitTransacao(); try { comp.getConfiguracaoBL().limparCache(tpConf); } catch (Exception e) { e.printStackTrace(); } } /** * Altera a senha da identidade. * * @param matricula * @param cpf * @param idCadastrante * @param senhaGerada * - Usado para retornar a senha gerada. um array para que o * valor seja passado como referncia e o mtodo que o chama * tenha a oportunidade de conhecer a senha) * @return * @throws AplicacaoException */ public CpIdentidade alterarSenhaDeIdentidade(String matricula, String cpf, CpIdentidade idCadastrante, String[] senhaGerada) throws AplicacaoException { final long longmatricula = Long.parseLong(matricula.substring(2)); final DpPessoa pessoa = dao().consultarPorCpfMatricula(Long.parseLong(cpf), longmatricula); if (pessoa != null && pessoa.getSigla().equals(matricula) && pessoa.getEmailPessoaAtual() != null) { // final Usuario usuario = // dao().consultaUsuarioCadastrante(matricula); CpIdentidade id = dao().consultaIdentidadeCadastrante(matricula, true); if (id != null) { final String novaSenha = GeraMessageDigest.geraSenha(); if (senhaGerada != null) { senhaGerada[0] = novaSenha; } try { Date dt = dao().consultarDataEHoraDoServidor(); CpIdentidade idNova = new CpIdentidade(); PropertyUtils.copyProperties(idNova, id); idNova.setIdIdentidade(null); idNova.setDtCancelamentoIdentidade(null); idNova.setDtCriacaoIdentidade(dt); final String hashNova = GeraMessageDigest.executaHash(novaSenha.getBytes(), "MD5"); idNova.setDscSenhaIdentidade(hashNova); BASE64Encoder encoderBase64 = new BASE64Encoder(); String chave = encoderBase64.encode(id.getDpPessoa().getIdInicial().toString().getBytes()); String senhaCripto = encoderBase64.encode(Criptografia.criptografar(novaSenha, chave)); idNova.setDscSenhaIdentidadeCripto(null); idNova.setDscSenhaIdentidadeCriptoSinc(null); dao().iniciarTransacao(); dao().gravarComHistorico(idNova, id, dt, idCadastrante); dao().commitTransacao(); Correio.enviar(pessoa.getEmailPessoaAtual(), "Alterao de senha ", "\n" + idNova.getDpPessoa().getNomePessoa() + "\nMatricula: " + idNova.getDpPessoa().getSigla() + "\n" + "\nSua senha foi alterada para: " + novaSenha + "\n\n Ateno: esta uma " + "mensagem automtica. Por favor, no responda. "); return idNova; } catch (final Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("Ocorreu um erro durante a gravao", 0, e); } } else { throw new AplicacaoException("Este usurio no est cadastrado no sistema"); } } else { if (pessoa == null) { throw new AplicacaoException("No foi encontrado usurio com matrcula e cpf informados."); } else if (pessoa.getEmailPessoaAtual() == null) { throw new AplicacaoException("Este usurio no possui e-mail cadastrado"); } else { throw new AplicacaoException("Dados Incorretos!"); } } } public CpIdentidade criarIdentidade(String matricula, String cpf, CpIdentidade idCadastrante, final String senhaDefinida, String[] senhaGerada, boolean marcarParaSinc) throws AplicacaoException { final long longMatricula = MatriculaUtils.getParteNumerica(matricula); Long longCpf = CPFUtils.getLongValueValidaSimples(cpf); final DpPessoa pessoa = dao().consultarPorCpfMatricula(longCpf, longMatricula); if (pessoa != null && matricula.equals(pessoa.getSigla())) { CpIdentidade id; try { id = dao().consultaIdentidadeCadastrante(matricula, true); } catch (Exception e1) { id = null; } if (id == null) { if (pessoa.getEmailPessoaAtual() != null) { String novaSenha = null; if (senhaDefinida != null && senhaDefinida.length() > 0) { novaSenha = senhaDefinida; } else { novaSenha = GeraMessageDigest.geraSenha(); } if (senhaGerada != null) { senhaGerada[0] = novaSenha; } try { CpIdentidade idNova = new CpIdentidade(); final String hashNova = GeraMessageDigest.executaHash(novaSenha.getBytes(), "MD5"); idNova.setDscSenhaIdentidade(hashNova); idNova.setNmLoginIdentidade(matricula); idNova.setDpPessoa(pessoa); idNova.setDtCriacaoIdentidade(dao().consultarDataEHoraDoServidor()); idNova.setCpOrgaoUsuario(pessoa.getOrgaoUsuario()); idNova.setCpTipoIdentidade(dao().consultar(1, CpTipoIdentidade.class, false)); idNova.setHisDtIni(idNova.getDtCriacaoIdentidade()); dao().iniciarTransacao(); dao().gravarComHistorico(idNova, idCadastrante); Correio.enviar(pessoa.getEmailPessoaAtual(), "Novo Usurio", "Seu login : " + matricula + "\n e sua senha " + novaSenha + "\n\n Ateno: esta uma " + "mensagem automtica. Por favor no responda "); dao().commitTransacao(); return idNova; } catch (final Exception e) { dao().rollbackTransacao(); throw new AplicacaoException( "Ocorreu um erro durante a gravao no banco de dados ou no envio do email", 0, e); } } else { throw new AplicacaoException("Este usurio no possui e-mail cadastrado"); } } else { throw new AplicacaoException("Usurio j est cadastrado no sistema"); } } else { throw new AplicacaoException("Dados Incorretos!"); } } public CpIdentidade trocarSenhaDeIdentidade(String senhaAtual, String senhaNova, String senhaConfirma, String nomeUsuario, CpIdentidade idCadastrante) throws NoSuchAlgorithmException, AplicacaoException { if (senhaAtual == null || senhaAtual.trim().length() == 0) { throw new AplicacaoException("Senha atual no confere"); } final String hashAtual = GeraMessageDigest.executaHash(senhaAtual.getBytes(), "MD5"); final CpIdentidade id = dao().consultaIdentidadeCadastrante(nomeUsuario, true); // se o usurio no existir if (id == null) throw new AplicacaoException("O usurio no est cadastrado."); boolean podeTrocar = id.getDscSenhaIdentidade().equals(hashAtual); if (!podeTrocar) { // tenta o modo administrador... String servico = "SIGA: Sistema Integrado de Gesto Administrativa;GI: Mdulo de Gesto de Identidade;DEF_SENHA: Definir Senha"; try { if (Cp.getInstance().getConf().podeUtilizarServicoPorConfiguracao(idCadastrante.getDpPessoa(), idCadastrante.getDpPessoa().getLotacao(), servico)) { if (hashAtual.equals(idCadastrante.getDscSenhaIdentidade())) { podeTrocar = true; } else { throw new AplicacaoException("Senha atual no confere"); } try { Correio.enviar(id.getDpPessoa().getEmailPessoaAtual(), "Troca de Senha", "O Administrador do sistema alterou a senha do seguinte usurio, para efetuar " + "uma manuteno no sistema: " + "\n" + "\n - Nome: " + id.getDpPessoa().getNomePessoa() + "\n - Matricula: " + id.getDpPessoa().getSigla() + "\n - Senha: " + senhaNova + "\n\n Antes de utiliza-lo novamente, altere a sua senha " + "ou solicite uma nova atravs da opo 'esqueci minha senha'" + "\n\n Ateno: esta uma " + "mensagem automtica. Por favor, no responda."); } catch (Exception e) { System.out.println( "Erro: No foi possvel enviar e-mail para o usurio informando que o administrador do sistema alterou sua senha." + "\n" + "\n - Nome: " + id.getDpPessoa().getNomePessoa() + "\n - Matricula: " + id.getDpPessoa().getSigla()); } } } catch (Exception e1) { } } if (podeTrocar && senhaNova.equals(senhaConfirma)) { try { Date dt = dao().consultarDataEHoraDoServidor(); CpIdentidade idNova = new CpIdentidade(); PropertyUtils.copyProperties(idNova, id); idNova.setIdIdentidade(null); idNova.setDtCriacaoIdentidade(dt); final String hashNova = GeraMessageDigest.executaHash(senhaNova.getBytes(), "MD5"); idNova.setDscSenhaIdentidade(hashNova); BASE64Encoder encoderBase64 = new BASE64Encoder(); String chave = encoderBase64.encode(id.getDpPessoa().getIdInicial().toString().getBytes()); String senhaCripto = encoderBase64.encode(Criptografia.criptografar(senhaNova, chave)); idNova.setDscSenhaIdentidadeCripto(null); idNova.setDscSenhaIdentidadeCriptoSinc(null); dao().iniciarTransacao(); dao().gravarComHistorico(idNova, id, dt, idCadastrante); dao().commitTransacao(); return idNova; } catch (final Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("Ocorreu um erro durante a gravao", 0, e); } } else { throw new AplicacaoException("Senha Atual no confere e/ou Senha nova diferente de confirmao"); } } public boolean podeAlterarSenha(String auxiliar1, String cpf1, String senha1, String auxiliar2, String cpf2, String senha2, String matricula, String cpf, String novaSenha) throws AplicacaoException { try { final long matAux1 = Long.parseLong(auxiliar1.substring(2)); final DpPessoa pesAux1 = dao().consultarPorCpfMatricula(Long.parseLong(cpf1), matAux1); if (pesAux1 == null) { throw new AplicacaoException("Auxiliar 1 invlido!"); } final long matAux2 = Long.parseLong(auxiliar2.substring(2)); final DpPessoa pesAux2 = dao().consultarPorCpfMatricula(Long.parseLong(cpf2), matAux2); if (pesAux2 == null) { throw new AplicacaoException("Auxiliar 2 invlido!"); } final long longmatricula = Long.parseLong(matricula.substring(2)); final DpPessoa pessoa = dao().consultarPorCpfMatricula(Long.parseLong(cpf), longmatricula); if (pessoa == null) { throw new AplicacaoException("A pessoa que ter a senha definida invlida!"); } CpIdentidade cpIdAux1 = null; CpIdentidade cpIdAux2 = null; for (CpIdentidade cpId : dao().consultaIdentidades(pesAux1)) { if (cpId.getCpTipoIdentidade().getIdCpTpIdentidade().equals(1)) { cpIdAux1 = cpId; } } for (CpIdentidade cpId : dao().consultaIdentidades(pesAux2)) { if (cpId.getCpTipoIdentidade().getIdCpTpIdentidade().equals(1)) { cpIdAux2 = cpId; } } if (cpIdAux1 == null || cpIdAux2 == null) { throw new AplicacaoException("Problema ao localizar a identidade dos auxiliares!"); } String hashSenha1 = null; String hashSenha2 = null; hashSenha1 = GeraMessageDigest.executaHash(senha1.getBytes(), "MD5"); hashSenha2 = GeraMessageDigest.executaHash(senha2.getBytes(), "MD5"); if (pesAux1.getIdInicial().equals(pesAux2.getIdInicial()) || pesAux1.getIdInicial().equals(pessoa.getIdInicial()) || pesAux2.getIdInicial().equals(pessoa.getIdInicial())) { throw new AplicacaoException("As pessoas devem ser diferentes!"); } ; if (!cpIdAux1.getDscSenhaIdentidade().equals(hashSenha1) || !cpIdAux2.getDscSenhaIdentidade().equals(hashSenha2)) { throw new AplicacaoException("As senhas no conferem!"); } List<DpPessoa> auxiliares = new ArrayList<DpPessoa>(); auxiliares.add(pesAux1); auxiliares.add(pesAux2); if (isAuxAdministradores(pesAux1, pesAux2)) { return true; } if (!pessoasMesmaLotacaoOuSuperior(pessoa, auxiliares)) { throw new AplicacaoException( "Os auxiliares devem ser da mesma lotao do usurio que ter a senha trocada!\n Tambm permitido que pessoas da lotao imediatamente superior na hiearquia sejam auxiliares."); } } catch (Exception e) { throw new AplicacaoException(e.getMessage()); } return true; } private boolean isAuxAdministradores(DpPessoa aux1, DpPessoa aux2) { String servico = "SIGA: Sistema Integrado de Gesto Administrativa;GI: Mdulo de Gesto de Identidade;DEF_SENHA: Definir Senha"; try { return Cp.getInstance().getConf().podeUtilizarServicoPorConfiguracao(aux1, aux1.getLotacao(), servico) && Cp.getInstance().getConf().podeUtilizarServicoPorConfiguracao(aux2, aux2.getLotacao(), servico); } catch (Exception e) { return false; } } /** * Verifica se as pessoas so da mesma lotao ou da lotao imadiatamente * superior da pessoa-alvo * * @return */ private boolean pessoasMesmaLotacaoOuSuperior(DpPessoa alvo, List<DpPessoa> listaPessoas) { for (DpPessoa p : listaPessoas) { if ((alvo.getLotacao().getIdInicial().equals(p.getLotacao().getIdInicial()) || (alvo.getLotacao().getLotacaoPai().getIdInicial().equals(p.getLotacao().getIdInicial())))) { continue; } return false; } return true; } public CpIdentidade definirSenhaDeIdentidade(String senhaNova, String senhaConfirma, String nomeUsuario, String auxiliar1, String auxiliar2, CpIdentidade idCadastrante) throws NoSuchAlgorithmException, AplicacaoException { final CpIdentidade id = dao().consultaIdentidadeCadastrante(nomeUsuario, true); // se o usurio no existir if (id == null) throw new AplicacaoException("O usurio no est cadastrado."); if (senhaNova.equals(senhaConfirma)) { try { Date dt = dao().consultarDataEHoraDoServidor(); CpIdentidade idNova = new CpIdentidade(); PropertyUtils.copyProperties(idNova, id); idNova.setIdIdentidade(null); idNova.setDtCriacaoIdentidade(dt); final String hashNova = GeraMessageDigest.executaHash(senhaNova.getBytes(), "MD5"); idNova.setDscSenhaIdentidade(hashNova); BASE64Encoder encoderBase64 = new BASE64Encoder(); String chave = encoderBase64.encode(id.getDpPessoa().getIdInicial().toString().getBytes()); String senhaCripto = encoderBase64.encode(Criptografia.criptografar(senhaNova, chave)); idNova.setDscSenhaIdentidadeCripto(null); idNova.setDscSenhaIdentidadeCriptoSinc(null); dao().iniciarTransacao(); dao().gravarComHistorico(idNova, id, dt, idCadastrante); dao().commitTransacao(); Correio.enviar(id.getDpPessoa().getEmailPessoaAtual(), "Alterao de senha ", "\n" + idNova.getDpPessoa().getNomePessoa() + "\nMatricula: " + idNova.getDpPessoa().getSigla() + "\n" + "\nSua senha foi alterada para: " + senhaNova + ".\n\n As seguintes pessoas participaram da alterao da senha: " + auxiliar1 + " e " + auxiliar2 + ".\n\n Ateno: esta uma " + "mensagem automtica. Por favor, no responda. "); return idNova; } catch (final Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("Ocorreu um erro durante a gravao", 0, e); } } else { throw new AplicacaoException("Senha nova diferente de confirmao"); } } public CpModelo alterarCpModelo(CpModelo mod, String conteudo, CpIdentidade identidadeCadastrante) throws AplicacaoException { try { Date dt = dao().consultarDataEHoraDoServidor(); CpModelo modNew = new CpModelo(); try { PropertyUtils.copyProperties(modNew, mod); } catch (Exception e) { throw new AplicacaoException("Erro ao copiar as propriedades do modelo anterior."); } modNew.setIdMod(null); modNew.setConteudoBlobString(conteudo); dao().iniciarTransacao(); CpModelo modSaved = (CpModelo) dao().gravarComHistorico(modNew, mod, dt, identidadeCadastrante); dao().commitTransacao(); return modSaved; } catch (Exception e) { dao().rollbackTransacao(); throw new AplicacaoException("No foi possvel alterar o modelo.", 9, e); } } public void appException(String message) throws AplicacaoException { appException(message, null); } private void appException(String message, Throwable cause) throws AplicacaoException { throw new AplicacaoException(message, 0, cause); } }