Java Magazine 51 PDF
Java Magazine 51 PDF
Java Magazine 51 PDF
a confiabilidade de sempre.
genesis
DevWare
O DevWare um ambiente virtual completo de desenvolvimento j instalado e configurado, composto exclusivamente por produtos open source. Inclui
controle de issues e de verso, automao de buid, frum, wiki corporativa,
servidores web, email e ftp, repositrio maven2, servidor ldap para controle
de usurios, console administrativo, entre outros. Com baixo consumo de recursos e baseado em tecnologia de virtualizao, o DevWare foi projetado
especialmente para facilitar tarefas administrativas como backup e migrao
entre mquinas. Consulte-nos para saber como o DevWare, combinado com
boas prticas de desenvolvimento, pode aumentar a qualidade e produtividade
de seus projetos Java.
Especial
Contedo
NO MUNDO DA INTERNACIONALIZAO
FERNANDO LOZANO
08
Entendendo e usando os recursos da plataforma Java para a construo de aplicaes internacionalizveis, de sistemas console a aplicaes desktop e web
Mobile e Web
30
60
18
Domine a nova verso do projeto da Fundao Eclipse para desenvolvimento de aplicaes corporativas em Java, e crie exemplos para web e Java EE 5
Qualidade
40
34
Conhea a nova linguagem JavaFX Script, que permite criar interfaces grficas ricas
mais facilmente, com cdigo parecido estrutura dos componentes visuais
48
Entendendo conceitos de excees do Java, usando boas prticas e evitando armadilhas, para tornar suas aplicaes mais robustas e organizar a manipulao de erros
Core
SISTEMAS MULTIAGENTES
RICARDO MARQUES PORTO
Usando a tecnologia de agentes inteligentes e o framework open source JADE para
criar aplicaes dinmicas e altamente distribudas
52
Direo
Carta ao Leitor
Edio
Publisher e Editor-Chefe
Leonardo Galvo ([email protected])
Editores adjuntos
Osvaldo Doederlein ([email protected])
mas nesta edio com um toque especial de modernidade. Voc vai ver, por
Arte
exemplo, como criar uma aplicao com acesso a banco de dados usando o
novo JavaFX Script. O conjunto de tecnologias JavaFX, que inclui alm do
JavaFX Script, o JavaFX Mobile (para dispositivos mveis de alta capacidade) foi lanado no incio desse ano e possibilita a criao de interfaces ricas
Produo
JavaFX est se tornando uma soluo eficaz para a criao de aplicaes com
Distribuio
Fernando Chinaglia Distribuidora S.A.
A esperada verso 2.0 do Web Tools Project coloca o Eclipse de volta na disputa
Atendimento ao leitor
principais facilidades do projeto. Voc ver como desenvolver passo a passo uma
A DevMedia possui uma Central de Atendimento on-line, onde voc pode tirar
suas dvidas sobre servios, enviar crticas e sugestes e falar com um de nossos
atendentes. Atravs da nossa central tambm possvel alterar dados cadastrais,
consultar o status de assinaturas e conferir a data de envio de suas revistas. Acesse
www.devmedia.com.br/central, ou se preferir entre em contato conosco
atravs do telefone 21 2283-9012.
aplicao Java EE fazendo uso de JSF, EJB 3.0, JPA e Apache Derby.
Sitemesh, um framework que compete de frente com o Apache Tiles (discutido nas
duas edies anteriores) e oferece vantagens em certos aspectos. Voc poder entender o funcionamento interno do Sitemesh, alm de como us-lo da melhor forma em
Edies anteriores
Adquira as edies anteriores da revista Java Magazine ou de qualquer outra
publicao do Grupo DevMedia de forma prtica e segura, em
www.devmedia.com.br/anteriores.
Publicidade
[email protected], 21 2213-0940
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, voc divulga
sua marca ou produto para mais de 100 mil desenvolvedores de todo o Brasil, em mais
de 200 cidades. Solicite nossos Media Kits, com detalhes sobre preos e formatos de
anncios.
Reprints Editoriais Se foi publicado na Java Magazine um artigo que possa
alavancar as suas vendas, multiplique essa oportunidade! Solicite a reimpresso
da matria junto com a capa da edio em que saiu, e distribua esse reprint
personalizado entre seus clientes.
Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD com
uma amostra de seus produtos na Java Magazine e atinja um pblico segmentado
e formador de opinio.
Java, o logotipo da xcara de caf Java e todas as marcas e logotipos baseados em ou
referentes a Java so marcas comerciais ou marcas registradas da Sun Microsystems,
Inc. nos Estados Unidos e em outros pases.
Realizao
Apoio
Leonardo Galvo
www.devmedia.com.br/javaplus .
Na compra desta edio, tenha acesso a 10 aulas sobre a criao de relatrios em Java com o iReport:
Cursos Online
GenericBoxDAO, buscando a utilizao com diversos beans. Construmos
ento os templates SQL, explicando a forma como os parmetros so
mapeados. Na quarta parte, vemos como construir a classe de testes
unitrios para o DAO genrico que criamos.
Edio 46
50 Java Magazine
No Mundo da Internaci
Construindo aplicaes para vrios idiomas e
ma aplicao internacionalizvel
tem seu cdigo escrito de modo que
seja adaptvel a diferentes idiomas
e a diferentes culturas, sem que para isso seja
necessrio modificar os fontes ou mesmo recompilar a aplicao. Muitas vezes a palavra
internacionalizao abreviada para i18n,
que vem do termo ingls internationalization
(representando a primeira e ltima letra,
com 18 caracteres entre elas).
No mundo globalizado, onde vrias empresas brasileiras atuam fortemente em
pases diversos, importante desenvolver
desde o incio aplicaes internacionalizveis. Tambm comum que sistemas
inicialmente desenvolvidos internamente
por filiais no Brasil de empresas multinacionais sejam posteriormente adotados em
outras filiais e at mesmo pela matriz. Por
isso fundamental saber como desenvolver aplicaes i18n.
A plataforma Java foi o primeiro ambiente de desenvolvimento de uso amplo
a trazer funcionalidades voltadas para a
Sobre os exemplos
Os exemplos iniciais deste artigo sero
compilados e executados diretamente pela
linha de comando do sistema operacional,
utilizando os comandos fornecidos com o
2 importante no confundir o processo de internacionalizao, que responsabilidade do programador, com
o processo de localizao. Este ltimo a traduo de
uma aplicao para um idioma e uma regio especficos
que em geral realizado por profissionais sem conhecimentos de programao de computadores.
onalizao
culturas
Conhea os recursos da
plataforma Java para a
construo de aplicaes
internacionalizveis
de sistemas console a
aplicaes desktop e web
Fernando Lozano
JDK. J os exemplos mais complexos sero
compilados e executados (ou, no caso daqueles para web, deployados) por meio de
um buildfile do Ant. Todos os exemplos foram testados com o JDK 1.5.0 e o Tomcat 5.5,
mas devem funcionar sem modificaes em
verses mais recentes do Java e em outros
containers web aderentes s especificaes
Servlets 2.4 e JSP 2.0 ou superiores.
VerLocalidade.java
3 Certamente nenhum desenvolvedor julgaria necessrio ter uma verso especfica de uma aplicao para o
portugus da Bahia ou para o portugus gacho, mas
em vrios pases da Europa e da sia os dialetos regionais
dentro de um mesmo pas so to ou mais diversos em
termos de vocabulrio, e at de variaes gramaticais,
quanto o portugus do Brasil e o de Portugal.
import java.util.*;
public class VerLocalidade {
public static void main(String[] args) {
Locale localidade = null;
if (args.length == 0) {
localidade = Locale.getDefault();
System.out.println(A localidade padro do usurio : + localidade);
}
else {
if (args.length == 1)
localidade = new Locale(args[0]);
else if (args.length == 2)
localidade = new Locale(args[0], args[1]);
else if (args.length == 3)
localidade = new Locale(args[0], args[1], args[2]);
System.out.println(A localidade requisitada : + localidade);
}
System.out.println(Idioma: + localidade.getDisplayLanguage());
System.out.println(Pas: + localidade.getDisplayCountry());
System.out.println(Variante: + localidade.getDisplayVariant());
No Mundo da Internacionalizao
Execuo de ListaLocalidade
$ java ListaLocalidades
Esto disponveis na JVM 132 localidades:
ar
(Arabic, , )
ar_AE
(Arabic, United Arab Emirates, )
ar_BH
(Arabic, Bahrain, )
ar_DZ
(Arabic, Algeria, )
ar_EG
(Arabic, Egypt, )
ar_IQ
(Arabic, Iraq, )
... restante da listagem omitida para poupar espao
Exemplo de MudaLocalidade
$ java MudaLocalidade
Data corrente na localidade pt_BR: 11/09/2007
$ java MudaLocalidade en US
Data corrente na localidade en_US: Sep 11, 2007
$ java MudaLocalidade en GB
Data corrente na localidade en_GB: 11-Sep-2007
Listagem 4. Faixas.java
import java.util.*;
import java.text.*;
public class Faixas {
public static void main(String[] args) {
double[] limites = { 0, 1, ChoiceFormat.nextDouble(1) };
String[] mensagens = { No foi encontrado nenhum registro,
Foi encontrado um nico registro, Foram encontrados vrios registros };
ChoiceFormat resultado = new ChoiceFormat(limites, mensagens);
int numero = Integer.parseInt(args[0]);
System.out.println(resultado.format(numero));
}
}
Execuo de Faixas
$ java Faixas 0
No foi encontrado nenhum registro
$ java Faixas 1
Foi encontrado um nico registro
$ java Faixas 2
Foram encontrados vrios registros
Formatao de mensagens
As classes java.text.DateFormat e java.text.
NumberFormat so de utilizao bem direta,
como foi demonstrado pelo exemplo da
Listagem 3. Entretanto, o pacote java.text
fornece ainda duas classes que so muito
teis para aplicaes internacionalizveis,
e que curiosamente no so afetadas diretamente pela localidade default da JVM.
Elas so ChoiceFormat e MessageFormat.
ChoiceFormat retorna mensagens diferentes
de acordo com faixas de valores para um
argumento numrico. Sua maior utilidade
em lidar com plurais, permitindo gerar
mensagens gramaticalmente corretas,
como mostra o exemplo da Listagem 4.
O exemplo define trs faixas de valores:
zero; maior que zero e menor ou igual
a um; e maior que um. Os limites para
cada faixa so valores decimais (double),
mas como no exemplo estamos utilizando
apenas valores inteiros, as faixas so na
verdade: zero, um e maior que um.
Observe o uso do mtodo nextDouble() para
que o limite final seja aberto ou infinito, de modo que qualquer valor maior que
um caia na terceira faixa. Dessa forma, o
ChoiceFormat seleciona a mensagem correta,
substituindo um conjunto de comandos
if...else if...else.
Execuo de Mensagem
$ java Mensagem 1
Foram encontrados 1 registros
$ java Mensagem 2
Foram encontrados 2 registros
Execuo de MensagemComFaixas
$ java MensagemComFaixas 1
Foi encontrado um nico registro
$ java MensagemComFaixas 2
Foram encontrados 2 registros
11
No Mundo da Internacionalizao
Execuo de Recurso
$ java Recurso 4
Foram encontrados 4 registros
$ LANG=en_US java Recurso 4
4 records found
$ LANG=pt java Recurso 4
4 records found
$ LANG=es java Recurso 4
4 records found
limite aberto;
5. Dentro da terceira mensagem, h
um NumberFormat aninhado: ...encontrados
{0,number} registros...;
6. Como a terceira mensagem a ltima
do ChoiceFormat, no temos uma barra vertical, e sim o sinal de fecha-chaves para
finalizar o formato iniciado por {0,choice...
Vimos como utilizar as classes do pacote
java.text para formatar mensagens que
soem naturais quando lidas pelo usurio.
Agora falta remover as strings do cdigo
Java, colocando-as em arquivos propriedades que podem ser editados e traduzidos
sem afetar os bytecodes da aplicao.
Recursos da JVM
Um recurso da JVM um arquivo de
dados que carregado por um classloader da JVM, em vez de por acesso direto
ao sistema de arquivos. A idia que o
mesmo algoritmo utilizado para se localizar os bytecodes de uma classe seja
utilizado para se localizar os arquivos de
dados necessrios para esta classe. Dessa
forma, no importa se a classe est em um
arquivo .class isolado, dentro de um JAR,
ou mesmo se foi carregada remotamente,
como ocorre com applets. O resultado so
aplicaes mais portveis e com menos
cdigo, pois no mais necessrio para a
aplicao lidar com detalhes como letras
de drives e convenes para a localizao
de arquivos de configurao em cada sistema operacional.
Se todas as mensagens (e padres de
formatao) utilizados por uma aplicao
forem colocados em um arquivo carregado
como um recurso da JVM, torna-se fcil
localizar uma aplicao: basta modificar
um arquivo de mensagens.
As bibliotecas do Java SE vo mais alm,
fornecendo a classe java.util.ResourceBundle,
que rene os conceitos de recursos da
JVM e de localidade, resultando em uma
maneira simples de se carregar mensagens customizadas para as configuraes
regionais dos usurios. ResourceBundle
utiliza os identificadores de idioma, pas
e variante da localidade para gerar um
nome de arquivo, e este arquivo ento
carregado como um recurso da JVM. O
arquivo (se encontrado) interpretado
mensagem desejada.
Fazem parte do exemplo dois arquivos de
propriedades: mensagens_pt_BR.properties
e mensagens_en.properties. Note que se
ResourceBundle no encontrar um arquivo de
propriedades correspondente localidade
desejada, como no caso en_US, ele descarta a variante e o pas e tenta localizar um
arquivo que corresponda apenas ao idioma
da localidade. Neste caso encontrado
mensagens_en.properties. Por outro lado, o
ResourceBundle no ir tentar usar arquivos
do mesmo idioma mas com pas diferente;
por isso mensagens_pt_BR.properties no foi
localizado para a localidade pt.
No sendo encontrado um arquivo de propriedades correspondente localidade desejada,
ResourceBundle utiliza o arquivo disponvel para
en ou en_US. Ou seja, para qualquer localidade
ainda no suportada pela aplicao (como no
caso de es espanhol no exemplo) sero utilizados os recursos para o idioma ingls.
Excees e internacionalizao
A apresentao da classe ResourceBundle
encerra nosso estudo sobre os recursos gerais para internacionalizao de aplicaes
Java. Agora podemos tratar de consideraes especficas para aplicaes grficas
(Swing) e web. Mas, antes de entrar nos
exemplos de aplicaes mais elaboradas,
vale chamar a ateno para um erro conceitual s vezes cometido por iniciantes.
13
No Mundo da Internacionalizao
CM
MY
CY
CMY
15
No Mundo da Internacionalizao
nentes Swing.
Mas o fato que a maioria dos componentes Swing no utiliza para nada a sua
prpria configurao de localidade. Por
exemplo, no possvel inicializar um
JLabel com valores especficos para a propriedade text de acordo com a localidade, e
deixar que o prprio componente escolha
qual valor exibir em tempo de execuo.
Alguns componentes Swing realizam
trabalho diretamente relacionado com
Modificaes sobre o descritor web.xml necessrios para o funcionamento correto da pgina JSP
<?xml version=1.0 encoding=UTF-8?>
<web-app xmlns=...>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
<param-value>localidades/mensagens</param-value>
</context-param>
<!-- omitido o mapeamento do servlet para /dataDeHoje -->
</web-app>
java.sun.com/javase/technologies/core/
basic/intl/
Guia de internacionalizao do Java SE
java.sun.com/developer/
technicalArticles/Intl/MultilingualJSP/index.
html
Descreve estratgias para a construo de pginas
JSP internacionalizadas
jakarta.apache.org/taglibs
Implementao do JSTL e outros taglibs da
Apache Software Foundation
www.loc.gov/standards/iso639-2/
Cdigos de idiomas no padro ISO
www.iso.org/iso/country_codes.htm
Cdigos de pases no padro ISO
Concluses
Este artigo apresentou as APIs essenciais
do Java para lidar com aplicaes internacionalizveis, em especial a classe java.util.
Locale e o pacote java.text. Vimos tambm
dicas para sua utilizao em aplicaes
reais, por exemplo evitar a localizao de
mensagens de excees Java.
Em seguida foram apresentados exemplos da aplicao destas APIs em aplicaes desktop e web, assim como detalhes
Fernando Lozano
([email protected],
www.lozano.eti.br) trabalha h
mais de 10 anos com desenvolvimento de sistemas de informaes e
integrao de redes, sendo um dos pioneiros do uso do
Software Livre no Brasil. Dentro da comunidade, atua
como Conselheiro do LPI Brasil, Webmaster da FSF e
Community Manager do Java.net. Atualmente consultor associado Neki Technologies (www.neki.com.br).
17
Ambiente e instalao
Alguns IDEs j trazem funcionalidades
Java EE no produto bsico, e o Eclipse
costumava ser criticado por no ser assim.
Mas isso apenas um efeito da estrutura
extremamente modular dos projetos da Fundao Eclipse. O verdadeiro problema que
a ESF, tradicionalmente, no disponibilizava
distribuies orientadas ao usurio final.
Isso comeou a melhorar com o Eclipse 3.2
(Callisto), cujo Update Manager permite comear com uma instalao bsica, selecionar
componentes que sabemos que precisamos,
e clicar em Select Required para marcar todos
os subcomponentes e dependncias.
Com o Eclipse 3.3 e o Europa, temos uma
nova facilidade: a Fundao Eclipse criou
uma srie de pacotes padronizados, para
os conjuntos de funcionalidades mais
populares (essas distribuies so detalhadas no artigo de Fernando Lozano, na
Edio 50). No caso de desenvolvimento
Java EE, voc s precisa ir em eclipse.org/
downloads e escolher a opo Eclipse IDE
for Java EE Developers. Isso o conduzir a
um download nico de 125Mb. Ao leitor
que ainda no tem familiaridade com o
Eclipse ou com o WTP, recomendamos este
download para acompanhar o presente
artigo. Existem tambm (como j existiam
antes) vrias distribuies de terceiros,
mas no h dvida que as distribuies
oficiais da ESF contribuiro para melhorar
a reputao do Eclipse quanto facilidade
de instalao.
o Eclipse
19
Deploy e execuo
Criado o projeto, faremos um teste mnimo de deployment. Primeiro, no diretrio
WebContent, use New>Other>Web>JSP para
criar um arquivo index.jsp contendo uma
mensagem qualquer (Al, mundo! no
seria m idia). Agora selecione a view
Servers que dever estar disponvel, pois
normalmente o WTP ativa a perspectiva
Java EE ao criar um projeto. Comande
New>Server, selecione o tipo de servidor
utilizado (ex.: Glassfish / Glassfish v2 Java
EE 5), passe pela prxima pgina aceitando
os defaults (a no ser que voc tenha instalado o servidor com valores no-default
para configuraes como porta HTTP e
login de administrador), e observe a ltima pgina do assistente (Figura4), que
permite selecionar projetos para deploy
neste servidor. Basta ento adicionar o
seu projeto ao painel direito (Configured
projects) e finalizar. (Se alguma coisa pareceu confusa ou repetida, veja o quadro
Runtimes e Servers no WTP.)
Com tudo configurado, vamos executar
o servidor de aplicaes, com uma das opes Start ou Debug sobre a sua definio na
view Servers. Aps a inicializao, abra um
browser com a URL http://localhost:8080/
TesteWeb. Aquela mensagem que voc definiu na index.jsp dever aparecer.
Um micro-tutorial
Para colocar o WTP em prtica, vamos
construir uma aplicao JavaServer Faces
mnima. O primeiro passo ser criar o
esqueleto das pginas a usar:
Recrie a pgina index.jsp, vazia (isto ,
s com o cdigo do template html).
Crie mais uma pgina, ok.jsp, contendo
apenas uma mensagem Login efetuado
com sucesso.
Crie outra pgina erro.jsp, com a mensagem Login incorreto.
21
Builders
Esta pgina existe em qualquer projeto do
Eclipse, e lista os chamados builders, que so
plug-ins que processam de alguma forma o
projeto quando h alteraes nos seus recursos.
Alm do Java Builder (responsvel por compilar
arquivos .java), um projeto do WTP ser configurado com os builders Faceted Project Validation
Builder e Validation. Ambos so responsveis por
diferentes tipos de validao.
No recomendado alterar essas opes, que
existem principalmente para permitir que builders exigidos por um projeto, mas no instalados,
sejam desativados, evitando assim a ocorrncia
de erros no Eclipse. Isso poderia acontecer, por
ou <%@include%>. Isso hoje uma tcnica obsoleta, substituda por recursos como tagfiles ou
frameworks de templates.)
JSP Fragment
Permite especificar opes default (linguagem e
content type) para fragmentos de JSP. (Os framentos so arquivos .jspf, normalmente criados para
incorporao em outras JSPs via <jsp:include>
Project Facets
Permite configurar os facets do projeto (mais
detalhes podem ser vistos no corpo do artigo).
Server
Possibilita a seleo de um servidor (container
Java EE) para executar o projeto. Isso importante
se o projeto tiver deploy configurado para mais
de um server e afeta o comportamento de opes
como Run As>Run on Server.
Targeted Runtimes
Seleciona os runtimes para os quais o projeto
ser compilado. Os JARs desses runtimes sero
automaticamente includos no classpath do projeto. Assim, no caso de um projeto configurado
para um runtime JBoss AS 5, por exemplo, todas
as APIs do Java EE 5 estaro disponveis e tambm muitas APIs proprietrias do JBoss sem a
necessidade de incluir os JARs desse servidor
manualmente no classpath do projeto.
Validation
Aqui vemos um ponto forte do WTP (veja a
do WTP, mas impe o uso de uma biblioteca de tags proprietria chamada webui.
que a JSF ainda no suficientemente
poderosa para habilitar editores visuais
mais sofisticados. Isso dever melhorar em
verses futuras da JSF, mas com o padro
atual, creio que o WTP 2.0 faz um excelente
trabalho. Pessoalmente, prefiro ter a opo
de gerar uma aplicao puro-Java EE, do
que ter um editor visual melhor, mas ser
obrigado a usar alguma API/framework/
biblioteca que no certificada, integrada
e suportada por todos os fornecedores de
servidores de aplicaes.
XDoclet
23
Regras de Navegao
EJB e JPA
25
Listagem2. Cdigo para o session bean de login quente, consultando a base de dados.
LoginServer.java
package session;
import javax.ejb.Local;
@Local
public interface LoginServer {
boolean loginUser (String nome);
}
LoginServerBean.java
package session;
import
import
import
import
javax.ejb.Stateless;
javax.persistence.EntityManager;
javax.persistence.PersistenceContext;
entidades.Usuario;
@Stateless
public class LoginServerBean implements Login {
@PersistenceContext private EntityManager em;
public boolean loginUser (String nome) {
return em.find(Usuario.class, nome) != null;
}
}
Concluses
O Eclipse, mesmo com as primeiras
verses do WTP, j foi o patinho feio dos
IDEs para J2EE/Java EE; mas isso mudou.
Com o Eclipse 3.3 e o WTP 2.0, temos finalmente suporte abrangente e poderoso
27
v i mos que no h
recursos como assistentes para criao de
session beans (o que at
o J2EE 1.4, exige a criao
de diversos fontes e a alterao de um descritor). Se por
um lado o EJB 3.0 torna esse tipo de
coisa muito menos essencial que antes,
bom lembrar que o Java EE 5 ainda uma
plataforma relativamente recente.
Mas se formos pensar nisso, h lacunas
maiores, e no s no WTP: em especial
a ausncia total de suporte para a velha
persistncia EJB/CMP, que tambm no
suportada por outros IDEs open source.
(Exceto via XDoclet, que o prprio WTP
suporta desde verses anteriores, mas que
no nenhuma maravilha de produtividade comparada JPA e s ferramentas que
vimos aqui.) Em resumo, o lema do WTP
eclipse.org/webtools
Projeto WTP.
java.sun.com/javaee
Plataforma Java EE.
jcp.org/en/jsr/detail?id=244
Especificao da plataforma Java EE 5.
Osvaldo Pinali Doederlein
([email protected])
Mestre em Engenharia de
Software Orientado a Objetos,
membro individual do Java Community
Process e trabalha na Visionnaire Informtica como
arquiteto e desenvolvedor.
Wireless Update
Interface de usurio
As diretivas de layout passam a ser
obrigatrias no MIDP 2.1 (antes, as implementaes dos fabricantes podiam
no incluir essa funcionalidade). Essas
diretivas especificam o posicionamento de componentes Item (por exemplo,
StringItem, TextField e DateField) de forma
alinhada direita, esquerda, centralizada etc. A Listagem 1 mostra uma
MIDlet com trs StringItems, com alinhamentos diferentes, e a Figura 1 apresenta
como fica o resultado desse exemplo no
emulador do Wireless Toolkit da Sun.
Outra alterao relacionada a obrigatoriedade de um StringItem ter a aparncia
de link web, sempre que houver um
Command (javax.microedition.lcdui.Command)
associado a ele. O objetivo aumentar
a navegabilidade. Commands podem ser
adicionados tanto a telas (Form, TextBox,
Canvas) quanto a Items especficos de um
formulrio.
H alteraes importantes tambm
na interao do usurio com o dispositivo. Com o novo release, passa a ser
obrigatrio o suporte a telas sensveis
a canetas apontadoras, quando o dispositivo oferecer esse recurso. Com
isso, os mtodos Canvas.hasPointerEvents() e
Canvas.hasPointerMotionEvents() devem sempre
Marlon Luz
retornar valor verdadeiro. Alm disso,
todas as implementaes devem suportar
eventos repetitivos como os de pressionar
e segurar uma tecla do dispositivo. Sendo
assim, o mtodo Canvas.hasRepeatEvents(),
por exemplo, tambm deve retornar valor
verdadeiro.
O suporte a grficos double-buffered 1
tambm deve existir em dispositivos
MIDP 2.1, garantindo assim melhor qua1 A tcnica de double-buffering utilizada para reduzir ou
remover problemas de renderizao na tela, como piscadas,
imagens rasgadas ou sombras. Com ela, so feitas operaes
de escrita em um buffer fora da tela e quando a imagem escrita estiver pronta para ser exibida, esta transferida para a
tela de uma s vez. O double-buffering pode ser implementado tanto por software como por hardware.
Conexes em rede
Outra novidade uma conveno para
nomes de portas seriais. Essa conveno
resolve problemas de falta de normalizao para os nomes das portas, bem como
a dificuldade de acesso. O nome da porta
agora deve ser seguido de uma abreviao
do tipo de porta e depois de um ndice
que sempre inicia em 1. Veja exemplos
abaixo, onde n deve ser substitudo por
um dgito:
COMn, para portas RS-232
31
Outras alteraces
O MIDP 2.1 torna obrigatrio como
configurao mnima o CLDC 1.1. uma
mudana significativa, pois embora muitos dispositivos j implementem a dupla
MIDP 2.0/CLDC 1.1, existem outros que
tm a verso mais nova do MIDP junto
com o CLDC 1.0, o que fragmenta muito a
plataforma Java ME2.
Outra mudana que temos uma definio sobre o tamanho do cone do aplicativo (declarado no atributo MIDlet-Icon do
descritor JAD). Agora exigido o tamanho
mnimo de 16x16 pixels, mas recomenda-se
o tamanho de 24x24 pixels.
As notificaes de instalao e excluso
dos aplicativos tambm foram alteradas.
Essas notificaes so definidas nos atributos MIDlet-Install-Notify e MIDlet-Delete-Notify
do descritor JAD, e so adicionadas para
notificar um servidor na internet sobre a
instalao ou a excluso do aplicativo em
um dispositivo.
Na nova verso do MIDP, o dispositivo
deve tentar pelo menos cinco vezes fazer
essa notificao, enquanto no obtiver resposta do servidor. Um dos motivos para essa
mudana que algumas implementaes
tentavam fazer a notificao, mas quando
no obtinham resposta, apenas ignoravam
o problema. Era uma estratgia ruim, pois
a falta de resposta poderia ter sido causada,
por exemplo, pela ausncia de sinal do telefone naquele momento, e uma nova tentativa
poderia resolver a questo.
2 No Java ME, fragmentao significa a existncia de
vrias implementaes diferentes da plataforma, criando
assim variaes que devem ser tratadas pelo desenvolvedor de aplicaes. Quando mais fragmentao houver,
mais trabalho ter o desenvolvedor (com testes e implantao, por exemplo) para garantir que suas aplicaes
funcionem no nmero mximo de dispositivos diferentes.
Um dos motivos para a fragmentao no Java ME que
as primeiras verses das especificaes (CLDC, MIDP etc.)
continham diversos itens opcionais, e muitos fabricantes
ento criaram implementaes que variavam muito com
relao a esses itens.
Figura 1. Tela de configurao de projeto no Sun Java Wireless Toolkit 2.5.1 para CLDC
Wireless Toolkit
A srie 2.5.x do Sun Java Wireless Toolkit
para CLDC traz a opo de desenvolver
aplicativos compatveis com o MIDP 2.1.
Ao criar um novo projeto na ferramenta,
possvel configurar qual o perfil da
aplicao, escolhendo uma dentre as trs
verses do MIDP (1.0, 2.0 e 2.1). A Figura 1
mostra essa tela de configurao.
Concluses
O MIDP 2.1 um importante passo para
reduzir a fragmentao no Java ME, e
facilitar o desenvolvimento para novos
dispositivos, oferecendo aos desenvolvedores plataformas mais compatveis para
suas aplicaes.
Grandes fabricantes de celulares como
Nokia e Sony-Ericsson j esto tornando
disponveis aparelhos compatveis com o
MIDP 2.1. No site da Nokia j possvel
Marlon Luz
([email protected])
consultor Java e possui as
certificaes SCJP, SCMAD, SCJA,
SCWCD. membro individual do Java
Community Process e integra o Expert Group da JSR271 (MIDP 3.0)
jcp.org/en/jsr/detail?id=118
Site do JCP para o MIDP 2.1
java.sun.com/products/sjwtoolkit
Pgina do Sun Java Wireless Toolkit
gue a funo
de dados
35
A aplicao completa
Agora que vimos alguns exemplos e
conceitos fundamentais, podemos iniciar
a criao da aplicao com acesso a dados.
Ela ser composta por trs componentes
e utilizar recursos mais avanados de
JavaFX Script, os quais sero apresentados
medida que forem utilizados. Os componentes da nossa aplicao so:
GerenciadorConexoes Responsvel por
abrir e fechar as conexes com o banco
de dados, bem como pela execuo de
instrues SQL.
Cliente Classe que espelha as propriedades de cada cliente, correspondentes s
colunas no banco de dados.
ClienteUI Interface grfica da aplicao.
JavaFXPad
O JavaFXPad uma ferramenta stand-alone
JFXBuilder
Ferramenta dirigida a programadores visuais, o
JFXBuilder permite montar interfaces arrastando
e soltando componentes, e tem bons recursos
para a montagem de animaes e efeitos no
estilo do Flash. Instalvel a partir de www.
reportmill.com/jfx.
1. Criando o GerenciadorConexoes
GerenciadorConexoes uma classe utilitria,
responsvel pela interao com o banco de
dados, de forma independente da classe de
negcios sendo utilizada. Nela definimos
dois atributos e trs operaes.
class GerenciadorConexoes {
private attribute conexao: Connection;
private attribute sql: Statement;
public operation abre();
public operation fecha();
public operation consulta(sql: String): ResultSet;
}
while(resultados.next()) {
insert Cliente {
nome : resultados.getString(nome),
email : resultados.getString(email),
cpf : resultados.getString(cpf),
codigo : {resultados.getInt(id)},
} into clientes;
}
} finally {
if (conexao <> null) {
conexao.fecha();
}
}
return clientes;
37
Para que seja possvel obter a lista completa de clientes do banco de dados,
necessrio abrir e fechar a conexo com
o banco e tambm executar uma instruo SQL. Para isso, utilizamos a classe
GerenciadorConexoes. Veja a implementao
completa de Cliente na Listagem 3.
content = BorderPanel {
top : combo
center: GridPanel {
var cliente = bind clientes[combo.selection]
columns: 2
cells: [
Label { text: nome: },
TextField { value: bind cliente.nome },
Label { text: codigo: },
TextField { value: bind cliente.codigo },
Label { text: cpf: },
TextField { value: bind cliente.cpf },
Label { text: email: },
TextField { value: bind cliente.email },
]
}
bottom: FlowPanel {
content: [
Button {text: Salvar},
Button {text: Novo},
]
}
};
visible = true;
Repare que o atributo clientes foi declarado como sendo do tipo Cliente*. O asterisco
indica que se trata de um grupo de objetos.
Este grupo utilizado para armazenar os
clientes que iro popular o combobox e
mantm as referncias para as informaes
de cada cliente.
O atributo combo, do tipo ComboBox um
componente visual que ser referenciado
em outras operaes; por isto declarado como atributo. O atributo clientes est
vinculado, atravs da clusula bind,
operao todosOsClientes(), que tem escopo
global e est definida no arquivo Cliente.fx
(Listagem 2):
attribute ClienteUi.clientes = bind todosOsClientes();
Construtores so representados em FX
Script atravs do uso de triggers, conforme
podemos verificar no seguinte trecho de
cdigo:
trigger on new ClienteUi {
title = Cliente UI;
width = 400;
height = 300;
...
}
center: GridPanel {
var cliente = bind clientes[combo.selection]
columns: 2
cells: [
Label { text: nome: },
TextField { value: bind cliente.nome },
Label { text: codigo: },
TextField { value: bind cliente.codigo },
...
}
Yara M. H. Senger
([email protected])
formada em Cincias da Computao na USP em So Carlos, e
especialista em desenvolvimento
web; possui as certificaes SCJA, SCJP e SCWCD.
Atualmente Instrutora e Diretora Educacional da
Globalcode, criadora e coordenadora de diversos
cursos das carreiras Academia do Java e Academia
do Web Developer.
openjfx.dev.java.net
Site oficial do JavaFX Script
jfx.wikia.com
Wiki onde acontece boa parte da discusso
que est moldando a tecnologia JavaFX
blogs.sun.com/chrisoliver
Blog de Chris Oliver, criador da tecnologia
precursora do JavaFX Script (F3).
Concluses
A FX Script bastante sofisticada para
uma linguagem de script, incorporando
Edio 51 Java Magazine
39
O problema
Quando vrias tecnologias web (JSP/
Servlets, PHP, HTML etc.) so utilizadas
A soluo
O framework Sitemesh permite separar
o layout das pginas do seu contedo. Ele
funciona independentemente da tecnologia utilizada, atravs da definio de
decorators. Esses decorators atuam como
templates, permitindo a insero do contedo varivel em pontos especficos.
Ao se requisitar uma pgina, o contedo
dela extrado e analisado e ento efetuada uma juno das partes desse contedo
com o decorator. Ou seja, os pontos relevantes obtidos ao analisar a pgina so
inseridos em partes pr-determinadas,
fazendo com que o resultado final contenha os dados da pgina, mas com o layout
definido pelo decorator. Com o Sitemesh
podemos decorar pginas sem que elas
saibam que sero decoradas. Isso facilita
a manuteno, pois possibilita centralizar
o cdigo necessrio para o layout em um
ponto nico: o decorator.
Alm da decorao, o Sitemesh permite
formar pginas a partir de outras pginas
ou de outras composies. Geralmente a
composio das pginas acabar em uma
estrutura similar a uma rvore, contendo
pginas simples ou outras composies.
O Sitemesh foi baseado em conceitos de
design patterns estruturais bem conhecidos: Decorator e Composite. Veja o quadro
Baseado em design patterns que faz uma
Sitemesh
simples
Decorao
A decorao realizada pelo Sitemesh
ocorre atravs de um Servlet Filter. Isso
proporciona vantagens, pois possvel
decorar at mesmo pginas estticas.
Quando uma pgina interceptada pelo
filtro do Sitemesh, ocorre uma srie de
eventos. Veja um resumo:
1. Aps o processamento da requisio
pelo objeto responsvel (servlet, action, JSP
etc.), o HTML resultante obtido.
2. O Sitemesh solicita o parse do contedo: o que era texto HTML se transforma
em uma estrutura de objetos em mem-
Sitemesh e performance
ara que possa aplicar a decorao, o Sitemesh realiza o parse do cdigo HTML resultante do processamento de pginas dinmicas
ou simplesmente da obteno de pginas
estticas. Esse processo no demorado e no
coloca em risco o uso do Sitemesh em aplicaes cujo tempo de resposta crtico.
Um possvel problema no uso do Sitemesh
a quantidade de memria necessria para
as operaes de decorao. Como a pgina
que est sendo decorada deve ter seu corpo
obtido pelo Sitemesh para que seja includo
no template, esse contedo deve ficar em
memria durante alguns instantes. Caso as
pginas forem exageradamente grandes e a
41
Decorator
O pattern Decorator tem como princpio adicionar responsabilidades a objetos de forma individual, e no a todos os objetos de uma mesma
classe. Como essa adio de responsabilidade
efetuada de forma dinmica e individualizada, o
simples uso de herana no uma boa soluo,
pois exigiria que todos os objetos possussem o
mesmo comportamento.
Composite
Um princpio do pattern Composite permitir
que objetos sejam agrupados em estruturas
hierrquicas (no estilo rvore). Outro objetivo
fazer com que o cliente trate objetos simples
ou compostos da mesma forma ambos devem
implementar uma interface comum e passam a
ser manipulados atravs dessa interface. Objetos
podem ser compostos por outros objetos compostos, recursivamente e sem limites. O diagrama na Figura Q2 ilustra a estrutura do pattern.
Com o uso do Sitemesh, possvel montar
pginas a partir de outras pginas, o que permite criar estruturas estilo rvore para que
elas sejam compostas. Alm disso, podemos
decorar nossas pginas independentemente
do fato de serem compostas por outras pginas
ou no. Ou seja, tratamos objetos compostos da
mesma forma que objetos simples, seguindo os
princpios do pattern Composite.
CompositeView
O pattern Java EE CompositeView baseado
no Composite. possvel afirmar que o Sitemesh
uma implementao de uma verso adaptada desse pattern. O CompositeView prega
que views (pginas, no nosso caso) complexas
devem ser compostas por subviews menores.
Com isso, separa-se o layout da composio da
pgina. O Sitemesh implementa esses conceitos.
O diagrama na Figura Q3 ilustra a estrutura do
pattern.
Composio
A composio de uma pgina a partir de
outras realizada atravs de uma tag. Veja
um exemplo:
<page:applyDecorator
page=/jsp/menu.jsp name=menu />
Preparando o ambiente
O projeto de exemplo est disponvel
para download no site da Java Magazine,
sendo disponibilizado como um WAR dentro de um ZIP. Utilizaremos o Eclipse com
WTP e o Apache Tomcat (5.5 ou superior).
Deve ser utilizada a verso 5 do Java SE,
ou mais recente.
No Eclipse, importe o projeto smesh.war,
usando File|Import>Web>WAR. Utilize
43
decorators.xml
A configurao dos decorators fica em
um arquivo denominado decorators.xml,
na pasta WEBINF da aplicao web. O
decorators.xml de nosso exemplo est na
Listagem 3. Analisando o arquivo, primeiramente temos o elemento <decorators
defaultdir=/decorators>. O atributo defaultdir
indica onde esto localizados os templates
que fazem o papel de decorators. No nosso
Listagem4. Declarao da pgina main.jsp, utilizada em nosso exemplo como o decorator main, aplicado maioria das pginas
<%@ taglib uri=http://www.opensymphony.com/sitemesh/decorator
prefix=decorator%>
<%@ taglib uri=http://www.opensymphony.com/sitemesh/page prefix=page%>
<html>
<head>
<title><decorator:title default= /></title>
<link href=<%= request.getContextPath() %>/decorators/main.css rel=stylesheet
type=text/css>
<decorator:head />
</head>
<body>
<table width=100% height=50% border=0>
<tr>
<td valign=top align=center>
<page:applyDecorator page=/feedsites.jsp name=panel />
</td>
<td width=70% valign=top align=center>
<decorator:body />
</td>
</tr>
</table>
<table width=100% height=50%>
<tr>
<td valign=top>
</td>
</tr>
</table>
</body>
</html>
Listagem5. Declarao da pgina panel.jsp, utilizada em nosso exemplo para o decorator denominado panel
<%@ taglib uri=http://www.opensymphony.com/sitemesh/decorator prefix=decorator %>
<p>
<table border=0 cellpadding=0 cellspacing=0>
<tr>
<th class=panelTitle>
<decorator:title default=Unknown panel />
</th>
</tr>
<tr>
<td class=panelBody>
<decorator:body />
</td>
</tr>
</table>
</p>
45
return mapping.findForward(SUCCESS);
Funcionamento do exemplo
Ao acessar a aplicao, a pgina index.
html exibida. Essa pgina possui apenas o esqueleto HTML, sem nada que
seria exibido pelo browser. Em tempo
de execuo, ela sofre ao do decorator
padro main. Esse decorator declarado
para interceptar todas as pginas da
aplicao (lembre-se do elemento pattern
com valor /*). Como o decorator utiliza
recursos de composio atravs da tag
<page:applyDecorator>, a pgina feedsites.jsp
includa. Essa pgina apresenta uma
lista de alguns sites onde podemos obter
notcias sobre Java, publicadas na forma
de RSS ou ATOM. Repare no uso das
tags <decorator:head> e <decorator:body> que
indicam onde o contedo da pgina ser
inserido.
Utilizamos outro decorator para a
pg i na feedsites.jsp, at ravs da tag
<page:applyDecorator>. Esse decorator
denominado panel e representado pela
pgina panel.jsp (Listagem 5). Ao utiliz-lo,
o main no aplicado, pois indicamos explicitamente qual o decorator que desejamos.
Utilizamos ainda a tag <decorator:title>
para incluir o ttulo da pgina feedsites.jsp
(Feeds sobre Java).
Ao clicar em um dos links, invocada
a action /obterFeeds (Listagem 6). Essa
action recorre classe br.com.jm.sitemesh.
service.FeedService para a obteno da lista
de notcias e envia essa listagem para a pgina feeds.jsp. Esta ltima pgina tambm
sofre ao do decorator main. Ao listar as
notcias obtidas pela action, apresentada
a listagem dos sites do lado esquerdo em
um painel, graas ao do decorator
main. Isso tambm ocorre com a index.
html, obedecendo ao padro visual que
criamos. A Figura 3 mostra nosso exemplo
em funcionamento, aps o clique em um
dos links dos sites.
Ao clicar em uma das notcias, a pgina
showSite.jsp (Listagem 7) acessada. Essa
pgina tambm decorada pelo decorator
main e aplica o decorator panel ao contedo
exibido. O contedo do site obtido pelo
Sitemesh e mostrado em um painel na
Concluses
Atravs de um exemplo pudemos ver o
Sitemesh em ao, apresentando muitos
dos seus recursos. Com o que foi apresentado, fica claro que o Sitemesh uma
excelente opo para manter o layout
de suas aplicaes consistente, mesmo
quando somente pginas estticas so
utilizadas.
O recurso de composio, que permite
montar pginas a partir de outras pginas, tambm importante para facilitar
a construo de sites e fazer a agregao
de contedo. Junto a isso, a separao
da pgina da forma como ela decorada
facilita a manuteno, reduz a quantidade
de cdigo repetitivo e permite mudar o
layout de forma simples. A alterao passa
a ser centralizada e o esforo para testes
reduzido drasticamente.
www.opensymphony.com/sitemesh
Site oficial do Sitemesh
rome.dev.java.net
Site oficial do ROME, biblioteca que
utilizamos para o consumo de feeds RSS e ATOM
Daniel Cicero Amadei
([email protected])
Bacharel em Sistemas de Informao pela Universidade Presbiteriana Mackenzie e ps-graduado
em Gesto de Projetos pela Fundao Vanzolini. Trabalha com Java desde 1999 e possui as certicaes
SCJP, SCWCD, SCBCD, SCDJWS e SCEA, atuando como
Arquiteto de Sistemas Java SE e Java EE.
47
Tratamento de Excees
Conceitos bsicos, armadilhas e boas prticas
Conceitos iniciais
na Prtica
Entenda o mecanismo de
controle e tratamento de
excees do Java e evite
problemas comuns
Andr Diniz
dentro de um catch do mesmo bloco try. O
bloco finally deve ser includo quando desejamos garantir a execuo de algum cdigo
de limpeza do mtodo, por exemplo, o
fechamento de arquivos, liberao de conexes de rede ou de banco de dados etc.
Vale ressaltar que existem situaes
excepcionais (!):
O bloco finally no ser executado
se a JVM for encerrada explicitamente
dentro de um bloco try/catch, atravs de
uma instruo System.exit(), por falhas de
hardware ou at mesmo por restries de
acesso a recursos do computador. Tambm existem situaes em que o cdigo
escrito dentro do bloco finally tambm
pode provocar uma exceo.
Se um bloco finally executar um return
ou lanar uma nova exceo, dessa
forma que o mtodo terminar. Se algum
bloco catch do mesmo mtodo tiver sido
executado (lembre que isso acontece
antes do finally) e tiver retornado outro
valor, ou gerado outra exceo, este valor
ou exceo sero simplesmente ignorados.
Isso pode ser bastante confuso; portanto
recomenda-se evitar instrues return ou
throw em blocos finally.
Hierarquia de excees
Categorias de excees
Checked exceptions
As classes de excees checadas so
der ivada s de Exception, ma s no de
RuntimeException. O cdigo a seguir mostra
um mtodo declarando uma exceo checada (NumberFormatException uma subclasse
direta de Exception):
public int stringToInt(String value)
throws NumberFormatException{ . . };
Ao chamar o mtodo stringToInt() do
exemplo, o desenvolvedor obrigado a
tratar a exceo NumberFormatException. Caso
contrrio, um erro de compilao ser
apontado. Isso acontece devido presena
da clusula throws declarada no mtodo, e
porque NumberFormatException checada.
Note que, com isso, a responsabilidade
de tratar a exceo passa a ser de quem vai
utilizar o mtodo e no de quem o codificou.
49
Neste caso muito comum, o programador, por ser obrigado a tratar a exceo,
apenas registra no console o erro ocorrido, atravs do mtodo printStackTrace() da
classe Exception. Apesar de ser melhor que
o caso anterior, pois a informao sobre
o erro no perdida, provavelmente o
usurio no vai tomar conhecimento do
que aconteceu (a no ser que o programa
tenha interface de linha de comando, ou
que a sada do console seja interceptada
por um arquivo de log).
Evitando armadilhas
Esse o mais perigoso dos casos. O programador mascara a exceo apenas para
se livrar das mensagens do compilador.
Dessa forma, se o mtodo processar() lanar
uma exceo, nada vai acontecer, e o programa vai continuar funcionando como
se nada de errado tivesse acontecido. Bugs
da aplicao podem ser mascarados, e se
acontecerem em produo, voc no ter
nem mesmo uma mensagem ou log de erro
para ajud-lo a diagnosticar o problema.
Transferncia de responsabilidade
public void executar() throws Exception {
processar();
}
Boas prticas
Concluses
java.sun.com/docs/books/tutorial/
essential/exceptions
Tutorial sobre controle de excees fornecido
pela Sun Microsystems.
java.sun.com/j2se/1.5.0/docs/api/index.html
Hierarquia do pacote java.lang completa.
java.sun.com/docs/books/tutorial/essential/
exceptions/runtime.html
A controvrsia das checked exceptions.
Andr Diniz
([email protected])
bacharel em Cincia da Computao (UNIFACS Universidade Salvador), e atualmente Software Analyst do
HSBC Global Technology Brazil.Tambm ps-graduado
em Sistemas de Informao com nfase em Componentes
Distribudos e Web, pela Faculdade Ruy Barbosa.
51
Sistemas Multiagentes
Usando agentes inteligentes com a plataforma
Desmistificando os agentes
Podemos definir um agente inteligente
como um sistema de computao capaz de
interagir em algum ambiente e de realizar
aes de forma autnoma (dependendo
apenas das informaes que o agente
possui no momento) para atingir seus
objetivos. Normalmente, agentes possuem
caractersticas tanto reativas (aes provocadas pelo ambiente) como proativas
(aes voluntrias do agente). So tambm
adaptativos e orientados a objetivos.
em Java
Aprenda a desenvolver
sistemas flexveis com
Java utilizando o conceito
de agentes inteligentes,
usando a API e plataforma
open source JADE
JADE
Agentes aplicados
O uso de agentes est longe de ser algo
puramente acadmico e sem aplicao
comercial. Agentes j so aplicados em diversas reas e podem tirar grande proveito
de ambientes distribudos como a Internet.
Diversas aplicaes peer-to-peer (P2P), baseadas em tecnologia de agentes vm sendo
usadas e desenvolvidas durante os ltimos
anos, impulsionadas pelo aumento na
largura de banda de transmisso e apostando, por exemplo, nos relacionamentos
virtuais. Outras aplicaes tpicas que
esto inseridas neste contexto so sistemas
baseados em e-learning e e-commerce.
Na rea de aplicaes mveis, podemos
destacar ainda servios de busca e localizao, como encontrar o estacionamento mais
prximo e mais barato, ou fazer reserva em
um restaurante de acordo com as preferncias do usurio. H tambm aplicaes no
ambiente corporativo. Agentes inteligentes
tm obtido sucesso em reas desde sistemas
para gesto do conhecimento, at em aplicaes de suporte deciso, passando por
controle industrial, e sistemas de logstica e
de gerenciamento de trfego de rede.
@Override
public boolean done() {
boolean condicaoTermino = false;
//Faz uma avaliao da condio de trmino...
return condicaoTermino;
}
53
Arquitetura
Com o JADE, o conjunto de agentes pode
ser distribudo em vrias mquinas e sua
configurao pode ser controlada atravs
de uma interface remota. H tambm
a possibilidade de mover agentes entre
mquinas virtuais em hosts diferentes,
permitindo balanceamento de carga. Com
isso, um agente pode parar a execuo e
migrar para outro host, sem a necessidade
de prvia instalao do agente. O nico
requisito para o uso do JADE a instalao
de uma JRE 1.4 ou superior.
O desenvolvimento utilizando a API do
JADE baseado na construo de POJOs
(classes Java comuns), permitindo o reuso
com outras tecnologias Java. Boa parte
da complexidade envolvida no JADE fica
por conta da plataforma. Assim, uma
abstrao simplificada apresentada ao
desenvolvedor para facilitar o entendi-
mento e a implementao.
A arquitetura de comunicao do JADE
flexvel e ela quem gerencia as mensagens de cada agente, permitindo o acesso
a essas mensagens de vrias formas.
utilizada a notificao de eventos, RMI e
IIOP, e h recursos para integrao a outros
protocolos, como HTTP.
Funcionamento do JADE
O JADE d o suporte aos servios bsicos
necessrios a aplicaes P2P distribudas
em ambientes fixos e mveis. Os agentes
utilizam esse suporte para disponibilizar
servios e descobrir dinamicamente outros
agentes para estabelecer uma interao.
A comunicao acontece atravs da troca
de mensagens assncronas. Em conseqncia disso, no existe uma dependncia
temporal entre agentes interessados em
trocar informaes.
Cada agente possui seu identificador
nico, representado por uma instncia da
classe jade.core.AID. Esse identificador pode
ser recuperado pelo mtodo getAID() da classe Agent e tem a forma <apelido>@<nomeda-plataforma>:<nmero-da-porta>/JADE,
A plataforma JADE
Cada instncia do runtime do JADE
chamada container. O conjunto desses
containers forma uma plataforma, que
proporciona uma camada homognea,
ocultando a diversidade e a especificidade
de outras camadas da aplicao.
Um container especial, o Main Container,
deve estar sempre ativo de forma nica,
e todos os outros containers devem se registrar nele no momento de inicializao.
Portanto, se um segundo Main Container
inicializado em algum lugar da rede, ele
constituir uma plataforma diferente, onde
novos containers podem ser registrados. A
arquitetura do JADE pode ser visualizada
na Figura 2, onde A1, A2, A3 e A4 representam diversos agentes em execuo.
Codificando
Uma vez apresentados os princpios, a
arquitetura e alguns detalhes de implementao do JADE, chegou a hora de ver
na prtica como tudo funciona.
Vamos usar um exemplo de um sistema de
cadeia de suprimentos. Nele, uma organiza-
Agentes e comportamentos
Tipos de comportamento
Podemos distinguir trs tipos de comportamentos dentro da plataforma JADE, e todos podem ser
convenientemente estendidos:
OneShotBehaviour Completa imediatamente e
o mtodo action() executado apenas uma vez.
Tem uma implementao do mtodo done() que
sempre retorna true.
CyclicBehaviour Nunca completa e seu mtodo
action() sempre executa as mesmas operaes. Seu
mtodo done() sempre retorna false.
GenericBehaviour Executa diferentes operaes
dependendo de um status interno. Completa
quando uma dada condio verdadeira.
Existe ainda a possibilidade de combinar
comportamentos, mas no vamos detalhar essa
Agendamento e execuo de
comportamentos
Um agente pode executar diversos comportamentos concorrentemente. O agendamento
de comportamentos cooperativo (nopreemptivo). Isso significa que quando um
comportamento agendado para execuo,
seu mtodo action() chamado e executa at
terminar. Portanto, o desenvolvedor quem
define quando um agente troca a execuo de
comportamentos. O processo de execuo de
um agente pode ser descrito como no diagrama
da Figura Q1.
55
Passando argumentos
possvel passar tambm argumentos
na construo de um agente. No exemplo
em questo, o AgenteCadeiaSuprimento recebe
a informao do produto a ser pesquisado,
atravs de um argumento, como pode ser
visto na Figura 5. Esses argumentos so recuperados atravs do mtodo getArguments()
da classe Agent. Observe o trecho de cdigo
a seguir:
Object[] args = getArguments();
if (args != null && args.length > 0) {
produto = (String) args[0];
addBehaviour(new BuscaProdutos());
}
Adicionando comportamentos
Listagem 2. AgenteCadeiaSuprimento
package br.com.javamagazine.agentes;
import
import
import
import
import
import
java.util.*;
jade.core.*;
jade.core.behaviours.*;
jade.domain.*;
jade.domain.FIPAAgentManagement.*;
jade.lang.acl.*;
sd.setType(Fornecedor);
template.addServices(sd);
try {
DFAgentDescription[] resultado = DFService.search(
myAgent, template);
fornecedores = new AID[resultado.length];
numeroFornecedores = resultado.length;
for (int i = 0; i < resultado.length; ++i) {
fornecedores[i] = resultado[i].getName();
request.addReceiver(fornecedores[i]);
}
}
catch (FIPAException fe) {}
request.setContent(produto);
request.setConversationId(solicitacaoProduto);
request.setReplyWith(AgenteCadeiaSuprimento
+ System.currentTimeMillis());
myAgent.send(request);
mt = MessageTemplate.and(MessageTemplate
.MatchConversationId(solicitacaoProduto),
MessageTemplate.MatchInReplyTo(request.getReplyWith()));
passo++;
break;
case 1:
ACLMessage reply = myAgent.receive(mt);
String valor = null;
if (reply != null) {
if ((reply.getPerformative() == ACLMessage.INFORM)
|| (reply.getPerformative() == ACLMessage.REFUSE))
{
valor = reply.getContent();
if (reply.getPerformative() == ACLMessage.INFORM) {
respostasPositivas.put(reply.getSender(), valor);
}
else {
respostasNegativas.add(reply.getSender());
}
numeroRespostas++;
if (numeroRespostas == numeroFornecedores) {
// Recebeu todas as respostas e processa informaes.
passo++;
break;
}
}
}
else {
block();
}
break;
}//Fim do switch
}//Fim do mtodo action()
public boolean done() {
System.out.println(Passo: + passo);
return (passo == 2);
}
}//Fim da classe BuscaProdutos
}//Fim da classe AgenteCadeiaSuprimento
57
Ambiente de execuo
A execuo do exemplo na plataforma
JADE simples. necessrio apenas
ter uma JRE instalada (superior a 1.4) e
adicionar ao classpath o projeto, que est
disponvel para download no site da revista, assim como os seguintes JARs: http.
jar, iiop.jar, jade.jar e jadeTools.jar (includos
na distribuio binria do JADE). Depois
disso, basta executar o comando a seguir,
em uma linha:
java jade.Boot -gui
FornA:br.com.javamagazine.agentes.FornecedorA
FornB:br.com.javamagazine.agentes.FornecedorB
FornC:br.com.javamagazine.agentes.FornecedorC
Sniffer:jade.tools.sniffer.Sniffer(FornA; FornB; FornC)
ao no futuro.
cancel Cancela alguma ao requisitada
previamente.
failure Informa outro agente a respeito da
falha de alguma ao.
inform Transmite alguma informao (geral)
ao destinatrio.
not-understood Informa ao destinatrio que
a mensagem no foi compreendida.
query-if Questiona outro agente se uma
dada proposio verdadeira.
request Requisita ao destinatrio a execuo de alguma ao.
try {
DFService.register(this, dfd);
}
catch (FIPAException e) {
doDelete();
}
addBehaviour(new CotacaoPrecoProduto());
@Override
protected void takeDown() {
System.out.println(O agente + getName()
+ est sendo finalizado.);
}
private class CotacaoPrecoProduto extends CyclicBehaviour {
private MessageTemplate mt;
public void action() {
mt = MessageTemplate.MatchConversationId(solicitacaoProduto);
ACLMessage request = myAgent.receive(mt);
if (request != null) {
String produto = request.getContent();
ACLMessage reply = request.createReply();
String valor = recuperaCotacaoProduto(produto);
if (valor != null) {
reply.setPerformative(ACLMessage.INFORM);
reply.setContent(valor);
}
else {
reply.setPerformative(ACLMessage.REFUSE);
reply.setContent(FornecedorA --> Nao temos o produto);
}
myAgent.send(reply);
}
else {
block();
}
Concluses
O potencial de um sistema multiagentes
vai muito alm do que foi apresentado
nesse artigo. O objetivo aqui foi mostrar
o funcionamento bsico da plataforma
e da API do JADE e dar as bases para o
leitor explorar essa interessante rea do
desenvolvimento de software.
Sistemas mais sofisticados lidam com APIs
e tecnologias que abstraem mquinas de
inferncia, protocolos de interao e estruturas de informaes. Algumas delas como
Jess e Jena, bem como o uso de ontologias,
permitem definir relacionamentos complexos e realizar tarefas muito especializadas,
de forma extremamente distribuda. Mesmo
assim, fcil perceber que abordagens como
a apresentada esto prximas das nossas tarefas e desafios dirios e que podemos tirar
proveito delas para construir sistemas mais
eficientes e flexveis.
www.fipa.org
Pgina principal da FIPA
jade.tilab.com
Pgina principal do JADE
www.agentcities.org
Pgina sobre pesquisas em sistemas multiagentes
www.agentlink.org
Pgina sobre pesquisa em tecnologia de agentes
em geral
Ricardo Marques Porto
([email protected])
consultor da Summa Technologies, mestrando em informtica
pela Universidade de Braslia na rea
de Sistemas Inteligentes e ps-graduado pela Fundao Getlio Vargas em Administrao Estratgica de
Sistemas de Informao.
59
JSRs e containers
um portlet completo
Edgar A. Silva
podem ser formatadas atravs de diversas
linguagens de marcao, por exemplo
HTML e WML. Cada portlet pode ter um
contexto parte, em que trata suas variveis
e outras informaes de forma particular;
tem tambm a capacidade de interagir
com o contexto do container de portlets e,
atravs deste, com outros portlets.
A especificao de Portlets determina que
um portlet pode estar em trs estados:
VIEW Estado padro, em que apresentado o contedo do portlet.
EDIT Para edio de preferncias/configuraes do portlet. Alteraes nessas
configuraes geralmente tm impacto
sobre o que mostrado no modo VIEW.
HELP Fornece uma visualizao de
ajuda para o usurio do portlet.
H tambm trs modos de visualizao
definidos, similares aos que temos em
janelas de sistemas operacionais:
NORMAL Nesta visualizao, o portlet
compartilha o espao com outros portlets, obedecendo sua posio e tamanho
definidos.
MINIMIZED O portlet aparece minimizado, na maioria das vezes sendo mostrada
apenas a sua barra de ttulo .
MAXIMIZED O portlet expandido como
se fosse o nico portlet da pgina, escondendo todos os outros.
Estes modos de visualizao so indicados por cones no topo dos espaos reservados para os portlets, reforando a idia
de que funcionam como mini-aplicaes.
Listagem 1. conf.jsp
<%@ taglib uri=http://java.sun.com/portlet prefix=portlet %>
<portlet:defineObjects/>
<h2>WordPress Portlet</h2>
<hr size=1>
<h3>Dados do Blog</h3>
<form action=<portlet:actionURL/>>
<table border=0>
<tr>
<td>Endereco do Site WordPress:</td>
<td><input type=text name=url
value=<%=request.getAttribute(WORDPRESS_URL)%> size=40 />
</td>
</tr>
<tr>
<td>Usuario:</td>
<td><input type=text name=usuario
value=<%=request.getAttribute(USER)%> size=20 />
</td>
</tr>
<tr>
<td>Senha:</td>
<td><input type=password name=senha value= size=20 /></td>
</tr>
<tr>
<td></td>
<td> <input type=submit value=Salvar name=op /> </td>
</tr>
</table>
</form>
Listagem 2. post.jsp
<%@ taglib uri=http://java.sun.com/portlet prefix=portlet %>
<portlet:defineObjects/>
<h2>WordPress Portlet</h2>
<hr size=1>
<h3>Escreva aqui seu Post:</h3>
<table>
<tr class=portlet-msg>
<td colspan=2>
<%= request.getAttribute(message) != null ?
request.getAttribute(message) : %></td>
</tr>
</table>
<form action=<portlet:actionURL/>>
<table border=0>
<tr>
<td></td>
<td><p>Titulo:</p>
<p> <input type=text name=titulo value= size=60 /> </p> </td>
</tr>
<tr>
<td></td>
<td> <p>Texto:</p> <p><textarea name=post rows=20 cols=50>
</textarea> </p> </td>
</tr>
<tr>
<td></td>
<td> <input type=submit value=Publicar name=op /> </td>
</tr>
</table>
</form>
61
Programando o portlet
63
prefs = request.getPreferences();
response.setContentType(text/html);
PortletRequestDispatcher prd = null;
@Override
protected void doHelp(RenderRequest request,
RenderResponse response)
if (op.equalsIgnoreCase(salvar)) {
this.getPortletContext().log(Evento Salvar....);
prefs.setValue
(WORDPRESSURL_KEY, request.getParameter(url));
prefs.setValue
(USER_KEY, request.getParameter(usuario));
prefs.setValue
(PASSWORD_KEY, request.getParameter(senha));
this.getPortletContext().log
(Preferencias alteradas....);
prefs.store();
this.getPortletContext().log(Preferencias Salvas!);
response.setPortletMode(PortletMode.VIEW);
return;
} else {
@Override
protected void doEdit(RenderRequest request,
RenderResponse response)
throws PortletException, IOException, UnavailableException
{
setRenderParameters(request);
response.setContentType(text/html);
PortletRequestDispatcher prd =
getPortletContext().getRequestDispatcher(
/WEB-INF/jsp/wordpress/conf.jsp);
prd.include(request, response);
}
if (op.equalsIgnoreCase(publicar)) {
try {
BlogInfo blog = new BlogInfo(1,
prefs.getValue(USER_KEY, null),
prefs.getValue(PASSWORD_KEY, null), 1);
XmlRpcClient client = new XmlRpcClient(
prefs.getValue(WORDPRESSURL_KEY, null));
BlogPoster poster = new BlogPoster(client, blog);
poster.setPostType(PostType.publish);
poster.post(getContents(request));
log(Post Publicado ... );
String site = prefs.getValue(WORDPRESSURL_KEY, null);
site = site.substring(0, site.lastIndexOf(/));
message = String.format(
Post salvo em <a href=%s>%s</a> com o titulo %s,
site, site, request.getParameter(titulo));
if (possuiInfo) {
request.setAttribute(message, message);
prd = getPortletContext().getRequestDispatcher
(/WEB-INF/jsp/wordpress/post.jsp);
} else {
prd = getPortletContext().getRequestDispatcher
(/WEB-INF/jsp/wordpress/conf.jsp);
}
prd.include(request, response);
response.setPortletMode(PortletMode.VIEW);
return;
} catch (XmlRpcException ex) {
Logger.getLogger(WordpressPortlet.class.
getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(WordpressPortlet.class.
getName()).log(Level.SEVERE, null, ex);
}
@Override
protected void doView(RenderRequest request,
RenderResponse response)
throws PortletException, IOException, UnavailableException
{
setRenderParameters(request);
possuiInfo = true;
request.setAttribute(USER_KEY,
prefs.getValue(USER_KEY, null));
request.setAttribute(PASSWORD_KEY,
prefs.getValue(PASSWORD_KEY, null));
request.setAttribute(WORDPRESSURL_KEY,
prefs.getValue(WORDPRESSURL_KEY, null));
Descritores XML
jboss-app.xml
<jboss-app>
<app-name>WordPressPortletAPP</app-name>
</jboss-app>
wordpressportlet-object.xml
<?xml version=1.0 encoding=UTF-8?>
<deployments>
<deployment>
<parent-ref>default</parent-ref>
<if-exists>overwrite</if-exists>
<instance>
<instance-name>WordPressPortlet</instance-name>
<component-ref>WordPressPortletAPP.WordPressPortlet</component-ref>
</instance>
</deployment>
</deployments>
65
wordpressportlet-object.xml Descritor
que relaciona nosso portlet declarado no
jboss-portlet.xml com a aplicao presente
no jboss-app.xml, alm de definir como o
container instancia o portlet.
Todos estes descritores, que so mostrados na Listagem 7, ficam no mesmo local:
na pasta WEB-INF, junto com o web.xml
padro. Eles faro parte do pacote WAR
que nosso script Ant ir gerar.
Empacotando e configurando
Testes finais
prefs.setValue(WORDPRESSURL_KEY,
request.getParameter("url"));
Edgar A. Silva
([email protected],
www.edgarsilva.com.br)
Solutions Architect da JBoss,uma
diviso da Red Hat. responsvel por
pr-vendas e tecnologias JBoss. Como Arquiteto Java
ajuda no desenho de solues de Middleware de misso crtica e SOA para vrios segmentos de indstria.
Possui nove anos de experincia com Java alm de
vrias certificaes na tecnologia, entre elas SCEA.
Figura 4. Resultado da ao do nosso blog em um site onde o blog gerenciado pelo WordPress
jcp.org/en/jsr/detail?id=168
JSR 169, Portlet Specification
labs.jboss.com/jbossportal
Site do projeto open source JBoss Portal
developers.sun.com/portalserver/reference/
techart/jsr168/
Referncias sobre as JSRs 168 e 286
docs.sun.com/source/817-5319/ch12a.html
Entendendo como estender a classe
GenericPortlet
ws.apache.org/xmlrpc
Site do Apache XML-RPC
onjava.com/pub/a/onjava/2006/02/01/
what-is-a-portlet-2.html
Usando a biblioteca de tags de portlets