[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

24) Como utilizar arquivos de configurações no mentawai  XML
Forum Index -> F.A.Q.
Author Message
IceW0lf


[Avatar]

Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline

Em muitos ambientes de desenvolvimento de aplicações temos algumas etapas, uma duas até mesmo três ou mais etapas, exemplo: desenvolvimento, homologação, e produção.

Por muitas vezes, essas etapas têm suas configurações próprias, como o variáveis globais, Banco de dados, configurações em geral. Nós podemos chegar a ter 3 (três) banco de dados diferentes, 1 (um) para o desenvolvedor, outro para homologação do sistema e um terceiro definitivo que é o da produção.

Agora, imagine você ter que lembrar de sempre ALTERAR as configurações que indique qual banco de dados, usuário, senha, etc no arquivo ApplicationManager, produção zero correto? pense então se você se esquece de configurar este arquivo antes de envia-lo pra produção, na hora que você lembrar da besteira que fez, a primeira coisa que você vai dizer é "sujô!" (existem outras) . Acredito que todos já passamos por algo parecido com isto.

Vendo esta dificuldade com relação à configurações, foi implementada uma solução excelente no mentawai, que é a utilização de arquivos .properties para efetuar essas configurações. Bom isso não teria nada demais, o uso de arquivos properties é bem comum hoje me dia, mas não é no comum que o menta se destaca e sim no SIMPLES.

a) Para que serve um arquivo de configuração?
Acho que as palavras do Sérgio descrevem bem isso, "Para aquelas configurações totalmente estáticas e burras que você não quer deixar hardcoded dentro da configuração programática".

b) Qual a vantagem de se utilizar?
Bom, acredito que alguns frameworks devem oferecem este tipo de configuração, não sei, mas como no mentawai a filosofia é opcional e produtividade sempre ON, ao invés de você possuir apenas um arquivo de configuração da aplicação que é a maioria dos casos, você poderá ter N arquivos de configurações, isso siginifica que teóricamente nada te impede de ter N etapas, N Bancos, N "Variáveis" globais, whatever... para cada etapa (Desenvolvimento, Homologação, Procução, . . .).

"Não configurar é 100 vezes melhor do que configurar, seja lá com o que, mas para certas coisas fica complicado fugir da configuração. Ex: DI, IoC, Transações, Autenticação, Autorização, Tratamento de Exeptions, etc." Sérgio (GUJ - http://www.guj.com.br/posts/list/65171.java#343531)

c) Mas como ele sabe qual o arquivo a ser correto a ser utilizado, onde fica este arquivo ?
- Através do HOSTNAME da máquina. O arquivo deverá se chamar appManager-HOSTNAME.properties, caso o mesmo não exista ele procurará por appManager.properties.
- Os arquivos deverão estar dentro WEB-INF.

Exemplo:
Digamos que eu esteja utilizando uma máquina com o nome/hostname "leiber" para a etapa de desenvolvimento de uma aplicação. Nela temos o Eclipse, Tomcat, e o Banco de dados Instalados. Como podemos ver está tudo na mesma máquina, logo teremos um arquivo voltado para configurar a aplicação para este hostname então teremos o arquivo appManager-leiber.properties.

d) Quantos arquivos de configurações devo deixar dentro do WEB-INF?
Quantos forem os necessarios. Sugiro, que se você tem 2 (duas) etapas, DESENVOLVIMENTO (leiber) e PRODUÇÃO (myAppServer) por exemplo, então faça 2 (dois) arquivos, um para cada um dos HOSTNAME, e um terceiro DEFAULT (appManager.properties) com as configuração idénticas ao do PRODUÇÃO, só or segurança.

e) A aplicação encontrará este arquivo sozinho?
Sim, Ele sempre vai procurar PRIMEIRO pelo arquivo que contenha o nome do hostname da maquina, caso não encontre assumirá o "default" conforme dito anteriormente no "ítem d".

f) Como posso utilizar ?
Basta utilziar o método getProperties do AplicationManager, confome o exemplo abaixo.

Vamos ao exemplo prático.
Primeiro passo: vamos criar os arquivos de configuração.

Utilizando a idéia do "ítem d" teremos então 2 (dois )arquivos config um para o desenvolvimento (leiber) outro para o servidor de produção (myAppServer) onde nele teremos apenas um TOMCAT e o banco de dados estará em outro server.

Então conforme o "ítem d", o nome da máquina de desenvolvimento é "leiber", portanto vamos criar um arquivo dentro de WEB-INF com o nome appManager-leiber.properties, neste arquivo colocaremos as configurações do banco de dados que é local, e uma informação extra global como o nome da aplicação.

No arquivo appManager-leiber.properties teremos:
Code:
 #Atenção!!! arquivo de configuração do servidor de desenvolvimento
 database.server = localhost
 database.name = database
 database.username = user
 database.password = passw0rd
 webapp.name = Abra a sua mente! Use mentawai
 


A "variável" apenas quardará o nome de nossa aplicação, lembre-se as "variáveis" podem ser como você achar conveniente, este é apenas um exemplo.

No arquivo appManager-myAppServer.properties teremos:

Code:
 #Atenção!!! arquivo de configuração do servidor de produção
 database.server = 192.168.0.25 #Endereço do servidor na rede
 database.name = producao_database
 database.username = security_user
 database.password = security_passw0rd
 webapp.name = Insisto!!!!!!! Abra a sua mente! Use mentawai
 


Segundo passo: vamos abrir o arquivo e utilizar seus dados.
Para abrir arquivo basta dar um getProperties() que o ApplicationManager irá procurar o arquivo correto, pegaremos essas informações e adicionaremos as "variáveis".

Code:
 public class ApplicationManager extends org.mentawai.core.ApplicationManager {
 
     public void init(Context application) {
          Properties props getProperties();
          private String server   = props.getProperty("database.server"); //adicinando o conteúdo de database.server em server
          private String database = props.getProperty("database.name"); //adicinando o conteúdo de database.name em database 
          private String username = props.getProperty("database.username"); //adicinando o conteúdo de database.username em username 
          private String password = props.getProperty("database.password"); //adicinando o conteúdo de database.password em password 
          private String appName= props.getProperty("webapp.name"); //adicinando o conteúdo de webapp.name em appName
       application.setAttribute("appName", appName);
 
 //Utilizando  os dados recebidos.
 //Os 4 (quatro) primeiros fazem referencia ao banco de dados, então vamos configura-lo.
 
        this.connHandler = new C3P0ConnectionHandle("com.mysql.jdbc.Driver","jdbc:mysql://"+server+"/"+database,username,password);
         props.clear(); //Limpa o properties
 }
 


Repare que não precisarei fazer mais nada, se o server for identificado como "leiber" ele utilizará os dados dos mesmo, caso seja o myAppServer ídem.

Para que serve o appName?
É apenas para ilustrar a você, que "teóricamente" você poderá armazenar e utilizar como quizer, qualquer tipo dado/informação que você ache necessário ao sistema. Através dessa informação armazenada no application, você poderá utilizar em qualquer lugar da aplicação. Por exemplo: Nas actions basta chamar application.getAttribute("appNome"), em outras classes basta dar um ApplicationManager.getApplication().getAttribute("appNome").toString().

Você pode por exemplo, criar uma "variável" max_user_login no seu arquivo propertie e utilizar esse dado pra quardar quantos usuários podem estar logado no sistema ao mesmo tempo, basta que vc implemente o HttpSessionAttributeListener em uma classe ou mesmo seu LoginAction.

É apenas uma das N formas de se fazer isso. O que importa é a UTILIDADE de se guardar algo no application.

O post é um pouco grande, mas lembre-se boa parte dos usuários do mentawai são iniciantes, então este post está primeiramente dedicado a eles.

Bom dúvidas ou sugestões, Utilizem o Forum.

Abraço a todos.

Leiber Wallace
Voixy ::: Soluções em Telecomunicações
YkyMatt



Joined: 15/08/2007 15:47:05
Messages: 229
Location: RS / Brasil
Offline

Legal, cara!

Eu havia implementado um esquema de carregamento próprio de Properties e tal. Mas deixando o Menta carregar fica bem melhor.

Jéferson C. Flores
Compusoft - Desenv. de Sistemas Empresariais

Mentawai Evangelist
http://www.chronusteam.com
[MSN]
Chantal



Joined: 20/11/2007 18:20:46
Messages: 3
Offline

Boa noite pessoal , estou desenvolvendo uma aplicação e estou usando esta idéia do properties mas a linha de comando abaixo não reconhece na minha aplicação , na classe ApplicationManager:

Properties props getProperties();


Alguem poderia me ajudar ....

Obrigado
saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline

Chantal wrote:
Boa noite pessoal , estou desenvolvendo uma aplicação e estou usando esta idéia do properties mas a linha de comando abaixo não reconhece na minha aplicação , na classe ApplicationManager:

Properties props getProperties();


Alguem poderia me ajudar ....

Obrigado 


Dentro de qualquer método do seu application manager vc tem que fazer:

Code:
 
 Properties prop = getProperties();
 
 


E não esqueça de importar lá em cima o properties:

Code:
 
 import java.util.Properties;
 
 


Ou usa o Organize Imports do Eclipse...

Sergio Oliveira

Chantal



Joined: 20/11/2007 18:20:46
Messages: 3
Offline

eu digitei conforme instruções e estou usando o import , mas o erro que dá é

library-inclusion-in-manifest:
Compiling 2 source files to C:\desenvolvimento_software\projetos\SOS\build\web\WEB-INF\classes
C:\desenvolvimento_software\projetos\SOS\src\ApplicationManager.java:81: ';' expected
Properties props getProperties();
1 error

Estou usando o NetBeans 5.5.1.

Desde já agradeço pelo Apoio





saoj wrote:

Chantal wrote:
Boa noite pessoal , estou desenvolvendo uma aplicação e estou usando esta idéia do properties mas a linha de comando abaixo não reconhece na minha aplicação , na classe ApplicationManager:

Properties props getProperties();


Alguem poderia me ajudar ....

Obrigado 


Dentro de qualquer método do seu application manager vc tem que fazer:

Code:
 
 Properties prop = getProperties();
 
 


E não esqueça de importar lá em cima o properties:

Code:
 
 import java.util.Properties;
 
 


Ou usa o Organize Imports do Eclipse... 



saoj



Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline


Isso aqui não existe: Properties props getProperties();

Tenta assim:

Properties props = getProperties();

Sergio Oliveira

Chantal



Joined: 20/11/2007 18:20:46
Messages: 3
Offline

Realmente , puxa como não vi.. obrigado pelo apoio

Chantal

saoj wrote:

Isso aqui não existe: Properties props getProperties();

Tenta assim:

Properties props = getProperties();  
 
Forum Index -> F.A.Q.
Go to:   
Powered by JForum 2.1.6 © JForum Team