terça-feira, 2 de junho de 2009

OAF Logging - Escrevendo Log de Erros no OAF

Boa tarde pessoal!

Hoje comentarei sobre o suporte do OAF a uma boa prática de desenvolvimento que é o tratamento correto de erros inesperados. Sabemos que todo sistema Java está sujeito a erros inesperados, sejam eles a falta de permissão para escrever um arquivo em um diretório do sistema operacional, ou então o famigerado NullPointerException, ou até mesmo as SQLExceptions que tratamos na chamada de procedures. No entanto, sabemos também que um erro como o abaixo pode ser extremamente interessante para o DBA ou desenvolvedor, porém não diz nada para o usuário final:

Erro: ORA-04068: Existing State of Packages has been Discarded

Portanto, as boas práticas de desenvolvimento ditam que em um caso desses, devemos silenciosamente gravar este erro em um local que os DBAs ou desenvolvedores monitorem, fazendo com que o mesmo chegue a quem é de interesse, porém mostrar uma mensagem mais amigável ao usuário final, algo como "Ocorreu um erro inesperado, favor contatar o Administrador do Sistema". Este procedimento é chamado de
Logging.

Em uma aplicação java comum, temos o suporte nativo da plataforma para o Logging e também alguns conhecidos frameworks de logging em arquivo ou tela (LOG4J, Commons Logging etc). Agora, trazendo para o nosso mundo Oracle, como podemos prover essa funcionalidade via OA Framework? Poderiamos obviamente utilizar os sistemas acima de logging, porém o OAF nos permite utilizar a ferramenta padrão de monitoramento do aplicativo, chamada Oracle Diagnostics. É um procedimento simples, vamos lá!

Passo 1: Codificar o Logging
O primeiro passo é marcar os pontos de logging no código fonte para que seja exibido pelo Diagnostics. Isto é feito por uma API presente nos objetos OAPageContext, para logging na camada Controller, e OAApplicationModule, para logging no modelo. Por exemplo, para logar uma exceção inesperada no modelo, veja um trecho de código no Application Module:


public void execPack() {
CallableStatement call = new CallableStatement("package",1);
try {
call.execute();
} catch (SQLException sqle) {
if (this.isLoggingEnabled(UNEXPECTED)) {
this.writeDiagnostics(this, sqle.getMessage(), UNEXPECTED);
}
throw new OAException("FND","WF_UNEXPECTED_MESSAGE");

}
}


O código acima faz uma checagem para ver se o nível UNEXPECTED está habilitado no Oracle Diagnostics (veremos como mudar isso nos passos seguintes). Caso afirmativo, irá logar a exceção técnica, logo em seguida disparamos a costumeira OAException, porém com a mensagem padrão WF_UNEXPECTED_MESSAGE que mostrará: "Ocorreu um erro inesperado, favor contatar o Administrador do Sistema". Bem melhor!

Passo 2: Habilitar o perfil FND: Diagnóstico
Quando quiser acompanhar o logging, o administrador do sistema deve trocar o valor do perfil "FND: Diagnóstico" para SIM. Este perfil habilitará, ao lado dos links do topo da tela como Logout, Retornar ao portal etc., um link chamado "Diagnóstico". Ao clicar neste link, aparecerá um dropdown. Escolha a opção "Mostrar Log na Tela", e ele irá perguntar o nível desejado, escolha então "Inesperado (6)". Este nível corresponde ao Logging do tipo UNEXPECTED.



Passo 3: Acessar a página desejada
Ao acessar a página desejada, perceberá que no rodapé da página aparecerá o Logging, no seguinte formato:

[356]:UNEXPECTED:[custom.oracle.apps.xxhr.test.TestAMImpl]:Existing State of Packages has been discarded.


Este tipo de logging em tela é interessante para Teste e Desenvolvimento. Em breve faremos um post explicando como configurar esta mesma funcionalidade, porém gravando em arquivos texto no servidor (para o Logging na base de Produção)
Até a próxima pessoal!