sexta-feira, 30 de março de 2007

Flex Java e MySql - Troca de Objetos com OpenAMF

EDITADO DIA 23/01/2008

Olá Pessoal, Este artigo faz uso do Framework OpenAMF que já foi desecontinuado.
Recomendo a leitura deste artigo -> http://blog.digows.com/?p=103
Que faz uso da solução OpenSource da Própria Adobe, o BlazeDS.

Porém, se você está aprendendo, ainda sim o tutorial abaixo é válido.

EDITADO DIA 13/10/2007

ATENCÃO!
O código fonte disponibilizado, foi melhorado e atualizado.

Para fazer o Download do mesmo clique aqui**:
Projeto JavaFlex com OpenAMF

Para utilização, apenas extraia o arquivo TutuJavaFlex.rar na pasta webapps do tomcat, ficando:
..\Tomcat\webapps\JavaFlex\*.*

Após isso, gere um banco de dados através do script dentro da Pasta JavaFlex: javaflexBD.sql
Feito isso, acesse: http://localhost:8080/JavaFlex/bin

Para edições , importe o projeto no Eclipse com o plugin do FlexBuilder instalado.

Lembrando que a apresentação abaixo apenas esclarece cada passo realizado.(...)


(...)

Mais então, um dos assuntos mais comentados pela net, é como deixar o Flex, como Camada de Apresentação para o Java,

realmente, se tem poquissimo material sobre este assunto, e o pouco que tem, meio complicado de entender,
eu mesmo já apanhei muito no começo, quem me deu uma mão na roda foi o "Mindu" do Grupo Google (FlexDev), hoje até já montei uma arquitetura usando Java, Flex, Hibernate, e OpenAMF trocando somente objetos!

Mas então, vamos lá?!


=====================================================

Requerimentos:
-- Ambiente configurado com Flex Builder, Java e TomCat ou similar;

--Conhecimentos Básicos de Java e Flex;

--MySQL® Connector/Java;
(Download: Link)

--OpenAMF RC12 - Java Flash Remoting;
(Download: Link)

1- Abra seu Eclipse, com Plugin do FlexBuilder, e crie um novo projeto Java com o nome de TutuJavaFlex (File=>New=>Project=>JavaProject).

O Projeto tem que ficar na pasta webapps do TomCat normalmente: "C:\tomcat\webapps\"
Ficando: "C:\tomcat\webapps\JavaFlex"


2- Vá até o a pasta "JavaFlex" pelo o explorer, e dentro dela, crie uma pasta chamada de
"WEB-INF" e dentro desta pasta, adicione os esses arquivos:





    • Bibliotecas do OpenAmf e o driver do MySql utilizadas na aplicação
- ant.jar
- astranslator-1.5.9.jar
- axis.jar
- commons-beanutils-1.7.0.jar
- commons-codec-1.3.jar
- commons-collections-3.1.jar
- commons-digester.jar
- commons-discovery.jar
- commons-httpclient-3.0.jar
- commons-lang-2.1.jar
- commons-logging-1.0.4.jar
- dom4j-1.6.jar
- log4j-1.2.9.jar
- mysql-connector-java-xxx-bin.jar
- openamf.jar
- wsdl4j.jar
  • O Arquivo de configuração openamf-config.xml não sofreu alteração, basta copiá-lo do arquivo openamf-xxx.zip e adicionar na pasta WEB-INF da sua aplicação.
  • Arquivo web.xml da aplicação com a configuração do OpenAmf se encontra no .rar baixado.

Estrutura (WEB-INF):

/WEB-INF
/lib/"OS JARS";
/WEB-INF/"
openamf-config.xml" e "web.xml";
/WEB-INF/classes/"Futuras Classes Javas";

Volte ao FlexBuilder e de um F5 para Atualizar o projeto, e depois de um botão direito sobre a pasta raiz do projeto(TutuJavaFlex), e vá até properties =>Java Builder Path =>Libraries => ADDJars , navegue até a pasta lib, e selecione todos os Jars disponiveis, OK;
Em Source, vá até "default output folder" e navegue até a pasta classes dentro de WEB-INF
("WEB-INF/classes") OK.


3- Vamos Criar uma Tabela 'pais' em um banco qualquer para o exemplo:


CREATE TABLE `pais` (
`id` int(10) unsigned NOT NULL auto_increment,
`pais` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;


4- Volte ao FlexBuilder, e crie uma pasta src no diretório raiz do projeto, e dentro dela, uma chamada java;

5- Dentro da pasta java, crie uma classe Java chamada Pais.java, dentro dela crie uma bean java normal:

package src.java;
public class Pais{
public int id;
public String pais;
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getPais(){
return pais;
}
public void setPais(String pais){
this.pais = pais;
}
}


6- Ainda Dentro da pasta Java, crie uma classe chamada PaisDAO.java que se encontra no projeto
baixado.



Esta é uma classe java normal, aonde tem os Sqls, e a conexão com o banco;

No método:

public Connection getConnection()throws Exception {
if(conn == null){
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=");
conn.setAutoCommit(false);
}
return conn;
}


Altere, o "test" para o nome do Banco que Você irá usar, assim como "user" e "password".


7- Crie mais uma nova classe java, chamada PaisService.java, e adicione os códigos igual ao do rar baixado.

8- Agora, dentro da pasta src, crie uma pasta chamada flex, até agora, já criamos todos os arquivos java necessários para este exemplo;

9- Já que o java já esta criado, de um Botão direito sobre o projeto e vá em
Flex Project Nature -> Add Flex Project Nature


10- Agora vá até a pasta flex e crie uma classe ActionScript chamada RemotingConnection.as
iguamente ao que se encontrar no aquivo rar baixado.

Perceba a que exite essa linha:

public var sURL:String = "http://localhost:8080/JavaFlex/gateway";


Se Voce Não mudou o nome do diretório, deixe como está.

Esta é a classe principal, é ela que faz a conexão entre o Flex(Flash) e o Java, isto é, ela cria um

gateway (Ponto de Acesso) , entre os 2.





11- Belza!! agora vamos ao mais divertido, criar telas! +)
para isso, automaticamente deve ter criado um arquivo chamado: JavaFlex.mxml na raiz do projeto, e adicione códigos iguamente ao que se encontrar no aquivo rar baixado.

O código esta bem comentado, está bem fácil de entender! =)

Pronto!! Sua Aplicação Já está Feita!! +)

Vamos Executar?

Vá ao menu:

Project=>Clean

(Depois em desenvolvimento, gosto de deixar marcado a opção "Build Automatically")

Start o TomCat e

acesse: http://localhost:8080/JavaFlex/bin/JavaFlex.html

se vc fez tudo correto, funcionará!! +)

bom pessoal, para entender melhor como funciona a comunicação entre essas 2 poderosas linguagens, bacana seria ler a documentação do OpenAMF, Vale a pena!

Abraço Pessoal!!!! \o/

Download do Projeto Completo: Link
(Para utilizar, é só importar para o eclipse e dar um Clean)

26 comentários:

Unknown disse...

Cara, segui seu tutorial a risca...

mas ele não esta conectando ao banco ! Apresenta alguns erros

Eu preciso compilar as classes antes de rodar o FLEX ?
Ou eu compilo via prompt !?

Valeu pelo bisu !
abraços

D!gOW's disse...

Olá Filipe,

acredito que o tutorial está ok!
pois fui fazendo e escrevendo ele.

Melhor vc especifiicar o erro, para que eu possa estar te auxiliando!

Qualquer coisa kra! tem o projeto pronto no final do post!

Blza kra?!

Abraço! \o/



De:
------------------------------
| Rodrigo Pereira Fraga|
http://e-digows.blogspot.com

e-mails: rpffoz@hotmail.com
rfraga@itaipu.gov.br
------------------------------

D!gOW's disse...

Post Revisado e aprimorado

De:
------------------------------
| Rodrigo Pereira Fraga|
http://e-digows.blogspot.com

e-mails: rpffoz@hotmail.com
rfraga@itaipu.gov.br
------------------------------

Anônimo disse...

Ola! Eu tenho pouca experiencia em desenvolvimento WEB e menos ainda em Flex.

Segui todo o seu tutorial, funcionou quase tudo perfeitamente. Exceto que a conexao com o mysql nao funcionou!
Nao sei se estou fazendo algo errado, nao sei como testar se a conexao com o BD esta funcionando corretamente, ou se o driver esta corretamente instalado.

Sei que a aplicacao nao apresenta nenhum resultado, nao aparece nada em tela, nenhuma informacao.

Como posso saber se o driver esta funcionando? Ou como testo se a conexao com o BD esta correta?

Obrigado!
Rodrigo

Anônimo disse...

Oi, eu acabei de postar uma duvida neste blog, mas acabei confirmando que o conector esta funcionando corretamente.

Quando acessei o "site" localmente (ou seja, na maquina que desenvolvi e disponibilizei com o TomCat) o BD foi acessado corretamente. MAS, quando acesso o "site" de outra maquina na rede, o BD nao eh acessado.

Como posso resolver este problema?

Obrigado!
Rodrigo

D!gOW's disse...

Olá, se você concluiu que localmente está funcionando, então está ok!

Observe que no arquivo: RemotingConnection.as

existe essa linha: public var sURL:String = "http://localhost:8080/TutuJavaFlex/gateway";

Troque pelo nome da máquina, exemplo:

public var sURL:String = "http://pcDigows:8080/TutuJavaFlex/gateway";

assim como PaisDAO.java na linha:

DriverManager.getConnection("jdbc:mysql://localhost/test?user=root&password=");

ok?

Abraço!

D!gOW's disse...

Por Favor! deixem no mínimo seu e-mail, se não, não terá como auxiliar vocês! +)

Unknown disse...

Ola!! Desculpe, na semana passada deixei as msgs e acabei esquecendo de deixar meu e-mail (rpg_ufv@yahoo.com.br)

Eu comecei a desenvolver agora WEB e, principalmente, a usar flex. Mas, como qq outro, jah quero comecar a desenvolver alguma coisa, ate para aprender mais rapido.

A minha duvida agora é qual arquitetura uilizar. Tenho pouca experiencia em arquiteturas, principalmente para WEB (sei pouco ainda de JavaBeans, JBoss, WebServices).

Se vc puder me ajudar, gostaria de saber como implementar/definir os arquivos de forma padronizada?

Tenho pesquisado framework, design patterns, para facilitar o desenvolvimento. Se vc souber de algo para ajudar, te agradeco!!

Abraco!
Rodrigo

Anônimo disse...

Cara, muito bom seu tutorial, segui passo a passo e tudo ok, também consegui usar o mesmo tutorial com o Apollo, e também deu certo.
Há, meu nome é Ricardo, e to usando Flex e Java no meu tce, seu tutorial será de muita ajuda.

Vlw...Até...
Rodrigo

Anônimo disse...

Rodrigo, aqui eh o Rodrigo tb!

Bom, eu ate te mandei um mail para saber sobre essa troca de objetos entre Flex e Java. Pelo seu tutorial vi objetos prmitivos sendo trocados, como int, String, ... . Mas e objetos nao primitivos como ProdutoVO, Pessoa VO, ... ?

Eu preciso de instalar o Flex Data Service, ou o MX Remoting!??

Valew!
rpg

Anônimo disse...

Opa Rodrigo, blz?

Cara eu segui o seu tutorial do começo ao fim, mas não tá funcionando aqui =(

Quando a aplicação carrega, um pop-up eh aberto dizendo "Falha: [object Object]".

Olhei o log do Tomcat, e o erro eh este:

- Error in service, detail=[AMFBody: {serviceName=src.java.PaisService, serviceMethodName=list, response=/1, type=ARRAY, value=[]}], AMFBody=[AMFBody: {serviceName=src.java.PaisService, serviceMethodName=list, response=/1, type=ARRAY, value=[]}]
org.openamf.invoker.ServiceInvocationException: java.lang.Exception: No service for 'src.java.PaisService'
at org.openamf.DefaultGateway.invokeBody(DefaultGateway.java:203)
at org.openamf.DefaultGateway.processMessage(DefaultGateway.java:190)
at org.openamf.DefaultGateway.service(DefaultGateway.java:95)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.Exception: No service for 'src.java.PaisService'


Vc saberia o que está acontecendo? E como faço para concertar isso?

[]'s
Ronaldo
ronaldoagra@gmail.com

Anônimo disse...

Opa Blz...
Rodrigo.

Sou iniciante em flex.

Gostaria de saber se tem como criar um formulario em flex que carregue 2 combobox com dados do mysql, em que uma combobox carrega a tabela cidades e a outra a tabela tipo cliente, tudo mesmo formulario.

Unknown disse...

D!gOW's

Parabéns é o melhor tutorial que trata da Integração do Flex com Java.


Só dúvida: sobre qual versão do MySql vc utilizou? ou qual devo utilizar?


Um Abraço

Sidnei Custodio
sidneicustodio@gmail.com

Anônimo disse...

Olá Rodrigo!

Parabens pelo tutorial, muito bem elaborado... O melhor que achei até o momento na Web.

Estou tendo problemas em executar o aplicativo na minha máquina, tanto para o script baixado do seu site quanto para o que eu segui a risca...

Meu problema é o seguinte, ele abre a tela para o cadastro, mas não puxa os dados cadastrados no banco de dados MySQL... vc tem alguma sugestão do que pode ser????

Eu estou usando o Tomcat 5.5 e o MySQL 3.23

Obrigado pela atenção...
Um Abraço,

Jean - jcainelli@gmail.com

Igor O. Costa disse...

Olá Rodrigo

Primeiro muito bom tutorial, e segundo estou com o mesmo problema do Ronaldo, se vc poder me dar uma força ficaria grato.

Igor - igoroliveiracosta@gmail.com

Anônimo disse...

Olá,

Consegui fazer o Tutorial funcionar, ficou blz! Mas eu estou tentando adicionar novas funcionalidades como enviar um objeto ActionScript para o Java receber e utilizar os dados recebidos do flex.

Bem, eu criei essa classe em flex pra ser o objeto:

class src.flex.FuncionarioVO {
public var nome: String;
public var email: String;
public var endereco: String;
public var telefone: String
}

-----
Dai eu envio o objeto ActionScript nessa funcação ActionScript:

// SALVAR
public function salvar():FuncionarioVO{

// Criação do objeto VO - instância da classe FuncionarioVO.

var funcionarioVO:FuncionarioVO = new FuncionarioVO();
funcionarioVO.nome = "Jonas"; funcionarioVO.email = "jonasxxxx@gmail.com";
funcionarioVO.endereco = "POA";
funcionarioVO.telefone = "Telefone";

// Envia o objeto funcinarioVO ao Java
service.call( "src.java.VeiculoService.salvar", new Responder(SalvarResult, resultFault),funcionarioVO);

}

-----

E estou recebendo esse objeto com a seguinte classe lá no Java. Nessa classe o ArrayList chega Vazio!

public static boolean salvar (ArrayList obj){

System.out.println("|| Tamanho ||: "+obj.size());

}


----
Não sei como receber isto no Java, talvez o objeto não esteja chegando.

Abraço,

Francisco - 52715@lci.upf.tche.br

D!gOW's disse...

***Francisco

Algumas perguntas:

-Você está cahamando no Flex o Métodod no Java "VeiculoService.salvar", isto está correto? não era pra ser FuncionarioService?


- No Java:
public static boolean salvar

eu nunca testei com métodos static,
Faça um teste sem.


-Pelo que eu entendi, você queria gerar uma lista de funcionários e mandar para o Java..

aonde está esta implementação?


-No método:
public static boolean salvar (ArrayList obj){

faça um debug, trocando o ArrayList por Object.


Por favor deixe seu e-mail para facilitar a comunicação.

Vitor Douglas Rumanski disse...

Olá digows otimo tutorial,

os links nao funcionam brother,
queria muito estudar seu exemplo,
por favor, coloca outros links
um abraço e até mais

Anônimo disse...

Olá Rodrigo
parabéns pela sua iniciativa, isto só parte de pessoas grandes!!!

[usei o tomcat6, mysql 6]

Segui o tutorial a risca, mas me deparei com o seguinte erro:

java.lang.NullPointerException

at dao.PaisDAO.list(PaisDAO.java:83)
at service.PaisService.listar(PaisService.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.openamf.invoker.RankedMethod.invoke(RankedMethod.java:71)
at org.openamf.invoker.JavaServiceInvoker.invokeServiceMethod(JavaServiceInvoker.java:108)
at org.openamf.invoker.JavaServiceInvoker.invokeService(JavaServiceInvoker.java:52)
at org.openamf.DefaultGateway.invokeBody(DefaultGateway.java:210)
at org.openamf.DefaultGateway.processMessage(DefaultGateway.java:190)
at org.openamf.DefaultGateway.service(DefaultGateway.java:95)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)


se puder me ajudar !!!
da uma bola ae mano!!

Rogerio.
rog3r007@gmail.com

Manu disse...

Cara, parabens pela iniciativa. Obrigado mesmo

Mas para mim esta aparecendo o seguinte erro na tela ao lado do flex, o que pode ser ?

java.lang.Exception: No service for 'service.PaisService'

at org.openamf.DefaultGateway.invokeBody(DefaultGateway.java:203)

at org.openamf.DefaultGateway.processMessage(DefaultGateway.java:190)

at org.openamf.DefaultGateway.service(DefaultGateway.java:95)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Thread.java:595)

?????

Manu disse...

Cara, parabens pela iniciativa. Obrigado mesmo

Mas para mim esta aparecendo o seguinte erro na tela ao lado do flex, o que pode ser ?

java.lang.Exception: No service for 'service.PaisService'

at org.openamf.DefaultGateway.invokeBody(DefaultGateway.java:203)

at org.openamf.DefaultGateway.processMessage(DefaultGateway.java:190)

at org.openamf.DefaultGateway.service(DefaultGateway.java:95)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Thread.java:595)

?????

Anônimo disse...

Parabéns Rodrigo pelo tutorial, ainda mais por estar disponibilizando os fontes, pois este assunto é questionado por muitas pessoas.

Abraços.

Anônimo disse...

intiresno muito, obrigado

Anônimo disse...

bom comeco

Anônimo disse...

proctor far-off this parole [url=http://www.casinoapart.com]casino[/url] baby something at the weighty [url=http://www.casinoapart.com]online casino[/url] signal with 10's of credulous [url=http://www.casinoapart.com]online casinos[/url]. bear a become to pieces at [url=http://www.casinoapart.com/articles/play-roulette.html]roulette[/url], [url=http://www.casinoapart.com/articles/play-slots.html]slots[/url] and [url=http://www.casinoapart.com/articles/play-baccarat.html]baccarat[/url] at this [url=http://www.casinoapart.com/articles/no-deposit-casinos.html]no ruin casino[/url] , www.casinoapart.com
the finest [url=http://de.casinoapart.com]casino[/url] to UK, german and all during the world. so owing the treatment of the worst clock off [url=http://es.casinoapart.com]casino en linea[/url] corroborate us now.

Anônimo disse...

[url=http://kaufenviagragenerika50mg.net/]viagra bestellen[/url] viagra kaufen [url=http://achat-viagra-pascher.net/]prix viagra[/url] commander viagra france [url=http://comprarviagragenerico100mg.net/]viagra[/url] viagra espana [url=http://comprareviagragenerico50mg.net/]viagra[/url] viagra in farmacia