Universidade Federal do Maranhão Centro de Ciências Exatas e Tecnologia Curso de Ciência da Computação ROBERTO GERSON DE ALBUQUERQUE AZEVEDO NCL Eclipse: editor textual para desenvolvimento de programas Hipermı́dia Interativos em NCL São Luı́s 2008 ROBERTO GERSON DE ALBUQUERQUE AZEVEDO NCL Eclipse: editor textual para desenvolvimento de programas Hipermı́dia Interativos em NCL Monografia apresentada ao Curso de Ciência da Computação da UFMA, como requisito parcial para a obtenção do grau de BACHAREL em Ciência da Computação. Orientador: Mário Antonio Meireles Teixeira Doutor em Ciência da Computação – UFMA Co-orientador: Carlos de Salles Soares Neto Mestre em Informática – PUC-Rio São Luı́s 2008 Azevedo, Roberto Gerson de Albuquerque NCL Eclipse: editor textual para desenvolvimento de programas Hipermı́dia Interativos em NCL / Roberto Gerson de Albuquerque Azevedo - 2008 45.p 1.Ciência da Computação 2. Sistemas Hipermı́dia 3. Nested Context Language 4. Editor Textual. I.Tı́tulo. ROBERTO GERSON DE ALBUQUERQUE AZEVEDO NCL Eclipse: editor textual para desenvolvimento de programas Hipermı́dia Interativos em NCL Monografia apresentada ao Curso de Ciência da Computação da UFMA, como requisito parcial para a obtenção do grau de BACHAREL em Ciência da Computação. Aprovado em 10 de julho de 2008 BANCA EXAMINADORA Mário Antonio Meireles Teixeira Doutor em Ciência da Computação – UFMA Anselmo Cardoso de Paiva Doutor em Informática – UFMA Maria Auxiliadora Freire Mestre em Engenharia Civil – UFMA À meus pais. Aos meus irmãos e à minha irmãzinha querida. Agradecimentos Agradeço à minha famı́lia e a todos que direta ou indiretamente guiaram os meus passos até este momento. Em especial, às duas pessoas que sempre estiveram presentes na minha vida, os quais tive a sorte grande de ter como pais. Agradeço e dedico à minha mãe, Virgı́nia Carminda de Paula Albuquerque Azevedo – pessoa a quem admiro e amo bastante principalmente por ser sempre companheira, amiga, conselheira, carinhosa e amorosa – e à meu pai, José Tarcı́sio Braga de Azevedo – a quem não deixo de admirar e amar da mesma forma, por ser quem me ensinou e me ensina até hoje, principalmente através do seu exemplo, a viver dignamente, a ter caráter e a respeitar o próximo. Agradeço também a todos os professores do Departamento de Informática. Em especial, aos meus orientadores, Carlos de Salles e Mário Meireles, com quem tive a honra e o prazer de trabalhar. Ambos, sempre acreditaram neste trabalho e ofertaram muitos conselhos sábios, o que facilitou muito a sua realização. Resumo Uma boa ferramenta é essencial para se desenvolver aplicações de forma rápida e confiável. Como não poderia ser diferente, isto também se aplica às linguagens hipermı́dia declarativas, entre as quais está a linguagem padrão para desenvolvimento de programas do Sistema Brasileiro de Televisão Digital Terrestre (SBTVD-T): a NCL - Nested Context Language. Esta monografia apresenta um editor textual que visa auxiliar o desenvolvimento de aplicações em NCL, desenvolvido na forma de um plug-in para a IDE Eclipse. Este editor textual, denominado NCL Eclipse traz funcionalidades como auto-completação de código automática e contextual, validação de documentos escritos em NCL e/ou XConnector, coloração de tags XML e palavras reservadas da linguagem, dentre outras. Palavras-chaves: Sistemas Hipermı́dia, NCL, editor textual, plug-in, Eclipse. Abstract A good development tool is essential to a quick and reliable applications development. It is also useful to hypermedia declarative languages, like the standard language to Brazilian Terrestrial Digital Television System (SBTVD-T) programs development - Nested Context Language (NCL). This work presents a textual editor to aid the application development in NCL, developed as an Eclipse plug-in. This textual editor is called NCL Eclipse and has various functionalities, such as contextual automatic completion, document validation, syntax colorization and so on. Keywords: Hypermedia Systems, NCL, textual editor, plug-in, Eclipse. “Se você acha que pode, está certo. Se você acha que não pode, também está certo.”. Henry Ford Sumário Lista de Figuras 8 Lista de Siglas 10 1 Introdução 11 1.1 Estrutura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2 Trabalhos Relacionados 14 2.1 Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2 Grins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.3 SMOX Pad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3 A Linguagem NCL 18 3.1 Linguagens Hipermı́dia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2 Linguagens Procedurais X Linguagens Declarativas . . . . . . . . . . . . . 19 3.3 NCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3.1 Módulos e Perfis NCL . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.4 Conceitos básicos em NCL . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.5 A estrutura de um documento NCL . . . . . . . . . . . . . . . . . . . . . . 23 3.6 NCL e a TV Digital 4 Validador NCL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 28 4.1 Validacão com XML Schema . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2 Processo NCL Validator 3.0 . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.3 Implementação do Processo NCL Validator 3.0 . . . . . . . . . . . . . . . . 31 4.3.1 NCL Validator 3.0 - Front End . . . . . . . . . . . . . . . . . . . . 32 4.3.2 Reutilização do NCL Validator 3.0 . . . . . . . . . . . . . . . . . . 32 5 Ambiente Eclipse 5.1 Conceitos básicos no Ambiente Eclipse . . . . . . . . . . . . . . . . . . . . 36 5.1.1 5.2 36 Perspectivas, Visões e Editores . . . . . . . . . . . . . . . . . . . . 36 Visão geral da arquitetura do Eclipse . . . . . . . . . . . . . . . . . . . . . 38 5.2.1 Infra-estrutura dos Plug-ins . . . . . . . . . . . . . . . . . . . . . . 39 5.2.2 SWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 5.2.3 JFace 5.2.4 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2.5 Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2.6 Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.3 Criação de plug-ins para o Eclipse . . . . . . . . . . . . . . . . . . . . . . . 43 5.4 Um Exemplo: Java Perspective . . . . . . . . . . . . . . . . . . . . . . . . 44 5.4.1 Criando um projeto -New Project Wizard . . . . . . . . . . . . . . . 45 5.4.2 Editor Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6 NCL Eclipse 48 6.1 Levantamento de Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6.2 Funcionalidades Implementadas . . . . . . . . . . . . . . . . . . . . . . . . 49 6.3 Infra-estrutura 6.4 Funcionamento do NCL Eclipse . . . . . . . . . . . . . . . . . . . . . . . . 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.4.1 NCL Wizard e Connector Base Wizard . . . . . . . . . . . . . . . . 51 6.4.2 Coloração sintática . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.4.3 Outline view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 6.4.4 Folding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6.4.5 Autocomplete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6 6.4.6 Integração NCL Eclipse e NCL Validator . . . . . . . . . . . . . . . 59 6.4.7 Execução de um documento NCL - Integração NCL Eclipse e Ginga Emulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 7 Considerações Finais 62 Referências Bibliográficas 64 Glossário 67 A NCL Eclipse - Diagrama de Classes e Pontos de Extensão 70 Lista de Figuras 2.1 Visões do Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2 SMOX Pad, um editor textual para a linguagem SMIL . . . . . . . . . . . 17 3.1 Nós, elos e nós de composição. Fonte: [Neto et al. 2007] 3.2 Estrutura da linguagem NCL - Exemplo de código . . . . . . . . . . . . . . 24 3.3 Arquitetura do middleware Ginga. . . . . . . . . . . . . . . . . . . . . . . . 27 4.1 Ilustração do Processo NCL Validator . . . . . . . . . . . . . . . . . . . . . 30 4.2 Diagrama de sequência da implementação do NCL Validator 3.0 . . . . . . 31 4.3 NCL Validator 3.0 sendo utilizado como front-end . . . . . . . . . . . . . . 33 4.4 Reutilizando o NCL Validator 3.0 - Exemplo de código . . . . . . . . . . . 34 4.5 NCL Validator sendo reutilizado pelo Composer . . . . . . . . . . . . . . . 35 5.1 Java Perspective - identificação de algumas visões e do editor Java. . . . . 37 5.2 Java Perspective - Menu do topo e barra de ferramentas . . . . . . . . . . 37 5.3 Java Perspective - exemplos de menus contextuais . . . . . . . . . . . . . . 38 5.4 Arquitetura do ambiente Eclipse. Fonte: [Eclipse Foundation 2008] . . . . 39 5.5 PDE - wizard para a criação de plug-ins . . . . . . . . . . . . . . . . . . . 44 5.6 PDE - gerenciamento de dependências . . . . . . . . . . . . . . . . . . . . 44 5.7 PDE - gerenciamento de pontos de extensão . . . . . . . . . . . . . . . . . 45 5.8 Exemplo de um arquivo .project . . . . . . . . . . . . . . . . . . . . . . . . 45 5.9 Editor Java - evidenciando autocomplete. . . . . . . . . . . . . . . . . . . . 47 6.1 Diagrama do NCL Eclipse interligado com o Eclipse . . . . . . . . . . . . . 50 6.2 Criação de um novo documento NCL . . . . . . . . . . . . . . . . . . . . . 51 . . . . . . . . . . 23 6.3 Criação de um novo documento NCL . . . . . . . . . . . . . . . . . . . . . 52 6.4 Fragmento do plugin.xml que define os wizards . . . . . . . . . . . . . . . . 53 6.5 Coloração sintática e Outline View . . . . . . . . . . . . . . . . . . . . . . 54 6.6 Colapsar (Folding) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6.7 Principais partições do XML definidas pelo NCL Eclipse . . . . . . . . . . 56 6.8 Autocomplete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 6.9 Autocomplete – sugestão de referências . . . . . . . . . . . . . . . . . . . . 58 6.10 Marcação de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.11 Execução de um documento NCL . . . . . . . . . . . . . . . . . . . . . . . 61 A.1 Diagrama de classes do NCL Eclipse - visão geral . . . . . . . . . . . . . . 71 A.2 Diagrama especı́fico da implementação dos Wizards . . . . . . . . . . . . . 72 A.3 Diagrama de classes especı́fico da implementação da visão Outline . . . . . 72 A.4 Diagrama de classes especı́fico da implementação do parsing NCL, utilizado para manter informações na memória e sugerı́-las quando necessário . . . . 73 A.5 Arquivo plugin.xml - Customização dos pontos de conexão . . . . . . . . . 74 10 Lista de Siglas Para o efeito deste trabalho as seguintes abreviaturas são utilizadas: API Application Programming Interface APT Annotation Processing Tool BDTV Basic Digital Television - é um perfil NCL. Básico TV Digital. DOM Document Object Model DTD Document Type Definition DTV Digital Television DVB Digital Video Broadcasting EDTV Enhanced Digital Television - é um perfil NCL. Avançado TV Digital. HTML Hypertext Markup Language HTTP Hypertext Transfer Protocol IDE Integrated Development Enviroment JDT Java Development Tools NCL Nested Context Language NCM Nested Context Model PDE Plug-in Development Enviroment SBTVD-T Sistema Brasileiro de Televisão Digital Terrestre SDK Standard Development Kit SMIL Synchronized Multimedia Integration Language UI User Interface URI Universal Resource Identifier URL Universal Resource Locator XHTML eXtensible HTML XML Extensible Markup Language WYSIWYG What You See Is What You Get W3C World-Wide Web Consortium 11 1 Introdução A programação textual é tida em muitos casos como mais fácil de entender e natural para os seres humanos interagirem com o computador. Isto é válido mas não pode ser generalizado para todos os casos, conforme demonstrou [Green e Petre 1992]. A avaliação do quão fácil e produtiva é uma linguagem de programação deve também levar em conta o público-alvo ao qual esta linguagem se destina. Para um matemático, por exemplo, pode ser mais natural representar um cı́rculo através do tamanho de seu raio, textualmente, enquanto que para um desenhista, desenhar este mesmo cı́rculo através do mouse ou de uma tela touch screen, de forma visual, pode deixá-lo mais a vontade. Tendo isto em mente, quando se analisa a programação para a TV Digital, é possı́vel distinguir dois públicos-alvo distintos. Os primeiros são os produtores de conteúdo, entre os quais estão os designers, pessoal de arte, de TV, etc. O segundo grupo são programadores. Linguagens visuais, principalmente em um ambiente WYSIWYG, estão mais próximos do primeiro grupo e linguagens textuais – linguagens de programação – são mais naturais para o segundo grupo. Este trabalho foca no desenvolvimento de uma ferramenta que auxilia a programação textual, notadamente mais bem aceita pelos programadores, e visa adicionar funcionalidades que tornem o trabalho de criação de códigos mais produtivo. A especificação de programas de forma textual geralmente é um processo árduo e que requer bastante cuidado, pois um pequeno erro pode fazer com que toda a solucão desenvolvida esteja errada. Isto faz com que sejam necessárias ferramentas para auxiliar neste desenvolvimento. A ferramenta mais utilizada com este objetivo – bem conhecida dos programadores – é a IDE – Integrated Development Enviroment ou Ambiente Integrado de Desenvolvimento. Cada IDE fornece um conjunto de funcionalidades para um determinado grupo de usuários. São exemplos destas funcionalidades: desenvolvimento visual, - através de menus, janelas, ou mesmo com desenhos, dependendo da linguagem à qual a IDE auxilia - editores de texto com coloração de sintaxe, auto-completação de código, etc. validação de código-fonte e indicação de erros sintáticos e semânticos. Existem também ambientes de programação, onde o programador utiliza-se de 1.1 Estrutura 12 formulários para preencher lacunas do programa, sendo que a IDE produz o código-fonte final. Neste tipo de ambiente é possı́vel que também seja necessário alterar o código-fonte de forma textual. Isto porque, geralmente as linguagens, que neste caso são textuais, trazem muito mais possibilidades de especificação de problemas do que as IDEs permitem expressar através do desenvolvimento baseado em formulários. Existem casos também em que o desenvolvedor sente-se mais à vontade para exercer sua função através da especificação textual, o que em muitos casos pode ser mais rápido, principalmente quando o editor o auxilia. A linguagem NCL permite a criação de apresentações hipermı́dia interativas e foi adotada como linguagem declarativa padrão pelo Sistema Brasileiro de TV Digital (SBTVD-T). Por ser uma linguagem relativamente nova e ainda com poucos usuários, a carência de ferramentas para a criação de documentos NCL ainda é grande. O ambiente Composer[Guimarães, Costa e Soares 2007], que será melhor discutido nos trabalhos relacionados, é uma ferramenta que auxilia na criação destes documentos e tem como foco o desenvolvimento visual, ou seja, seu público-alvo principal são os produtores de conteúdo. Embora o Composer possibilite que o autor edite o texto do documento NCL, ele não traz auxı́lio algum com este objetivo. Caracterı́sticas como autocompletação de código e auto-formatação não estão implementadas no Composer. Sendo assim, quando o autor encontra-se em uma situação em que é necessário atuar diretamente no código-fonte do documento, o mesmo terá que fazê-lo sem nenhum auxı́lio da ferramenta. Visando suprir essa necessidade é proposta nesta monografia um editor textual que auxilia o autor na criação de documentos NCL, denominado NCL Eclipse. O NCL Eclipse é implementado como um plug-in para a IDE Eclipse, visando reusar todo este ambiente já consagrado, bem como outros plug-ins. Não é objetivo do NCL Eclipse ser um concorrente do Composer. O principal objetivo é atender uma outra classe de usuários, que possuem conhecimento de NCL e preferem criar documentos hipermı́dia através da especificação textual. 1.1 Estrutura Esta monografia está dividida da seguinte forma: No capı́tulo 2 são apresentados os trabalhos relacionados. No capı́tulo 3 é feito uma visão geral da linguagem NCL. Já no 1.1 Estrutura 13 capı́tulo 4 é discutido o processo de validação de documentos NCL desenvolvido como parte desta monografia e que será reutilizado pelo editor NCL aqui proposto. O capı́tulo 5 apresenta o ambiente Eclipse que serviu como base para a implementação do NCL Eclipse. Seguindo, o capı́tulo 6 discute as caracterı́sticas implementadas no NCL Eclipse e os detalhes desta implementação. Por fim, no capı́tulo 7 apresenta-se a conclusão do trabalho, juntamente com propostas de trabalhos futuros. 14 2 Trabalhos Relacionados Neste capı́tulo são apresentados alguns trabalhos relacionados à esta monografia. 2.1 Composer O Composer é uma ferramenta de autoria hipermı́dia voltada para o desenvolvimento de programas audiovisuais interativos em NCL. Desenvolvido pelo Laboratorio TeleMı́dia da PUC-Rio (Pontifı́cia Universidade Católica do Rio de Janeiro). O Composer encontra-se atualmente na versão 2.2.1. Seu principal objetivo é possibilitar que usuários com pouco conhecimento de NCL possam produzir programas. Para que isso seja possı́vel a filosofia utilizada pelo Composer é a de que o usuário que irá construir o programa poderá fazê-lo através de visões. Cada visão mostra uma parte do programa NCL e uma alteração em uma das visões atualiza automaticamente as outras visões. Existem basicamente 4 visões: Visão Estrutural (1), Visão Temporal (2), Visão de Leiaute (3) e Visão Textual (4), conforme a Figura 2.1. A Visão Estrutural mostra os nós e os elos entre os nós. É através desta visão que se pode criar nós de mı́dia, nós de contexto e elos. A Visão Temporal mostra como o sincronismo temporal está definido pelo documento e quais as opcões de interatividade. A Visão de Leiaute ilustra as regiões definidas pelos elementos region da NCL. Pode-se alterar o tamanho e/ou a posicão das regiões através do mouse, sem a necessidade de especificar os valores das propriedades diretamente. A Visão Textual é um editor de texto que apresenta o código NCL em si. A Visão Textual do Composer, na versão atual é um simples editor de texto XML, com coloracão de tags e valores de atributos. Em [Neto et al. 2007] pode-se encontrar uma introdução à ferramenta Composer. Este tutorial ensina como criar programas interativos utilizando-a. As versões mais atuais da ferramenta bem como a documentação referente a ela podem ser encontradas no site http://www.ncl.org.br. Maiores detalhes sobre o Composer também podem ser encontrados em [Guimarães, Costa e Soares 2007]. A presente monografia se propõe a fazer um editor que poderia ser entendido 2.2 Grins 15 Figura 2.1: Visões do Composer como a Visão Textual do Composer. A maior diferença, entretanto, é que a ferramenta aqui proposta se propõe a ajudar o usuário na medida em que o mesmo está editando o código do documento NCL, o que não existe, pelo menos na versão atual, do Composer. O NCL Eclipse poderá ser utilizado em conjunto com o Composer, mesmo sem nenhuma integracão ainda automatizada. É fácil sugerir aos usuários que se sintam melhor utilizando a Visão Textual do Composer para que migrem para o NCL Eclipse. Visto que com a ferramenta aqui sugerida muitas novas funcionalidades serão adicionandas a um editor de código NCL. 2.2 Grins O GRiNS [Bulterman et al. 1998] é um sistema de autoria e apresentação para documentos SMIL [W3C 2005]. Assim como o Composer, o Grins também é voltado para autores com pouco conhecimento da linguagem hipermı́dia (no caso, SMIL) e também utiliza a abordagem de visões, embora de uma forma um pouco diferente da abordagem 2.3 SMOX Pad 16 do Composer. O GRiNS possui basicamente três visões: Visão de Estrutura Lógica (logical structure view ), Visão de Linha de Tempo Virtual (virtual timeline view ), Visão de ‘Playout’ (playout view ) e Visão Textual (textual view ). A logical structure view permite ao autor construir um documento SMIL em termos de uma hierarquia aninhada de objetos de mı́dia. Nesta visão os atributos dos nós são preenchidos em formulário, representando a grosso modo os nós < par > e < seq >. A virtual timeline view tem o propósito de tornar mais visı́veis relações com os atributos DURATION e REPEAT, que não ficam muito claras na logical structure view. Nesta visão é mostrada a cronometragem lógica das relações calculadas a partir da logical structure view. A playout view ou presentation view permite tocar o documento SMIL, além de permitir alterar dinamicamente os valores dos atributos. A textual view é um simples editor de textos e oferece apenas recursos básicos. A coloração sintática é bem restrita, visto que somente as composições com semântica temporal (<par>, <seq> e <excl>) recebem cor em destaque. A sugestão de código não está presente no GRiNS. Mais informações sobre o GRiNS podem ser encontradas em [Oratrix 2008]. Mais informações sobre SMIL podem ser encontradas em [Refsnes Data 2008]. 2.3 SMOX Pad O SMOX Pad [Manalee 2008] é um editor de texto avançado voltado para a linguagem SMIL. Muitas das caracterı́sticas sugeridas para a ferramenta proposta por esta monografia são suportadas pelo SMOX Pad. Algumas delas são: • Coloração sintática • Auto-completação de código • Identificação de erros O SMOX Pad é uma ferramenta proprietária, produzida pela Manalee. Além do SMOX Pad, a Manalee também possui a ferramenta SMOX Editor, uma ferramenta 2.3 SMOX Pad 17 WYSIWYG para a criação de apresentações SMIL. É possı́vel assim, atingir duas classes de usuários, os que se sentem mais à vontade na criação visual (com o SMOX Editor) e os que se sentem mais à vontade com a especificação textual das apresentações (com o SMOX Pad). A existência do SMOX Pad é mais um indı́cio de que ferramentas que atingem esta classe de usuário são bem recebidas e até mesmo rendáveis no ambiente de criação de documentos Hipermı́dia. Esta é mais uma justificativa para a criação da ferramenta proposta por esta monografia. Uma desvantagem encontrada no SMOX Pad é o fato de que o autocomplete não é contextual em muitos casos. Um exemplo disto é quando estamos definindo um filho de uma tag head e o editor nos sugere head, ou até mesmo body. Fatos estes que não condizem com a especificação do SMIL. Outra desvantagem encontrada no SMOX Pad é o fato de que só existe versão deste para a plataforma Windows. Estes fatos foram levados em conta para a criação do NCL Eclipse. O caráter multiplataforma do ambiente Eclipse foi mais um fator que contribuiu para a sua escolha como base deste trabalho. Figura 2.2: SMOX Pad, um editor textual para a linguagem SMIL 18 3 A Linguagem NCL Neste capı́tulo a estrutura da linguagem NCL é discutida. Primeiramente, se discutirá o que é uma hipermı́dia e o que é uma linguagem hipermı́dia. Posteriormente, o conceito de linguagem declarativa. Por fim, um exemplo de um documento NCL será apresentado, onde serão discutido os principais elementos de NCL. 3.1 Linguagens Hipermı́dia Os conceitos de hipermı́dia e multimı́dia muitas vezes são utilizados como sinônimos, erroneamente. Na realidade, o conceito de hipermı́dia surge da década de 1960, com o filósofo e sociólogo estadunidense Ted Nelson [Nelson 1965], como uma extensão lógica do conceito de hipertexto, na qual áudio, vı́deo, texto e hiperlinks se interrelacionam para criar um meio geral não-linear de informação. Caracterı́stcas como hibridismo, nãolinearidade, interatividade e navegabilidade estão presentes no conceito de hipermı́dia. A multimı́dia, por outro lado, é uma mı́dia que se utiliza de uma combinação de conteúdos em formas diferentes. Uma multimı́dia, geralmente é gravada e tocada ou acessada por dispositivos de processamento de informações. Atualmente a World Wide Web pode ser entendida como um meio hipermı́dia. Contudo, na WWW existe apenas um tipo de hiperlink, o ‘vai-para’. Este hiperlink possibilita apenas que ao se clicar em uma mı́dia que tem a propriedade de hiperlink, o sistema nos leve à outra. Além do hiperlink ‘vai para’ é possı́vel que novos tipos de hiperlinks sejam idealizados, por exemplo, hiperlinks temporais e espaciais. Neste contexto, uma linguagem que permite estruturar estas informações: conteúdo, estrutura e hiperlinks dos mais variados é o que denomina-se linguagem hipermı́dia. Conforme será visto mais a frente, a linguagem NCL dá suporte a estruturação de informações em um sistema hipermı́dia. 3.2 Linguagens Procedurais X Linguagens Declarativas 3.2 19 Linguagens Procedurais X Linguagens Declarativas Existem várias formas de classificar as linguagens de programação. Aqui estamos interessados em uma classificação em particular que distingue as linguagens de programação em linguagens procedurais (ou imperativas) e linguagens declarativas. As linguagens procedurais são aquelas que exigem que o programador especifique explicitamente todos os passos que o programa deve executar. Por outro lado, as linguagens declarativas são aquelas onde o programador especifica uma definição da tarefa a ser executada, sem se preocupar como ‘exatamente’ esta tarefa será executada pelo computador. Em outras palavras pode-se afirmar que a diferença entre linguagens procedurais e declarativas é que, na primeira, se especifica como obter a resposta, enquanto, na segunda, se especificam as condições que devem ser satisfeitas para se obter a resposta. Programação declarativa envolve o que deve ser computado, mas não necessariamente como será computado. As linguagens procedurais, ao necessitarem que sejam especificados todos os passos da execução do programa, terminam por tornar-se complexas para a criação de documentos hipermı́dia. Devido a isso, geralmente utilizam-se linguagens declarativas com este propósito, as quais permitem um maior nı́vel de abstração. Para que estes documentos sejam executados, é necessário um interpretador (ou no caso especı́fico de linguagens hipermı́dia, um formatador ou player ), o qual é o responsável por aplicar um algoritmo pré-definido às especificações feitas para produzir o resultado desejado. A NCL é uma linguagem declarativa que visa a criação de documentos hipermı́dia. A seção a seguir dá uma visão geral da linguagem. 3.3 NCL NCL - Nested Context Language - é uma linguagem declarativa, baseada em XML, para especificação de apresentações hipermı́dia interativas. A NCL tem como base o modelo NCM [Soares e Rodrigues 2005]. Ela age como um elemento de ‘cola’ entre os diversos elementos multimı́dia atômicos, tais como texto, som, vı́deo, imagem, etc. Seu objetivo não é especificar o conteúdo das mı́dias, mas sim como as mı́dias interagem entre si no 3.3 NCL 20 espaço e no tempo, possibilitando assim a separação mais acurada entre o conteúdo e a estrutura. [ABNT 2007, Separar o conteúdo da estrutura é útil na medida em que torna a linguagem NCL bastante ampla, tornando possı́vel que mı́dias de diversos tipos diferentes possam ser relacionadas com o mesmo documento NCL, desde que é claro, o formatador que vá tocar o documento saiba como disparar o tocador daquela mı́dia em particular.] 3.3.1 Módulos e Perfis NCL A linguagem NCL é modular. Isto quer dizer que toda a sua estrutura é dividida em módulos, os quais são especificados através de XML Schema. Especificar a linguagem em módulos provê um maior reuso, visto que tanto podem ser adicionados novos módulos facilmente à linguagem, como os módulos da linguagem podem ser facilmente inseridos em outras linguagens. Um perfil de uma linguagem é uma combinação de módulos. Normalmente, uma linguagem define um perfil que abrange todos os módulos da linguagem, no caso da NCL este é o perfil Linguagem NCL. A NCL também define outros perfis, o perfil BTVD, por exemplo, é um subconjunto do perfil Linguagem NCL, e o perfil ETVD é um perfil que inclui alguns módulos SMIL. Uma abordagem similar também é encontrada em outras linguagens ([W3C 2005] e [W3C 2002]) A NCL 3.0 é particionada em 13 áreas funcionais, que são novamente particionadas em módulos. A partir das 13 áreas funcionais, 12 são utilizadas para definir os perfis TVD Avançado e TVD Básico. Além das 12 áreas funcionais de NCL 3.0, 2 áreas funcionais foram importadas de SMIL 2.0 para compor o perfil TVD Avançado. As 14 áreas funcionais utilizadas e seus módulos correnspondentes são: 1. Structure • Módulo Structure 2. Layout • Módulo Layout 3. Components 3.3 NCL • Módulo Media • Módulo Context 4. Interfaces • Módulo MediaContentAnchor • Módulo CompositeNodeInterface • Módulo PropertyAnchor • Módulo SwitchInterface 5. Presentation Specification • Módulo Descriptor 6. Linking • Módulo Linking 7. Connectors • Módulo ConnectorCommonPart • Módulo ConnectorAssessmentExpression • Módulo ConnectorCausalExpression • Módulo ConnectorTransitionAssessment • Módulo CausalConnector • Módulo CausalConnectorFunctionality • Módulo ConnectorBase 8. Presentation Control • Módulo TestRule • Módulo TestRuleUse • Módulo ContentControl • Módulo DescriptorControl 9. Timing 21 3.4 Conceitos básicos em NCL 22 • Módulo Timing 10. Reuse • Módulo Import • Módulo EntityReuse • Módulo ExtendedEntityReuse 11. Navigational Key • Módulo KeyNavigation 12. Animation • Módulo Animation 13. SMIL Transition Effects • Módulo TransitionBase • Módulo BasicTransition • Módulo TransitionModifiers NOTA: O módulo TransitionBase é um módulo definido pela NCL 3.0; não existe na SMIL 2.0. 14. SMIL Meta-Information • Módulo Metainformation Não está no escopo desta monografia discutir os detalhes de cada um dos módulos, mais informações podem ser obtidas em [Soares e Rodrigues 2006] e [ABNT 2007]. Para que o leitor possa se familiarizar com a linguagem NCL, na seção seguinte será mostrado um documento NCL e se discutirá a estrutura da linguagem de uma forma prática. 3.4 Conceitos básicos em NCL Esta seção discute os principais conceitos do modelo NCM (e consequentemente de NCL) que são necessários para a criação de documentos hipermı́dia. São eles: nós, nós de composição, elos e conectores. 3.5 A estrutura de um documento NCL 23 Os dois principais conceitos de NCL são os de nós e elos. Nós podem estar associados com os objetos de mı́dia que compõem a aplicação ou serem composições de nós. Composições de nós, por sua vez, podem conter recorrentemente outros nós ou elos. Uma composição utilizada para estruturar e encapsular partes de aplicações é chamada de contexto. Uma composição empregada na adaptação de conteúdo é chamada de switch. A Figura 3.1 mostra um exemplo de um documento hipermı́dia, onde existem nós, elos e nós de composição. Figura 3.1: Nós, elos e nós de composição. Fonte: [Neto et al. 2007] O conceito de conector hipermı́dia está relacionado com o tipo de relacionamento entre os nós que fazem parte de um elo. Esta separação permite o reuso de conectores para vários elos diferentes além de aumentar muito a expressividade da linguagem, visto que o autor pode criar novos conectores (novos tipos de elos). 3.5 A estrutura de um documento NCL Para um total entendimento desta seção é necessário um conhecimento básico de XML, que pode ser obtido através de [Moultis e Kirk 1998]. Nesta seção será discutido um exemplo de um documento NCL simples, apenas para que o leitor se familiarize com a estrutura da linguagem NCL. A especificação completa da linguagem pode ser encontrada em [ABNT 2007]. Mais informações da linguagem bem como alguns exemplos práticos são encontrados em [Neto et al. 2007], [NCL 2008] e [PUC-Rio 2008]. 3.5 A estrutura de um documento NCL 24 O exemplo aqui apresentado é uma apresentação que possui dois vı́deos. A lógica é: o primeiro vı́deo será disparado no inı́cio da apresentação. Quando este terminar sua exibição, a apresentação deverá disparar o segundo vı́deo. Quando este segundo terminar sua exibição, a apresentação deverá disparar, novamente, o primeiro vı́deo, e assim sucessivamente. O código NCL da Figura 3.2 mostra como é possı́vel especificar esta apresentação em NCL. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?xml version=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <n c l i d=” exemplo01 ” xmlns=” h t t p : //www. n c l . o r g . br /NCL3. 0 / EDTVProfile ”> <head> <r e g i o n B a s e> <r e g i o n i d=” r g V i d e o ” h e i g h t=” 600 ” width=” 800 ” /> </ r e g i o n B a s e> <d e s c r i p t o r B a s e> <d e s c r i p t o r i d=” dVideo ” r e g i o n=” r g V i d e o ” /> </ d e s c r i p t o r B a s e> <c o n n e c t o r B a s e> <importBase documentURI=” c o n n e c t o r B a s e . n c l ” a l i a s=” connBase ” /> </ c o n n e c t o r B a s e> </ head> <body> <p o r t i d=” p o r t a ” component=” v i d e o 0 1 ” /> <media i d=” v i d e o 0 1 ” s r c=” media / v i d e o 0 1 . mpg” d e s c r i p t o r=” dVideo ” /> <media i d=” v i d e o 0 2 ” s r c=” media / v i d e o 0 2 . mpg” d e s c r i p t o r=” dVideo ” /> <l i n k x c o n n e c t o r=” connBase#onEndStart ”> <bind component=” v i d e o 0 1 ” r o l e=”onEnd” /> <bind component=” v i d e o 0 2 ” r o l e=” s t a r t ” /> </ l i n k> <l i n k x c o n n e c t o r=” connBase#onEndStart ”> <bind component=” v i d e o 0 2 ” r o l e=”onEnd” /> <bind component=” v i d e o 0 1 ” r o l e=” s t a r t ” /> </ l i n k> </ body> </ n c l> Figura 3.2: Estrutura da linguagem NCL - Exemplo de código Todo documento NCL possui uma tag principal < ncl >, a qual é subdividida em duas novas tags < head > e < body >. No < head > são definidos os elementos relacionados com reuso, as regiões (dentro da tag < regionBase >, linha 4 a 6), descritores (dentro da tag descriptorBase, linha 7 a 9) e conectores (dentro da tag connectorBase, linha 10 a 12). Uma região define onde as mı́dias poderão aparecer na tela. Caracterı́sticas como altura, largura, distância da borda à esquerda, direita, topo e abaixo e zIndex podem ser especificados em uma região. Separando a definição da região da especificação da mı́dia, se favorece o reuso à medida que uma mesma região pode ser utilizada por várias mı́dias. Por outro lado, um descritor permite que atributos opcionais com definições espaço-temporais possam ser especificados. Um dos atributos do descriptor é o region, o qual permite dizer à qual região aquele descritor está ligado. São outros atributos de descriptor: explicitDur, player, focusSelSrc, moveUp, moveDown, entre outros. Ainda como filho do elemento < head >, o < connectorBase > define a base de conectores que o autor do documento pode utilizar. Os conectores podem ser 3.5 A estrutura de um documento NCL 25 entendidos como os tipos de relações que temos entre as mı́dias. Diferente de HTML, onde o único tipo de relação é o ‘vai para’, a linguagem NCL permite que novas relações possam ser definidas. Estes conectores são especificados na linguagem XConnector, cujos módulos fazem parte de todos os perfis NCL. Mais uma vez favorecendo o reuso, estes conectores, podem ser especificados em outro arquivo e reusados por qualquer documento, conforme feito no exemplo, utilizandose a tag < importBase >. Para diminuir a complexidade para o autor final é recomendado que esta base de connectores seja disponibilizada junto com a ferramenta de autoria. O autor, assim, não necessita nem ao menos saber como se cria um conector. A idéia principal é que ele reuse os conectores padrões. Mesmo assim, caso exista a necessidade o autor poderá criar novos conectores. O < body > é outro filho do elemento < ncl >. No < body > são definidos os nós de mı́dia, os relacionamentos entre estes nós (elos), os nós de contexto (< context >) e de alternativa (< switch >). Estes dois últimos nós não serão comentados pois esta seção é apenas uma introdução à estrutura da linguagem NCL. Vejamos então os nós de mı́dia e elos. Na linha 16 é especificado o nó de mı́dia com identificador video01. Um nó de mı́dia faz referencia explı́cita a uma mı́dia através do atributo src. O atributo descriptor especifica a qual descritor aquela mı́dia está associada, o qual deve ser o valor de um identificador dos descritores definidos em < descriptorBase >. Na linha 17 é especificado o outro nó de mı́dia que se deve tocar, com identificador video02. Já foram especificadas as duas mı́dias que serão tocadas, bem como onde elas aparecerão na tela (region) e com quais caracterı́sticas (descriptor ). Falta agora definir os relacionamentos entre estas mı́dias. Primeiro, deve-se definir a ‘porta de entrada’ na apresentação. Isto é feito através do elemento < port > que especifica através do atributo component qual será o ponto de entrada. Do ponto de vista do usuário, esta será a primeira mı́dia a ser tocada. Sabendo que o video01 será a primeira mı́dia a ser tocada, deve-se agora definir que quando esta mı́dia acabar a outra deve começar. Isto é feito das linhas 18 à 21. No elemento < link > é especificada que tipo de relação está sendo usada, através do atributo xconnector. Este tipo de relação deve estar definido na base de conectores. E então se define que papéis são exercidos por cada mı́dia através os elementos < bind >, filhos de 3.6 NCL e a TV Digital 26 < link >. No exemplo, é utilizada a relação onEndStart, que possui os papéis onEnd e start. Definimos que nesta relação o video01 exerce o papel de onEnd e o video02 de start. Resumindo, é descrito que quando o video01 terminar o video02 começa. Das linhas 22 à 25 se especifica o outro elo: quando o video02 acabar, inicia-se o video01 novamente. Embora tenha sido um exemplo simples - do ponto de vista das possibilidades que a linguagem NCL oferece, como reuso, interatividade, especificação de novos conectores, etc - este serviu para que o leitor se familiarize com a linguagem NCL. Na seção seguinte, será discutido um pouco da relação entre NCL e TV Digital. 3.6 NCL e a TV Digital Embora a linguagem NCL não tenha sido criada com o intuito restrito de ser utilizada para o desenvolvimento de programas interativos para a TV Digital ela se encaixa perfeitamente a este propósito. Tanto é que a mesma foi escolhida como padrão para a criação de programas interativos declarativos no Sistema Brasileiro de TV Digital. A parte 2 da Norma Brasileira - NBR 15606 - Televisão digital terrestre - Codificação dados e especificações de transmissão para radiodifusão digital especifica a linguagem NCL 3.0 para a TV Digital [ABNT 2007]. O Ginga-NCL [NCL 2008] é um ambiente completo para apresentação de uma aplicação de TV Digital escrita em linguagem NCL. Ele é o midlleware que fará parte do Sistema Brasileiro de Televisão digital. A Figura 3.3 mostra a arquitetura do middleware Ginga, evidenciando o Ginga-NCL. Alternativamente, também é possı́vel integrar a NCL com linguagens de scripts, que permitem embutir comandos procedurais à linguagem. Um exemplo desta possibilidade é mostrada por NCLua[PUC-Rio 2008], que integra a linguagem NCL, com scripts Lua. Isto aumenta muito as possibilidades de expressão que a linguagem tem, permitindo tratamento de eventos como clique do mouse, aperto de um botão do controle remoto, etc. 3.6 NCL e a TV Digital Figura 3.3: Arquitetura do middleware Ginga. 27 28 4 Validador NCL Há várias razões pelas quais se faz necessário algum processo de validação sintática e semântica durante a concepção de documentos hipermı́dia. É fácil perceber que há um ganho significativo de tempo no processo de autoria quando uma ferramenta oferece ao autor um retorno descritivo sobre erros no documento antes mesmo de exibı́-lo. Um indicador de possı́veis erros (ou avisos) também é importante para garantir ao autor que o documento está de acordo com a semântica esperada. Em um contexto especı́fico como o da transmissão de documentos declarativos no ambiente de TV digital, onde o receptor móvel ou fixo tem poder de processamento bem restrito, o processo de validação também é imprescindı́vel. Nesse cenário, o processo pode ocorrer tanto no lado da emissora, onde as restrições de processamento são bem menos rı́gidas ou ainda no próprio set-top box, na casa do telespectador. Nesse segundo caso, a validação pode contribuir em muito para diminuir a complexidade na implementação da máquina de apresentação do middleware de TV digital. Isso porque o processo de validação do documento pode ser feito como uma fase isolada e inicial na execução da aplicação interativa, simplificando a implementação dos passos seguintes ao garantir que o documento está correto. Este capı́tulo apresenta um processo de validação sintática e semântica exclusivamente para documentos NCL (Nested Context Language) que é denominado NCL Validator. Juntamente com o processo também é apresentada uma implementação do NCL Validator para a versão 3.0 da linguagem NCL. A implementação aqui mostrada é reutilizada pelo NCL Eclipse, possibilitando que erros sejam dinamicamente apresentados ao autor durante a concepção do documento NCL. 4.1 Validacão com XML Schema Ao trabalhar-se com linguagens baseadas no padrão XML[W3C 2008] é comum o pensamento de que a validação com XML Schema[W3C 2003] é a melhor abordagem a ser utilizada para validar estes documentos, visto que existem bibliotecas disponı́veis com 4.2 Processo NCL Validator 3.0 29 este objetivo. Esta foi a primeira abordagem a ser levada em consideração para se validar um documento NCL. Contudo, como foi possı́vel evidenciar à medida que nos familiarizamos mais com a linguagem, NCL possui várias particularidades que não podem ser especificadas através de um XML Schema. Dois motivos principais motivaram a criação de um processo de validação especı́fico para a linguagem: • As bibliotecas disponı́veis não oferecem mensagens suficientemente ilustrativas ao autor (o que já remeteu à criação do Schematron [ISO 2008]); • Esta não é uma abordagem útil para algumas especificidades de NCL, como o escopo baseado nas perspectivas. Para ilustrar a segunda restrição, é importante salientar que, por meio da abordagem XML Schema, é possı́vel definir, segundo a terminologia XML, a cardinalidade dos elementos e seus filhos e os tipos dos atributos, mas não seria possı́vel validar semanticamente atributos que fazem referência a identificadores de tipos especı́ficos de elementos, ou ainda que referenciem elementos que são filhos do mesmo contexto em que se encontra um elo (a idéia de perspectiva). A Seção a seguir discute o processo NCL Validator, cujo objetivo é verificar se um documento NCL está conforme a Norma [ABNT 2007]. 4.2 Processo NCL Validator 3.0 O processo proposto para a validação de um documento NCL é dividido em quatro fases: Validação Léxica e Sintática, Validação Estrutural, Validação Contextual e de Referências e Validação Semântica. Sendo a linguagem NCL baseada em XML, o primeiro passo de validação em um documento é a estrutura léxica e sintática do XML. Com este objetivo existem várias bibliotecas que podem ser utilizadas e que fazem o parsing de um documento XML. Para economia de tempo e esforço o processo sugere que alguma destas bibliotecas seja reutilizada. São exemplos de bibliotecas que fazem parsing de XML: o Xerces [Apache Software Foundation 2002] e a bilibioteca padrão Java DOM. O próximo passo do processo é validar a estrutura do documento. Neste passo é verificado se todos os atributos presentes em um elemento são válidos, se todos os 4.2 Processo NCL Validator 3.0 30 atributos obrigatórios estão presentes, se os filhos de um determinado elemento estão definidos na norma e se estão conforme a cardinalidade especificada na norma. Componentes NCM [Soares e Rodrigues 2005] possuem um id que os identificam univocamente no documento, este atributo freqüentemente é utilizado para fazer referência a estes elementos. Saber se o elemento referenciado existe, se é do tipo que o atributo ‘requer’ e se está no mesmo contexto do elemento que o referencia são os pontos de validação que mais necessitam de cuidado e os mais necessários também. Estas validações são realizadas no Passo 3. Por fim, pode-se ainda ter um passo adicional de validação, aqui chamado de Semântica, que tem por função gerar alertas ao usuário caso sejam detectadas inconsistências do ponto-de-vista da apresentação do documento. Como exemplos citam-se: a existência de trechos do documento que não são alcançáveis por um elo ou ainda elementos internos de um nó de alternativa que nunca são selecionados. Este passo envolve uma simulação da apresentação do documento e mesmo sendo útil não compromete a utilidade de uma implementação que não o cobre. A Figura 4.1 ilustra esquematicamente como funciona o processo NCL Validator. As mensagens de erro e/ou alertas são geradas durante cada uma das fases, ficando disponı́vel para serem acessadas após o término da validação. Figura 4.1: Ilustração do Processo NCL Validator 4.3 Implementação do Processo NCL Validator 3.0 4.3 31 Implementação do Processo NCL Validator 3.0 Visando comprovar o processo pela seção anterior e disponibilizar uma solução completa, uma implementação do NCL Validator foi desenvolvida em Java. Para fazer o parsing do documento NCL utilizou-se a biblioteca XML padrão do Java. Por não comprometer o processo, o passo 4 proposto acima, não foi implementado, deixando-se como um trabalho futuro. A implementação realizada está disponı́vel de duas formas diferentes: através de um software front-end (voltada para o usuário final); ou através de uma biblioteca que pode ser reutilizada por outros softwares (como os de autoria ou os de apresentação). A Figura 4.2 apresenta o diagrama de sequência da implementação do processo NCL Validator 3.0. Neste diagrama é possı́vel verificar as principais classes envolvidas no processo de validação - NCLValidator, DTDValidator, Semantics, Message e MessageList - e quais as principais mensagens trocadas entre objetos destas classes. Estruturalmente existe um pacote - br.ufma.deinf.laws.ncl - no qual as classes são responsáveis pela modelagem da estrutura da linguagem NCL 3.0 (NCLStructure) e pela validação dos tipos básicos - entre os quais estão identificador, inteiro, URI, size, etc. - (DataType). A classe NCLValidatorDocument é responsável pela modelagem de um documento NCL 3.0 e também pelo primeiro passo na validação proposta pelo processo: validação léxica. Figura 4.2: Diagrama de sequência da implementação do NCL Validator 3.0 A validação estrutural é realizada pela classe DTDValidator. Esta classe utiliza-se da classe NCLStructure para verificar se o documento está de acordo com a estrutura da linguagem. Verificações como atributos válidos, obrigatórios, filhos válidos, 4.3 Implementação do Processo NCL Validator 3.0 32 obrigatórios e a ordem destes filhos são validadas por esta classe. A validação dos tipos de dados também é feita por esta classe - utilizando a classe DataType. A validação de contextos e referências é feita pelas subclasses de Semantics. A Semantics é responsável por fazer o parsing do elemento e chamar a função de validação para cada constituinte do elemento - atributo, tagname, etc. Para cada elemento da linguagem existe uma classe associada. Esta classe é responsável por verificar a existência dos elementos referenciados por estes elementos bem como se estes elementos referenciados estão em contextos válidos e são de tipos válidos. Visando unificar as mensagens de erros, provendo uma única interface de acesso para o cliente, existem as classes Message e MessageList. A primeira representa uma mensagem de erro individual, constituı́da por: a mensagem para o usuário, a localização no arquivo e também qual o elemento XML no qual ocorre o erro. A segunda, por sua vez, atua como um repositório de Messages. À medida que o processo de validação vai evoluindo, novas mensagens vão sendo adicionadas neste repositório, possibilitando assim que no final do processo de validação estas mensagens possam ser recuperadas pelo cliente. É importante ainda salientar que as mensagens podem ser de dois tipos: mensagens de erros ou de alertas (warnings). Alternativamente, a implementação aqui apresentada também permite a escolha da lı́ngua na qual as mensagens serão mostradas. Atualmente existe suporte para o Inglês e para o Português. 4.3.1 NCL Validator 3.0 - Front End Como front-end, o NCL Validator 3.0 pode ser acessado através da linha de comando de qualquer sistema operacional com a máquina virtual Java 1.6 ou superior instalada. A sintaxe do comando é: java -jar ncl30-validator.jar pathDoArquivo lingua. Caso a lı́ngua não seja especificada as mensagens serão por padrão apresentadas em inglês. A Figura 4.3 mostra o front-end do NCL Validator 3.0 sendo executado em um shell Linux. 4.3.2 Reutilização do NCL Validator 3.0 A implementação do NCL Validator 3.0 também pode ser reutilizada por outros softwares. Com este objetivo foi disponibilizada uma API simples que permite chamar o processo de 4.3 Implementação do Processo NCL Validator 3.0 33 Figura 4.3: NCL Validator 3.0 sendo utilizado como front-end validação (passando um arquivo) e recuperar as mensagens de erros no final no processo. O exemplo de código da Figura 4.4 mostra como é possı́vel reutilizar o NCL Validator 3.0. A classe NCLValidator possui um método estático validate. Este método recebe um vetor de NCLValidatorDocument e tem por função executar o processo NCL Validator. À medida que erros são encontrados em cada um dos documentos passados para o método validate as mensagens de erros vão sendo carregadas na classe MessageList. Ao final do processo de validação é possı́vel acessar as mensagens de erros através do método estático getErrors da classe MessageList e os alertas através do método getWarnings. Cada um destes métodos retorna um vetor de Message. É possı́vel também alterar a lı́ngua na qual as mensagens serão apresentadas através do método setLanguage da classe MessageList. É importante salientar que este método só tem efeito se utilizado antes do inı́cio do processo de validação. A Figura 4.5 ilustra a implementação do NCL Validator sendo reutilizada pelo Composer [Guimarães, Costa e Soares 2007]. O NCL Eclipse, apresentado nesta mono- 4.3 Implementação do Processo NCL Validator 3.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 34 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { F i l e d o c F i l e = new F i l e ( ” t e s t e . n c l ” ) ; Document doc = n u l l ; MessageList . c l e a r ( ) ; M e s s a g e L i s t . s e t L a n g u a g e ( M e s s a g e L i s t . ENGLISH ) ; try { DocumentBuilderFactory d b f = DocumentBuilderFactory . n e w I n s t a n c e ( ) ; DocumentBuilder db = d b f . newDocumentBuilder ( ) ; N c l P a r s e E r r o r H a n d l e r p = new N c l P a r s e E r r o r H a n d l e r ( ) ; p . s e t F i l e ( docFile . getAbsolutePath ( ) ) ; db . s e t E r r o r H a n d l e r ( p ) ; doc = db . p a r s e ( d o c F i l e ) ; V e c t o r <NclValidatorDocument> documents = new V e c t o r<NclValidatorDocument> ( ) ; NclValidatorDocument n c l V a l i d a t o r D o c u m e n t = new NclValidatorDocument ( doc ) ; documents . add ( n c l V a l i d a t o r D o c u m e n t ) ; NCLValidator . v a l i d a t e ( documents ) ; // chama o p r o c e s s o de v a l i d a c a o } catch ( Exception e ) { M e s s a g e L i s t . addError ( d o c F i l e . g e t A b s o l u t e P a t h ( ) , e . g e t M e s s a g e ( ) , n u l l , M e s s a g e L i s t . ENGLISH ) ; } V e c t o r <Message> w a r n i n g s = NCLValidator . getWarnings ( ) ; // r e c u p e r a a l i s t a de a l e r t a s V e c t o r <Message> e r r o s = NCLValidator . g e t E r r o r s ( ) ; // r e c u p e r a a l i s t a de E r r o s } Figura 4.4: Reutilizando o NCL Validator 3.0 - Exemplo de código grafia, também reutiliza o NCL Validator. Esta integração será melhor discutida no capı́tulo 6. 4.3 Implementação do Processo NCL Validator 3.0 Figura 4.5: NCL Validator sendo reutilizado pelo Composer 35 36 5 Ambiente Eclipse Neste capı́tulo, o Ambiente Eclipse1 é apresentado. Os principais conceitos deste ambiente serão discutidos e serão úteis a seguir, no desenvolvimento do NCL Eclipse. ”Para milhões de desenvolvedores, engenheiros e usuários de todo o mundo, o Eclipse é uma plataforma extensı́vel para integração de ferramentas. Para centenas de vendedores comerciais que usam o Eclipse para desenvolver plug-ins ou ferramentas de plataformas completas, o Eclipse representa uma provada, rendável e escalável tecnologia para produtos comerciais que podem ser facilmente projetados, desenvolvidos e construı́dos. Para milhares de estudantes e pesquisadores, o Eclipse representa uma plataforma estável para inovação, liberdade e experimentação. Para todos estes indivı́duos, grupos e organizações o Eclipse é uma plataforma de padronização neutra para integrar ferramentas suportadas por um diverso Ecossistema Eclipse.”[Clayberg e Rubel 2004] 5.1 5.1.1 Conceitos básicos no Ambiente Eclipse Perspectivas, Visões e Editores Para prover uma melhor organização do ambiente de desenvolvimento, o Eclipse é divido em unidades. Uma perspectiva é um conjunto de visões e de editores. Visões são geralmente usadas para navegar em arquivos e mudar suas propriedades. De forma contrária, um editor é utilizado para alterar o conteúdo de um arquivo especı́fico. A Figura 5.1 mostra um exemplo da Perspectiva Java, na qual é possı́vel identificar 1 como sendo Visão e 2 como sendo Editor. As visões Problems e Outline são padrões do ambiente Eclipse e serão utilizadas no desenvolvimento do NCL Eclipse. 1 O site principal do Eclipse é http://www.eclipse.org. No momento da escrita deste trabalho versão disponibilizada no site é a 3.3, sendo que no decorrer do presente trabalho esta será a versão utilizada. O processo de instalação é simples, basta descompactar o arquivo baixado através do site. 5.1 Conceitos básicos no Ambiente Eclipse 37 Figura 5.1: Java Perspective - identificação de algumas visões e do editor Java. São exemplos de perspectivas padrões já instaladas no Eclipse: Resource Perspective, Java Perspective, Debug Perspective e CVS Perspective. São exemplos de Visões: Navigator, Outline e Tasks. Adicionalmente aos Editores e às Visões, o Eclipse também provê outras áreas de visualização entre as quais estão um grande número de menus e barras de ferramentas que representam os vários comandos e ações disponı́veis no sistema. A figura 5.2 mostra o menu do topo, juntamente com a barra de ferramentas; a figura 5.3 mostra exemplos de menus contextuais que podem ser visualizados clicando-se com o botão direito em algum editor e/ou visão. Figura 5.2: Java Perspective - Menu do topo e barra de ferramentas 5.2 Visão geral da arquitetura do Eclipse 38 Figura 5.3: Java Perspective - exemplos de menus contextuais 5.2 Visão geral da arquitetura do Eclipse A plataforma Eclipse é estruturada através do conceito de plug-ins. Plug-ins são pacotes de código e/ou dados estruturados que contribuem funcionalmente para o sistema e podem ser distribuı́dos separadamente. As funções exercidas pelos plug-ins podem estar na forma de biblioteca de códigos (classes Java com API pública), extensões da plataforma, ou até mesmo documentação. Do ponto de vista do usuário, são os plug-ins que determinam a funcionalidade final da plataforma. O Eclipse provê um Workbench comum onde são ‘plugados‘ os plug-ins. Isto é feito usando ‘portas’ bem definididas chamadas pontos de extensão (extension points). A construção do Eclipse é feita em camadas de plug-ins de tal forma que cada plug-in, ele mesmo, possa definir pontos de extensão, permitindo assim que o mesmo possa ser customizado por outro desenvolvedor. Este modelo de extensão permite que desenvolvedores de plug-ins adicionem uma grande variedade de funcionalidades à plataforma básica. A Figura 5.4 ilustra a arquitetura do Eclipse, onde é possı́vel destacar o núcleo runtime e os subsistemas básicos da arquitetura. Cada subsistema é estruturado como um conjunto de plug-ins que implementam algumas funções chaves. Alguns plug-ins 5.2 Visão geral da arquitetura do Eclipse 39 adicionam caracterı́sticas visı́veis para a plataforma, utilizando o modelo de extensão. Outros adicionam bibliotecas de classes que podem ser usados para implementar extensões do sistema. Figura 5.4: Arquitetura do ambiente Eclipse. Fonte: [Eclipse Foundation 2008] Eclipse SDK (Standard Development Kit) inclui a plataforma básica mais duas ferramentas úteis para o desenvolvimento de plug-ins. A Java Development Tool implementa um completo ambiente de desenvolvimento Java. O Plug-in Development Enviroment adiciona ferramentas especializadas que racionalizam o desenvolvimento de plug-ins e extensões. Estas ferramentas não apenas possuem um objetivo útil, como também provêem um bom exemplo de como novas ferramentas podem ser adicionadas à plataforma através da construçao de plug-ins que estendem o sistema. 5.2.1 Infra-estrutura dos Plug-ins Os plug-ins são codificados em Java. Um plug-in tı́pico consiste de códigos Java em uma biblioteca JAR, juntamente com arquivos como imagens, templates, catálogos de messagens, etc. Cada plug-in tem um arquivo manifest que especifica sua interconexão com outros plug-ins. No seu manifest um plug-in declara seus pontos de extensão e quais pontos de extensão de outros plug-ins ele customiza. 5.2 Visão geral da arquitetura do Eclipse 40 Ao ser carregada, a Plataforma Runtime descobre o conjunto de plug-ins disponı́veis, lê os seus arquivos manifest e constrói, na memória, uma estrutura com estas informações. Qualquer problema, tais como extensões faltando, são detectados e escritos no log do sistema. Os plug-ins não podem ser adicionados depois da plataforma carregada. Assim, ao instalar um plug-in é necessário que a plataforma seja recarregada para que o mesmo entre em funcionamento. Um plug-in é ativado, na realidade, quando o seu código necessita executar. Uma vez ativado, um plug-in utiliza-se do seu registro feito em memória pela Plataforma Runtime para descobrir e acessar os pontos de extensão que este estende. Depois de ativado, um plug-in permanece ativo até que a plataforma seja encerrada. Existe uma API reduzida que pode ser utilizada para explicitamente carregar um plug-in, o que pode ser útil em alguns casos. A cada plug-in é atribuı́do seu próprio carregador de classes Java que é unicamente responsável por carregar as classes e arquivos deste plug-in. Cada plug-in declara explicitamente suas dependências de outros plug-ins dos quais ele espera acessar diretamente as classes. Um plug-in controla a visibilidade para o público de suas classes e interfaces em sua biblioteca. Estas informações são declaradas no arquivo manifest do plug-in. As regras de visibilidade são executadas em tempo de execução pelo carregador de classes do plug-in. 5.2.2 SWT O SWT[Eclipse Foundation 2008] (Standard Widgets Toolkit) é um componente de software que proporciona widgets avançados, nativos e independentes de plataforma para a plataforma Eclipse. O SWT é análogo ao AWT[Zukowski 1997]/Swing[Loy et al. 2002], com a diferença que usa um conjunto de widgets nativos. Além de ser usado integrado com a plataforma Eclipse é possı́vel também usar o SWT em qualquer programa Java. Para isto basta baixar a biblioteca no site do projeto. Um pouco da história do SWT em comparação com o AWT e Swing podem ser encontrados em [Clayberg e Rubel 2004]. O SWT é escrito totalmente em Java e mesmo assim é nativo (diferentemente do Swing onde ele mesmo desenha a interface). Para mostrar os elementos da interface, o SWT implementa acesso a bibliotecas nativas do sistema operacional utilizando JNI (Java Native Interface) [Sun Microsystems 2008] em uma forma similar àquela feita por 5.2 Visão geral da arquitetura do Eclipse 41 programa escritos usando APIs especı́ficas do sistema operacional. JNI é o mecanismo padrão usado por todos os programas Java para invocar códigos escritos em C. O SWT, entretanto, vai um passo mais longe ao impor um mapeamento um-para-um entre métodos Java nativos e chamadas ao sistema operacional. Este fato permite que o programador possa fazer chamadas ao sistema operacional a partir de métodos Java ao mesmo tempo que pode utilizar os widgets avançados do SWT, tais como Browser (mostra páginas HTML), Shell, StyledText, Toolbar, Tray, etc. Na Figura 5.4 é possı́vel identificar como o SWT está na base da infra-estrutura do Eclipse. Ao fazer plug-ins para o Eclipse, também é comum a criação de componentes utilizando-se os widgets SWT. 5.2.3 JFace O SWT ao possibilitar uma interface direta aos widgets nativos é limitado à utilização de tipos de dados simples - strings, números, imagens, etc. Isto é crı́tico principalmente para programadores do paradigma de Orientação a Objetos (OO) que necessitam apresentar widgets utilizando estruturas de dados como listas, tabelas, árvores e textos. O JFace é uma camada de abstração no topo do SWT que provê ‘OO wrappers’ sobres os seus widgets associados. O JFace inclui os componentes usuais de interface com o usuário (imagens, fontes, preferências, janelas de diálogo, etc.). Duas das caracterı́sticas mais interessantes do JFace são as ações (actions)e os visualizadores (viewers). O mecanismo de tratamento de ações permite que os comandos do usuário sejam definidos independentemente do local exato onde a interface irá executálo. Uma ação representa um comando que pode ser desencadeado por um usuário via um botão, um item de menu ou um item em uma barra de ferramentas. Cada ação conhece as propriedades chaves do componente da interface (label, icon, tool tip) que são usados para construir widgets apropriados para a ação atual. Esta separação permite que a mesma ação seja usada em vários lugares na UI. Os Visualizadores são adaptadores baseados em modelos para certos widgets SWT. Os Visualizadores controlam os comportamentos comuns e provêem uma semântica de mais alto nı́vel do que os widgets SWT. Existem visualizadores padrões para listas, árvores e tabelas. Estes visualizadores são configurados com um provedor de conteúdo (content provider ) e um provedor de nomes (label provider ). O content provider sabe como 5.2 Visão geral da arquitetura do Eclipse 42 mapear o elemento da entrada do visualizador para o elemento esperado pelo visualizador de conteúdo. O label provider sabe como produzir o texto especı́fico que aparecerá na interface (label ) e o ı́cone necessário para mostrar um determinado elemento no widget. É possı́vel também configurar os visualizadores com filtros e ordenadores baseados em elementos. Os clientes são notificados quando ocorrem eventos (seleção, clique duplo, etc.). Os visualizadores padrões para texto suportam operações comuns como comportamento de clique duplo, voltar (undo), coloração e navegação pelo ı́ndice do caracter ou número de linha. Os visualizadores de texto provêem um modelo de documento para o cliente e administram a conversão do documento para a informação requerida pelo widget de texto SWT. Múltiplos visualizadores podem ser abertos no mesmo modelo ou documento; todos são atualizados automaticamente quando o modelo ou documento é alterado em qualquer um deles. 5.2.4 Actions Uma Ação no Eclipse é composta de várias partes, incluindo a declaração XML no arquivo manifest do plug-in, o objeto IAction instanciado pelo Eclipse UI para representar a ação, e o IActionDelegate definido na biblioteca do plug-in e contendo o executor da ação. Esta separação permite que o Eclipse represente a mesma ação em um menu, ou uma barra de ferramentas sem necessariamente carregar o plug-in que contém a ação. 5.2.5 Workspace Os vários plug-ins da plataforma Eclipse operam sobre arquivos na área de trabalho (workspace) do usuário. O workspace consiste de um ou mais nı́veis de projetos, onde cada projeto mapeia um diretório correspondente, especificado pelo usuário no sistema de arquivos. Os diferentes projetos no workspace podem mapear diferentes diretórios ou drivers. Todos os arquivos no workspace são acessados diretamente pelos programas e ferramentas padrões do sistema operacional subjacente. Ferramentas integradas com a plataforma utilizam-se de uma API para manusear os recursos do workspace (a coleção de projetos, arquivos e pastas). Recursos do workspace são representados por objetos adaptáveis, possibilitando, assim, a extensão de seu comportamento. 5.3 Criação de plug-ins para o Eclipse 5.2.6 43 Workbench Diferentemente do SWT e do JFace, os quais são toolkits de interface gráfica para propósitos gerais, o workbench provê os componentes de interface com o usuário personalizados para a plataforma Eclipse e fornece a estrutura na qual as ferramentas interagem com o usuário. Devido à este papel central, o workbench é sinônimo da interface com o usuário da plataforma Eclipse. A API do workbench é dependente tanto do SWT quanto do JFace; Java AWT e Swing não são usados. A interface com o usuário da plataforma Eclipse é baseada em editores, visões e perspectivas (Veja subseção 5.1.1). Do ponto de vista do usuário uma janela do workbench consiste visualmente de visões e editores. As perspectivas mostram uma seleção e um arranjo de editores e visões dispostos na tela. Uma janela do workbench pode possuir várias perspectivas separadas, das quais apenas uma é visı́vel em um dado momento. 5.3 Criação de plug-ins para o Eclipse A JDT (Java Development Toolkit) e o PDE (Plug-in Development Environment), juntos, constituem um ambiente completo para a criação de novos plug-ins para a IDE Eclipse. A JDT e o PDT vêm por padrão na SDK do Eclipse. A JDT é um conjunto de plug-ins que adicionam funcionalidades que auxiliam o desenvolvimento utilizando a linguagem Java à plataforma Eclipse. Os plug-ins JDT provêem APIs que também podem ser reutilizadas por outros desenvolvedores. Os plug-ins JDT são dividos em: • JDT APT: adiciona o suporte à anotação para projetos Java 5 no Eclipse. • JDT Core: define uma infra-estrutura não relacionada com a interface com o usuário, incluindo: Java Builder, assistente de código, etc. • JDT Debug: implementa o suporte à Debug para Java. • JDT Text: provê o editor Java. • JDT UI: implementa contribuições ”visuais”para o workbench, tais como: Package Explorer, Type Hierarchy View, Java Outline View, Wizards para a criação de elementos Java. 5.4 Um Exemplo: Java Perspective 44 O PDE disponibiliza um conjunto de ferramentas que auxiliam o desenvolvedor em cada estágio do desenvolvimento de plug-ins. O PDE provê wizards para a criação de projetos de plug-ins (Figuras 5.5), editores para os arquivos manifest e plugin.xml que permitem gerenciar as dependências (Figura 5.6), pontos de extensões (Figura 5.7) e visibilidade do código definido pelo plug-in. Figura 5.5: PDE - wizard para a criação de plug-ins Figura 5.6: PDE - gerenciamento de dependências 5.4 Um Exemplo: Java Perspective Nesta subseção será apresentada a perspectiva Java padrão do Eclipse. O objetivo é identificar algumas caracterı́sticas desejáveis para o projeto aqui em questão. 5.4 Um Exemplo: Java Perspective 45 Figura 5.7: PDE - gerenciamento de pontos de extensão 5.4.1 Criando um projeto -New Project Wizard Criar um novo projeto no Eclipse é muito simples, para cada tipo de projeto suportado pela plataforma existe um wizard que auxilia o usuário a criar este tipo de projeto. Para criar um novo projeto Java, por exemplo, basta selecionar F ile > N ew > P roject. Ao criar um novo projeto no Eclipse é criado um arquivo .project no diretório raiz do projeto (especificado no wizard ). O arquivo .project é um arquivo XML que descreve as caracterı́stica do projeto ao qual se refere, o que permite recriá-lo no workbench. O código da Figura 5.8 mostra o exemplo de um arquivo .project. O wizard Java também cria um arquivo .classpath que traz informações relativas aos paths dos sources e dos outputs. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?xml version=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <p r o j e c t D e s c r i p t i o n> <name>xml</name> <comment></comment> <p r o j e c t s> </ p r o j e c t s> <b u i l d S p e c> <buildCommand> <name>o r g . e c l i p s e . j d t . c o r e . j a v a b u i l d e r</name> <arguments> </ arguments> </buildCommand> </ b u i l d S p e c> <n a t u r e s> <n a t u r e>o r g . e c l i p s e . j d t . c o r e . j a v a n a t u r e</ n a t u r e> </ n a t u r e s> </ p r o j e c t D e s c r i p t i o n> Figura 5.8: Exemplo de um arquivo .project No arquivo .project são especı́ficadas caracterı́sticas, tais como, qual o comando para construir o projeto (tag buildCommand ), que tipo de projeto é este (tag nature), o nome do projeto (tag name) e a quais projetos este pode referenciar (tag projects). 5.4 Um Exemplo: Java Perspective 5.4.2 46 Editor Java O Editor Java (Figura 5.9)é uma ferramenta moderna para a criação de classes Java em modo texto que provê muitas caracterı́sticas voltadas ao trabalho de editar código. São exemplos destas caracterı́sticas: • Coloração de palavras reservadas; • Assistência de código sensı́vel ao contexto; • Templates; • Formatação automática de código definida pelo usuário; • Execução de um documento NCL. A coloração de palavras reservadas ajuda o usuário a se situar no código Java e é configurável através do menu Java > Editor > Syntax. Caracterı́sticas como cor e estilo de fonte das palavras reservadas, comentários, strings, caracteres, etc podem ser configurados através deste menu. A assistência de código sensı́vel ao contexto - autocomplete - é uma das caracterı́sticas que mais ajudam ao usuário no momento da edição de código. O autocomplete do editor Java pode ser acionado através de Ctrl + Espaço. A figura 5.9 mostra como o autocomplete aparece na tela. Caso existam mais de uma opção para completar o texto que se está editando um menu é mostrado para o usuário para que este possa escolher a opção certa, caso exista apenas uma opção esta opção aparece no texto. Além do autocomplete convencional, o editor Java também define templates que podem ser adicionados ao código. Estas duas caracterı́sticas (muito úteis) foram identificados no editor Java e serão implementadas no NCL Eclipse, conforme será visto no capı́tulo 6. 5.4 Um Exemplo: Java Perspective Figura 5.9: Editor Java - evidenciando autocomplete. 47 48 6 NCL Eclipse Este trabalho tem como principal objetivo implementar um plug-in textual para a IDE Eclipse visando auxiliar no desenvolvimento de apresentações interativas em NCL. Para tanto, inicialmente foi realizado um estudo básico da linguagem NCL (Capı́tulo 3). Posteriormente, e não com o intuito restrito de servir apenas para este plug-in foi desenvolvido o NCL Validator, um software que tem como objetivo validar se um documento está ou não conforme a norma NCL (Capı́tulo 4). Seguindo neste objetivo, foi então realizado um estudo aprofundado da IDE Eclipse, sempre ressaltando os pontos que poderiam ser aproveitados para a implementação do plug-in e como seria possı́vel a integração deste plug-in com o ambiente Eclipse (Capı́tulo 5). Enfim, o plug-in foi desenvolvido. Este capı́tulo traz as caracterı́sticas desenvolvidas bem como os principais pontos do código e uma discussão sobre a relevância de cada uma das funcionalidades. 6.1 Levantamento de Requisitos Os requisitos básicos do NCL Eclipse são os comumente encontrados em ambientes de desenvolvimentos para linguagens textuais. As seguintes funcionalidades básicas devem estar presentes no NCL Eclipse: 1. Gravar o documento em disco – Salvar 2. Voltar alterações (undo) – disponı́vel através de Ctrl+z 3. Coloração Sintática 4. Auto-formatação de código 5. Validação do código-fonte 6. Rodar em sistemas operacionais diferentes - ser multiplataforma 7. Sugestão de código contextual 8. Navegação no documento como uma árvore 6.2 Funcionalidades Implementadas 49 9. Colapsar elementos XML – Folding 6.2 Funcionalidades Implementadas Com base nos requisitos básicos da seção anterior, foram implementados as seguintes funcionalidades no NCL Eclipse: • Gravar o documento em disco – Disponı́vel pelo Eclipse – requisito 1. • Voltar alterações – Disponı́vel pelo Eclipse – requisito 2. • Coloração de tags e atributos XML – requisito 3. • Auto-formatação do código XML – requisito 4. • Validação do documento NCL – requisito 5. • Auto-completação contextual de código NCL – requisito 7. • Navegação no documento como uma árvore – requisito 8. • Executar o documento NCL – Não estava nos requisitos O Requisito 6 – Rodar em sistemas operacionais diferentes – é automaticamente suprido pelo ambiente Eclipse que já é um ambiente multiplataforma. As seções seguintes discutirão cada uma destas funcionalidades implementadas, qual a sua relevância e, sempre que possı́vel, uma discussão sobre como se deu esta implementação no Eclipse. 6.3 Infra-estrutura A Figura 6.1 demonstra, estruturalmente, como o NCL Eclipse interage com a plataforma Eclipse. As dependências do NCL Eclipse são: • org.eclipse.core.runtime • org.eclipse.core.resources 6.3 Infra-estrutura 50 • org.eclipse.ui • org.eclipse.ui.workbench.texteditor • org.eclipse.ui.editors • org.eclipse.ui.ide • org.eclipse.ui.views • org.eclipse.jface.text Figura 6.1: Diagrama do NCL Eclipse interligado com o Eclipse Dentre os pontos de extensão, destaca-se o org.eclipse.jface.text que permite a customização de editores de texto no ambiente Eclipse. Este é o principal ponto de extensão reutilizado pelo NCL Eclipse. O apêndice A mostra os principais diagramas de classes do NCL Eclipse. 6.4 Funcionamento do NCL Eclipse 6.4 6.4.1 51 Funcionamento do NCL Eclipse NCL Wizard e Connector Base Wizard Um wizard, no Eclipse, é um passo-a-passo que auxilia o usuário na realização de uma tarefa. É comum sua utilização para a criação de novos projetos ou de novos documentos. Os wizards são organizados em categorias. Sendo que tanto as categorias como eles próprios são definidos pelos plug-ins que fazem parte do ambiente. O NCL Eclipse provê dois wizards padrões classificados na categoria NCL. Um para a criação de um documento NCL básico e outro para a criação de uma base de conectores que deve ser reutilizada por outros documentos. O NCL Document cria um novo documento NCL - com a tag < ncl > e seus filhos < head > e < body >. O Connector Base Document tem a mesma funcionalidade do anterior com a diferença de não criar o elemento < body >. A figura 6.2 mostra como acessar o NCL Document Wizard e a Figura 6.3 mostra o NCL Document Wizard. Figura 6.2: Criação de um novo documento NCL 6.4 Funcionamento do NCL Eclipse 52 Figura 6.3: Criação de um novo documento NCL Curiosidades da Implementação Para que um plug-in possa adicionar um novo wizard à plataforma é necessário a customização do ponto de extensão org.eclipse.ui.newWizards. Através do arquivo plugin.xml é possı́vel definir novas categorias bem como novos wizards. O trecho do arquivo plugin.xml da Figura 6.4, mostra como o NCL Eclipse define a categoria NCL e os wizards NCL Document e Connector Base Document. As classes NCLNewWizard e ConnectorBaseNewWizard estendem a classe org.eclipse.jface.wizard.Wizard e implementam a interface org.eclipse.ui.INewWizard, customizando apenas as caracterı́sticas que são especı́ficas do NCL Eclipse. 6.4.2 Coloração sintática A coloração sintática é útil na medida em que auxilia o autor a se situar no texto. Ela é uma caracterı́stica básica da maioria dos editores de texto voltados para a criação de arquivos-fonte. Como a linguagem NCL é baseada em XML, a coloração sintática do NCL 6.4 Funcionamento do NCL Eclipse 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 53 <p l u g i n> ... <e x t e n s i o n p o i n t=” o r g . e c l i p s e . u i . newWizards ”> <c a t e g o r y i d=” n c l e c l i p s e ” name=”NCL”> </ c a t e g o r y> <w i z a r d c a t e g o r y=” n c l e c l i p s e ” c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . w i z a r d s . NCLNewWizard” i c o n=” i c o n s / sample . g i f ” i d=” n c l e c l i p s e . w i z a r d s . NCLNewWizard” name=”NCL Document”> </ w i z a r d> <w i z a r d c a t e g o r y=” n c l e c l i p s e ” c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . w i z a r d s . ConnectorBaseNewWizard ” i c o n=” i c o n s / sample . g i f ” i d=” n c l e c l i p s e . w i z a r d s . ConnectorBaseNewWizard ” name=” Connector Base Document”> </ w i z a r d> </ e x t e n s i o n> ... </ p l u g i n> Figura 6.4: Fragmento do plugin.xml que define os wizards Eclipse foi desenvolvida para diferenciar as tags XML, atributos e os valores dos atributos, bem como alguns conteúdos textuais e comentários. Por padrão, as tags XML aparecem na cor azul, os valores dos atributos na cor verde e os comentários na cor vermelha. A coloração sintática disponibilizada por um editor de texto do JFace é feita através da divisão do documento em um conjunto de tokens, cada um descrevendo uma seção do documento que tem cor do texto (foreground ), cor de fundo (background ) e estilo de fonte diferentes. Esta divisão é feita por um presentation reconciler. Isto é muito similar ao particionamento de documento – que será discutido na subseção 6.4.5 – com a diferença de que o presentation reconciler permite um controle mais fino do que a partição de documento. Através do presentation reconciler é possı́vel, por exemplo, modificar as cores de cada uma das palavras reservadas da linguagem. 6.4.3 Outline view A visão outline é a visão padrão do Eclipse para apresentar a estrutura do documento que está sendo editado atualmente. A JDT, por exemplo, mostra as classes, atributos e métodos do arquivo que está sendo editado. O NCL Eclipse também utiliza a visão outline para mostrar a estrutura do documento NCL. Um documento XML pode ser representado como uma árvore. Esta representação permite navegar mais facilmente sobre o documento. Visando aproveitar-se dessa caracterı́stica de documentos XML, o Outline view desenvolvido pelo NCL Eclipse 6.4 Funcionamento do NCL Eclipse 54 representa o documento NCL como uma árvore, permitindo assim navegar sobre o documento. O evento de clicar sobre um nó da árvore leva o editor a selecionar a linha daquele nó. Veja a Figura 6.5. A visão outline estende a visão padrão do Eclipse. Caso a mesma não esteja ativa é possı́vel ativá-la através do menu Window > Show View > Other... > General > Outline. Cada vez que o documento é salvo a visão Outline é atualizada. Figura 6.5: Coloração sintática e Outline View Curiosidades da Implementação Para que um plug-in possa customizar a visão outline é necessário que este estenda a classe org.eclipse.ui.views.contentoutline.ContentOutlinePage. Dois métodos, em especial, merecem destaque e foram reimplementados pelo NCL Eclipse: createControl – instancia a TreeViewer, bem como adiciona os Listeners – e selectionChanged – no caso do NCL Eclipse, seleciona a linha na qual este elemento está definido. Além destes método, foi adicionado também o update – que atualiza a árvore da visão outline quando o documento é gravado no disco. 6.4 Funcionamento do NCL Eclipse 6.4.4 55 Folding Colapsar partes de um código é uma caracterı́stica presente em muitos editores de texto – usualmente chamada de folding – que torna o trabalho de ler e entender este código mais fácil. Esta caracterı́stica permite esconder a parte do código em que não se está interessados no momento, mostrando assim apenas o que é mais importante naquele contexto. O NCL Eclipse implementa o folding baseado nas tags XML. Ou seja, é possı́vel esconder um elemento, juntamente com todos os seus filhos. A figura 6.6 evidencia esta caracterı́stica do NCL Eclipse. Figura 6.6: Colapsar (Folding) 6.4.5 Autocomplete A sugestão automática de texto - autocomplete - baseada em contexto é uma caracterı́stica presente em muitos editores e processadores de texto, bem como navegadores web. O autocomplete envolve o processo do programa predizer uma palavra ou frase que o usuário quer inserir no texto sem que este usuário precise digitá-la por inteiro. Em editores de 6.4 Funcionamento do NCL Eclipse 56 texto especı́ficos para linguagens de programação esta caracterı́stica é extremamente útil, pois diminui bastante o tempo necessário para a programação, ajudando o usuário a sempre criar um documento correto e a digitar menos do que o que seria necessário sem esta funcionalidade. O NCL Eclipse implementa o autocomplete baseado no perfil Enhanced Digital Television da linguagem NCL, disponı́vel através de Ctrl+Espaço. Três cenários principais foram analisados: a sugestão de tags, a sugestão de atributos de uma determinada tag e a sugestão de valores dos atributos de uma tag. Para poder implementar separadamente cada um destes cenários, o particionamento do documento, disponibilizado pelo JFace text editor, foi extremamente útil. Através da API do Eclipse é possı́vel definir regras de particionamento do documento e tratar cada uma destas partições de forma totalmente independente. É possı́vel, por exemplo, definir coloração sintática, formatação, bem como sugestão de texto diferentes para cada uma destas partições. No NCL Eclipse foram definidas algumas partições úteis para documentos XML. A figura 6.7 apresenta as principais partições do XML definida pelo NCL Eclipse. Figura 6.7: Principais partições do XML definidas pelo NCL Eclipse A sugestão de tags baseia-se na estrutura da linguagem e na posição atual na qual o cursor está posicionado. Sendo assim, quando estamos com o cursor entre uma partição de start tag <ncl> e uma de end tag < /ncl>, o NCL Eclipse sugere as tags que 6.4 Funcionamento do NCL Eclipse 57 são filhas de <ncl> (<body> e <head>). Isto acontece para todas as tags da linguagem. Para as tags que possuem atributos obrigatórios, estes atributos também são incluı́dos no texto quando a mesma é inserida pelo autocomplete. O segundo cenário, que se refere aos atributos de uma determinada tag, está relacionado exclusivamente a uma partição de start tag. Ao ativar o autocomplete dentro de uma partição de start tag que já possui o nome de uma tag definida, o autocomplete, baseado neste nome, sugere ao usuário os valores possı́veis de atributos desta tag. Caso um atributo já tenha sido preenchido o mesmo não é sugerido novamente. No terceiro cenário, onde o usuário está digitando o valor de um atributo, existem duas possibilidades principais. Na primeira, os valores dos atributos são prédefinidos pela linguagem – é o que acontece, por exemplo, com o atributo operator do elemento <compoundAction> que só pode assumir os valores par ou seq. E, na segunda, os valores são referência a outros nós definidos pelo próprio usuário no documento (ou em outro importado) – podem-se citar como exemplos o atributo xconnector do elemento <link> que deve ser o valor de um identificador de um conector definido através do elemento <causalConnector>. As Figuras 6.8 e 6.9 mostram exemplos deste terceiro cenário. Na Figura 6.8, o usuário está digitando o papel que um nó vai exercer em um elo. Este elo é do tipo onBegin1StatN, – o qual está especificado na base de connectores (connBase) – conforme definido pelo atributo xconnector. Este tipo de atributo, que na verdade é um conector definido na base de connectores, tem como papéis possı́veis onBegin e start. O NCL Eclipse faz o parsing do documento, encontra a definição do connector e sugere os papéis possı́veis para este conector. Na Figura 6.9, os valores possı́veis para o atributo descriptor do elemento media são os identificadores dos elementos descriptor, definidos na base de descritores. Da mesma forma que o anterior, quando o usuário está digitando o valor do atributo descriptor, NCL Eclipse faz o parsing do documento e descobre quais os descritores definidos pelo usuário e sugere seus identificadores. Quando o valor é pré-definido pela linguagem a lista dos valores possı́veis é mostrada. Já quando o valor deve ser uma referência a outro nó definido pelo próprio usuário o parsing do documento é realizado em tempo de execução para saber quais os valores possı́veis. 6.4 Funcionamento do NCL Eclipse Figura 6.8: Autocomplete Figura 6.9: Autocomplete – sugestão de referências 58 6.4 Funcionamento do NCL Eclipse 59 Outros problemas, tais como o tipo do atributo sugerido deve ser do tipo que aquele atributo aceita e o contexto no qual os elementos estão, também influem nas sugestões dadas pelo NCL Eclipse. Estes dois pontos estão implementados no NCL Eclipse e são vistos como diferencial desta ferramenta em relação a outras existentes. 6.4.6 Integração NCL Eclipse e NCL Validator Uma das caracterı́sticas mais úteis que os ambientes de desenvolvimento baseados em linguagem de programação disponibilizam para os seus usuários é a identificação e marcação de erros no momento da autoria dos arquivos-fonte. Esta é uma funcionalidade disponı́vel na maioria das IDEs existentes no mercado e ajuda a diminuir o tempo de autoria, visto que diminui a necessidade de executar o documento para evidenciar que o mesmo possui erros sintáticos e/ou semânticos. Como foi visto no capı́tulo 4, o NCL Validator foi desenvolvido com o objetivo de identificar erros em documentos NCL e retornar uma lista de mensagens ao usuário. Outro objetivo do NCL Validator é ser reutilizado por outras ferramentas (como as de autoria ou os formatadores). O NCL Eclipse, assim, reutiliza o NCL Validator para identificar e marcar erros em documentos NCL. A reutilização do NCL Validator dá-se como visto na subseção 4.3.2. A Figura 6.10 mostra como o NCL Eclipse apresenta os erros gerados pelo NCL Validator. A marcação de erros no próprio documento (o sublinhado sob a posição do erro) também é suportado pelo NCL Eclipse. 6.4.7 Execução de um documento NCL - Integração NCL Eclipse e Ginga Emulator Além de tornar possı́vel a construção de documentos NCL de forma textual, com as funcionalidades discutidas acima, através do NCL Eclipse, também é possı́vel executar o documento NCL. Veja a Figura 6.11. A execução do documento é feita através do Ginga NCL Emulator que está disponı́vel como software público em [Governo do Brasil 2008]. O NCL Eclipse utilizase do ponto de extensão org.eclipse.debug.ui.launchShortcuts da plataforma Eclipse para disponibilizar a execução através do menu contextual Run as > NCL Presentation. 6.4 Funcionamento do NCL Eclipse 60 Figura 6.10: Marcação de erros A ferramenta NCL Eclipse, portanto, traz várias funcionalidades que auxiliam o processo de criação de apresentações interativas em NCL. Estas funcionalidades tornam a autoria mais prática e rápida. Ao ser implementado sobre o ambiente Eclipse é também possı́vel que o autor utilize-se de outros plug-ins que podem auxiliá-lo, como plug-ins para controle de versão, comparação de arquivos e mesmo plug-ins voltadas para linguagens procedurais como o JDT e o LuaEclipse [PUC-Rio 2008] – um conjunto de plug-ins para a criação de scripts Lua. 6.4 Funcionamento do NCL Eclipse Figura 6.11: Execução de um documento NCL 61 62 7 Considerações Finais Este trabalho teve como objetivo principal a criação de um editor textual que auxilie o desenvolvimento de programas interativos em NCL. Este editor foi desenvolvido na forma de um plug-in para Eclipse, visando reutilizar todo este ambiente já bem conhecido por muitos programadores, e outros plug-ins que também podem ser úteis para o desenvolvimento de aplicações para a TV Digital Brasileira (como é o caso do LuaEclipse [PUC-Rio 2008]. Algumas caracterı́sticas comuns em IDEs, como coloração sintática, folding, auto-formatação, identificação e marcação de erros, sugestão de conteúdo baseado no contexto (autocomplete) e execução do documento, foram implementadas neste plug-in. Tornando-o assim, um ambiente completo para o desenvolvimento de programas em NCL. O aprendizado da linguagem NCL também é favorecido com a utilização da ferramenta, permitindo assim que apenas com Ctrl+Espaço, seja possı́vel, por exemplo, descobrir os filhos de uma determinada tag ou os valores possı́veis de um determinado atributo da linguagem. Como forma de avaliar o NCL Eclipse e conhecer a sua receptividade pelo público-alvo (conhecedores da linguagem NCL) está sendo realizada uma pesquisa qualitativa com alguns membros selecionados na comunidade Ginga NCL [Governo do Brasil 2008]. Infelizmente, a pesquisa ainda não teve resultados conclusivos, por isso não está sendo apresentada aqui. Como crı́tica à ferramenta é evidenciado o fato de que esta não traz funcionalidades que poderiam auxiliar outros públicos (leigos em NCL), principalmente os produtores de conteúdo, que são mais próximos de ferramentas WYSIWYG. Este é deixado como um trabalho futuro. O autocomplete baseado nos perfis da linguagem NCL, também é deixado como trabalho futuro – atualmente o perfil Enhanced Digital Television é o suportado. Em breve, o NCL Eclipse será disponibilizado como software livre na comunidade Ginga NCL, o que permitirá que os membros desta comunidade também adicionem novas funcionalidades à ferramenta e a utilizem livremente. Esta é mais uma contribuição da Universidade Federal do Maranhão a esta comunidade – a primeira contribuição foi o 7 Considerações Finais 63 NCL Validator (Capı́tulo 4), reutilizado pelo Composer [Guimarães, Costa e Soares 2007] que inclusive foi a primeira contribuição pública a comunidade Ginga. Referências Bibliográficas [ABNT 2007]ABNT. Televisão Digital Terrestre - Codificação de dados e especificações de transmissão para radiodifusão digital. [S.l.], 2007. [Apache Software Foundation 2002]Apache Software Foundation. Xerces Java Parser. 2002. Http://xerces.apache.org/xerces-j/. [Bulterman et al. 1998]BULTERMAN, D. C. A. et al. Grins: A graphical interface for creating and playing smil documents. WWW7 Conference Computer Networks anda ISDN Systems, 1998. [Clayberg e Rubel 2004]CLAYBERG, E.; RUBEL, D. Eclipse: Building CommercialQuality Plugins. [S.l.]: Addison-Wesley, 2004. [Eclipse Foundation 2008]Eclipse Foundation. Eclipse documentation - Latest Release Eclipse 3.3. 2008. Http://help.eclipse.org/help33/index.jsp. [Eclipse Foundation 2008]Eclipse Foundation. SWT: The Standard Widget Toolkit. 2008. Http://www.eclipse.org/swt/. [Governo do Brasil 2008]Governo do Brasil. Comunidade Ginga-NCL. 2008. URL: http://www.softwarepublico.gov.br. [Green e Petre 1992]GREEN, T. R.; PETRE, M. When visual programs are harder to read than textual programs. ECCE-6 (6th European Conference on Cognitive Ergonomics), 1992. [Guimarães, Costa e Soares 2007]Guimarães, R. L.; Costa, R. M. de R.; Soares, L. F. G. Composer: Ambiente de autoria de aplicações declarativas para a tv digital interativa. WEBMEDIA: Brazilian Symposion on Multimedia and the Web, 2007. [ISO 2008]ISO. The Schematron - An XML Structure Validation Language using Patterns in Trees. 2008. Http://xml.ascc.net/resource/schematron/. [Loy et al. 2002]LOY, M. et al. Java Swing. [S.l.]: O Reilly, 2002. REFERÊNCIAS BIBLIOGRÁFICAS 65 [Manalee 2008]MANALEE. SMOX Pad. 2008. URL: http://www.manalee.com/. [Moultis e Kirk 1998]MOULTIS, N. P.; KIRK, C. XML Black Book Solução e Poder. [S.l.]: Makron Books, 1998. [NCL 2008]NCL. Site NCL. 2008. Http://www.ncl.org.br. [Nelson 1965]NELSON, T. H. A file structure for the complex, the changing and the indeterminate. In: . [S.l.]: ACM Press, 1965. p. 84–100. [Neto et al. 2007]NETO, C. S. S. et al. Construindo Programas Audiovisuais Interativos Utilizando a NCL 3.0 e a Ferramenta Composer. [S.l.], 2007. [Oratrix 2008]ORATRIX. Site na Web da Oratrix. 2008. URL: http://www.oratrix.com/. [PUC-Rio 2008]PUC-RIO. Documentação de NCLua. 2008. URL: http://www.telemidia.puc-rio.br/ francisco/nclua/index.html. [PUC-Rio 2008]PUC-RIO. LuaEclipse: An integrated development environment for the Lua programming language. 2008. Http://luaeclipse.luaforge.net/. [Refsnes Data 2008]Refsnes Data. DTD Tutorial. 2008. Http://www.w3schools.com/DTD/default.asp. [Refsnes Data 2008]Refsnes Data. Tutorial sobre SMIL. 2008. URL: http://www.w3schools.com/smil/default.asp. [Soares e Rodrigues 2005]SOARES, L. F. G.; RODRIGUES, R. F. Nested Cotext Model 3.0 Part 1 - NCM Core. [S.l.], 2005. [Soares e Rodrigues 2006]SOARES, L. F. G.; RODRIGUES, R. F. Nested Context Language 3.0 Part 8 - NCL Digital TV Profiles. [S.l.], 2006. [Sun Microsystems 2008]Sun Microsystems. Java Native Interface Specification. 2008. Http://java.sun.com/j2se/1.3/docs/guide/jni/spec/jniTOC.doc.html. [W3C 2002]W3C. XHTML 1.0 The Extensible HyperText Markup Language (Second Edition). 2002. Http://www.w3.org/TR/xhtml1/. [W3C 2003]W3C. XML Schema. 2003. Http://www.w3.org/XML/Schema. REFERÊNCIAS BIBLIOGRÁFICAS 66 [W3C 2005]W3C. Synchronized Multimedia Integration Language (SMIL 2.1). 2005. URL: http://www.w3.org/TR/REC-smil/. [W3C 2008]W3C. XML 1.0 Extensible Markup Language (XML) 1.0 (Fourth Edition). 2008. Http://www.w3.org/TR/REC-xml. [Zukowski 1997]ZUKOWSKI, J. Java AWT Reference. [S.l.]: O Reilly, 1997. 67 Glossário Atributo Os atributos em XML são usados para descrever os elementos XML ou para fornecer uma informação adicional sobre os elementos. São definidos sempre nas tags de aberturas, da seguinte forma <tag attributo1=“valor” atributo2=“valor”...>. Autor pessoa que interage com o editor / formatador NCL visando a criação de um documento hipermdia. Conector hipermı́dia tem a função de representar relações entre os componentes de um documento hipermı́dia. Documento hipermı́dia Um documento hipermı́dia é composto por nós e elos. Um documento hipermı́dia contém imagens, vı́deos, áudios e textos. Além disso, usa ligações de hipertexto para permitir que o usuário salte de um trecho para outro do documento ou até mesmo para um documento diferente. DOM API definida pelo W3C que define como acessar, ou manipular, um documento XML. Esta API é independente de plataforma e/ou linguagem e é baseada no modelo DOM (Document Object Model). Elo De uma forma simplificada, um elo pode ser entendido como o relacionamento entre mı́dias. Linguagem de marcação É representada por um conjunto de códigos empregados a dados e a textos, com a finalidade de adicionar informações especı́ficas sobre esse dado ou texto. A linguagem de marcação é utilizada em diferentes segmentos, em especial na indústria editorial onde a marcação e a formatação de páginas são feitas a partir desse recurso. XML, HTML, SMIL e NCL são exemplos de linguagens de marcação. REFERÊNCIAS BIBLIOGRÁFICAS 68 Linguagem de script É uma linguagem de programação interpretada, ou seja, executada em um interpretador. Módulos XML são coleções de elementos, atributos e valores de atributos XML semanticamente relacionados que representam uma unidade de funcionalidade. Módulos são definidos em conjuntos coerentes. Essa coerência é expressa por meio da associação de um mesmo namespace aos elementos desses módulos. Os módulos são atômicos, isto é, não podem ser subdivididos quando incluı́dos em um perfil de linguagem. Middleware é a camada de software localizada entre as aplicações (programas de usuário ou uso final) e o sistema operacional. Seu objetivo é oferecer às aplicações suporte necessário para seu rápido e fácil desenvolvimento, além de esconder os detalhes das camadas inferiores, bem como a heterogeneidade entre os diferentes sistemas operacionais e hardwares, definindo, para os que produzem conteúdo, uma visão única de aparelho. O Ginga é o middleware brasileiro da televisão digital terrestre. Nó (de um documento hipermı́dia) Representa um objeto de mı́dia abstraindo como seu conteúdo está representado. Nó NCL Qualquer elemento definido Pela linguagem NCL.(elemento < media >, < context >, < body > ou < switch > de NCL)[ABNT 2007] NCL (Nested Context Language) Linguagem de marcação, declarativa, baseada em XML, para especificação de apresentações hipermı́dia. Perfil XML Um perfil de linguagem é uma combinação de módulos. Além disso, a especificação de um módulo pode incluir um conjunto de requisitos para integração, com o qual os perfis de linguagem, que incluem o módulo, devem obrigatoriamente ser compatı́veis. [ABNT 2007] Plug-in Plug-in é um termo que significa ”de encaixe”, pode ser utilizados em situações cotidianas, como aparelhos eletrônicos, máquinas ou qualquer coisa. Na informática, um plugin ou plug-in é um (geralmente pequeno e leve) REFERÊNCIAS BIBLIOGRÁFICAS 69 programa de computador que serve normalmente para adicionar funções a outros programas maiores, provendo alguma funcionalidade especial ou muito especı́fica. Schema (XML) Descreve a estrutura de um documento XML. A linguagem XML Schema é também denominada como XML Schema Definition (XSD). É uma alternativa aos DTDs (Document Type Definition) [Refsnes Data 2008]. Tag (XML) Em XML, uma tag é o que está escrito entre ”menor que”e ”maior que- (< isto é uma tag >). As tags podem ser de abertura (<tag>) ou de fechamento </tag>. Uniform Resource Identifier (URI) método de endereçamento tido como universal. Permite, por exemplo, o acesso a objetos em uma rede. Usuário ou Usuário final pessoa que interage com o programa em execução. Se estivermos falando de TV digital, podemos entender como sendo o telespectador. Validador software cuja finalidade é verificar se um dado documento segue os padrões sintáticos e semânticos definidos na especificação da linguagem na qual este documento é criado. É muito utilizado para validar linguagens de programação. Um bom validador além de dizer se existe ou não erros no documento deve ter a capacidade de identificar o possı́vel local do erro, bem como mostrar um mensagem que auxilie o autor a consertá-los. 70 A NCL Eclipse - Diagrama de Classes e Pontos de Extensão Este anexo tem como objetivo mostrar a estrutura do NCL Eclipse. Para isto são apresentados os diagramas de classes mais explicativos do sistema e o arquivo plugin.xml. A NCL Eclipse - Diagrama de Classes e Pontos de Extensão Figura A.1: Diagrama de classes do NCL Eclipse - visão geral 71 A NCL Eclipse - Diagrama de Classes e Pontos de Extensão Figura A.2: Diagrama especı́fico da implementação dos Wizards Figura A.3: Diagrama de classes especı́fico da implementação da visão Outline 72 A NCL Eclipse - Diagrama de Classes e Pontos de Extensão 73 Figura A.4: Diagrama de classes especı́fico da implementação do parsing NCL, utilizado para manter informações na memória e sugerı́-las quando necessário A NCL Eclipse - Diagrama de Classes e Pontos de Extensão 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 <?xml version=” 1 . 0 ” e n c o d i n g=”UTF−8” ?> <? e c l i p s e version=” 3 . 2 ” ?> <p l u g i n> <e x t e n s i o n p o i n t=” o r g . e c l i p s e . u i . e d i t o r s ”> <e d i t o r c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . NCLEditor ” c o n t r i b u t o r C l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . NCLActionContributor ” default=” t r u e ” e x t e n s i o n s=” n c l , conn ” i c o n=” i c o n s / sample . g i f ” i d=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . e d i t o r s . NCLEditor ” name=”NCL E c l i p s e ”> </ e d i t o r> </ e x t e n s i o n> < !−−E d i t o r A c t i o n s −−> < !−− End o f E d i t o r A c t i o n s −−> <e x t e n s i o n p o i n t=” o r g . e c l i p s e . u i . newWizards ”> <c a t e g o r y i d=” n c l e c l i p s e ” name=”NCL”> </ c a t e g o r y> <w i z a r d c a t e g o r y=” n c l e c l i p s e ” c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . w i z a r d s . NCLNewWizard” i c o n=” i c o n s / sample . g i f ” i d=” n c l e c l i p s e . w i z a r d s . NCLNewWizard” name=”NCL Document”> </ w i z a r d> <w i z a r d c a t e g o r y=” n c l e c l i p s e ” c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . w i z a r d s . ConnectorBaseNewWizard ” i c o n=” i c o n s / sample . g i f ” i d=” n c l e c l i p s e . w i z a r d s . ConnectorBaseNewWizard ” name=” Connector Base Document”> </ w i z a r d> </ e x t e n s i o n> <e x t e n s i o n p o i n t=” o r g . e c l i p s e . u i . commands”> <command c a t e g o r y I d=” o r g . e c l i p s e . j d t . u i . c a t e g o r y . s o u r c e ” d e s c r i p t i o n=”%A c t i o n D e f i n i t i o n . f o r m a t . d e s c r i p t i o n ” i d=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . a c t i o n s . f o r m a t ” name=”%A c t i o n D e f i n i t i o n . f o r m a t . name”> </command> </ e x t e n s i o n> <e x t e n s i o n i d=” n c l e r r o r ” name=”NCL E r r o r ” p o i n t=” o r g . e c l i p s e . c o r e . r e s o u r c e s . markers ”> <s u p e r t y p e=” o r g . e c l i p s e . c o r e . r e s o u r c e s . markers . problemmarker ”> </ s u p e r> <s u p e r t y p e=” o r g . e c l i p s e . c o r e . r e s o u r c e s . markers . t e x t m a r k e r ”> </ s u p e r> <p e r s i s t e n t v a l u e=” t r u e ”> </ p e r s i s t e n t> </ e x t e n s i o n> <e x t e n s i o n p o i n t=” o r g . e c l i p s e . debug . u i . l a u n c h S h o r t c u t s ”> <s h o r t c u t l a b e l=”NCL P r e s e n t a t i o n ” i c o n=” i c o n s / sample . g i f ” modes=” run ” c l a s s=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . l a u n c h . LaunchShortcut ” i d=” br . ufma . d e i n f . l a w s . n c l e c l i p s e . l a u n c h . LaunchShortcut ”> <c o n t e x t u a l L a u n c h> <enablement> <with v a r i a b l e=” s e l e c t i o n ”> <count v a l u e=” 1 ” /> </ with> </ enablement> <c o n t e x t L a b e l mode=” run ” l a b e l=”NCL P r e s e n t a t i o n ” /> </ c o n t e x t u a l L a u n c h> <p e r s p e c t i v e i d=” o r g . e c l i p s e . j d t . u i . J a v a P e r s p e c t i v e ” /> <p e r s p e c t i v e i d=” o r g . e c l i p s e . debug . u i . D e b u g P e r s p e c t i v e ” /> </ s h o r t c u t> </ e x t e n s i o n> </ p l u g i n> Figura A.5: Arquivo plugin.xml - Customização dos pontos de conexão 74