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.

Tuesday, May 12, 2009Desmistificando o Google Analytics

Com Engenheiro de Vendas do Google na América Latina Rodrigo Vale, video onde explica passo a passo uso e implantação. Quem conhece a ferramente sabe o valor dos dados que ela traz.
Fica ali a dica.

Até um próximo post.

Ronaldo

Monday, May 11, 2009Singleton em Java

Simples post para demonstrar o uso do Design Pattern Singleton em Java.

Assegura que uma determinada classe tenha apenas uma única instância, e apenas um meio de acesso a mesma.

Por exemplo em um sistema operacional é o uso de impressoras, temos vários clientes conectados a impressora, mas a mesma possui apenas um spool de documentos.

Segundo Gof temos o diagrama abaixo:

singleton_gofE como codificar isso? Imagine um cenário seguinte, precisamos desenvolver um chat entre múltiplos clientes,

onde todos podem se comunicar com todos, de que forma podemos implementar e assegurar que todos os usuários do nosso chat acessem exclusivamente a mesma instância da classe?


package br.com.ronaldorigoni.singleton;
/**
* Exemplo de Singleton - ChatRoom
* @author ronaldorigoni.com.br
*/
public class ChatRoom {
/**
* Única instancia da sala de bate papo, deve ser privada para
* não permitir acesso direto.
*/
private static ChatRoom instance = null;

/**
* Construtor privado para não permitir a
* criação de novas instancias da classe.
*/
private ChatRoom(){
// aqui codigo para a inicialização do chat.
// verifica configurações em banco ou outras
// operações.
}
/**
* Única forma de acesso para a instancia "instance" da classe
* @return  - A única instância da sala de Chat
*/
public static ChatRoom getInstance(){
if(instance == null)
instance = new ChatRoom();
return instance;
}

}

Através do método getInstance(), qualquer cliente tem apenas uma forma de acesso e em uma única instancia da sala de Chat.

Agora criaremos um método writeMessage(String message):


/**
* Envia uma mensagem a todos os usuários
* @param message
*/
public void writeMessage(String message){
for(User user : userList){
user.sendMessage(message);
}
}

Mesmo o método sendo public, só conseguiremos acessar ele através de uma instancia da classe desta forma:


ChatRoom.getInstance().writeMessage("Mensagem de teste");

Mas cuidado, em um ambiente MultiThread não está seguro que existe apenas uma instancia da classe, se em um determinado momento duas threads acessarem o método getInstance() ao mesmo tempo será criada duas instancias.

Como bloquear isso?  Adicionaremos um bloco s no método getInstance(), desta forma garantimos que toda Thread que entrar neste bloco irá bloquear o objeto instance para si mesmo, e só fará o desbloqueio quando o bloco de código terminar, assim uma vez desbloqueado estará disponível para uma nova thread utilizar.


public static ChatRoom getInstance() {

// garante que apenas uma thread por vez

// executará este bloco de código
synchronized (instance) {
if (instance == null)
instance = new ChatRoom();
}
return instance;
}

Para deixarmos nosso exemplo mais seguro, muitos desenvolvedores acham este método bizarro, mas eu o utilizei varias vezes, altere o método getInstance() para o modificador de acesso private, em seguida crie uma classe interna conforme abaixo, esta classe deve ser public static abstract, mas espere aí? Classe estatica é possível? Sim classe static é possível desde que a mesma seja aninhada ( classe interna).


private static ChatRoom getInstance() {
synchronized (instance) {
if (instance == null)
instance = new ChatRoom();
}
return instance;
}

E agora nossa classe interna aninhada:


public abstract static class ChatRoomHolder{
public static ChatRoom getInstance(){
return ChatRoom.getInstance();
}
}

Repare que a classe é abstrata, com isso fica impossível instanciá-la, mas por ela ser interna ela tem acesso aos métodos private de nossa ChatRoom, invoca o método getInstance() e retorna a instancia criada no construtor.

Desta forma estamos garantindo de duas maneiras que a classe ChatRoom tenha apenas uma única instancia:

  • Com o uso de construtor privado e um bloco sincronizado no método getInstance().
  • Com o uso de uma classe abstrata interna que não permite ser instanciada por ser abstrata.

Singleton pode ser aplicado em diversos casos, ( conexão a banco de dados, mecanismo de Log, Objetos de configuração, etc…).

Dúvidas, ronaldo@ronaldorigoni.com.br

Até um próximo post.

Saturday, May 9, 2009Como Instalar ISPCONFIG Ubuntu

Salve galera,
Hoje tive uma experiência ótima que me proporcionou um bom conhecimento na área de hospedagem, tive que instalar uma suíte de aplicativos de controle de hospedagem em um servidor dedicado recém formatado onde irá hospedar um projeto de Jogos de Bingo no qual estamos desenvolvendo para a 58 Pixels . A suíte de aplicativos que utilizei é chamada ISPCONFIG ( Apache2, Mysql, PhpMyAdmin, RoudCube, WebMiau, SVN, PostgreSQL,dentre outros). Se trata de uma solução completa em termos de hospedagem e o melhor de tudo é FREE,  fica alí minha indicação.

Vou relatar abaixo todas as bibliotecas necessárias para instalação deste Hosting Manager, varias delas não está n0 manual de instalação , se não instalar todas elas a instalação tem grandes chances de erro (passei por isso).

Importante: A instalação foi feita em Ubuntu Server 8.04 (Hardy Heron) 64bits.

Antes de instalar, siga os passos no  manual de instalação para a adição dos repositórios e para a atualização do servidor. Após isso siga os passos no manual de instalação e voe lá.

Bibliotecas necessárias:

proftpd libhtml-parser-perl libdb-file-lock-perl libnet-dns-perllibssl-dev

libxml2 openssl libmysql++-dev sendmail procmail quota vsftpd

openssl bind9 apache2 subversion apache2 libapache2-svn php5

libapache2-mod-php5 flex g++

Valeu e até um próximo post,  dúvidas ronaldo@ronaldorigoni.com.br

Ronaldo

Salve galera, segue abaixo um tutorial de como instalar o controlador de versão Subversion e o Apache no Ubuntu.

Primeiramente abra seu terminal onde iremos instalar todas as bibliotecas e o servidor apache com subversion:

Onde:

  • subversion: Controlador de versão.
  • libapache2-svn: Biblioteca de integração entre apache e subversion.
  • apache2: Servidor Web Apache
sudo apt-get install subversion libapache2-svn apache2

Caso você ja possua o apache instalado, use o comando abaixo:

sudo apt-get install subversion libapache2-svn

Após o processo terminar, precisamos habilitar o modulo webdav na configuração do apache.

sudo vi /etc/apache2/mods-enabled/dav_svn.conf

O linha onde diz é onde o diretório raiz de repositórios onde o subversion estará escutando quando for acessado http://meuhost/svn , deixe ela com a configuração abaixo, se a mesma estiver com um comentário remova.

<Location /svn>

Com isso ele estará lendo no diretório /var/svn

Agora precisamos habilitar o modulo dav, descomente a linha abaixo.


# Uncomment this to enable the repository
DAV svn

O SVNParentPath é onde será o diretório padão de repositórios, indicado quando vc usará mais de um repositório, descomente a linha abaixo:


SVNParentPath /var/svn

Agora necessitamos habilitar a autenticaçao, utilizaremos o modo basic que é baseado em arquivo, para isso descomente as linhas abaixo:


AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd

Antes de salvar o arquivo e fecha-lo, não esqueça de descomentar a ultima linha onde diz:

</Location>

Pronto, só falta adicionarmos os usuários, para isso utilize o comando abaixo:


sudo htpasswd -cm /etc/apache2/dav_svn.passwd seu_usuario

Importante, este comando serve apenas para quando se está criando o primeiro usuário, para outros usuários
deve ser utilizado o mesmo comando sem a opção -c , pois ela faz a criação do arquivo, deve ser utilizado apenas a opção -m para que a senha armazenada seja com HASH MD5

Será solicitado uma senha e uma confirmação de senha.

Agora vamos criar um repositório de teste, para isso digite o comendo abaixo:


sudo svnadmin create /var/svn/teste

Para testar se esta funcionando acesse http://localhost/svn/teste , se aparecer uma página contendo "Revision 0" tudo funcionou corretamente.

Agora apenas precisamos reiniciar o apache, utilize o comando abaixo:


sudo /etc/init.d/apache2 force-reload

Valeu galera, qualquer dúvida meu email é ronaldo@ronaldorigoni.com.br

Wednesday, May 6, 2009Instalar Skype Ubuntu

Galera dica rápida: Como instalar Skype no Ubuntu?


Primeiramente precisamos adicionar o repositório.

Com permissão de super usuário edite o arquivo /etc/apt/sources.list com o comando abaixo.


sudo vi /etc/apt/sources.list

Em seguida com o arquivo aberto, adicione a seguinte linha ao final do arquivo:


deb http://download.skype.com/linux/repos/debian stable non-free

Agora precisamos salvar o arquivo, aperte "ESC" e em seguida digite :wq  e dê um ENTER.

Repositório adicionado, agora precisamos efetuar um update para que o apt-get encontre os pacotes na lista de repositorios,

para isso digite:


sudo apt-get update

Após feito isso, o pacote skype estará disponível para ser instalado, então vamos a parte principal, digite o comendo abaixo:


sudo apt-get install skype

Aguarde até que os pacotes necessários para o skype sejam instalados.

Em seguida vá até o menu Applications >>> Internet >>> Skype.

E voe la.

Até um proximo post.

Monday, May 4, 2009Observer em Java

Salve galera.
Hoje iremos abordar um padrão de projeto designado Observer.
Observer é um padrão de projeto que se caracteriza em uma associação 1 x N entre objetos. Em que quando um dos objetos muda de estado ou característica, todos os objetos relacionados sejam notificados.
Um objeto do lado 1 da relação deve permitir acesso a seus elementos sem que sua estrutura interna seja exposta.
Como podemos implementar de uma forma abstrata e sem acoplamento a relação, sendo que qualquer alteração no objeto todos os seus relacionados sejam notificados  e que eles não se conhecem em tempo de compilação?

Devemos ter em mente os seguintes requisitos:

  • Os objetos relacionados devem conhecer o objeto de interesse, mas não devem estar
  • O objeto de interesse ( lado 1 da relação), deve notificar os objetos relacionados e interessados sobre ocorrência modificações.

Deve ser implementado de uma forma que os objetos não se conheçam em tempo de compilação, possibilitando acoplamento em tempo de execução e desfazê-lo a qualquer momento.

Aplicabilidade do padrão é quando necessitamos encapsular dois objetos por uma interface em que eles não se conheçam, sendo assim eles ficam completamente desacoplados, possibilitando o reuso separadamente de cada objeto.

Bem, vamos ao que interessa.

Imagine a seguinte situação de envio de email.

  • O remetente deseja saber quando o email chegou a caixa postal do destinatário e também saber quando o email foi lido.
  • O destinatário deseja saber quando chegou um novo email na caixa postal.

Como podemos implementar isso sem que destinatário e remetente estejam acoplados?

Primeiramente criaremos uma classe EmailEvent que representará os eventos ocorridos sobre um email.


package br.com.ronaldorigoni.observer;

/**
* Classe EmailEvent, representa todo e qualquer evento ocorrido com um email.
* Classe herda de java.util.EventObject para podermos manipular o método
* getSource(), que nos devolve o email que ocorreu o evento.
*
* @author ronaldorigoni.com.br
*/
public class EmailEvent extends java.util.EventObject {

public EmailEvent(Object source) {
super(source);
}

}

Em seguida deveremos criar uma interface EmailListener que será implementada pelo Remetente e Destinatário, que será através dela que eles serão notificados.


package br.com.ronaldorigoni.observer;

/**
* Interface de Listeners para email.
* @author ronaldorigoni.com.br
*
*/
public interface EmailListener {
public void emailRecebido(EmailEvent emailEvent);
public void emailLido(EmailEvent emailEvent);
}

Agora criaremos a classe Email, conforme abaixo.


package br.com.ronaldorigoni.observer;

import java.util.ArrayList;
import java.util.Collection;

/**
* Representa um email.
*
* @author ronaldorigoni.com.br
*
*/
public class Email {
/**
* Lista de objetos interessados nos eventos ocorridos com um email.
*/
private Collection<EmailListener> emailListeners =
new ArrayList<EmailListener>();

/**
* Envia um email.
*
* @param email
*/
public void enviar() {
disparaEmailRecebido();
disparaEmailLido();
}

/**
* Dispara um evento quando este email for recebido.
*/
public void emailRecebido() {
this.disparaEmailRecebido();
}

/**
* Dispara um evento quando este email for lido.
*/
public void emailLido() {
this.disparaEmailLido();
}

/**
* Método sincronizado para impedir que seja adicionado o mesmo listener
* mais de uma vez.
*
* @param emailListener
*            - o Listener
*/
public synchronized void addEmailListener(EmailListener emailListener) {
this.emailListeners.add(emailListener);
}

/**
* Remove um listener.
*
* @param emailListener
*            O listener.
*/
public synchronized void removeEmailListener(EmailListener emailListener) {
this.emailListeners.remove(emailListener);
}

/**
* Notifica todos os listeners que um email foi lido.
*/
private void disparaEmailLido() {
// criando um evento do próprio email
EmailEvent event = new EmailEvent(this);
// iterando sobre todos os listeners
// para notificar evento de email lido.
for (EmailListener listener : emailListeners) {
listener.emailLido(event);
}
}

/**
* Notifica todos os listeners que um email foi recebido.
*/
private void disparaEmailRecebido() {
// criando um evento do próprio email
EmailEvent event = new EmailEvent(this);
// iterando sobre todos os listeners
// para notificar evento de email recebido.
for (EmailListener listener : emailListeners) {
listener.emailRecebido(event);
}
}

}

Em seguida criaremos as classes Remetente e Destinatario, que deverão implementar a interface EmailListeners pois se tratam de interessados nos eventos ocorridos sobre os emails.


package br.com.ronaldorigoni.observer;

/**
* Representa um destinatário para um email.
* @author ronaldorigoni.com.br
*
*/
public class Destinatario implements EmailListener {

@Override
public void emailLido(EmailEvent emailEvent) {
Email email = (Email) emailEvent.getSource();
System.out.println("DESTINATÁRIO: Você acabou de ler o email:" + email + ".");
}

@Override
public void emailRecebido(EmailEvent emailEvent) {
Email email = (Email) emailEvent.getSource();
System.out.println("DESTINATÁRIO: Você acabou de receber um novo email:"+email);
}

}

E a classe Remetente.


package br.com.ronaldorigoni.observer;

/**
* Representa um
* @author ronaldorigoni.com.br
*
*/
public class Remetente implements EmailListener {

@Override
public void emailLido(EmailEvent emailEvent) {
Email email = (Email) emailEvent.getSource();
System.out.println("REMETENTE: O email " + email + " acaba de ser lido.");
}

@Override
public void emailRecebido(EmailEvent emailEvent) {
Email email = (Email) emailEvent.getSource();
System.out.println("REMETENTE: O email " + email
+ " acaba de ser recebido pelo destinatário.");
}

}

Agora criaremos a classe CaixaPostal que é onde a nossa brincadeira acontece.


package br.com.ronaldorigoni.observer;

/**
* Representa uma caixa postal para teste sobre emails.
* @author ronaldorigoni.com.br
*
*/
public class CaixaPostal {
public static void main(String[] args) {
// criando dois emails
Email email1 = new Email();
Email email2 = new Email();
// criando destinatário e remetente
Destinatario destinatario = new Destinatario();
Remetente remetente = new Remetente();
// Adicionaodo os listeners aos emails
email1.addEmailListener(destinatario);
email1.addEmailListener(remetente);

email2.addEmailListener(destinatario);
email2.addEmailListener(remetente);
/**
* Aqui é onde tudo acontece, brinque com os codigos abaixo,
* comente e descomente as linhas.
*/
email1.enviar();

email2.emailRecebido();
//email2.emailLido();
}
}

Execute o arquivo CaixaPostal.java e veja que quando um email é enviado tanto o remetente quando o destinatário são notificados nenhum conhece a implementação do outro.

Segue aqui o aqui para download do projeto

Bom por hoje fico por aqui, qualquer duvidas ou sugestões segue meu email 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.

Sunday, May 3, 2009Olá Mundo

Salve galera,

Criei este blog com intúito de compartilhar informações e experiências técnicas na área de desenvolvimento de software.

Aqui será abordado várias áreas dentre elas: Java,Adobe Flex , Design Patterns, JQuery, Linux dentre outras…

Está aqui meu Hello Word.

System.out.println("Hello Word");

Ronaldo.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes

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