UNIVERSIDADE FEDERAL DE SANTA CATARINA … · no desenvolvimento de software em geral. Para...
Transcript of UNIVERSIDADE FEDERAL DE SANTA CATARINA … · no desenvolvimento de software em geral. Para...
UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE CIÊNCIAS DA COMPUTAÇÃO
FRANCISCO DE ASSIS BESEN HILLESHEIM
X SWING MENU: UMA FERRAMENTA PARA CONSTRUÇÃO DE MENUS JAVA SWING UTILIZANDO
XML
FLORIANÓPOLIS, 2004
UNIVERSIDADE FEDERAL DE SANTA CATARINA DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE CIÊNCIAS DA COMPUTAÇÃO
FRANCISCO DE ASSIS BESEN HILLESHEIM
X SWING MENU: UMA FERRAMENTA PARA CONSTRUÇÃO DE MENUS JAVA SWING UTILIZANDO
XML
Orientador: Prof. Dr. Leandro José Komosinski
Membros da Banca:
Prof. Dr.José Leomar Todesco Prof Dr. Roberto Carlos dos Santos Pacheco
FLORIANÓPOLIS, 2004
RESUMO
A criação e manutenção de interfaces gráficas de usuário representa um ponto crítico
no desenvolvimento de software em geral. Para resolver este problema, várias ferramentas e
arquiteturas foram concebidas no decorrer dos anos.
Este trabalho apresenta a ferramenta XSwingMenu que utiliza XML para criação de
objetos gráficos Java Swing referentes a barras de menu. Seu funcionamento consiste na
geração de código Java a partir de um documento XML por meio de transformações do
documento via XSLT. Além disso, XSwingMenu também provê suporte ao processo inverso,
ou seja, extração de um documento XML a partir de uma barra de menu codificada em Java
Swing já existente.
Palavras-chave: Java – XML – interface gráfica
ABSTRACT
The creation and maintenance of graphical user interfaces in general represent a
critical point in the software development. To solve this problem, some tools and
architectures had been conceived in the elapsing years.
This work presents a tool called XSwingMenu that uses XML for creating Java Swing
graphical objects describing menu bars. Its functioning consists of Java code generation from
a XML document by means of transformations of the XML document through XSLT.
Moreover, XSwingMenu also provides support to the inverse process, in another words,
extration of a document XML from a pre-existent menu bar coded in Java Swing.
Key-words: Java – XML – graphic interface
Índice de figuras
Figura 1 Exemplo de documento em XAML........................................................................ 12 Figura 2 Processo de renderização do XAML ...................................................................... 12 Figura 3 Helloworld em SwiXml ......................................................................................... 13 Figura 4 Renderização Helloworld em SwiXml.................................................................... 14 Figura 5 Execução programa Java........................................................................................ 16 Figura 6 Exemplo de barra de menu em Java Swing............................................................. 18 Figura 7 Classes relacionadas a menu em Java Swing .......................................................... 18 Figura 8 Processo de transformação de documentos XML ................................................... 22 Figura 9 Exemplo simplificado da especificação XML Schema ........................................... 24 Figura 10 Figura simplificada de script XSLT...................................................................... 27 Figura 11 Etapas do processo de geração de código ............................................................. 29 Figura 12 Estrutura de classes simplificada .......................................................................... 34 Figura 13 Exemplo de documento de XML de entrada......................................................... 39 Figura 14 Exemplo de erro de validação de um documento XML ........................................ 40 Figura 15 Exemplo de transformação bem sucedida ............................................................. 42 Figura 16 Classe gerada a partir do arquivo Exemplo1.xml .................................................. 44 Figura 17 Exemplo de classe de teste gerada automaticamente............................................. 45 Figura 18 Renderização da classe gerada.............................................................................. 45
Índice de tabelas
Tabela 1 Descrição dos elementos da linguagem.................................................................. 32 Tabela 2 Elementos da linguagem........................................................................................ 32 Tabela 3 Descrição dos atributos da linguagem .................................................................... 33 Tabela 4 Atributos da linguagem.......................................................................................... 34 Tabela 5 Comparação entre XSwingMenu e SwiXml........................................................... 37
SUMÁRIO
1 INTRODUÇÃO.................................................................................................................. 8 1.1 Contexto....................................................................................................................... 8 1.2 Objetivos...................................................................................................................... 8
1.2.1 Objetivo Geral ....................................................................................................... 8 1.2.2 Objetivos Específicos ............................................................................................ 8
1.3 Metodologia ................................................................................................................. 9 2 ESTADO DA ARTE......................................................................................................... 10
2.1 Soluções existentes..................................................................................................... 10 2.2 XUL........................................................................................................................... 10 2.3 XAML ....................................................................................................................... 11 2.4 Um Exemplo utilizando XML e Java Swing............................................................... 13
2.4.1 SwiXml ............................................................................................................... 13 3 SOLUÇÃO PROPOSTA................................................................................................... 15
3.1 Primeira parte............................................................................................................. 15 3.2 Segunda parte............................................................................................................. 16 3.3 Tecnologias envolvidas .............................................................................................. 16
3.3.1 Java, Java Swing e Menus ................................................................................... 16 3.3.2 XML ................................................................................................................... 18 3.3.3 W3C XML Schema ............................................................................................. 20 3.3.4 XSLT .................................................................................................................. 20
4 DESENVOLVIMENTO ................................................................................................... 23 4.1 Primeiro ciclo de desenvolvimento............................................................................. 23
4.1.1 Especificação da linguagem................................................................................. 23 4.1.2 Validador da linguagem....................................................................................... 25
4.2 Segundo ciclo de desenvolvimento............................................................................. 25 4.2.1 Transformador XSLT .......................................................................................... 25 4.2.2 Criação da GUI.................................................................................................... 27 4.2.3 Funcionalidades adicionais .................................................................................. 27
5 XSWINGMENU............................................................................................................... 29 5.1 Descrição ................................................................................................................... 29 5.2 Especificação da linguagem ....................................................................................... 31
5.2.1 Descrição dos elementos...................................................................................... 31 5.2.2 Elementos............................................................................................................ 32 5.2.3 Descrição dos atributos........................................................................................ 33 5.2.4 Atributos ............................................................................................................. 33
5.3 Estrutura de classes simplificada ................................................................................ 34 5.4 Tratamento de eventos................................................................................................ 35 5.5 Gerador de documentos XML .................................................................................... 36 5.6 Comparação entre XSwingMenu-0.2 e SwiXml-1.2 ................................................... 36
6 UM EXEMPLO UTILIZANDO XSWINGMENU............................................................ 38 6.1 Requerimentos ........................................................................................................... 38 6.2 Criação da especificação do Menu.............................................................................. 38 6.3 Iniciando o XSwingMenu........................................................................................... 39 6.4 Validando o arquivo XML.......................................................................................... 39 6.5 Transformando o arquivo XML em classe Java .......................................................... 41 6.6 Resultado ................................................................................................................... 42
7 CONCLUSÃO.................................................................................................................. 46 7.1 Trabalhos futuros ....................................................................................................... 46
8 REFERÊNCIAS BIBLIOGRÁFICAS............................................................................... 48 9 ANEXOS.......................................................................................................................... 50
9.1 Código fonte .............................................................................................................. 50 9.2 Artigo......................................................................................................................... 50
8
1 INTRODUÇÃO
1.1 Contexto
No desenvolvimento de software em geral, a construção de interfaces gráficas de
usuário (GUI) consiste em uma tarefa que requer um alto grau de esforço na maioria das
linguagens de programação usuais. Em decorrência desse fato, várias tentativas de simplificar
este processo foram realizadas, com e sem sucesso, ao longo dos anos. Em Java Swing,
biblioteca incorporada à linguagem Java que permite o desenvolvimento de interfaces gráficas
de usuário, este fato também ocorre.
Com a ascensão da especificação XML nos últimos anos e o surgimento de diversas
ferramentas para sua utilização, principalmente em Java, é razoável que seu uso para
especificação de interfaces gráficas de usuário seja uma alternativa para minimizar o esforço
necessário no seu desenvolvimento.
1.2 Objetivos
1.2.1 Objetivo Geral
Definir uma linguagem baseada em XML para especificação de objetos visuais da
biblioteca Swing de Java, juntamente com uma ferramenta para manipulação de documentos
XML baseados nessa linguagem visando aumentar a produtividade com relação a codificação
destes objetos visuais.
1.2.2 Objetivos Específicos
Permitir a especificação de barras de menu através da linguagem a ser criada. Além
disso, desenvolver uma biblioteca Java que, quando incorporada a uma aplicação, gere
objetos Swing (interface gráfica em Java) relativos ao menu desta aplicação a partir de um
9
documento XML. Assim, para o programador, a implementação do menu de seu programa se
resumiria a especificar os seus itens no formato XML.
Outro objetivo específico e pessoal seria o contato e o aprendizado das diversas
tecnologias relacionadas à manipulação de documentos XML.
1.3 Metodologia
Na fase inicial, uma pesquisa bibliográfica será realizada sobre as soluções já
existentes, juntamente com os conceitos e tecnologias abordados. Em seguida, será definido
uma proposta de solução para alcançar os objetivos traçados através do desenvolvimento de
uma ferramenta escrita em Java. Esta ferramenta, então, será responsável pela interpretação de
documentos XML que deverão estar de acordo com uma especificação referente aos objetos
gráficos em pauta (barra de menu e seus componentes) que também será desenvolvida.
Por fim, uma comparação da ferramenta desenvolvida com as demais pesquisadas
será realizada para demonstrar as suas principais diferenças, além de um exemplo prático de
como a ferramenta pode ser utilizada.
10
2 ESTADO DA ARTE
2.1 Soluções existentes
Durante muitos anos, várias tentativas de se melhorar o desenvolvimento de GUI
foram realizadas. Atualmente, pode-se encontrar diversas tecnologias multi-plataforma que
melhoraram, sim, o desenvolvimento de GUI´s, porém não são muitos eficientes (Ex:
XWindows e Xt, Smalltalk, e diversas bibliotecas de classes como Xaw, GTK, Qt, Java AWT
e Swing). Essas soluções são poderosas, mas ainda precisam do aprendizado de uma
biblioteca.
Em contrapartida, a utilização de XML ao invés de bibliotecas representa uma
solução interessante. Uma prova disso é a linguagem XUL (XML-based User-Interface
Language) que faz parte do projeto Mozilla e que já é utilizada, como por exemplo, no
browser Mozilla. Outra linguagem é XAML (Extensible Application Markup Language) que
é um dialeto XML que desenvolvedores utilizarão para construir aplicativos para o Longhorn,
a nova versão do sistema operacional Microsoft Windows.
XUL e XAML representam os maiores projetos nesta área, porém, vários outros
projetos com propostas semelhantes também podem ser encontrados. A seguir, alguns
exemplos dos principais projetos de código aberto nesta área: SwiXml, ThinLet, MyXAML,
Xulux, JellySwing/JellySWT e SwingML.
2.2 XUL
XUL é uma linguagem de interface de usuário baseada em XML do projeto Mozilla
que permite construir aplicativos multi-plataforma que podem rodar conectados ou
desconectados da Internet. A seguir segue suas principais características:
• Linguagem de marcação poderosa com suporte aos elementos clássicos de GUI
(widgets);
• Baseada em padrões existentes (Ex: Javascript e Cascading Style Sheets);
11
• Multi-plataforma;
• Separação da apresentação da lógica da aplicação;
• Fácil manutenção.
Além disso, existem outras tecnologias que são utilizadas pelo XUL como:
• XBL (Extensible Binding Language): uma linguagem de marcação que define
novos elementos para os widgets do XUL.
• Overlays: representam arquivos XUL utilizados para descrever conteúdos extra
para a UI.
• XPCOM/XPConnect: tecnologias complementares que permitem a integração de
bibliotecas externas à aplicações XUL.
• XPInstall: Mecanismo de instalação multi-plataforma do Mozilla.
XUL representa uma nova idéia de desenvolvimento de aplicações visto que
desenvolvedores habituados com os padrões tecnológicos do W3C1 podem utilizar seus
conhecimentos de programação em browsers diretamente nas aplicações desktop.
2.3 XAML
XAML define uma UI de aplicação com marcações representando controles padrões
do Windows. A seguir segue um exemplo para um formulário de Login:
<Canvas xmlns="http://schemas.microsoft.com/2003/XAML" ID="LoginPage"> <Label ID="lblUserId" FontFamily="verdana" FontSize="8" Canvas.Top="10" Canvas.Left="10"> User ID:</Label> <TextBox ID="txtUserId" FontSize="8" Canvas.Top="8" Canvas.Left="75"></TextBox> <Label ID="lblPassword" FontFamily="verdana" FontSize="8" Canvas.Top="35" Canvas.Left="10">Password:</Label> <TextBox ID="txtPassword" FontSize="8" Canvas.Top="33" Canvas.Left="75"></TextBox>
1 World Wide Web Consortium – Consórcio internacional de empresas envolvidas com a Internet e a Web.
12
<Button ID="cmdOK" Width="50" Canvas.Top="60" Canvas.Left="155">OK</Button> </Canvas>
Figura 1 Exemplo de documento em XAML
Neste exemplo, pode-se observar a idéia de XAML onde cada página é definida por
um arquivo XAML. Cada página possui um painel raiz (Canvas, DockPanel ou FlowPanel)
onde os elementos gráficos são definidos. Para criar uma aplicação, basta desenvolver um
arquivo .proj para agrupar os arquivos XAML e definir as opções de compilação, como
informação sobre a versão e se a aplicação irá rodar em um browser ou em uma janela. O
processo de renderização está demonstrado a seguir:
Figura 2 Processo de renderização do XAML
Com relação à adição de código, ela pode ser feita dentro do próprio documento
XAML ou em arquivos diferentes. As linguagens de programção aceitas são Microsoft Visual
Basic® .NET ou C#. Sobre o tratamento de eventos, ele deve ser escrito através destas
linguagens.
A renderização do XAML não é multi-plataforma porque ele constrói, a partir dos
documentos XML, objetos Avalon (que são nativos da nova versão do Microsoft Windows)
que são responsáveis pela renderização. Tal fato torna essa tecnologia dependente da
plataforma Windows. Atualmente, como o novo sistema operacional ainda não foi lançado, a
utilização de XAML ainda é incipiente.
13
2.4 Um Exemplo utilizando XML e Java Swing
A seguir, será visto um exemplo de como se pode utilizar esses novos conceitos com
a biblioteca Java Swing.
2.4.1 SwiXml
SwiXml é um pequeno motor de geração de interfaces gráficas de usuário para
aplicações Java e applets. A interface gráfica é definida através de documentos XML que são
analisados e renderizados em tempo de execução em objetos Swing.
Suas principais características são listadas a seguir:
• Focada exclusivamente na biblioteca javax.swing;
• Programadores acostumados com a biblioteca Swing podem utilizar SwiXml sem
maiores preocupações;
• SwiXml é rápido pois não adiciona novas camadas sob os objetos Swing;
• SwiXml é pequeno visto que seus componentes, presentes no arquivo swixml.jar,
ocupam 40 Kbytes.
• Só se preocupa com a interface gráfica. O comportamento dinâmico da interface e
a lógica de negócio devem ser implementados em Java.
Para se utilizar o motor do SwiXml basta acoplar, a um aplicativo Java, sua
biblioteca de classes contida no arquivo swixml.jar. Em seguida, basta invocar a classe
org.swixml.SwingEngine que é responsável pela renderização do documento XML. Eis um
exemplo de documento XML que pode ser usado:
<?xml version="1.0" encoding="UTF-8"?> <frame size="640,480" title="Hello SWIXML World" DefaultCloseOperation="JFrame.EXIT_ON_CLOSE"> <panel constraints="BorderLayout.CENTER"> <label LabelFor="tf" Font="Comic Sans MS-BOLD-12" Foreground="blue" text="Hello World!"/> <textfield id="tf" Columns="20" Text="Swixml"/> <button Text="Click Here" Action="submit"/> </panel> </frame>
Figura 3 Helloworld em SwiXml
14
A seguir, a sua renderização:
Figura 4 Renderização Helloworld em SwiXml
Pode-se notar, através do exemplo, que usuários já habituados com a biblioteca
Swing não teriam problemas em utilizar este motor visto que a linguagem utilizada no seu
documento XML é parecida com a nomenclatura utilizada na biblioteca Java Swing. Apesar,
de apresentar um número de linhas de código menor e código mais claro (devido a hierarquia
dos elementos).
A questão agora é como os eventos e o comportamento dinâmico dos objetos Swing
seriam tratados. Pois bem, nas marcações utilizadas no documento XML pode-se definir o
atributo id, que deve ser único no documento, que representará o nome do objeto Swing
correspondente à marcação. Se desejado enviar mensagens ao objeto Swing, basta declarar
uma variável com o mesmo nome do atributo id. Caso um evento seja registrado no
documento XML, um objeto da classe javax.swing.Action deve ser declarado, onde o evento
será tratado. Estes atributos devem estar presentes em uma classe qualquer que deve ser
passada como parâmetro para a classe responsável pela renderização do documento.
Portanto, SwiXml é um exemplo prático de como a utilização de XML e Java Swing
pode ser realizada.
15
3 SOLUÇÃO PROPOSTA
A seguir, será descrita uma maneira de se alcançar os objetivos propostos utilizando-se
de padrões de manipulação de documentos XML estabelecidos pelo W3C para elaboração da
ferramenta XSwingMenu. Esta proposta de solução está divida em duas partes distintas:
3.1 Primeira parte
A primeira parte da solução do problema consistiria na geração de código Java a partir
de um documento XML, o que representa um diferencial em relação às outras soluções
existentes. Para que isto possa ser realizado, uma especificação de linguagem baseada em
XML deve ser criada. Para isso será utilizada uma especificação definida em W3C XML
Schema.
Com a especificação em mãos, uma ferramenta de verificação e validação dos
documentos XML, de acordo com o esquema XML definido, será desenvolvida para
encontrar possíveis erros nos documentos XML e assegurar que o processo de geração de
código seja consistente.
Para a geração de código Java, considerada a tarefa mais complexa, a idéia inicial é
utilizar a linguagem XSLT para especificar como a transformação dos documentos XML, já
checados e validados, será realizada. Caso a utilização da linguagem XSLT não abranger toda
o processo de geração de código, parte da biblioteca, será responsável por esta tarefa.
Para o desenvolvimento de todas essas tarefas será criado um programa escrito na
linguagem Java juntamente com as bibliotecas Xerces e Xalan, provenientes do projeto
Apache, para a manipulação dos documentos XML. A escolha destas bibliotecas é em virtude
do fato de pertencerem ao respeitável projeto Apache, por serem de código aberto, por
proverem juntas suporte a W3C XML Schema e XSLT, e, finalmente, por serem largamente
utilizadas por várias outras aplicações. Com relação a W3C XML Schema e a XSLT, sua
utilização foi escolhida por serem padrões W3C.
16
3.2 Segunda parte
A segunda parte da solução seria permitir o processo inverso da primeira parte, ou
seja, gerar um documento XML a partir de uma classe Java existente. Para isso, uma idéia é
utilizar reflexão computacional, além das bibliotecas já citadas na primeira parte.
Essa tarefa teria como objetivo automatizar, em partes, a migração de aplicações já
existentes que possuem barra de menu definida para que a solução tenha uma maior
abrangência. Porém, esta parte do projeto só será realizada se o andamento de
desenvolvimento da primeira parte terminar em tempo hábil. Além disso, esta parte pode ser
considerada um bom desafio por envolver outras áreas.
3.3 Tecnologias envolvidas
A seguir, as tecnologias abordadas pela solução proposta serão descritas.
3.3.1 Java, Java Swing e Menus
Java é uma linguagem de programação orientada a objetos criada pela Sun
Microsystems. Java é multiplataforma, ou seja, um programa Java pode rodar em qualquer
plataforma que disponha de uma Máquina Virtual Java como mostra a figura a seguir:
Figura 5 Execução programa Java
17
O processo de compilação de um programa Java produz bytecodes (instruções de
máquina simplificados específicos da plataforma Java). Após isso, bytecodes Java podem ser
interpretados por uma Máquina Virtual Java qualquer, escrita em código nativo, que traduz os
bytecodes em código executável.
A linguagem Java pode ser utilizada em 3 plataformas distintas, definidas pela Sun:
• Java 2 Plataform, Micro Edition – para ambientes com recursos limitados;
• Java 2 Plataform, Standard Edition – para ambientes desktop;
• Java 2 Plataform, Enterprise Edition – para ambientes distribuídos e internet.
Neste trabalho, o foco é a plataforma J2SE, especialmente a biblioteca para construção
de interfaces gráficas de usuário Java Swing que é parte integrante da JFC2.
Java Swing, que foi anunciada em 1997, é uma biblioteca gráfica multi-plataforma
para Java. Ela substitui a a biblioteca anteriormente utilizada: Abstract Windowindo Toolkit
(AWT) que tinha como base para renderização de widgets3 bibliotecas nativas. A principal
característica de Java Swing é dispor de um mecanismo de troca de look and feel para todos
os componentes gráficos através de pequenas alterações subtanciais.
Como grande parte das bibliotecas gráficas existentes, Java Swing possui
componentes que suportam a idéia de menus. Menus são componentes gráficos que permitem
a seleção de uma opção entre várias possíveis. Menus são geralmente usados para
disponibilizar acesso a opções como salvar ou abrir um arquivo, sair de um programa, entre
outros. Por convenção, os menus possuem um posicionamento diferente dos demais
componentes gráficos pois são agrupados em uma barra de menu ou em um popup menu. A
seguir, um exemplo de barra de menu com todos os componentes possíveis:
2 Java Foundation Classes – Framework gráfico para construção de interfaces gráfica de usuário baseado em Java. É composto pelas bibliotecas AWT, Swing e Java2D. 3 Widget – Componente gráfico, ou controlador, que o usuário pode interagir. Menus, janelas e botões são exemplos de widgets.
18
Figura 6 Exemplo de barra de menu em Java Swing
Neste trabalho, apenas a construção de barras de menus e seus subcomponentes serão
abordados. Abaixo será descrita a hierarquia de classes de Java Swing que representa os
componentes de um menu:
Figura 7 Classes relacionadas a menu em Java Swing
Basicamente, uma barra de menu é composta por um objeto JMenuBar, que possui
objetos da classe JMenuItem (que, através de herença, podem ser também objetos das classes
JMenu, JCheckboxMenuItem e JRadioButtonMenuItem) e/ou JSeparator. Além disso, a
classe JMenu também é composta por objetos JMenuItem e/ou JSeparator.
3.3.2 XML
19
XML (Linguagem de marcação estensível) é uma linguagem de marcação simples,
derivada de SGML. Seu objetivo principal é facilitar o compartilhamento de textos
estruturados e informação através da Internet. XML, que foi desenvolvida em 1996 pelo XML
Working Group (coordenado por Jon Bosak da Sun Microsystems), virou uma recomendação
da W3C em 1998.
A seguir serão listadas algumas características de XML:
• Compatibilidade com a Web e os protocolos da Internet;
• Legível para humanos e para máquinas;
• Suporte a codificação Unicode;
• Permite representar as principais estruturas de dados (registros, listas e
árvores);
• Sintáxe rígida torna os algoritmos de análise rápidos e eficientes;
• Constitui um padrão internacional;
• Utiliza arquivo de texto comum, ou seja, não está atrelado a tecnologia alguma;
• Independente de plataforma.
A linguagem XML pode ser utilizada em diversos tipos de aplicações como uma
maneira de representar dados. Estes dados podem ser provenientes de um banco de dados, de
um arquivo de configuração, entre outros meios.
Em XML é possível fazer validação de um documento, ou seja, garantir que sua
estrutura está de acordo com um determinado esquema. Para especificação de um esquema,
existem duas tecnologias mais utilizadas: DTD (Document Type Definition) e XML Schema.
DTD não é feito em XML e possui uma abrangência menor que o XML Schema (que será
descrito no próximo tópico). Além de validação de documentos, os dados de um documento
XML podem ser transformados em outro tipo de representação (por exemplo: XML, HTML,
PDF ou texto simples) via XSL.
Para processamento de um documento XML existem várias API´s baseadas em alguns
modelos que podem ser utilizados para analisar e manipular estruturas XML. Um desses
modelos seria DOM (Document Object Model) que é baseado em objetos, onde cada parte do
documento é descrita como um tipo de nó. Esses nós, então, são agrupados em uma estrutura
20
de árvore. Existem implementações de DOM para diversas linguagens como Java, C++, Perl e
Python. Outro modelo popular seria SAX (Simple API for XML) que é um modelo baseado
em eventos, onde um documento XML é traduzido em diversas chamadas a métodos (como
startElement()). DOM e SAX possuem suas vantagens e desvantagens que devem ser levadas
em consideração de acordo com o contexto onde forem utilizados.
3.3.3 W3C XML Schema
W3C XML Schema é uma linguagem XML utilizada para descrever e restringir o
conteúdo de documentos XML. W3C XML Schema é uma recomendação W3C.
Um documento que está conforme um determinado esquema é dito válido e o processo
de checagem é chamado validação. A validação pode ser dividida basicamente em dois
momentos: validação da marcação (análise estrutural do documento) e validação do conteúdo
individual de cada nó (chamado de datatyping).
Além do W3C XML Schema existem outras linguagens de definição de esquema para
XML. Dentre elas estão: DTD, RELAX NG, Schematron e Examplotron. A mais comumente
utilizada é DTD (que apresenta um fraco suporte a datatyping), o que faz do W3C XML
Schema uma linguagem promissora.
3.3.4 XSLT
XSLT (Extensible Stylesheet Language Transformations) é uma linguagem que
permite transformar documentos XML em outros documentos XML, em documentos HTML
ou em qualquer outra coisa. Uma transformação da linguagem XSLT é feita através de um
documento XML bem-formado, chamado “folha de estilo”, que utiliza elementos e atributos
XML especializados definidos pelo Namespace4 específico da linguagem (chamado XSLT
Namespace). XSLT é uma recomendação W3C (assim como XML e XML Schema).
4 Namespace – representa um padrão W3C para identificar unicamente os elementos e atributos de um documento XML. Serve para resolver possíveis amibuidades.
21
O XSLT é tecnicamente parte da XSL (Extensible Stylesheet Language). A
especificação descreve XSL como uma família de recomendações constituida de três partes:
uma linguagem para transformar documentos XML (XSLT), uma linguagem de expressão
utilizada em XSLT para acessar ou referenciar partes de um documento XML (XPATH) e um
vocabulário XML para descrever como formatar conteúdo de documentos (XSL-FO).
Além de XSLT, existem outras alternativas para transformar documentos XML. Duas
categorias possíveis seriam (DUCHARME, 2002, p.6):
• XML relacionadas a bibliotecas adicionadas a linguagens de programação de
finalidade geral como Java, Perl, Visual Basic, Python e C++;
• Linguagens como OMNImark e Balise, projetadas especificamente para
manipular documentos XML (e tipicamente SGML).
O que diferencia XSLT das outras alternativas é que XSLT é um padrão. Isto significa
que muitos fabricantes contribuiram para este projeto e que estão comprometidos em usá-lo
em seus produtos.
A geração de código utilizando transformação de documentos (SAKAR,
CLEAVELAND, 2001) via XSLT é possível através somente de scripts XSLT juntamente
com expressões XPATH. Ainda, a geração de código é bastante flexível visto que a adição de
novos elementos e atributos no documento XML de entrada não afeta os scripts de geração de
código.
A seguir, uma figura explicando o processo de geração de um documento XML via
um processador XSLT:
23
4 DESENVOLVIMENTO
O objetivo deste capítulo é mostrar a maneira como foi desenvolvida a ferramenta
XSwingMenu ressaltando as dificuldades e alguns detalhes de implementação importantes
com relação as tecnologias utilizadas. Este capítulo foi dividido em dois ciclos, como descrito
anteriormente, de acordo com a solução proposta.
4.1 Primeiro ciclo de desenvolvimento
Na primeira etapa de desenvolvimento, foram alcançados dois objetivos: a
especificação da linguagem a ser utilizada nos documentos XML e o desenvolvimento de um
validador referente a esta especificação criada.
4.1.1 Especificação da linguagem
A criação da linguagem foi baseada na linguagem aceita pelo SwiXml, porém com
diversas modificações. Primeiramente, foi levado em consideração apenas as marcações
referentes à barra de menu e seus subcomponentes que serão apresentados a seguir:
• <menubar>
- filhos: <menu>
• <menu>
- filhos: <grupo>, <menuitem>, <checkboxmenuitem>, <radiobuttonmenuitem>,
<separador> e <menu>
• <grupo>
- filhos: <radiobuttonmenuitem>
• <menuitem>
• <checkboxmenuitem>
• <radiobuttonmenuitem>
• <separador>
24
As quatro primeiras marcações descritas acima possuem atributos, sendo que todas
essas marcações possuem o atributo “id” que serve como identificação dos objetos que serão
futuramente descritos (nos elementos <menu> e <grupo> este atributo é opcional).
Em seguida, foi prosposta uma especificação XML Schema que contemplasse a
linguagem definida. A seguir, um trecho do que foi especificado para um subconjunto da
linguagem:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="menubar"> <xs:complexType> <xs:sequence> <xs:element ref="menu" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="optional"/> </xs:complexType> </xs:element> <xs:element name="menu"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="separador" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="menuitem" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="menu" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="optional"/> <xs:attribute name="texto" type="xs:string" use="optional"/> </xs:complexType> </xs:element> <xs:element name="menuitem"> <xs:complexType> <xs:attribute name="id" type="xs:ID" use="required"/> <xs:attribute name="texto" type="xs:string" use="optional"/> <xs:attribute name="icone" type="xs:string" use="optional"/> <xs:attribute name="acelerador" type="xs:string" use="optional"/> </xs:complexType> </xs:element>
Figura 9 Exemplo simplificado da especificação XML Schema
Pode-se notar, a partir do esquema acima, que o tipo “xs:ID” está sendo utilizado pelo
atributo id de todos os elementos. Com isso, garante-se que o valor presente em cada atributo
id seja único no documento XML. Vale ressaltar que para a confecção deste XML Schema foi
feito baseado no tutorial gratuito fornecido pela W3Schools5.
5 W3Schools – Site onde pode-se encontrar vários tutorias sobre tecnologias utilizadas pela WEB. Disponível em: <http://www.w3schools.com/>.
25
4.1.2 Validador da linguagem
O validador tem como função analisar um documento XML de acordo com a
especificação Schema desenvolvida e, após essa análise, determinar se o documento XML é
válido ou não indicando, em caso negativo, onde estão as inconsistências. Vale lembrar que
um documento XML só pode ser validado se ele estiver bem-formado, ou seja, obece as
regras básicas que todo documento XML deve obedecer.
Para a construção do validador foi utilizada a biblioteca Xerces Java Parser 2.5.0
(Projeto XML Apache) que apresenta suporte para a recomendação XML Schema versão 1.0.
Sendo assim, a tarefa se resumiu em utilizar classes já prontas da biblioteca e em construir um
tratador de erros referentes aos possíveis problemas provenientes do processo de validação de
um documento XML.
4.2 Segundo ciclo de desenvolvimento Nesta etapa foi desenvolvido o transformador XSLT responsável pela geração de uma
classe Java que estende de javax.swing.JMenuBar a partir de um documento XML já validado
frente a especifição descrita. Além disso, o refactoring das classes existentes referentes ao
validador foi realizado, juntamente com uma GUI (Interface Gráfica de Usuário) englobando
o validador e o transformador desenvolvidos.
Por fim, foram criadas duas ferramentas adicionais: o gerador de XML a partir de
objetos javax.swing.JMenuBar e automatizador do processo de teste de renderização.
4.2.1 Transformador XSLT Como descrito na solução proposta, para criação do transformador de documentos
XML para classes Java utilizou-se a linguagem XSLT. O processo de transformação pode ser
dividido em dois momentos: Adição de identificadores omitidos (XML – XML) e Geração de
código Java (XML – Java).
26
Na primeira parte, o documento XML validado é sujeito a uma transformação XML –
XML com intuito de garantir que todos os elementos contidos no documento possuam um
identificador único (representado no atributo id da especificação). Tal processo é realizado
pois na etapa seguinte, o atributo id será utilizado como identificador do objeto gerado por
cada elemento.
Na segunda parte, após a adição dos identificadores, a criação da classe Java resultante
é realizada. Para isso, cada elemento do documento é mapeado para um componente Java
Swing específico relacionado a construção de menus. Como no validador, esse processo de
transformação é automatizado pela biblioteca Xalan-Java versão 2.6.0 (que implementa XSLT
versão 1.0 e XPath versão 1.0), o que significa dizer que toda especificação da transformação
está contida em arquivos do tipo XSL.
A seguir, um exemplo simplificado de como o XSLT foi utilizado para construção do
cabeçalho da classe gerada juntamente com a definição de atributos:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text" indent="no"/> <xsl:strip-space elements="*"/> <xsl:template match="menubar"> /* * <xsl:value-of select="@id"/>.java * * Codigo gerado automaticamente pelo XSwingMenu 0.2 * Francisco Hillesheim - [email protected] */ public class <xsl:value-of select="@id"/> extends javax.swing.JMenuBar { <xsl:for-each select="descendant::menu"> protected javax.swing.JMenu <xsl:value-of select="@id"/>; </xsl:for-each> <xsl:for-each select="descendant::menuitem"> protected javax.swing.JMenuItem <xsl:value-of select="@id"/>; </xsl:for-each> public <xsl:value-of select="@id"/>() { inicializaComponentes(); } private void inicializaComponentes() { <xsl:apply-templates/>
27
} } </xsl:template>
Figura 10 Figura simplificada de script XSLT
Pode-se notar no exemplo de como as expressões XPATH são utilizadas em XSLT e
como são poderosas visto a maneira simplificada de se realizar a declaração dos atributos.
Outro ponto, é que XSLT é uma linguagem funcional o que pode não agradar a todos os
desenvolvedores.
4.2.2 Criação da GUI Após o validador e o transformador prontos, uma interace de usuário foi elaborada
para viabilizar as duas funcionalidades. Primeiramente, o usuário tem a opção de escolher o
arquivo XML a ser analisado. O conteúdo desse arquivo aparece na tela para verificação pelo
usuário. Com isso, o usuário pode, então, chamar o processo de validação. Se a validação for
efetuada com sucesso, o usuário escolhe o local onde deseja gerar a classe Java e pode chamar
o processo de transformação. Caso contrário, se a validação não for bem sucedida, a interface
gráfica deve mostrar os erros de validação que ocorreram.
A interface gráfica, como não poderia deixar de ser, foi feita em Java Swing. A
ferramenta utilizada para sua elaboração foi (como todo o código da ferramenta) o Netbeans6
3.6.
4.2.3 Funcionalidades adicionais
Para complementar as funcionalidades do XSwingMenu, foram adicionadas duas
ferramentas: gerador de XML e automatizador de testes de renderização.
O gerador de XML foi feito a partir da leitura de todos os componentes presentes em
um javax.swing.JMenuBar. A cada componente encontrado era montado um elemento
correspondente a linguagem criada que depois era adicionado a uma árvore DOM. Ao final do
6 Netbeans – Ferramenta para desenvolvimento de programas Java. Disponível em: <http://www.netbeans.org/>.
28
processo, esta árvore DOM era traduzida em um documento XML. Para todos esses processos
foi utilizadas classes presente na biblioteca Xerces, o que simplificou todo esse processo de
manipulação da árvore DOM.
Já com relação ao automatizador de teste de renderização, foi elaborado um
mecanismo de se chamar os processos “java” e “javac” para execução e compilação das
classes criadas. No mais, uma classe utilitária foi adicionada na ferramenta para possuir o
código da classe de teste (visto que ele é praticamente imutável). Com essa funcionalidade, o
processo de teste da barra de menu feita a partir do documento XML fica mais produtivo.
29
5 XSWINGMENU
5.1 Descrição
XSwingMenu é uma ferramenta para criação de menus Java Swing através de
documentos XML. Seu cerne consiste na geração de código (classes Java) através da
transformação de documentos XML. Pode-se dividir seu funcionamento em quatro partes:
• Validação do documento de entrada (via W3C XML Schema);
• Manipulação de dados (via DOM);
• Transformações do documento XML e geração de código (via XSLT);
• Renderização automática da barra de menu gerada.
A seguir, uma figura que mostra em detalhes todo o processo de geração de código de
acordo com (segundo Artigo XSLT):
Figura 11 Etapas do processo de geração de código
30
Descrição das etapas de acordo com o XSwingMenu:
1. Input Docs – Representa o documento XML que possue a especificação da barra de
menu.
2. Parser – Etapa onde o documento XML é validado (via W3C XML Schema) e sua
representação de árvore é carregada em memória (via DOM). É de responsabilidade
do parser de indicar, caso existir, os erros de validação.
3. Input Language Syntax Tree - Representa a árvore gerada pelo parser.
4. Transformation/Selection – Esta etapa é dividida em dois momentos:
Transformação: a árvore em memória é transformada via script XSLT em outra árvore
de acordo com algum objetivo, no caso do XSwingMenu neste momento são
adicionados identificadores aos elementos que ainda não possuem, com o intuito de
viabilizar a geração de código. Seleção: a árvore já transformada é, então, utilizada
para geração de código Java.
5. Ouput Language Syntax Tree – Representa a árvore resultante da geração de código
da etapa anterior.
6. Writer – Escreve no sistema de arquivos a árvore resultante da geração de código.
Realiza o processo inverso do parser.
7. Output Docs – Representa o arquivo resultante (.java) do processo de geração de
código.
Após a geração da classe, caso desejado, um JFrame de teste pode ser
automaticamente renderizado juntamente com a barra de menu gerada para visualização do
resultado obtido. Porém, como esta funcionalidade necessita de compilar e executar as classes
geradas (barra de menu e janela de teste), é necessário que os programas “javac” e “java”
estajam disponíveis através das variáveis de ambiente do sistema operacional em questão.
XSwingMenu faz uso das seguintes ferramentas livres para automatização de builds,
manipulação e transformação de documentos XML:
• Apache Ant (automatização do build e execução)
• Apache Xerces2 Java Parser 2.5.0 (parser XML)
• Apache Xalan-Java version 2.6.0 (processador XSLT)
31
Além da geração de código, que é o principal propósito da ferramenta, XSwingMenu
também provê um mecanismo de engenharia reversa, ou seja, geração de documentos XML a
partir de um objeto já existente (ver detalhes no item 5.5).
Portanto, XSwingMenu pode ser utilizado tanto em aplicações já existentes quanto em
novas aplicações o que representa uma maior abrangência de situações para criação e
manipulação de barras de menu em Java Swing.
5.2 Especificação da linguagem
A seguir será mostrada uma especificação detalhada do esquema da linguagem XML
de entrada aceita pelo XSwingMenu.
5.2.1 Descrição dos elementos
Elemento Descrição
<menubar> Elemento raiz do documento. Representa uma barra de menu e
todos os seus itens. Por ser elemento raiz, possui o nome da classe
a ser gerada e seu respectivo package. Classe Swing
correspondente: javax.swing.JMenuBar
<menu> Representa um menu da barra de menu. É nele que estão presentes
os demais componentes. Classe Swing correspondente:
javax.swing.JMenu
<menuitem> Representa um item de menu. Seus eventos de ação são
automaticamente tratados. Classe Swing correspondente:
javax.swing.JMenuItem
<checkboxmenuitem> Representa um item de menu com checkbox. Seus eventos de ação
e alteração de estado são automaticamente tratados. Classe Swing
correspondente: javax.swing.JCheckboxMenuItem
<radiobuttonmenuitem> Representa um item de menu com radiobutton. Geralmente está
contido em um <grupo> para que no máximo um item do grupo
esteja selecionado. Seus eventos de ação e alteração de estado são
32
automaticamente tratados. Classe Swing correspondente:
javax.swing.JRadioButtonMenuItem
<grupo> Corresponde a um grupo de radiobutton´s. Permite apenas que um
de seus agrupados esteja selecionado. Classe Swing
correspondente: javax.swing.ButtonGroup.
<separador> Representa um separador entre itens de um <grupo> ou <menu>.
Corresponde a chamada do método addSeparator() do container
em questão.
Tabela 1 Descrição dos elementos da linguagem
5.2.2 Elementos
Elemento Elementos filhos Atributos
<menubar> <menu> id, package
<menu> <separador>, <menuitem>,
<checkboxmenuitem>, <menu>,
<radiobuttonmenuitem>, <grupo>
id (opcional), texto,
descricao, icone, mnemonico,
ativado
<menuitem> nenhum id, texto, descricao, icone,
mnemonico, ativado,
acelerador, selecionado
<checkboxmenuitem> nenhum id, texto, descricao, icone,
mnemonico, ativado,
acelerador, selecionado,
selecionado
<radiobuttonmenuitem> nenhum id, texto, descricao, icone,
mnemonico, ativado,
acelerador, selecionado,
selecionado
<grupo> <radiobuttonmenuitem>,
<separador>
id (opcional)
<separador> nenhum nenhum
Tabela 2 Elementos da linguagem
33
5.2.3 Descrição dos atributos
Atributo Descrição
id Utilizado como identificador único dentro do documento XML. Na geração de
código, este atributo se torna o identificador do componente em questão.
package Refere-se ao package da classe a ser gerada.
texto Corresponde ao método setText(...) do componente em questão, ou seja, o texto
exibido pelo componente.
descricao Representa um “tooltip” que é uma mensagem exibida quando o ponteiro do
mouse aponta para o componente. Corresponde ao método setToolTip(...) do
componente em questão.
icone Utilizado para indicar o caminho onde um ícone (imagem JPEG ou GIF) pode
ser encontrado. Método correspondente: setIcon(new ImageIcon(...))
docomponente em questão.
mnemonico Usado para indicar o mnemonico do componente em questão. Método
correspondente: setMnemonic(java.awt.event.KeyEvent.VK_...).
acelerador Representa um conjunto de teclas para acelerar o acionamento do componente.
Método correspondente: setAccelerator(javax.swing.KeyStroke.getKeyStroke("
... ")).
selecionado Indica se o item deve estar selecionado ou não no momento da inicialização.
Método correspondente: setSelected(...).
ativado Indica se o item deve estar ativado ou não no momento da inicialização. Método
correspondente: setEnabled(...).
Tabela 3 Descrição dos atributos da linguagem
5.2.4 Atributos
Atributo Tipo Uso Exemplo
id xs:ID obrigatório "btn_abrir"
package xs:string opcional “meuprojeto.menu”
texto xs:string opcional “Abrir”
descricao xs:string opcional “Clique aqui para abrir um arquivo.”
icone xs:string opcional “icones/Open16.gif”
34
mnemonico mnemonicos* opcional “A”
acelerador xs:string opcional "control A"
selecionado xs:boolean opcional “true”, “1”
ativado xs:boolean opcional “false”, “0”
Tabela 4 Atributos da linguagem
A coluna “Tipo” da tabela acima representa os tipos primitivos ou não utilizados para
restringir o universo de valores aceito pelo atributo.
* O tipo mnemonicos é uma restrição criada a partir do tipo xs:string que permite
apenas os caracteres utilizados na tabela de mnemonicos contida na classe
java.awt.event.KeyEvent (Documentação disponível em : http://java.sun.com/j2se/1.4.2/docs/
api/java/awt/event/KeyEvent). Obs: Os caracteres iniciais (“VK_”) presentes em todos os
mnemonicos devem ser omitido pois já são incluidos automaticamente na geração da classe.
5.3 Estrutura de classes simplificada
Para a criação da ferramenta foram desenvolvidos os seguintes pacotes com suas
respectivas classes:
Figura 12 Estrutura de classes simplificada
35
O pacote engine é o responsável pela validação, transformação e geração de
documentos XML. Já o pacote gui é responsável pela interface com o usuário. O pacote util
possui apenas classes utilitárias.
A interface gráfica se relaciona com o motor (engine) da ferramenta através das
classes XSMEngine e XSMGerador. A classe XSMEngine possui referência as classes
XSMValidador e XSMTransformador, portanto é responsável pela parte de validação e
geração de código. Já a classe XSMGerador, que faz uso das classes XSMAtributo e
XSMElemento, é utilizada para a geração de documentos XML a partir de um objeto
javax.swing.JMenuBar.
5.4 Tratamento de eventos
A ferramenta XSwingMenu ao gerar uma classe Java a partir de um documento XML
provê automaticamente suporte ao tratamento de eventos dos componentes: JMenuItem,
JRadioButtonMenuItem e JCheckboxMenuItem.
Esse tratamento é feito da seguinte forma: A classe gerada já possui 4 tipos de
construtores (construtor padrão, construtor com ActionListener, construtor com ItemListener
e construtor com ActionListener e ItemListener).
Quando o usuário, em sua aplicação, utiliza um dos construtores para inicializar sua
barra de menu, ele estará atrelando o ActionListener e/ou ItemListener passado como
parâmetro a todos os componentes JMenuItem (somente ActionListener),
JRadioButtonMenuItem (ActionListener e ItemListener) e JCheckboxMenuItem (somente
ItemListener).
Para facilitar na identificação da origem do evento, todos os componentes com eventos
automaticamente tratados terão na propriedade ActionCommand (presente em todos os objetos
que estendem javax.swing.JMenuItem) o valor do atributo id do componente presente no
documento XML mais a string “AC”. Além disso, a classe gerada possuirá todos esses valores
em constantes estáticas com o intuito de simplificar a obtenção desses valores.
36
Desta maneira, boa parte da necessidade de tratamento de eventos estará coberta no
caso de barras de menu. Entretanto, caso em alguma situação esta abordagem de tratamento
de evento não seja adequada, uma maneira de resolver isto seria estender a classe gerada e a
partir desta nova classe (que terá acesso a todos os atributos da classe gerada, visto que eles
são todos protected) codificar o que for necessário.
5.5 Gerador de documentos XML
Para que barras de menu já existentes em Java Swing possam ser reutilizadas pela
ferramenta, foi desenvolvido um mecanismo de geração de documentos XML (seguindo a
especificação aceita pelo XSwingMenu) a partir de um objeto javax.swing.JMenuBar.
Esta funcionalidade pode ser acionada a partir do arquivo build.xml via Ant. Para isso,
primeiramente deve-se configurar o arquivo build.xml para referenciar o classpath da classe
alvo e também alterar a classe xswingmenu.gui.GeradorXML para instanciar um objeto da
classe em questão. O resultado desta geração poderá ser encontrado na pasta “gerados” da
ferramenta.
Em suma, o gerador percorre todos os componentes do objeto JMenuBar em questão,
identifica os seus tipos e propriedades abordados pelo XSwingMenu e gera uma árvore DOM
que em seguida é materializada em um documento XML. Portanto, as propriedades que não
são abordadas pela ferramenta serão descartadas.
5.6 Comparação entre XSwingMenu-0.2 e SwiXml-1.2
Para mostrar as principais diferenças entre XSwingMenu e SwiXml, será feito um
quadro comparativo das principais características de cada ferramenta. É importante ressaltar
que o objetivo desta comparação é apenas demonstrar que a utilização de XML para
desenvolvimento de interfaces gráficas pode ser feita de diversas maneiras, cada uma mais ou
menos apropriada de acordo com a situação e escopo abordados.
37
XSwingMenu-0.2 SwiXml-1.2
Escopo Barras de menu Quase todos os componentes do pacote
javax.swing
Geração de código Sim Não. Componentes são renderizados em
tempo de execução
Engenharia reversa Sim Não
Necessário adição
de biblioteca a
aplicação
Não Sim (apenas 40 Kb de tamanho)
Tratamento de
eventos
Via construtor ou
herança da classe
gerada
O acesso aos componentes (atributos) é feito
por atributos públicos de uma classe auxiliar.
A partir daí que os eventos podem ser
tratados.
Tabela 5 Comparação entre XSwingMenu e SwiXml
Mais uma vez, vale salientar que esta comparação entre as duas ferramentas só seria
válida se o escopo do problema fosse somente barras de menu.
38
6 UM EXEMPLO UTILIZANDO XSWINGMENU
O objetivo deste capítulo é mostrar um exemplo passo-a-passo de como a ferramenta
XSwingMenu pode ser usada para gerar uma barra de menu através de um documento XML
simples.
6.1 Requerimentos
Para execução deste exemplo, se faz necessário que a máquina local tenha instalada
uma JDK 1.4 ou superior. Além disso, seria opcional a utilização da ferramenta Ant
proveniente do projeto Apache, visto que o XSwingMenu possui um arquivo build.xml,
produzido para ser usado juntamente com o Ant, que visa automatizar o processo de
compilação e execução do programa. Caso o usuário pretenda utilizar a opção de criação de
teste automatizado, deve-se assegurar que os programas “javac” e “java” estejam disponíveis.
O JDK pode ser baixado gratuitamente pelo site da Sun Microsystems. Já o Ant pode
ser encontrado no site do projeto Apache. Ferramentas para desenvolvimento Java, como
Netbeans e Eclipse, possuem em sua maioria suporte ao Ant.
6.2 Criação da especificação do Menu
Neste exemplo será criado uma barra de menu simples contendo um menu “Arquivo”
com alguns elementos clássicos como “Abrir”, “Salvar” e “Sair”. Além disso, um grupo de
radiobutton´s foi adicionado para tornar o exemplo mais interessante. A seguir, a
especificação de acordo com o esquema definido:
<?xml version="1.0" encoding="UTF-8" ?> <menubar id ="Exemplo1" > <menu texto="Arquivo" mnemonico="O"> <menuitem id="abrir" texto="Abrir" mnemonico="A"/> <separador/> <menuitem id="salvar" texto="Salvar" mnemonico="S"/> <separador/> <menu texto="Arquivos em uso..."> <grupo> <radiobuttonmenuitem texto="Arquivo1.xml"/>
39
<radiobuttonmenuitem texto="Arquivo2.xml" selecionado="true"/> </grupo> </menu> <separador/> <menuitem id="abrir" texto="Sair" mnemonico="R"/> <separador/> </menu> </menubar>
Figura 13 Exemplo de documento de XML de entrada
Esta especificação foi armazenada no arquivo Exemplo1.xml. Para fins de
demonstração, foi incluído propositalmente um erro na especificação do documento. O erro é
a utilização do id = “abrir” em dois elementos do documento (o que não é permitido).
6.3 Iniciando o XSwingMenu
Após criado o arquivo XML, pode-se iniciar a ferramenta. Uma maneira fácil é iniciar
a ferramenta através do arquivo build.xml utilizando Ant do projeto Apache. Outra maneira
seria executar a classe xswingmenu.gui.JFramePrincipal, não esquecendo de adicionar as
bibliotecas presentes na pasta lib da ferramenta.
6.4 Validando o arquivo XML
Com a ferramento rodando, basta que o usuário indique o arquivo a ser validado. Após
selecionado o arquivo Exemplo1.xml, o seu conteúdo será exibido pela ferramenta. Para
iniciar o processo de validação o usuário deve pressionar o botão “Validar” presente na parte
inferior da tela. A seguir uma demonstração:
40
Figura 14 Exemplo de erro de validação de um documento XML
Conforme exposto anteriormente, a especificação do documento está incorreta visto
que há dois identificadores (id) com o mesmo nome em elementos diferentes. Com a presença
de erros, a ferramenta indica em que parte do documento o erro foi encontrado (parte
selecionada em vermelho) e exibe as mensagens de erro geradas pelo Validador. Vale lembrar
que estas mensagens são geradas pela biblioteca Xerces no processo de validação de um
documento XML por um determinado W3C XML Schema.
Corrigindo-se os erros encontrados pelo validador (através da troca do valor do
atributo id do último menuitem para “sair”) e iniciando novamente o processo de validação,
41
uma mensagem é apresentada ao usuário informando que o documento XML é válido e que o
processo de transformação (ou seja, geração de código) pode ser realizado.
6.5 Transformando o arquivo XML em classe Java
Para transformar um arquivo XML qualquer é necessário que este seja válido. Por esse
motivo, a ferramenta só dispõe a GUI referente a transformação após a validação do arquivo
XML. Sendo esta condição satisfeita, o usuário pode escolher o diretório onde será gerada a
classe Java correspondente à especificação presente no arquivo XML e iniciar o processo de
transformão através do botão “Transformar”, como mostra a figura abaixo:
42
Figura 15 Exemplo de transformação bem sucedida
6.6 Resultado
A transformação da etapa anterior resultou na seguinte classe Java:
/* * Exemplo1.java * * Codigo gerado automaticamente pelo XSwingMenu 0.2 * Francisco Hillesheim - [email protected] */ public class Exemplo1 extends javax.swing.JMenuBar { protected javax.swing.JMenu menuN400005;
43
protected javax.swing.JMenu menuN400017; protected javax.swing.JMenuItem abrir; protected javax.swing.JMenuItem salvar; protected javax.swing.JMenuItem sair; protected javax.swing.JRadioButtonMenuItem r1; protected javax.swing.JRadioButtonMenuItem r2; protected java.awt.event.ActionListener actionListener; protected java.awt.event.ItemListener itemListener; public static final String abrirAC = "abrir"; public static final String salvarAC = "salvar"; public static final String sairAC = "sair"; public static final String r1AC = "r1"; public static final String r2AC = "r2"; public Exemplo1() { this.actionListener = null; this.itemListener = null; inicializaComponentes(); } public Exemplo1(java.awt.event.ActionListener al) { this.actionListener = al; this.itemListener = null; inicializaComponentes(); } public Exemplo1(java.awt.event.ItemListener il) { this.actionListener = null; this.itemListener = il; inicializaComponentes(); } public Exemplo1(java.awt.event.ActionListener al, java.awt.event.ItemListener il) { this.actionListener = al; this.itemListener = il; inicializaComponentes(); } private void inicializaComponentes() { menuN400005 = new javax.swing.JMenu(); menuN400005.setText("Arquivo"); menuN400005.setMnemonic(java.awt.event.KeyEvent.VK_O); this.add(menuN400005); abrir = new javax.swing.JMenuItem(); abrir.setText("Abrir"); abrir.setMnemonic(java.awt.event.KeyEvent.VK_A); abrir.setActionCommand(abrirAC); if (actionListener != null) { abrir.addActionListener(actionListener); } menuN400005.add(abrir); menuN400005.addSeparator();salvar = new javax.swing.JMenuItem(); salvar.setText("Salvar"); salvar.setMnemonic(java.awt.event.KeyEvent.VK_S); salvar.setActionCommand(salvarAC); if (actionListener != null) {
44
salvar.addActionListener(actionListener); } menuN400005.add(salvar); menuN400005.addSeparator(); menuN400017 = new javax.swing.JMenu(); menuN400017.setText("Arquivos em uso..."); menuN400005.add(menuN400017); javax.swing.ButtonGroup grupoN40001A = new javax.swing.ButtonGroup(); r1 = new javax.swing.JRadioButtonMenuItem(); r1.setText("Arquivo1.xml"); r1.setActionCommand(r1AC); if (actionListener != null) { r1.addActionListener(actionListener); } if (itemListener != null) { r1.addItemListener(itemListener); } grupoN40001A.add(r1); menuN400017.add(r1); r2 = new javax.swing.JRadioButtonMenuItem(); r2.setText("Arquivo2.xml"); r2.setSelected(true); r2.setActionCommand(r2AC); if (actionListener != null) { r2.addActionListener(actionListener); } if (itemListener != null) { r2.addItemListener(itemListener); } grupoN40001A.add(r2); menuN400017.add(r2); menuN400005.addSeparator();sair = new javax.swing.JMenuItem(); sair.setText("Sair"); sair.setMnemonic(java.awt.event.KeyEvent.VK_R); sair.setActionCommand(sairAC); if (actionListener != null) { sair.addActionListener(actionListener); } menuN400005.add(sair); menuN400005.addSeparator(); } }
Figura 16 Classe gerada a partir do arquivo Exemplo1.xml
Com a seguinte classe de teste (caso desejado teste automático):
import java.awt.event.*; import javax.swing.*; public class Exemplo1Teste extends JFrame implements ActionListener, ItemListener { public static void main(String[] args) throws Exception { javax.swing.JFrame frame = new Exemplo1Teste();
45
frame.setTitle("XSwingMenu Teste"); frame.setSize(frame.getToolkit().getScreenSize()); frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); javax.swing.JMenuBar barra = new Exemplo1((ActionListener)frame, (ItemListener)frame); frame.setJMenuBar(barra); frame.show(); } public void actionPerformed(java.awt.event.ActionEvent e) { JOptionPane.showMessageDialog(this, "'" + e.getActionCommand() + "' foi ACIONADO."); } public void itemStateChanged(java.awt.event.ItemEvent e) { String item = "'" + ((javax.swing.JMenuItem) e.getItem()).getActionCommand() + "'"; item += " foi "; item += (e.getStateChange() == e.SELECTED) ? "SELECIONADO" : "DESELECIONADO"; javax.swing.JOptionPane.showMessageDialog(this, item); } }
Figura 17 Exemplo de classe de teste gerada automaticamente
A seguir, a renderização do JFrame de teste:
Figura 18 Renderização da classe gerada
46
7 CONCLUSÃO
O produto final deste trabalho, XSwingMenu, representa mais uma maneira de se
abordar um ponto crítico, com relação a produtividade, no desenvolvimento de software: a
criação e manutenção de interfaces gráficas de usuário. Deve-se considerar, claro, que
XSwingMenu não é uma ferramenta completa para solução de problema, e sim, para um
determinado escopo: barras de menu da biblioteca Java Swing.
Neste sentido, a ferramenta desenvolvida atendeu o objetivo principal proposto por
esse trabalho, o de simplificar a vida do desenvolvedor de software na criação de barras de
menu. Como exemplo disso, visto no capítulo 6, pode-se verificar por meio do número de
linhas utilizadas e organização dos elementos entre o documento XML de entrada e a classe
Java gerada que o documento XML é mais claro e conciso na representação de uma barra de
menu.
Por outro lado, este trabalho foi enriquecedor por permitir o contato, na prática, com
diversas tecnologias relaciandas a XML como XML Schema, XSLT, XPATH, XML
Namespace, DOM, SAX, entre outras. Estas siglas, que anteriormente representavam uma
“sopa de letras”, agora possuem seus propósitos mais claros que certamente serão levados em
conta para a resolução de futuros desafios profissionais.
7.1 Trabalhos futuros
Para continuidade e aperfeiçoamento deste trabalho, existem algumas sugestões que
podem ser desenvolvidas. Entre estas sugestões, pode-se destacar:
Ampliação do escopo abordado: Neste trabalho, o escopo foi somente barras de
menu. Pode-se, por meio de alterações basicamente do XML Schema e scripts XSLT
produzidos, aumentar este escopo para, por exemplo, abranger popup menus ou qualquer
outro componente de GUI.
47
Geração de código para outras bibliotecas: Um trabalho interessante seria alterar o
processo de geração de código via XSLT para produzir não só objetos Java Swing, e sim
objetos de qualquer biblioteca de qualquer linguagem desejado. Um exemplo seria a geração
de objetos SWT (que estão sendo amplamente utilizados) a partir do XSwingMenu.
Adição de um editor XML ao XSwingMenu: Para aumentar a produtividade e
simplificar o processo de criação de documentos XML para o XSwingMenu, a adição de um
editor XML a ferramenta traria maior comodidade ao desenvolvedor visto que todo o
processo poderia ser abordado dentro da própria ferramenta.
Realizar pesquisa bibliográfica mas aprofundada sobre XUL: A questão da
utilização de XML no desenvolvimento de interfaces gráficas está em alta nestes últimos.
Com o lançamento iminente da nova versão do Microsoft Windows (LongHorn) e a crescente
utilização do XUL proveniente do projeto Mozilla, este tema provavelmente será alvo de mais
discussões sobre suas vantagens e desvantagens. Além disso, várias ferramentas (gratuitas ou
não) foram e estão sendo desenvolvidas baseadas nesta tendência, o que justificaria uma
pesquisa bibliográfica mais completa sobre esta área.
48
8 REFERÊNCIAS BIBLIOGRÁFICAS
SAKAR, Soumen; CLEAVELAND, Craig. Code. Generation Using XML Based
Document Transformation, Novembro, 2001. Disponível em: <http://www.theserverside.
com/articles/content/XMLCodeGen/xmltransform.pdf>. Acesso em: 27 outubro 2004.
DUCHARME, Bob. XSLT guia prático. Tradução:Kirten Woltmann. Rio de Janeiro:
Ciência Moderna Ltda, 2002.
BOJANIC, Peter. The Joy of XUL, Dezembro, 2003. Disponível em:
<http://www.mozilla.org/projects/xul/joy-of-xul.html>. Acessado em: 10 de setembro de
2004.
MICROSOFT. "Longhorn" Markup Language (code-named "XAML") Overview.
Disponível em: <http://longhorn.msdn.microsoft.com/lhsdk/core/overviews/
about%20xaml.aspx>. Acessado em: 20 de outubro de 2004.
SUN MICROSYSTEMS, INC. Java Technology. Disponível em: <http://java.sun.com>.
Acessado em: 23 de setembro de 2004.
SUN MICROSYSTEMS, INC. How to Use Menus. Disponível em: <http://java.sun.com
/docs/books/tutorial/uiswing/components/menu.html>. Acessado em: 15 de setembro de 2004.
MCFARLANE, Nigel. New GUIs: XML Is the Heir Apparent, Outubro, 2002. Disponível
em: < http://www.devx.com/DevX/Article/9605>. Acessado em: 15 de setembro de 2004.
IBM.. developerWorks : XML: New to XML. Disponível em <http://www-106.ibm.com/
developerworks/xml/newto/>. Acessado em: 22 de setembro de 2004.
VLIST, Eric van der. Comparing XML Schema Languages. Disponível em:
<http://www.xml.com/pub/a/2001/12/12/schemacompare.html>. Acessado em: 23 de
setembro de 2004.
49
VLIST, Eric van der. Using W3C XML Schema. Disponível em:
<http://www.xml.com/pub/a/2000/11/29/schemas/part1.html>. Acessado em: 23 de setembro
de 2004.
OPEN XUL ALLIANCE. Open XUL Alliance – Creating A Rich Internet for Everyone.
Disponível em <http://xul.sourceforge.net/>. Acessado em: 15 de outubro de 2004.
W3C. World Wide Web Consortium. Disponível em: <http://www.w3c.org/>. Acessado
em: 8 de outubro de 2004.
W3C. Extensible Markup Language (XML) 1.0 (Third Edition). Disponível em:
<http://www.w3c.org/TR/2004/REC-xml-20040204/>. Acessado em: 20 de setembro de
2004.
W3C. W3C XML Schema. Disponível em: < http://www.w3.org/XML/Schema>. Acessado
em: 20 de setembro de 2004.
W3C. XSL Transformations (XSLT). Disponível em: <http://www.w3.org/TR/xslt>.
Acessado em: 20 de setembro de 2004.
THE APACHE XML PROJECT. Xerces Java Parser Readme. Disponível em:
<http://xml.apache.org/xerces-j/>. Acessado em: 1 de outrubro de 2004.
THE APACHE XML PROJECT. Xalan-Java version 2.6.0. Disponível em:
<http://xml.apache.org/xalan-j/>. Acessado em: 1 de outrubro de 2004.
WIKIPEDIA. Wikipedia, the free encyclopeia. Disponível em:
<http://en.wikipedia.org/wiki/Main_Page>. Acessado em: 28 de setembro de 2004.
PAULUS, Wolf. SwiXml. Disponível em: <http://www.swixml.org/>. Acessado em: 1 de
setembro de 2004.