Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/09/2007 17:08:46
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
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 |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/09/2007 14:08:38
|
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 |
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/11/2007 18:24:12
|
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
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/11/2007 19:36:54
|
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
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/11/2007 16:55:40
|
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...
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/11/2007 17:39:43
|
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
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/11/2007 17:42:19
|
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();
|
|
 |
|
|
|