Arquivo para a categoria 'FLEX'

Introspecção Performance: Java x ActionScript3

Bom, hoje vou falar um pouco de um recurso muito importante no desenvolvimento de aplicações, que é o processo pelo qual se pode obter informações sobre a estrutura e comportamento do programa em tempo de execução, de uma maneira estreitamente dependente das características de abstração do código, ou seja, o programa tem a habilidade para “observar” e possivelmente modificar a estrutura e comportamento. Levando em consideração esse conceito vou mostrar como esse pode ser aplicado tanto na linguagem Java como em ActionScript3(AS3).

Em AS3 ultilizada no desenvolvimento Flex, reflexão é referenciada como object introspection (introspecção de Objeto). Existem duas formas de introspecção em AS3: Usando o laço for…in e a API introspecção. Em Java esta atividade é auxiliada pelo pacote java.lang.reflect. É bom deixar bem claro que a API introspecção em ActionScript não é tão avançada como em Java, porem permite você ler métodos, propriedades e invocar métodos de objetos em tempos de execução, tao bem quanto. Bom, chega de conversa e mãos a obra.

Para nosso exemplo vamos definir nossa classe que ira servir como base para fazer nossos testes, precisamos de duas classes uma em Java .class e outra em ActionScript .as:

Vamos por parte, primeiramente aprender como pegar a definição de classe e logo em seguida criar uma instancia da mesma, primeiro em Java:

...
Class classePessoa = Class.forName(”Pessoa”);
Object instance = classePessoa.newInstance();

Muito fácil não? Em ActionScript é mais fácil ainda, com a utilização do método getDefinitionByName() definido em flash.utils, onde contem diversas funções de manipulação de classes e objetos em tempo de execução, podemos criar uma definição de classe.

...
var classePessoa: Class = getDefinitionByName(”Pessoa”) as Class;
var instance = new classePessoa ();

Agora Vamos tentar recuperar a estrutura do Objeto Pessoa em tempo de execução, primeiro em Java:

Class classePessoa = Class.forName("Pessoa");
String str=”";
for (Field field : classePessoa.getDeclaredFields()) {
str+=”Variaveis: “+
field.getName()+
“=(”+field.getType().getSimpleName()+
“)”+
“\n”;
}
for (Method method : classePessoa.getDeclaredMethods()) {
str+=”Metodo: “+
method.getName()+
“=(”+method.getReturnType()+
“)”+
“\n”;
}
System.out.println(str);

Agora o processo em ActionScript, é feito com a utilização do for..in e a função describeType() que vem também no pacote flash.utils, recebe como parâmetro o objeto a ser introspectivo sobre um retorno descrito em XML do tipo do objeto e toda sua estrutura:

var ClassePessoa:Class = getDefinitionByName(”Pessoa”) as Class;
var classInfo:XML = describeType(classePessoa);
var str:String=”;
for each (var v:XML in classInfo..variable) {
str += “Variavel: ” + v.@name + “=” + ” (” + v.@type + “)\n”; }
for each (var v:XML in classInfo..method) {
str += “Metodo: ” + v.@name + “=” + ” (” + v.@returnType + “)\n”;
}
trace(str);

Abas imprimem o seguinte trace:

Variavel : nome=(String)

Variavel : nacionalidade=(String)

Variavel : idade=(String)

Metodo: falar=(void)

Metodo: ouvir=(void)

Outra coisa muito utilizada quando se utiliza reflexão e invocação de métodos por definição explicita de assinatura e parâmetro, em Java podemos criar um objeto Method a partir do getMethod() passando o nome do método como parâmetro, e em seguida utilizar seu método invoke() , passando o objeto, e parâmetro, no argumento:

...
Class classePessoa = Class.forName(”Pessoa”);
Method m = classePessoa.getMethod(”falar”, null);
m.invoke(classePessoa.newInstance(), null);

Em ActionScript é um pouco diferente, pois o tipo Object é uma classe dinâmica então não precisamos fazer o hard-code do método para que o metodo seja invocado, basta fazer instanciar com new e invocar explicitamente.

var classePessoa:Class = getDefinitionByName("Pessoa") as Class;
var instance:Object = new classePessoa()
instance["falar"](); //
ou instance.falar(); os dois sao equivalentes

Um outro método muito utilizado na introspecção AS3 é o getClassInfo(), no qual retorna um objeto com nome e propriedades do mesmo e o toString() que retorna uma espécie de “mapa” do Objeto, todos dois da classe ObjetoUtils.

...
var o:Object = ObjectUtil.getClassInfo(Pessoa);
trace(ObjectUtil.toString(o));

Bom, espero ter colaborado para um entendimento do que vem a ser introspecção de objetos e como se comporta em cada uma das linguagens, tanto em Java quando em AS3, podendo ser uma técnica poderosa no desenvolvimento de soluções um tanto quanto genéricas.

RIA com Java: BlazeDS e AMF

Ultimamente com o uso de ferramentas como Adobe Flex, Flash CS3 vem crescendo muito o numero de Rich Internet Applications (RIA), aplicações desktop com o Adobe AIR e aqueles que rodam em browser com Flash Player atuando como client-side, que por sua vez tem que de alguma forma se comunicar com um servidor para leitura e manipulação de dados, dados esses que geralmente são transportados via HTTP, mas a diferença em como esses dados são passados pelo protocolo pode comprometer drasticamente a performance, bem como a produtividade no desenvolvimento dos sistemas.

Muitas dessas aplicações utilizam-se de XML-sobre-HTTP para a comunicação cliente-servidor e acabam se dando conta da carga que sistema sofre com a serialização e deserialização dos XMLs que correm de um lado para outro.

O Action Message Format(AMF) se trata de um protocolo binário que pode ser usado sobre o HTTP ao invés do XML, evitando o tempo de parse entre a comunicação com o servidor. Nesse intuito, a Adobe tratou de lanca o tantas vezes renomeado LiveCycle Data Service, que prove as APIs necessárias para o server-side trabalhar com o AMF. Porém, não muito difundido pelos desenvolvedores por ser uma ferramenta liberada apenas para um único servidor(CPU) como demonstração. Em dezembro de 2007 a Adobe anuncio que a especificação AMF seria liberada e uma poção do LiveCycle Data Service seria open-source denominado BlazeDS que incluiria a implementação Java de AMF em servidores de aplicação como: Tomcat, JBoss, WebLogic, WebSphere, etc.

James Ward e Shashank Tiwari publicaram um artigo que explica em detalhes todo esse processo e a criação de um exemplo com back-end Java com o BlazeDS sobre o desenvolvimento Flex para um cliente RIA.

O artigo pode ser encontrado aqui postado na infoQ.

Relatórios em Flex? Jasper4Flex pode ser uma opção

Recentemente por uma iniciativa de Teodor Danciu, foi desenvolvido mais uma opção de renderização de relatórios feitos em jasper, so que desta vez em swf, ou seja, para desenvolvimento Flex, conhecido como Jasper4Flex, o mesmo possui algumas peculiaridades em relação ao FlexReport, pois constitui base jasper server-side, então toda a geração do relatório ocorre no servidor jasper seguido de um parser Jasper4Flex, feito por um servlet registrado no deploy descriptor:

web.xml

….

<servlet>

<servlet-name>SwfServlet</servlet-name>

<servlet-class>net.sf.jasperreports.j2ee.servlets.SwfServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>SwfServlet</servlet-name>

<url-pattern>/servlets/swf</url-pattern>

</servlet-mapping>

……

Em poucas linhas podemos fazer nossa chamada apartir de um servlet.

JasperPrint impressao = JasperFillManager.
fillReport(”Report_exemplo.jasper”, parametros,conn);
HttpSession session = request.getSession();
session.
setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, impressao);
response.sendRedirect(”servlets/swf”);

Neste caso foi criado um servlet para testar o exemplo. O código, não tem muito mistério a única diferença está, em como esse servlet vai responder essa requisição direcionando ’servlets/swf’. O resto o jasper4Flex se encarrega de fazer. Estou ate satisfeito com os testes que tenho feito ate agora. Mais o projeto é muito recente? Sim, eu sei mais a comunidade esta ai pra isso, testar, motivar e colaborar. Vejo isso como mais um incentivo a desenvolvedores que querem usar projetos Java em front-end Flex. Os exemplos podem ser baixados aqui no site do projeto.