• Nenhum resultado encontrado

5   IMPLEMENTAÇÃO E EXPERIMENTOS 71

5.1   Detalhes Sobre a Implementação 71

5.1.3   Detalhamento 76

As próximas seções se dedicam a explicar a organização das classes em pacotes e suas respectivas funções no projeto do ambiente, além de mostrar como esses elementos interagem entre si. Elementos menos relevantes para o entendimento da mecânica geral do projeto poderão ser consultados na documentação javadoc.

As classes do ambiente estão agrupadas pelo papel que exercem no projeto, e organizadas nos seguinte pacotes:

• br.ufpe.cin.dvaj.msc.data: Contém basicamente classes que representam dados.

• br.ufpe.cin.dvaj.msc.environment: É onde estão as classes e recursos relacionados à configuração do ambiente.

• br.ufpe.cin.dvaj.msc.exception: Contém classes que representam as situações de exceção que podem ser levantadas durante o funcionamento do ambiente.

• br.ufpe.cin.dvaj.msc.gui: Contém classes que representam janelas, caixas de diálogo, classes auxiliares que controlam seus funcionamentos e outros elementos relacionados a interface gráfica.

• br.ufpe.cin.dvaj.msc.host: É o pacote que abriga o host e as classes estruturais da mecânica de funcionamento essencial do ambiente.

• br.ufpe.cin.dvaj.msc.plugin: Abriga interfaces e classes abstratas que devem ser implementadas para a criação de um novo plugin.

• br.ufpe.cin.dvaj.msc.tools: Possui classes que representam ferramentas disponíveis para utilização pelos plugins desenvolvidos e úteis aos usuários. • br.ufpe.cin.dvaj.msc.util: Possui classes de utilidade geral.

O pacote de distribuição bleembloom-pluginkit.jar contém a seleção de classes e interfaces necessárias para o desenvolvimento de novos plugins. É o que futuros desenvolvedores deverão adicionar a seus projetos.

As Classes e Suas Funções

Aqui serão apresentadas as principais classes do ambiente e suas funções. Nos casos mais importantes serão apresentadas as interações entre os objetos para explicar a mecânica funcional do ambiente.

A classe Host representa o host de uma aplicação com arquitetura de plugin e implementa toda a sua mecânica de funcionamento. Ela é quem reconhece (ver Figura 27) e gerencia os plugins através de seu plugin loader, além de controlar todas as suas manipulações. Qualquer requisição de processamento passa por uma instância dessa classe, que é responsável por despacha-la para o plugin adequado.

Descriptor é um dos principais elementos do ambiente, pois é a partir dele

que são mantidos os mapeamentos dos plugins. Trata-se de uma interface que descreve objetos que tem o objetivo de identificar uma implementação de um plugin em diversas situações durante o funcionamento do ambiente. Seus métodos basicamente retornam informações a respeito do plugin.

Plugin é a interface que define um plugin propriamente dito. A implementação

dela é o centro de processamento de um foco de estudo e possui todas as características necessárias para que o plugin funcione no ambiente. É a partir dele que o host tem acesso a seu Descriptor. As principais atividades do Processor é a transformação, realizada pela execução do método transform(), e a execução de funcionalidades específicas realizada pelo método execute(). Essa classe também fornece componentes utilizados pelo ambiente para manipulação de seus dados. Uma exigência é que qualquer implementação de plugin possua um construtor público sem parâmetros, para que possa ser instanciado pelo plugin loader.

Script é uma classe abstrata que representa uma funcionalidade específica de

um plugin. Sempre que o usuário solicita sua utilização, o host executa seu script, trazendo os resultados esperados. Um plugin deve fornecer tantos scripts quantas funcionalidades específicas ele possuir.

UseCaseController é uma classe que centraliza os roteiros operacionais dos

casos de uso e controla os objetos da dados através dos componentes de interface para que uma atividade útil seja realizada pelo usuário. Cada roteiro de usabilidade é basicamente um método desta classe.

Figura 27 Processo de mapeamento das classes dos plugins e Descriptor realizado pelos class

loader do host.

Objetos de Conteúdo

Existem objetos cuja função é carregar um conteúdo de um plugin. Esses objetos, representados pela classe Content, carregam, além dos objetos que são o conteúdo propriamente dito, o Descriptor do plugin ao qual o conteúdo pertence. Então, para que algo seja processado por um plugin, um objeto Parameters, que é subclasse de Content, carrega o Descriptor desse plugin e os parâmetros propriamente ditos. Da mesma forma, todo conteúdo retornado de um processamento vem em um objeto Results, que também herda de Content e contém o mesmo Descriptor.

De forma simplificada, o host sempre recebe um objeto Parameters como parâmetro, repassa para o plugin adequado baseado no Descriptor que está embutido, que executa o processamento e retorna para o host um objeto Results daquele plugin, contendo o mesmo Descriptor e o conteúdo dos resultados propriamente ditos. A Figura 28 mostra esse comportamento. O comportamento de escolha do plugin que irá processar uma requisição baseado nos objetos passados por parâmetro é inspirado nos patterns Startegy, onde algoritmos são objetificados, e

Command, onde a requisição de um serviço é objeticificada (GAMMA, et al., 1993).

O conteúdo retornado por cada plugin é uma lista de objetos ContentItem, que é um objeto que possui um conteúdo transformado por intervalo de tempo, ou seja,

representa uma informação temporal que indica que um conteúdo está presente a partir de um instante X até um segundo momento Y de um material. O conteúdo desse objeto pode ser qualquer objeto que o plugin reconheça, desde que seja uma subclasse de Comparable, pois deve suportar as funcionalidades relativas a similaridades.

Figura 28 Atividades realizadas durante uma solicitação de transformação Scene

Um objeto Scene representa uma situação após o processamento de uma ou mais transformações para um mesmo arquivo. Essa situação é a base para uma visualização em timeline, onde cada track é uma coleção de objetos transformados por um plugin. Tecnicamente, um objeto Scene é uma coleção de objetos ItemTrack, que por sua vez é uma coleção de objetos ContentItem. A Figura 29 representa graficamente esses elementos.

Figura 29 Representação dos objetos que compõem uma cena

Na interface gráfica, as classes TimelineWindow, Track e ContentItemBlock representam respectivamente os objetos Scene, ItemTrack e ContentItem. A visualização padrão do objeto dentro de um ContentItemBlock é a representação em

String fornecida pelo método toString() dos objeto Comparable.

Ferramentas e Visualização de Dados (Corpus, Console, Progress)

Os elementos que exibem dados funcionam basicamente em pares e seguem o pattern Observer (DENZLER e GRUNTZ, 2008). Existe um objeto observável, que são os dados propriamente ditos, e o observador, que é o elemento de interface gráfica que exibe os dados do objeto observável e permite que o usuário faça manipulações sobre eles. Cada objeto observador é registrado em seu respectivo observável, pois sempre que ocorre uma modificação do conteúdo de um observável, este notifica todos os seus observadores para que possam refletir o novo estado de seus dados (DENZLER e GRUNTZ, 2008). Este mecanismo é mostrado graficamente na Figura 30. Corpus, Console e a visualização de progresso são ferramentas que possuem tais características de funcionamento.

Figura 30 Atualização da interface disparada pela atualização de objetos de dados

A ferramenta referente à biblioteca de materiais para análise é composta pelas seguintes classes: Corpus, que representa a coleção, seus dados e suas operações; CorpusManagerWindow, que é o componente visual por onde o usuário manipula esses dados; e TagSelectorAccessory, que é um componente visual que pode ser inserido em caixas de diálogo para permitir a seleção de arquivos por classificador. Além dessas, existem classes auxiliares que são modelos de como os dados se comportam e são apresentados nos componentes.

O Console é uma ferramenta utilizada pelos plugins para que possam expressar informações textuais aos usuários. Seu funcionamento é baseado em duas classes: OutputConsole, que são as operações e conteúdo acumulado, e;

OutputConsoleWindow, que é o componente visual onde as informações são

exibidas.

Para visualização do progresso dos processamentos existem as classes

ProgressInformation e ProgressWindow. Os dados de um objeto

ProgressInformation são atualizados pelos plugins durante suas execuções e

refletidos na ProgressWindow, pois este é seu observador.

Existem ainda outras classes de menor relevância no funcionamento da aplicação, e são basicamente elementos auxiliares. Todas as classes implementadas possuem informações explicativas em formato javadoc que serão publicadas ao final da implementação total deste trabalho.