DClick

Arquivos para November, 2006

Utilizando o FusionDebug

Categorias relacionadas: ColdFusion, Flex, Notícias

FusionDebug é um plugin para o Eclipse que permite debuggar aplicações em ColdFusino tal como é feito em aplicações Java e em Flex. Eu já havia comentado sobre ele no CFGigolo.com. Assim, quando occorrer uma parada via debug (tanto em caso de erro quanto por um breakpoint adicionado manualmente), é possível visualizar o valor das variáveis, o conteúdo dos escopos, o stack trace, roda expressões, executar o código passo-a-passo, e por aí vai.

Após alguns testes, adquirimos licenças para a DClick. Porém, quando, fomos utilizar efetivamente em um projeto, ele não funcionou.

Em nossos projetos nós criamos uma pasta “src” (tal como acontece por padrão em projetos Java). Assim, esse era o nosso “source folder”, e os arquivos ColdFusion dali era jogados para o webroot. Assim, um “localhost/arquivo.cfm” simplesmente não tinha um correspondente “arquivo.cfm” no projeto - pois ele estava em “src/arquivo.cfm”.

Nós reportamos o ocorrido para a FusionReactor (fabricante do FusionDebug) quue prontamente respondeu estar ciente do problema e nos orientando para um workaround simples (não utilizarmos a pasta “src”) e afirmando que na próxima versão do produto (1.5, já em beta) isso já está corrigido.

Por Fabio Terracini em 30/November/2006
Nenhum Comentário »


No Translations

“RemoteObject” no Flex 2 com PHP e com Java sem Data Services

É possível no Flex 2, hoje, consumir objetos do PHP tal como era feito no Flex 1.5 com o uso do AMFPHP, assim como é possível consumir objetos Java com o OpenAMF sem a necessidade do Flex Data Services.

Para consumir objetos Java diretamente do Flex 2.0 usa-se o componente RemoteObject, que implementa um conjunto de funcionalidades - entre elas a serialização ("tradução") dos objetos - do Java para o ActionScript 3.0. No Flex 2 o RemoteObject troca informação com o servidor utilizando um formato chamado AMF3 (ActionScript Message Format 3), de forma que ele pode conversar com qualquer servidor que também saiba receber e enviar objetos (bem como fazer sua serialização) em AMF3. O Flex Data Service é uma aplicação J2EE para comunicação entre a camada de apresentação feita em Flex e a camada de negócios em Java de alta performance, que além de "falar" em AMF3 e ter o RPC (Remote Procedure Call) via RemoteObject oferece funcionalidades de Messaging (colaboração, push de dados, etc) e de Data Management (sincronização de objetos, clientes off-line, etc). O Flex também pode se comunicar com serviços em SOAP (WebServices) ou via HTTP.

Contudo, nem sempre é possível utilizar um servidor capaz de se comunicar em AMF3, como o Flex Data Services ou o ColdFusion.

A versão anterior do Flex (versão 1.5) era baseada no ActionScript 2.0, cujo formato para troca de dados do RemoteObject era o AMF0 (não existe AMF1 nem AMF2). Para esse formato de troca de mensagens há outros servidores que podem ser utilizados, como o OpenAMF (para Java) e o AMFPHP (para PHP). O ColdFusion já conversava nativamente com o Flex 1.5, assim como faz com o Flex 2.

É esperado que essas tecnologias (OpenAMF e AMFPHP) sejam atualizados para se comunicar também em AMF3 e conversar nativamente com o Flex 2, mas ainda assim é possível utilizar as versões existentes do OpenAMF e AMFPHP que se comunicam apenas via AMF0 com o Flex 2. O que precisa ser feito, basicamente, é dizer para o Flex que os dados que serão trocados estarão no formato AMF0, e não no formato AMF3.

Como o RemoteObject só conversa em AS3, podemos utilizar a classe flash.net.NetConnection que igualmente pode ser utilizada para se comunicar com o servidor e contém uma propriedade (objectEncoding) indicando o encoding dos objetos trocados com o servidor. Essa variável é static e os possíveis valores para ela estão definidos na classe flash.net.ObjectEncoding:

NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;

Assim, podemos criar um novo serviço regido pela classe NetConnection:

public var service:NetConnection = new NetConnection();

E definir qual o endpoint ele acessará:

service.connect("http://localhost:8080/TesteAMF/amfgateway");

A partir daí, basta usar o método call() de nosso serviço (que é um NetConnection) para chamar os métodos no servidor. Nesse momento vamos também definir os responsáveis por tratar a resposta do servidor, utilizando a flash.net.Responder:

service.call("Teste.getArrayList", new Responder(resultHandler, faultHandler));

Abaixo um exemplo completo em Flex 2.0 que se consome uma classe Java via AMF0:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application
  3.     xmlns:mx="http://www.adobe.com/2006/mxml"
  4.     initialize="initApp()">
  5.  
  6.     <mx:Script>
  7.     <![CDATA[
  8.     import flash.net.ObjectEncoding;   
  9.     import flash.net.NetConnection;
  10.     import mx.collections.ArrayCollection;
  11.     import mx.controls.Alert;
  12.    
  13.     // O serviço poderá ser chamado de qualquer lugar.
  14.     public var service:NetConnection = new NetConnection();
  15.    
  16.     [Bindable]
  17.     public var meses:ArrayCollection;
  18.        
  19.     public function initApp():void
  20.     {
  21.         // define o encoding para amf0
  22.         NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0;
  23.        
  24.         // Conecta no servidor amf. O endereço é o "endpoint" do RemoteObject
  25.         service.connect("http://localhost:8080/TesteAMF/amfgateway");
  26.     }
  27.    
  28.     public function getArrayList():void {
  29.         // Chama o método getArrayList da classe Teste.
  30.         // Define um handler para o o resultado e um para a falha.
  31.         service.call("Teste.getArrayList", new Responder(resultHandler, faultHandler));
  32.     }
  33.    
  34.     public function resultHandler(result:Array):void
  35.     {
  36.         meses = new ArrayCollection(result);
  37.     }
  38.  
  39.     public function faultHandler(fault:String):void
  40.     {
  41.       Alert.show('Erro');
  42.     }
  43.  
  44.     ]]>
  45.     </mx:Script>
  46.  
  47.     <mx:RemoteObject />
  48.     <mx:ComboBox dataProvider="{meses}" />
  49.    
  50.     <mx:Button buttonDown="getArrayList()" label="Pegar dados do servidor" />
  51.    
  52. </mx:Application>

É possível até mesmo conectar à serviços disponíveis em uma instalação do Flex 1.5. Assim, novas aplicações podem ser desenvolvidas em Flex 2 para aproveitar os novos recursos de interface, até o servidor ser efetivamente migrado para o Flex Data Services.

Esse é um exemplo simples de integração, uma prova de conceito. Boa parte da lógica de conexão com o serviço remoto pode ser encapsulada em uma classe para ser mais fácil de trabalhar. Já há um componente muito interessante chamado RemoteObjectAMF0 que visa justamente isso.

A prática de consumo e troca de objetos é encorajada em relação ao WebService e à serviços HTTP. Além dos ganhos de performance e escalabilidade, há troca (e serialização) dos objetos nativos das linguagens. Prefira o uso do RemoteObject, aproveite os benefícios do AMF.

Por Fabio Terracini em 28/November/2006
8 Comentários »


No Translations

Populando apenas o necessário com Hibernate

Categorias relacionadas: Hibernate, Java

Uma das funcionalidades do Hibernate é transformar os dados do banco em objeto (s) de acordo com as informações solicitadas, lhe poupando do trabalho de popula-los. Por padrão, o Hibernate popula todas os atributos do seu objeto, o que nem sempre é o desejado. Pense em um cenário no qual desejamos retornar ao frontend apenas os dados referente a identificação daquele objeto, como id e descrição, para popular um combo por exemplo. Não desejamos que o Hibernate retorne todos os atributos da classe gerando, assim, um trafego desnecessario em nossa rede.

Exemplificando, vamos imaginar que eu tenha uma classe de Produto que tenha dezenas de atributos. Não quero que o Hibernate popule todos eles, apenas o id e o nome do produto para enviar ao frontend. Para isso vamos utilizar 2 recursos: O setProjection, com a funcionalidade de projetar o que será requisitado na clausula select que, por padrão, sempre retorna os dados projetados como um array de objetos ao invés do próprio objeto (Produto); e o segundo recurso, setResultTransformer, que diz ao Hibernate como tratar os dados solicitados.

JAVA:
  1. Collection collection = HibernateSessionFactory.getSession()
  2. .createCriteria(Produto.class, "p")
  3. .setProjection( Projections.projectionList()
  4.     .add( Projections.property("p.id").as("id") )
  5.     .add( Projections.property("p.nome").as("nome") )
  6. )
  7. .setResultTransformer(new AliasToBeanResultTransformer(Produto.class))
  8. .list();

No exemplo acima, ao utilizarmos o método as("atributo"), criamos uma espécie de "alias" para o Hibernate saber em que propriedade ele irá "jogar" esse dado. Tal recurso é muito interessante quando desejamos selecionar dados de uma Classe e atribui-los diretamente a um DTO ou uma classe de relatório. O AliasToBeanResultTransformer pega todos os "alias" criados apartir do .as e atribui na classe que está sendo passada procurando pelo nome do atributo na mesma.

[update data="10/08/2007 14:15"]
Adicionado alias na query
[/update

Por Daniel Passos em 21/November/2006
15 Comentários »


No Translations

Artigo de Flex na revista MundoJava

Categorias relacionadas: ActionScript, Flash Platform, Flex, Java, RIA

Capa da revista Mundo Java, ed 20. Na revista MundoJava desse bimestre (nov/dez, 20ª ed) foi publicado um artigo sobre Flex 2 que eu e o Rafael Martinelli escrevemos! É o artigo da capa da revista!

O objetivo é mostrar para os programadores Java a tecnologia Flex, como ela funciona e os problemas que ela resolve. No artigo, além de explicações conceituais, também criamos uma pequena aplicação em Flex que consome dados no formato XML fornecido pelo Java.

É uma ótima exposição para a tecnologia e tenho certeza que dará um bom resultado!

O projeto utilizado no artigo pode ser baixado aqui.

Por Fabio Terracini em 17/November/2006
Nenhum Comentário »


No Translations

Novo endereço do blog!

Categorias relacionadas: Notícias

Pessoal, atualizem seus bookmarks e agregadores!

O endereço do blog da DClick mudou para http://blog.dclick.com.br e o endereço do Feed XML no formato RSS 2.0 mudou para http://blog.dclick.com.br/?feed=rss2.

Por Fabio Terracini em 17/November/2006
Nenhum Comentário »


No Translations

Mais novidades da MAX 2006 no AUG-SP

Categorias relacionadas: MAX 2006, Notícias

Eu e o Rafael vamos fazer uma apresentação na próxima reunião do AUG-SP (dia 9 de Novembro, quinta-feira) com mais novidades da MAX 2006! Essa reunião será transmitida online via Adobe Connect (ex-Breeze).

Veja mais informações e inscrições no site do AUG-SP.

Por Fabio Terracini em 7/November/2006
3 Comentários »


No Translations

Adobe Flex no RioJUG

Categorias relacionadas: Flex, Flex Data Services, Java, Notícias

Beck Novaes e Henrique Marino, especialistas em Rich Internet Applications na DClick farão uma palestra esse mês no RioJUG sobre o Adobe Flex, demonstrando integração com WebServices, com Java e as possibilidades do Data Services, além de um panôrama da tecnologia.

Dia: 13/Novembro/2006 (segunda-feira)
Horário: 19:00 horas
Duração: 2 horas
Local: Auditório do SENAC CIT - Rua Santa Luzia, 735 - 7o. andar, Centro

Mais informações sobre o evento no site do RioJUG.

Por Fabio Terracini em 7/November/2006
3 Comentários »


No Translations