Arena PUJ – Sistema Online de Suporte ao Prêmio Universitário Java Leonardo Silveira¹, Felipe Gaúcho² ¹USIX Technology ²Ceará Java Users Group (CEJUG) ¹[email protected] ²[email protected] Resumo - Este artigo apresenta o Prêmio Universitário Java (PUJ), uma competição acadêmica entre trabalhos Java realizados por alunos de cursos de graduação no Ceará. Além do formato da competição e de como ela se encaixa no mercado cearense de TI, o artigo descreve o Arena PUJ, um projeto de software livre criado para desenvolver um sistema online de gerenciamento e divulgação dos resultados das competições no formato PUJ. Este texto descreve as demandas que motivaram o projeto, o modelo das competições, e apresenta os primeiros resultados obtidos com um protótipo desenvolvido sob a plataforma Java Enterprise Edition (Java EE). O modelo inovador de desenvolvimento e a interoperabilidade entre as tecnologias adotadas no protótipo oferecem bons indicadores sobre as tecnologias ditas “Web 2.0” e também as novas tendências de projeto de software orientados à Cloud Computing. Palavras chave — PUJ, Software Livre, Java EE, CEJUG, Cloud Computing. Abstract — This article presents "Premio Universitario Java" (PUJ), an academic competition between java exercises made by students from graduation courses on Ceará. This article describes the competition format, how it's connected with IT market on Ceará and also it describes the Arena PUJ, a free software/open source online system made to manage and spread competitions results which uses PUJ's format. This article describes the demands which motivated the project conception, it's model and the results obtained by a prototype application developed using the Java Enterprise Edition (Java EE) platform. It's innovative model and it's interoperability with adopted technologies on the prototype offers good indicators about the so-called "Web 2.0" technologies and also the new software project trends oriented to Cloud Computing. Keywords — PUJ, open-source, Computing. Java EE, CEJUG, Cloud I. INTRODUÇÃO O CEJUG [1] (Grupo de usuários Java do Ceará) promove anualmente o Prêmio Universitário Java - PUJ, uma competição que revela trabalhos de graduação produzidos com a tecnologia Java em faculdades do Ceará. Iniciado em 2007, o PUJ oferece à sociedade um indicador independente sobre a qualidade do ensino Java nas faculdades locais, além de abrir um espaço para revelar novos talentos em TI e para a celebração dos bons professores e das boas instituições de ensino superior no Ceará e no Brasil – visto que o formato da competição começa a ser copiado em outros estados brasileiros. A partir do apoio da indústria local e da boa repercussão das três primeiras edições do PUJ, um grupo de profissionais e estudantes do CEJUG decidiu criar um projeto de software livre para melhorar a visibilidade e a organização do PUJ. O projeto foi batizado de “Arena PUJ” e publicado sob a licença LGPL[2] no portal Kenai[3]. Nas próximas seções deste artigo descrevemos o modelo de competição do PUJ e a arquitetura do Projeto Arena PUJ, apresentando também o modelo de desenvolvimento adotado no Projeto e os resultados já obtidos. O formato do artigo é um convite para que os desenvolvedores contribuam nesta inovadora forma de estimular qualidade em educação Java. II.PRÊMIO UNIVERSITÁRIO JAVA O objetivo do Prêmio Universitário Java é aproximar a academia do mercado, colocando os trabalhos acadêmicos produzidos em exposição para profissionais de TI e empresas patrocinadoras. A competição consiste em três etapas distintas: 1. Chamada de trabalhos: professores podem submeter os trabalhos Java de seus melhores alunos. 2. Avaliação dos trabalhos: profissionais de mercado, alunos e professores avaliam os trabalhos com notas entre um e dez e uma pequena justificativa para cada nota. 3. Publicação dos resultados: o CEJUG divulga os resultados, encerrando a competição e premiando os alunos com os melhores trabalhos. Algumas regras são obedecidas para garantir a qualidade e segurança das informações, bem como para estimular a competitividade saudável entre os estudantes. Para economizar espaço neste texto, não iremos copiar aqui o regulamento completo usado pelo CEJUG, mas dentre estas regras destacam-se o fato que apenas professores podem submeter trabalhos e de que a competição é toda virtual, não exigindo a presença física de professores e/ou estudantes em nenhuma de suas etapas. Ao submeter um trabalho o professor endossa a autoria do trabalho, que precisa ter sido parte de alguma disciplina regular de um curso de graduação do Ceará. Outro detalhe importante é que o PUJ delimita as tecnologias aceitas na competição mas não estabelece os tipos de trabalho que podem ser submetidos pelos professores, ou seja, o PUJ avalia a realidade do que está sendo produzido dentro da faculdade sem interferir nos currículos destas faculdades. Reconhecemos a liberdade das faculdades em escolher o que ensinar, bem como na seriedade dos órgãos de governo em fiscalizar a qualidade dos currículos adotados nas instituições de ensino. Um dos objetivos do PUJ é oferecer um indicador complementar ao currículo das universidades, permitindo ao mercado de trabalho dar notas ao que está sendo produzido em sala de aula. A sociedade em geral, incluindo alunos e seus familiares e as empresas que buscam contratar bons egressos de cursos universitários recebem os resultados como uma opinião do mercado sobre o que é realmente implementado com Java em sala de aula – e não apenas uma avaliação institucional formal sobre o formato dos currículos. Outro detalhe interessante é que os professores e alunos são convidados a avaliarem os trabalhos de seus concorrentes, estimulando a revisão aos pares e a identificação do que os colegas de outras instituições de ensino estão produzindo dentro de sala de aula. Isto estimula as instituições a atualizarem continuamente seus conteúdos, e sugere aos alunos a uma busca por melhor qualidade de ensino – pelo menos se equiparando ao que de melhor seus pares acadêmicos estão produzindo. Papéis no PUJ Os seguintes papéis são observados nas competições PUJ: • Professores: são responsáveis por submeterem os trabalhos e podem avaliar os trabalhos de seus concorrentes. Apesar de alunos e professores serem considerados times em competições PUJ, os professores normalmente não recebem prêmios pela conquista de seus alunos. • Alunos: são os autores dos trabalhos, e candidatos ao título da competição e respectivos prêmios. Apesar de serem os autores dos trabalhos, os alunos não podem submeter os trabalhos diretamente ao PUJ, eles precisam do consentimento de seus professores. Isto visa garantir a segurança das informações e também valorizar a relação aluno-professor em um processo saudável de ensino-aprendizado. • Profissionais Seniores: são profissionais de destaque no mercado brasileiro de java, selecionados pelo JUG[4] e responsáveis por darem a opinião do mercado de software sobre a qualidade do que vem sendo produzido dentro das salas de aula das universidades. Estes profissionais doam o seu tempo livre à competição visto que não é prevista nenhuma remuneração ou premiação aos avaliadores do PUJ. • JUG: o grupo de usuários é responsável pela comunicação durante a competição, coletando os trabalhos e demais informações relevantes sobre os participantes. Ao JUG também cabe estabelecer o calendário da competição e divulgar seus resultados, bem como zelar pela entrega dos prêmios conquistados pelos alunos. Em situações excepcionais o JUG pode intervir nas regras e nas avaliações, mas isto nunca foi necessário. O ideal é que o JUG se mantenha o mais imparcial possível, não interferindo nas avaliações ou ajudando os professores e alunos durante a submissão. Processo de avaliação Os avaliadores são compostos por profissionais sênior do mercado de TI brasileiro, bem como pelos professores que submeteram os trabalhos e pelos alunos competidores. Há uma distribuição de pesos para as notas dadas pelos avaliadores, a saber: 1 – estudante; 3 – Professor; 7 – Profissional Sênior. A nota final é calculada através de média harmônica. Outro detalhe inovador é que o CEJUG não define critérios de avaliação, a única recomendação é que os avaliadores usem sua experiência profissional para avaliar os trabalhos e dar uma pequena justificativa sobre cada nota. Este detalhe também sugere a experiência dos profissionais como critério mais importante no convite de participação aos avaliadores. Submissão dos trabalhos As submissões de trabalhos devem ocorrer em um período estipulado pelo CEJUG, geralmente nas primeiras semanas de um período letivo, aceitando trabalhos que foram desenvolvidos nos semestres acadêmicos desde a última competição PUJ. Cabe aos professores selecionar dentre os trabalhos acadêmicos de seus alunos os com melhor acabamento e qualidade técnica. Não deve haver nesta etapa intervenção alguma por parte dos profissionais de mercado ou por parte do JUG organizador da competição. Premiação dos trabalhos As premiações do PUJ são variadas, podem ser viagens para congressos, licenças de software, livros técnicos ou cursos. Há uma recomendação para não prover premiações em dinheiro, pois elas poderiam desviar o foco da competição, que é promover a educação e a integração entre a universidade e o mercado de trabalho. A primeira edição da competição foi realizada em 2007 e envolveu duas das maiores instituições de ensino superior do Ceará. A edição seguinte teve maior participação, contando com cinco instituições de ensino superior adicionais, empresas patrocinadoras e dezenas de trabalhos acadêmicos de alto nível. A partir de 2010, outros JUGs brasileiros demonstraram interesse em realizar competições no mesmo formato, e a necessidade de uma ferramenta de gerenciamento das competições se tornou evidente. Neste momento, alguns profissionais começaram a avaliar os requisitos e a arquitetura do projeto Arena PUJ. III. REQUISITOS DO ARENA PUJ A partir do formato de competição descrito acima, debates técnicos permitiram a enumeração dos requisitos de um sistema de suporte ao PUJ, dentre os quais destacamos: • Gerenciamento dos documentos, em especial os trabalhos java distribuídos em arquivos compactados. • Cadastro e autenticação dos usuários do sistema, com ênfase em tecnologias de autenticação distribuída, por exemplo OpenId[5] ou Oauth[6]. • Sistema de votação, incluindo a coleta das notas e justificativas e cálculo das médias parciais e finais. • Sistema de notificação, com ênfase em mídias atuais como Twitter[7], Google Buzz[8] e sistemas de emails. Requisitos Não funcionais Uma restrição natural do projeto é que ele deve ser implementado com tecnologias Java devido à filosofia do CEJUG em fomentar e divulgar o Java no Ceará. Não questionamos a possibilidade de outras tecnologias oferecerem soluções de igual qualidade técnica ao que buscamos produzir, mas tratando-se de um projeto novo o CEJUG sempre privilegia o Java. A partir deste princípio, alguns outros aspectos foram debatidos, em especial a questão emergente do Cloud Computing[9] uma tendência de mercado que promove a integração de serviços distribuídos em máquinas distribuídas na rede mundial de computadores (world wide web – www) e conectadas pelo protocolo HTTP[10]. Seguindo esta forte tendência, adotamos o estilo de arquitetura conhecido como Representational State Transfer (REST[11]) e definimos que o projeto seria baseado no conceito de produtor-consumidor, onde serviços REST servem dados através do protocolo HTTP e um conjunto de aplicações web consomem e formatam estes dados para o usuário final – um ser humano. O REST faz distinção entre consumidores humanos e máquinas, mas este tópico vai além do escopo do nosso artigo. Outro detalhe importante é que o Arena PUJ também é um projeto escola, permitindo que membros do CEJUG experimentem diversas tecnologias e tentem a seu modo produzir uma solução de qualidade ao suporte de competições PUJ. Para este fim, é importante que a configuração do projeto seja flexível o bastante para absorver novas tecnologias com o mínimo impacto no código já desenvolvido. Integração contínua e o acesso público e permanente ao código produzido são outros detalhes importantes a serem observados durante montagem do projeto. Diversas discussões foram realizadas entre os membros do CEJUG e no final alguns requisitos não funcionais foram estabelecidos: • Ser desenvolvido total ou principalmente em Java. • Parte servidora baseada em web-services REST (protocolo HTTP). (1.6 formalmente) da plataforma Java Enterprise: EJB 3.1, JPA 2 e JSF 2. Ele provê serviços web no padrão REST (Em detrimento aos Serviços que seguem a especificação SOAP[17]). A implementação do contêiner EJB[18] utilizada para o desenvolvimento do Arena é a implementação de referência da SUN[19], o Glassfish[20], em sua versão 3; a implementação do JPA[21] é o EclipseLink[22]; a implementação do JSF[23] é também a de referência (Mojarra[24]) e o framework Jersey[25] provê um webservice no estilo REST que é consumido nos módulos de interface de usuário do Arena. O Arena possui separação clara entre a parte de negócio e a apresentação dos fluxos possíveis; existem 5 módulos experimentais de interface de usuário, com 3 destes bastante usáveis, um feito com JSF, outro com técnicas tradicionais da web e um terceiro com tecnologias web pretendidas para a próxima versão do HTML[26]; um módulo a parte e independente destes outros é responsável por servir através de HTTP os serviços de listagem, votação e patrocínio do PUJ. Por trás da fachada de serviço REST há os EJB's que cuidam da camada de lógica e negócio e interagem com a parte de persistência da aplicação por meio dos mapeamentos objetorelacional feitos pelo EclipseLink, a implementação de JPA escolhida para o Arena. Há também Beans Assíncronos participantes de barramentos JMS[27] responsáveis por tarefas como envio de email de confirmação de cadastro. • Ter integração contínua baseada em Hudson[12]. • Usar Maven[13] como ferramenta de compilação do código. • Usar Kenai para a hospedagem do projeto e usar Mercurial[14] ou GIT[15] como repositório de código. IV. ARQUITETURA DO ARENA PUJ O Arena é desenvolvido para dar suporte à competição promovida pelo CEJUG, em substituição a uma série de documentos e planilhas a preencher. Em sua concepção várias tecnologias Java Enterprise Edition recentes foram avaliadas, mais precisamente a versão 6 da especificação JEE[16] e suas correlatas. Requisitos do Projeto Arena PUJ Para dar suporte à competição o aplicativo funciona como sistema de votação e listagem dos competidores, além de possuir um subsistema de autenticação para diferenciar competidores e avaliadores de visitantes. A listagem hoje possui um filtro capaz de mostrar todas as competições passadas e seus participantes, bem como apresentar a competição atual. O arena também tem um espaço reservado para os patrocinadores e para as instituições participantes na forma de propaganda. Há um algoritmo que define de forma aleatória quais e em que ordem aparecerão os patrocinadores. Protótipo do Arena PUJ Para validar a arquitetura acima descrita e, principalmente, permitir o experimento de diversas tecnologias web 2.0, o CEJUG desenvolveu um aplicativo Java EE 6 chamado Arena PUJ e hospedado no portal Kenai.com. O aplicativo é construído com as mais recentes implementações da versão 6 Fig. 1 Arquitetura do Arena PUJ O módulo de interface arena-vaadin utiliza um framework java (chamado Vaadin[28]) que permite abstrair a camada web e suas tecnologias específicas e assim possibilitar que os desenvolvedores produzam apenas código java. Este módulo consome o serviço REST do módulo arena-http (que veremos um pouco adiante) através de um cliente no lado do servidor. O módulo encontra-se em seus estágios iniciais. Outro módulo de interface é o arena-html5. Este utiliza apenas tecnologias web da camada do cliente, sem uso de códigos java para consumir o serviço REST. Este módulo usa novidades do html5[29], especificação essa ainda em desenvolvimento, além de muitos comportamentos dinâmicos implementados em Javascript[30]. Este módulo é capaz de listar os competidores das edições do PUJ e é um dos módulos mais recentes do Arena. O módulo arena-vraptor usa o framework java vraptor[31] para a renderização dos componentes de tela. Este framework dá ênfase a configuração por convenção e permite desenvolver interfaces de usuário compatíveis com REST. Este módulo é uma exceção à separação entre os módulos pela camada de serviço, pois o módulo vraptor faz acesso direto à camada de persistência. O arena-vraptor encontra-se em seus estágios iniciais de desenvolvimento. O módulo arena-jsf20 é feito com o que temos hoje de padrão de interface de usuário em JEE. Com Java Server Faces o desenvolvedor pode codificar apenas códigos java e componentes JSF, que de forma resumida podem ser chamados de xml's customizados e específicos de renderização de aplicações web. O JSF também contempla a abstração das tecnologias web da camada do cliente. Este módulo é a segunda exceção ao uso da interface do serviço, todavia este usa os ejb's de negócio para acessar os dados do banco. O módulo JSF já possui a listagem de competidores em operação dentre outras funcionalidades. O último módulo de interface é o arena-dwr. Este faz uso de tecnologias tradicionais da web, como html4[32] e Javascript em conjunto com um framework java de RPC[33] (Remote Procedure Call), o DWR[34] (Direct Web Remoting). As chamadas DWR são usadas para alimentar o cliente de serviço escrito em Java que repassa as requisições da tela do usuário ao serviço REST. Este cliente por sua vez devolve à camada DWR os dados e estes são “traduzidos” pelo framework em objetos Javascript e entregues na camada do cliente web. Este módulo foi o primeiro módulo funcional do Arena. O módulo arena-http é o módulo padrão de serviço, é nele que temos fachadas de serviço publicadas através do framework Jersey que consomem os EJB's do Arena. Este módulo não é uma interface de usuário, pois embora possua e distribua conteúdo através de HTTP ele não é um módulo destinado a usuário final; seu conteúdo pode ser lido por um ser humano todavia não é destinado a isso; ele fornece dados codificados em XML[35] (ou JSON[36] opcionalmente) para aplicativos clientes, neste caso específico os módulos do arena listados anteriormente. O módulo arena-model contém todos os componentes de negócio e de persistência de dados do Arena. Os EJB's deste projeto estão contidos aqui, efetuando as operações de cada fluxo lógico. A instanciação e o ciclo de vida destes objetos de negócio são de responsabilidade do contêiner EJB, bem como o tratamento de acessos concorrentes a estas instâncias. Diferente dos outros módulos mostrados até aqui, este módulo não é acessível publicamente através de HTTP, apenas módulos residentes do Enterprise Archive (arquivo EAR[37]) podem fazer uso dos seus objetos de negócio, requisitando a injeção de uma instância do objeto de negócio. O arena-model interage com o gerenciador de entidades (EntityManager) da parte de persistência da aplicação, provendo funcionalidades básicas como listagem, atualização, remoção e salvamento para cada tipo definido no domínio do Arena. As entidades, embora salvas em uma base relacional, não são traduzidas para código SQL[38] diretamente tampouco se faz uso de JDBC[39] dentro do arena-model; usa-se mapeamentos JPA entidade-relacional para abstrair a complexidade da mudança de contexto objeto-relacional. Outro módulo de negócio é o arena-mom. Este módulo também é gerenciado pelo contêiner EJB e também possui lógica de negócio, todavia a natureza dos objetos deste módulo é assíncrona. São estes objetos os responsáveis de receber notificações dos objetos do arena-model e efetuar tarefas secundárias que usualmente não possuem garantias de término. Especificamente o envio de emails de confirmação e mensagens para a conta de twitter do Arena. Os objetos assíncronos fazem parte do barramento da aplicação e aguardam a ocorrência de novas mensagens no tópico do barramento (BUS[40]) serem publicadas (pelos objetos do outro módulo de negócio) e então a notificação é gerada. Os objetos assíncronos recebem então a mensagem e os dados desta são usados em suas tarefas específicas. O módulo arena-client é um módulo de testes unitários. Aqui vão classes de testes que garantem o correto funcionamento de cada peça de código individualmente, desde que tenha um teste escrito para esta peça. Testes funcionais são escritos com Junit[41], um framework especializado de testes que permite fazer medições precisas acerca de erros, acertos e tempo consumido por cada mensagem de cada objeto. O último módulo é o arena-puj, que tem a função de empacotar os outros módulos dentro dele na forma de EAR, Enterprise Archive. Estes tipos de pacote são o que a Especificação JEE recomenda como entregável final de projetos Java enterprise. Ele não somente agrupa os outros módulos, também define uma hierarquia de carregadores de classe protegendo e isolando as definições de classes de cada módulo umas das outras. Recursos como bibliotecas de terceiros quando disponibilizadas dentro do EAR são também disponibilizadas para os módulos nele contidos, pois tais bibliotecas são incluídas no classloader[42] do pacote EAR, que é o carregador de classes “pai” dos classloaders dos outros módulos do Arena. De acordo com a especificação JEE, cada módulo deve possuir seu classloader individual e estes classloaders devem ter como classloader superior o classloader do módulo EAR, que por sua vez tem o classloader do contêiner de aplicações como superior. Todo o código do Arena PUJ e seus módulos é distribuído sob a licença “GNU Lesser General Public License”, que garante o acesso aos fontes originais para todos que tiverem acesso ao aplicativo executando. É uma licença que permite o trânsito livre de desenvolvedores da comunidade no projeto sem gerar a preocupação de apropriamento indevido do código produzido sem manter os créditos do autor original. V.CONCLUSÕES O Arena PUJ serve para gerenciar (e promover) o PUJ, Prêmio Universitário Java e testar as novas tecnologias JEE do mercado por meio de um regime de desenvolvimento colaborativo de código aberto, envolvendo a comunidade de desenvolvedores Java do Ceará no processo. O modelo é interessante enquanto regime de desenvolvimento além de ser primoroso, tecnicamente falando, por sua gama de tecnologias e baixa acoplação entre as camadas. É interessante notar como a evolução da especificação JEE aproxima-se cada vez mais da internet sem perder a capacidade de atender as redes corporativas em analogia às versões anteriores da tecnologia. REFERÊNCIAS BIBLIOGRÁFICAS [1] CEJUG: Ceará Java User Group. Disponível em http://www.cejug.org. Acessado em 01 de Março de 2010. [2] LGPL: GNU Lesser General Public License. Disponível em http://www.gnu.org/licenses/lgpl.html. Acessado em 01 de Março de 2010. [3] Kenai: Project Kenai. Disponível em http://kenai.com/. Acessado em 01 de Março de 2010. [4] JUG: Java User Group. Disponível em http://java.sun.com/community/usergroups/. Acessado em 01 de Março de 2010. [5] OpenId: OpenId Foundation. Disponível em http://openid.net/. Acessado em 01 de Março de 2010. [6] Oauth: Open Protocol to secure API authorization. Disponível em http://oauth.net/. Acessado em 01 de Março de 2010. [7] Twitter: Real-time Information Network. Disponível em http://twitter.com/. Acessado em 01 de Março de 2010. [8] Google Buzz: Real-Time Information Network. Disponível em http://www.google.com/buzz. Acessado em 01 de Março de 2010. [9] Cloud Computing: [10] HTTP: Hyper Text Transfer Protocol. Disponível em http://pt.wikipedia.org/w/index.php? title=Hypertext_Transfer_Protocol&oldid=19085598. Acessado em 01 de Março de 2010. [11] REST: Representational State Transfer. Disponível em http://pt.wikipedia.org/w/index.php?title=REST&oldid=18521273. Acessado em 01 de Março de 2010. [12] Hudson: Extensible Continuous Integration Server. Displnível em http://hudson-ci.org/. Acessado em 01 de Março de 2010. [13] Maven: Project Management and Build Automation Tool. Disponível em http://en.wikipedia.org/w/index.php?title=Apache_Maven&oldid=341515281. Acessado em 02 de Março de 2010. [14] Mercurial: Distributed Source Control Management Tool. Disponível em http://mercurial.selenic.com/. Acessado em 02 de Março de 2010. [15] GIT: Distributed Version Control System. Disponível em http://gitscm.com/. Acessado em 02 de março de 2010. [16] JEE: Java Enterprise Edition. Displnível em http://java.sun.com/javaee/. Acessado em 02 de Março de 2010. [17] SOAP: Simple Object Access Protocol. Disponível em http://www.w3.org/TR/2000/NOTE-SOAP-20000508/. Acessado em 02 de Março de 2010. [18] EJB: Enterprise Java Beans. Disponível em http://java.sun.com/products/ejb/. Acessado em 02 de Março de 2010. [19] SUN: Sun MicroSystems. Disponível em http://en.wikipedia.org/w/index.php? title=Sun_Microsystems&oldid=348174363. Acessado em 02 de Março de 2010. [20] Glassfish: Reference Implementation Application Server. Disponível em https://glassfish.dev.java.net/. Acessado em 02 de Março de 2010. [21] JPA: Java Persistence API. Disponível em http://java.sun.com/javaee/technologies/persistence.jsp. Acessado em 02 de Março de 2010. [22] EclipseLink: Eclipse Persistence Services Project. Disponível em http://www.eclipse.org/eclipselink/. Acessado em 02 de Março de 2010. [23] JSF: Java Server Faces. Disponível em http://java.sun.com/javaee/javaserverfaces/. Acessado em 02 de Março de 2010. [24] Mojarra: Project Mojarra. Disponível em https://javaserverfaces.dev.java.net/. Acessado em 03 de Março de 2010. [25] Jersey: Project Jersey. Disponível em https://jersey.dev.java.net/. Acessado em 03 de Março de 2010. [26] HTML: HyperText Markup Language. Disponível em http://en.wikipedia.org/w/index.php?title=HTML&oldid=348178495. Acessado em 03 de Março de 2010. [27] JMS: Java Message Service. Disponível em http://java.sun.com/products/jms/. Acessado em 03 de Março de 2010. [28] Vaadin: Java Framework. Disponível em http://vaadin.com/home. Acessado em 03 de Março de 2010. [29] html5: HyperText Markup Language ver. 5. Disponível em http://en.wikipedia.org/w/index.php?title=HTML5&oldid=347702904. Acessado em 03 de Março de 2010. [30] Javascript: ECMAScript Language. Disponível em http://www.ecmainternational.org/publications/files/ECMA-ST/ECMA-262.pdf. Acessado em 03 de Março de 2010. [31] Vraptor: MVC Framework. Disponível em http://vraptor.caelum.com.br/. Acessado em 04 de Março de 2010. [32] html4: HyperText Markup Language ver. 4. Disponível em http://www.w3.org/TR/1999/REC-html401-19991224/. Acessado dia 04 de Março de 2010. [33] RPC: Remote Procedure Call. Disponível em http://en.wikipedia.org/w/index.php? title=Remote_procedure_call&oldid=348142258. Acessado dia 04 de Março de 2010. [34] DWR: Direct Web Remoting. Disponível em http://directwebremoting.org/dwr/index.html. Acessado dia 04 de Março de 2010. [35] XML: eXtensible Markup Language. Disponível em http://www.w3.org/XML/. Acessado dia 04 de Março de 2010. [36] JSON: Javascript Object Notation. Disponível em http://www.json.org/. Acessado dia 04 de Março de 2010. [37] EAR: Enterprise Archive. Disponível em http://en.wikipedia.org/w/index.php? title=EAR_(file_format)&oldid=343489532. Acessado dia 04 de Março de 2010. [38] SQL: Structured Query Language. Disponível em http://en.wikipedia.org/w/index.php?title=SQL&oldid=347765204. Acessado dia 04 de Março de 2010. [39] JDBC: Java Database Connectivity. Disponível em http://java.sun.com/javase/technologies/database/. Acessado dia 04 de Março de 2010. [40] BUS: Enterprise Service BUS. Disponível em http://en.wikipedia.org/w/index.php? title=Enterprise_service_bus&oldid=347926583. Acessado dia 04 de Março de 2010. [41] Junit: Unit Tests. Disponível em http://www.junit.org/. Acessado dia 04 de Março de 2010. [42] Classloader: Java Class Loader. Disponível em http://en.wikipedia.org/w/index.php? title=Java_Classloader&oldid=343512895. Acessado dia 04 de Março de 2010.