Friday, May 15, 2009Fábrica de RemoteObjetc em Flex

Ola pessoal.

Exemplo simples de criação de uma fábrica de RemoteObject em ActionScript 3, que utiliza por base função de ResultEvent e FaultEvent e como configuração uma classe de constantes para o RemoteObject testada e usada com o framework Java Blaze Data Services.
Dica rápida…

OBS: Classe testada e utilizada com BlazeDs.


package br.com.ronaldorigoni.remote{
import mx.controls.Alert;
import mx.core.Application;
import mx.managers.CursorManager;
import mx.messaging.ChannelSet;
import mx.messaging.channels.AMFChannel;
import mx.rpc.AbstractOperation;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.mxml.RemoteObject;

/**
* Classe de requisições remotas usando RemoteObject.
* @autor Ronaldo Rigoni.
**/
public class RemoteCall{

/**
* Indica se o channelSet está construido.
*/
private var channelBuilded:Boolean = false;
/**
* ChannelSet do RemoteObject
**/
private var channelSet : ChannelSet = new ChannelSet();
/**
* RemoteDestination
**/
private var destination:RemoteDestination = null;

/**
* Função chamada quando tudo ocorrer corretamente.
*/
private var functionSuccess:Function = null;

/**
* Função chamada quando algo de errado ocorrer
*/
private var functionError:Function = null;

/**
*
* @param destination O Destination do RemoteObject.
**/
public function RemoteCall(destination:RemoteDestination){
this.destination = destination;
}

/**
* Cria um ChannelSet.
**/
private function getChannelSet():void{
var amfChannel:AMFChannel = new AMFChannel("my-amf",getMessageBroker());
channelSet.addChannel(amfChannel);
channelBuilded = true;
}
/**
* Retorna o endereço messagebroker da aplicação.
**/
private function getMessageBroker():String{
return Application.application.url.substr(0, Application.application.url.indexOf("/cms.swf"))+"/messagebroker/amf";
}

/**
* Invoca uma requisição remota.
* @param operation Operação a ser executada no lado servidor.
* @param faultFunction Função a ser executada caso ocorra um erro.
* @param successFunction Função a ser executada caso a operação remota ocorra com sucesso.
* @param args Argumentos passados a operação remota.
**/
public function invoke(operation:String, faultFunction:Function = null,
successFunction:Function = null, ...args):void{
functionSuccess = successFunction;
functionError = faultFunction;
// capturando o remoteObject
var remoteObject : RemoteObject = getRemoteObject(destination.getDestination());
// setando o source ( pacote + classe )
remoteObject.source = this.destination.getSource();
// adicionando listener para a funcao de retorno
remoteObject.addEventListener(ResultEvent.RESULT, onSuccess);
//se foi definido uma função de erro.
remoteObject.addEventListener(FaultEvent.FAULT, onFault);
// se a lista de argumentos for vazia não será passado nada como parametro.
// capturando o nome do método do destination a ser invocado.
var remoteOperation:mx.rpc.AbstractOperation = remoteObject[operation];
if(args[0] != null){
// serando os argumentos
remoteOperation.arguments = args;
}
CursorManager.setBusyCursor();
// invocando o servico remoto
remoteOperation.send();
}
/**
* Constroe o remoteObject
**/
private function getRemoteObject(destination:String):RemoteObject{
if(channelBuilded == false)
getChannelSet();
var remoteObject:RemoteObject = new RemoteObject(destination);
remoteObject.channelSet = channelSet;
return remoteObject;
}

private function onSuccess(result:ResultEvent):void{
CursorManager.removeBusyCursor();
if(this.functionSuccess != null){
this.functionSuccess.call(this, result);
}
}

/**
* Manipulador default de mensagens de erro, caso não for
* expecificado será invocada esta função em caso de erro.
**/
private function onFault(result:FaultEvent):void{
CursorManager.removeBusyCursor();
if(this.functionError != null){
this.functionError.call(this, result);
}else{
Alert.show(String(result.message));
}
}
}
}

Toda a classe está comentada e de fácil entendimento.

A RemoteCall recebe como parâmetro um argumento do tipo RemoteDestination conforme abaixo, onde é configurado como constantes um "destination", que possue o source e o id do serviço remoto.


package br.com.ronaldorigoni.remote{
/**
* Classe de constantes para declarações de RemoteDestination,
* onde contém as informações de source e id do destination em questão.
**/
public class RemoteDestination{
private var destination : String = new String();
private var source:String = new String();
/**
* Nome de destination para operações com Usuário.
**/
public static const USER_DESTINATION:RemoteDestination = new RemoteDestination                        ("userDestination","br.com.ronaldorigoni.destinations.UserDestination";);

public function RemoteDestination(name:String, source:String){
this.destination = name;
this.source = source;
}
/**
* Retorna o id do serviço remoto.
**/
public function getDestination():String{
return destination;
}
/**
* Retorna o source do serviço remoto.
**/
public function getSource():String{
return this.source;
}
}
}

E para utilizarmos é simples basta intanciarmos conforme abaixo:


private var remoteObject:RemoteCall = new RemoteCall(RemoteDestination.USER_DESTINATION);

remoteObject.invoke("nomeDoMetodoNoDestination",minhaFuncaoDeErro,minhaFuncaoDeSucesso,null);

Qualquer dúvidas ronaldo@ronaldorigoni.com.br

Até um próximo post.

Olá galera,
Qual desenvolvedor Java e Flex não se deparou com a sintaxe estranha do texto produzido pelo RichTextEditor contido no Adobe Flex?

Segue abaixo exemplo simples utilizando Expressões Regulares em java de como remover esta formatação transformando o texto em XHTML 4.1 válido pela W3C.

package br.com.ronaldorigoni.FlexAndJava;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* Taglib para formatacao de texto proveniente do RichTextEditor do AdobeFlex
* @author ronaldorigoni.com.br
*
*/
public class XHTMLFormatting extends SimpleTagSupport {

/**
* Texto a ser convertido
*/
private String textToConverter;
/**
* Execucao da tag
*/
@Override
public void doTag() throws JspException, IOException {
super.doTag();
if(textToConverter!= null)
getJspContext().getOut()
.println(convertFlexTextToXHTML(textToConverter));
}

private String convertFlexTextToXHTML(String text){
String str = text;
// removendo todos os  TEXTFORMAT por espaco em branco
str = str.replaceAll("<TEXTFORMAT.*?>","");
// removendo todas as aberturas de tags  FONT
str = str.replaceAll("<FONT.*?>","");
// removendo todos as fechamentos de tags  FONT
str = str.replaceAll("</FONT.*?>","");
// Alterando atributo HREF para minusculo, padrao HTML
str = str.replaceAll("<A HREF","<a href");
// Convertendo todos os links para minusculo
str = str.replaceAll("</A>","</a>");
//  Alterando target para rel externo ( attr manipulado por JS )
str = str.replaceAll("TARGET="_blank"","target="externo" ");
// convertendo todas as aberturas de tags I para <em>
str = str.replaceAll("<I>","<em>");
// convertendo todos os fechamentos de tags I para <em>
str = str.replaceAll("</I>","</em>");
// alterando abertura de <B> para <strong>  padrao XHTM
str = str.replaceAll("<B>","<strong>");
// alterando fechamento de <B> para <strong>  padrao XHTM
str = str.replaceAll("</B>","</strong>");
// alterando para maiuscula para minuscula
str = str.replaceAll("<U>","<u>");
str = str.replaceAll("</U>","</u>");
// formatando para minusculo
str = str.replaceAll("</LI><LI>","</li><li>");
// formatando para minusculo
str = str.replaceAll("</LI>","</li></ul>");
// todo o inicio de uma <li>  deve ser procedido por uma <ul> por isso
// quando encontrarmos uma abertura de <LI> devemos
// abrir antes disto uma  <ul>
str = str.replaceAll("<LI>","<ul><li>");
// removendo formatacao de paragrafo,
// ( formatacao deve ser feita por CSS )
str = str.replaceAll("<P ALIGN="LEFT">","<p>");
str = str.replaceAll("<P ALIGN="CENTER">","<p>");
str = str.replaceAll("<P ALIGN="RIGHT">","<p>");
str = str.replaceAll("<P ALIGN="JUSTIFY">","<p>");
// todo o fechamento de paragrafo
str = str.replaceAll("</P>","</p>");
// removendo todo o final de </TEXTFORMAT>
str = str.replaceAll("</TEXTFORMAT.*?>","");
// removendo todas as UL vazias
str = str.replaceAll("</ul><ul>","");
/*
Caso queira remover os paragrafos em branco e principalmente
as listas em branco  resultandes de um ENTER no editor do Flex
descomente as duas linhas abaixo.
*/
//str = str.replaceAll("<p></p>","");
//str = str.replaceAll("<li></li>","");
return str;

}
/**
*  Getter  textToConverter
*/
public String getTextToConverter() {
return textToConverter;
}
/*
*  Setter textToConverter
*/
public void setTextToConverter(String textToConverter) {
this.textToConverter = textToConverter;
}

Este exemplo é a criação de uma Custom TagLibrary, mas pode também ser adaptado para outras linguagens.
Surgindo dúvidas ronaldo@ronaldorigoni.com.br
Até um próximo post.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes

© 2007 Ronaldo Rigoni | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress