• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Apache Commons Configuration

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Neste tutorial vamos ensinar a utilizar uma API de Apache para gerenciar as configurações de suas aplicações de forma avançada.



Por Carlos Eduardo Sotelo Pinto



Você alguma vez já implementou classes que gerenciavam diretamente dados de configuração?

Existem várias formas padronizadas de gerenciar os dados de configuração de nossos componentes e aplicações:


•Mediante a classe java.util.Properties
•Através das classes do pacote java.util.prefs. (API muito potente que permite gerenciar dados de configuração de modo hierárquico ao estilo do "Registro de Windows" que recomendo ler se o leitor a desconhece)

Neste pequeno tutorial, vou nomear um API que a mim pessoalmente me parece de enorme utilidade e potência para o gerenciamento de dados de configuração. Trata-se de Apache Jakarta Commons Configuration.

Apache Jakarta Commons Configuration é um subprojeto da série de projetos Apache Jakarta Commons.

Commons Configuration é um conjunto de projetos que tentam padronizar as tarefas comuns que quase todas as aplicações e componentes realizam normalmente.
Uma tarefa muito comum em qualquer aplicação é o gerenciamento de dados de configuração. É aqui onde entra em jogo Apache Jakarta Commons Configuration.
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Basicamente Apache Commons Configuration nos permite:


1.Gestão de dados de configuração independentemente do lugar no que estejam armazenados. (Arquivos de propriedades, documentos XML, JNDI, Banco de dados, etc.).
2.Um potente motor de consultas para realizar buscas do valor que têm determinadas propriedades de configuração.
3.Recarregamento automático dos dados de configuração no caso de serem modificados em seu lugar físico de origem (Arquivo de texto plano, arquivo xml, etc)
4.Possibilidade de armazenar os dados de configuração automaticamente em seu lugar físico (arquivo de texto plano, arquivo xml, etc).

Alguns exemplos

Antes de nada, desejo ressaltar que este tutorial é só uma introdução ao API, e que deve se documentar na Web oficial do API para ver todas as possibilidades que nos proporciona este API.

Exemplo 1

Suponhamos que temos o seguinte arquivo de propriedades, no qual se definem dados de configuração relacionada com a interface gráfica da aplicação:

app.windows.properties:

mainmdi.title=Título de minha aplicação de prova
mainmdi.width=800
mainmdi.height=600
mainmdi.state=maximized

userform.title=Gestão de usuários
userform.width=320
userform.height=200
userform.state=normal

# Também seria válido: language=Castellano,English,French
language=Castellano
language=English
language=French

Pois através de Commons Configuration, poderíamos acessar às propriedades da seguinte forma:

try {
// Lemos os dados de configuração. O arquivo deve estar no mesmo diretório que a aplicação.
PropertiesConfiguration config = new PropertiesConfiguration("app.windows.properties");

// A seguinte instrução se imprimirá: 800
System.out.println(config.getInt("main.mdi.width"));

// A seguinte instrução se imprimirá: Minha aplicação de proba
System.out.println(config.getString("main.mdi.title"));

// A seguinte instrução imprimirá: Castellano
System.out.println(config.getStringArray("language")[0]);

// A seguinte instrução configura o objeto para que salve as propriedades
// automaticamente em sua origem (Neste caso um arquivo) quando se atualizem
// ou quando se agregem novas propriedades
config.setAutoSave(true);

// Adicionamos duas propriedades
config.addProperty("version", "1.0");
config.addProperty("author", "Carlos García Pérez");

// Não faz falta graças a que está estabelecida a propriedade autoSave
// config.save();

} catch (ConfigurationException ex){
System.out.println(ex);
}
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Exemplo 2

Agora veremos as possibilidades deste API para tratar com propriedades Hierárquicas em formato xml.

app.windows.properties.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<gui>
<mainmdi>
<title>Minha aplicação de prova</title>

<dimension>
<width>800</width>
<height>600</height>
</dimension>
<state>maximized</state>
</mainmdi>

<userform>
<title>Gestão de Usuários</title>
<dimension>
<width>800</width>
<height>600</height>
</dimension>
<state>normal</state>
</userform>

<printer.form>
<dimension>
<width>320</width>
<height>200</height>
</dimension>
</printer.form>

<languages default="Castellano">
<language>Castellano</language>
<language>English</language>
<language>French</language>
</languages>
</gui>

Agora podemos acessar aos dados da seguinte forma. O exemplo é autodescritivo e está comentado.

try {
// Lemos os dados de configuração. O arquivo deve estar no mesmo diretório que a aplicação.
XMLConfiguration config = new XMLConfiguration("app.windows.properties.xml");

// A seguinte instrução imprimirá: 800
System.out.println(config.getInt("mainmdi.dimension.width"));

// A seguinte instrução imprimirá: Minha aplicação de prova
System.out.println(config.getString("mainmdi.title"));

// A seguinte instrução imprimirá: Castellano
System.out.println(config.getString("languages[@default]"));

// A seguinte instrução imprimirá: 3
System.out.println(((java.util.List) config.getProperty("languages.language")).size());

// A seguinte instrução imprimirá: French
System.out.println(config.getString("languages.language(2)"));

// A seguinte instrução imprimirá: 320
// Observe que devido a que o elemento contém um ponto em seu nome
// devemos acessá-lo escapando o ponto mediante ..
System.out.println(config.getInt("printer..form.dimension.width"));

// A seguinte instrução configura o objeto para que salve as propriedades
// automaticamente em sua origem (Neste caso um arquivo) quando se atualizarem
// ou quando se agregarem novas propriedades
config.setAutoSave(true);

// Mudamos o jogo de caracteres, pois usaremos propriedades
// que precisam de acentos.
config.setEncoding("ISO-8859-1");

// Adicionamos duas propriedades
// Adicionamos a propriedade 1.0 que descende da raiz
config.addProperty("version", "1.0");

// Adicionamos a propriedade Carlos García Pérez que descende da raiz
config.addProperty("author", "Carlos García Pérez");

// Não faz falta graças a que está estabelecida a propriedade autoSave estabelecida
// config.save();
} catch (ConfigurationException ex){
System.out.println(ex);
}
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Outras Características interessantes

Este API também nos dá a possibilidade de que se recarreguem automaticamente os dados de configuração sobre o objeto Configuration no caso de que estes tenham sido modificados.

Para habilitar esta característica deverá indicá-lo mediante a seguinte linha de código:

config.setReloadingStrategy(new FileChangedReloadingStrategy());

Conclusões

Na minha opinião este API é mais completo, potente e flexível que o resto de APIS ou métodos para gerenciar dados de configuração.

Embora java.util.prefs proporcione uma funcionalidade e potencia similar a Commons Configurations, os dados de configuração em java.util.prefs só podem ser modificados através de aplicações e não manualmente, pois entre outras coisas não se sabe onde salva realmente este API os dados de configuração.

Quando utilizamos objetos Properties para gerenciar as propriedades, devemos realizar conversões de tipos de dados, com este API nos poupamos deste trabalho.

Por comentar algo negativo, este API depende de outros subprojetos de Jakarta, por isso devemos incluir seus JARs associados se quisermos usá-lo. Por exemplo, para usar as funções básicas, o API depende de:


•Apache Jakarta Commons Lang
•Apache Jakarta Commons Collections
•Apache Jakarta Commons Loggin
 
Topo