Cortex - Anatomia de Um Framework

download Cortex - Anatomia de Um Framework

of 26

Transcript of Cortex - Anatomia de Um Framework

CortexAnatomia de um FramewokVerso 1.0

Cortex: Anatomia de um Framework Verso 1.0 - 31/12/2010 Copyright 2010 - Departamento de Cincia e Tecnologia / Exrcito Brasileiro Todos os direitos reservados. Autores: Alisson Sandes Palmeira Thiago Mael de Castro

ndiceMemria Gentica Origens O que o Cortex O que o Cortex no Uma Rpida Cirurgia Exploratria Passo 1 - Reunindo os instrumentos Qt SDK Cortex Passo 2 - Costurando o tecido Passo 3 - Ativando uma sinapse de exemplo Primeiro Estmulo Cerebral: Al, Mundo! Fazendo a inciso Ligando os neurnios Viso Geral do Tecido Camadas Estrutura padro de diretrios Dissecando uma Sinapse Estrutura padro de diretrios Arquivo de projeto (.pro) Manifesto Implementao De volta ao exemplo Eletrodos de Teste Manifesto Implementao Argumentos Exemplo Nas Entranhas do Cortex Carregando as Sinapses Resoluo de Dependncias Log da Execuo

Memria GenticaOrigensO Cortex surgiu em 2009, da necessidade de se reutilizar componentes de um software de Comando e Controle (C2) desenvolvido pelo Exrcito Brasileiro. O Programa C2 em Combate, como um software de C2, destina-se a permitir que um comandante militar, em qualquer nvel, possa emitir ordens a seus subordinados e acompanhar a sua execuo durante uma operao militar. O desenvolvimento teve incio em 2003, por determinao do Comandante do Exrcito, e em 2008 contava com uma srie de funcionalidades com grande potencial de reutilizao por parte de outros projetos em andamento no prprio Exrcito. Uma primeira abordagem foi tornar o C2 em Combate um programa plugvel, de forma que um novo projeto pudesse agregar novas funcionalidades de acordo com suas necessidades. O problema que nem todos os projetos precisavem do arcabouo de C2: para alguns, o mdulo de informaes geogrficas era suficiente; para outros, comunicaes e criptografia, por exemplo. Assim, optou-se pelo desenvolvimento de um framework de propsito geral, inspirado na filosofia da ento emergente arquitetura orientada a servios (SOA).

O que o Cortex O Cortex um framework orientado a servios para desenvolvimento de aplicativos multiplataforma em C++, para desktop. No Cortex, as tradicionais bibliotecas C++ so substitudas por componentes reutilizveis, com alta coeso e baixo acoplamento, disponiblizados sobre o framework como servios, segundo a filosofia de arquitetura orientada a servios (SOA).

O que o Cortex no O Cortex no um um framework de Comando e Controle; muito menos destina-se a aplicaes exclusivamente militares; decididamente no um conjunto de bibliotecas utilitrias; tampouco multilinguagem; e definitivamente no um framework para web wervices (embora seja possvel implement-los com o Cortex).

Uma Rpida Cirurgia ExploratriaAntes de se aprofundar nos conceitos do Cortex, talvez seja interessante dar uma rpida olhada no framework em ao. Cada servio disponibilizado sobre o framework recebe o nome de sinapse. Esta seo ir gui-lo na execuo de um aplicativo de exemplo chamado Calculator View, que composto de trs sinapses.

Passo 1 - Reunindo os instrumentosQt SDKO pr-requisito para o desenvolvimento sobre o Cortex o Qt SDK, mantido pela Nokia, na verso 4.5.2 (2009.03) ou superior. O instalador da verso LGPL do Qt SDK pode ser obtida no seguinte endereo: http://qt.nokia.com/downloads. poca da escrita deste guia, a verso mais recente era a 4.7.0, estando a verso Windows disponvel no endereo http://get.qt.nokia.com/qtsdk/qtsdk-win-opensource-2010.05.exe e a verso linux (32 bits) em http://get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.05.1.bin. Aps o donwload, basta executar e seguir os passos do instalador.

CortexA ltima verso estvel do Cortex pode ser obtida no Portal do Software Pblico Brasileiro, no seguinte endereo: http://www.softwarepublico.gov.br/dotlrn/clubs/cortex/onecommunity?page_num=2. Aps o download, basta descompactar o arquivo. Se preferir, possvel baixar a verso mais recente a partir do repositrio svn: http://svn.softwarepublico.gov.br/svn/cortex/trunk/.

Passo 2 - Costurando o tecidoExecute o Qt Creator. Clique em Open Project... (Ctrl+O), navegue at o diretrio do Cortex e abra o arquivo de projeto cortex.pro. Na barra da esquerda, clique no boto Projects. Na seo Build Steps, localize o comando Make e clique em Details. Na propriedade Make arguments, digite a opo install.

No menu Build, clique em Build All (Ctrl+Shift+B).

Passo 3 - Ativando uma sinapse de exemploAinda em Projects, selecione a aba Run Settings. Na propriedade Arguments, digite br.mil.eb.synapseLauncher (ATENO: o Cortex faz distino entre caracteres maisculos e minsculos).

No menu Build, clique em Run (Ctrl+R). Nesse momento, o Cortex iniciar o aplicativo Synapse Launcher.

Selecione Calculator View Example e clique em Iniciar.

Primeiro Estmulo Cerebral: Al, Mundo!O que seria deste guia sem o clssico Al, Mundo! revisitado? Esta seo ir conduzi-lo na construo de uma primeira sinapse!

Fazendo a incisoH um aplicativo distribudo junto com o Cortex chamado Synapse Generator que facilita a criao de toda a infraestrutura necessria para o desenvolvimento de uma sinapse. Execute o Qt Creator. Clique em Open Project... (Ctrl+O), navegue at o diretrio do Cortex e abra o arquivo cortex.pro. Na barra da esquerda, clique no boto Projects e selecione a aba Run Settings. Na propriedade Arguments, digite br.mil.eb.synapseLauncher, conforme o passo 3 da seo anterior. No menu Build, clique em Run (Ctrl+R). Nesse momento, o Cortex iniciar o aplicativo Synapse Launcher. Selecione Gerador de Sinapses e clique em Iniciar. Na tela Criao de uma nova sinapse para o Cortex, preencha os campos com os seguintes dados e clique em Next: ID: br.gov.softwarepublico.aloMundo Verso: 1.0.0 Ttulo: Al, Mundo! Descrio: Minha primeira sinapse.

Na tela Interface e implementao da Sinapse, preencha o campo interface com IAloMundo, marque a opo Iniciadora e clique em Next.

Na tela Sinapses a serem consumidas, clique em Terminar. Nesse ponto, ser criado o diretrio br.gov.softwarepublico.aloMundo dentro de do diretrio synapses do Cortex.

Ligando os neurniosDe volta ao Qt Creator, na barra da esquerda, clique no boto Edit. Na esturuta do projeto cortex, abra a pasta synapses e selecione o arquivo de projeto synapses.pro. Ao final do arquivo, adicione uma linha com o contedo abaixo e salve o arquivo (Ctrl+S):

Note que, ao salvar o arquivo, aparecer, dentro de synapses, uma pasta chamada br.gov.softwarepublico.aloMundo, contendo a seguinte estrutura:

Na seo Dissecando uma Sinapse sero discutidos todos os detalhes de um projeto de sinapse. Por ora, basta saber que a classe IAloMundo a interface da sinapse recm-criada (que estende a interface ISynapse do Cortex), e a classe AloMundo a sua correspondente implementao.. Abra o arquivo AloMundo.cpp, faa as alteraes abaixo e salve o arquivo (Ctrl+S).

No menu Build, clique em Build All (Ctrl+Shift+B). No menu Build, clique em Run (Ctrl+R). Nesse momento, o Cortex iniciar o aplicativo Synapse Launcher.

Repare que agora h uma nova sinapse iniciadora (um novo aplicativo), chamada Al, Mundo!. Selecione-a e clique em Iniciar. Eis nosso primeiro estmulo cerebral!

Viso Geral do TecidoCamadasO cortex dividido em quatro camadas:sinapses, runtime, multiplataforma e plataforma.

No topo do framework, encontra-se a camada de sinapses, na qual so disponibilizados os servios desenvolvidos como componentes reutilizveis. Cada sinapse deve expor suas operaes por meio de uma nica interface, caracterizando o padro de projeto Faade. A camada de runtime inclui o componente principal da framework, chamado cortex.kernel, bem como o ambiente de execuo em si. Aqui, implementa-se o padro arquitetural microkernel, com apenas duas interfaces de interesse: ICortex, que atua como um localizador de servios (padro Service Locator) e ISynapse, que a classe base para qualquer interface de sinapse.

Uma camada multiplataforma inclui alguns componentes que permitem a compilao e execuo da estrutura em diferentes sistemas operacionais. fortemente baseada no Qt SDK, um framework C + + de alto desempenho para desenvolvimento de aplicaes portveis. Por exemplo, cada sinapse efetivamente implementada como um plugin do Qt e est disponvel aplicao em tempo de execuo atravs do mecanismo de plugins do prrpio Qt (Qt Plugin System). Ainda na camada multiplataforma, existe o conceito de extenses, que nada mais so do que bibliotecas de terceiros que podem ser instaladas no framework para aumentar o poder de portabilidade de uma aplicao. O Cortex dispe de um processo para resolver as dependncias e carregar as extenses que anlogo ao processo de carregamento de sinapses. Por ltimo, na base de tudo, est a camada chamada plataforma, que constiui-se do ambiente nativo do sistema operacional, como o Windows, Mac OS X, GNU/Linux, Maemo ou MeeGo.

Estrutura padro de diretriosPor conveno, o framework possui uma estrutura padro de diretrios para desenvolvimento: deploy: arquivos para implantao e execuo, destino final de toda compilao. extensions: projetos desenvolvimento/incorporao de extenses runtime: projetos dos componentes de runtime synapses: projetos de desenvolvimento de synapses Por tratar-se de conveno, nem todos esses diretrios estaro necessariamente presentes. O diretrio deploy, por exemplo, s criado aps a primeira compilao; extensions, por outro lado, pode ser criado pelo desenvolvedor se houver alguma demanda por bibliotecas de terceiros.

Dentro do diretrio runtime, encontram-se os arquivos de incluso de projeto Qt (.pri), que contm as instrues para a correta gerao de Makefiles e consequente compilao dentro do framework. os arquivos so os seguintes: cortex.pri - definio de variveis e funes gerais. extension.pri - configuraes para a compilao de extenses. Deve ser includo pelos arquivos de projeto (.pro) de cada extenso.

synapse.pri - configuraes para a compilao de synapses. Deve ser includo pelos arquivos de projeto (.pro) de cada synapse. test.pri - configuraes para a compilao de testes automatizados. Deve ser includo pelos arquivos de projeto (.pro) de cada teste.

Ainda em runtime, so encontrados os esquemas XML para permitir a validao dos arquivos de manifesto. Esses arquivos so copiados para o diretrio de implantao do framework, por ocasio da instalao. Os arquivos so os seguintes: cortex.xsd - contm os elementos comuns a todos os esquemas extension.xsd - contm os elementos especficos para uma extenso synapse.xsd - contm os elementos especficos para uma synapse test.xsd - contm os elementos especficos para um teste

Dissecando uma SinapseEstrutura padro de diretriosAssim como o Cortex, uma sinapse tambm possui sua prpria conveno de diretrios padro: doc: arquivos de documentao include: arquivos de interface (.h) lib: destino para as bibliotecas compiladas. res: arquivos de recursos, a serem copiados posteriormente para o diretrio de instalao da sinapse src: arquivos de implementao (.h e .cpp) tests: testes automatizados da synapse tmp: arquivos temporrios de pr-processamento do Qt. ui: arquivos de interface com o usurio (.ui)

Arquivo de projeto (.pro)O arquivo de projeto de Qt (.pro) situa-se na raiz do diretrio da sinapse e contm as instrues para a correta gerao de Makefiles e consequente compilao da synapse. Ele recebe um nome no seguinte formato: .pro. General - seo que contm as configuraes gerais do projeto. Permite as seguintes configuraes: SYNAPSE_ID - id da synapse SYNAPSE_VERSION - verso da synapse DEFINES - definio da macro de guarda da synapse

QT - adio/remoo de mdulos do Qt FORMS - especificao dos arquivos de interface com o usurio (quando for o caso, sugere-se ui/*.ui) RESOURCES - especificao de arquivo de recursos (quando for o caso, sugere-se *.qrc) include - incluso do arquivo 'synapse.pri', fornecido com o Cortex Synapses - seo destinada s declaraes das synapses que sero consumidas. Para cada synapse, feita a chamada s seguintes funes: INCLUDEPATH += $$synapseIncludePath() LIBS += $$pseudoSynapseLibs() - funo OBSOLETA, porm necessria devido s "pseudo synapses"* Extensions - seo destinada s declaraes das extenses requeridas. Para cada extenso, feita a chamada s seguintes funes: INCLUDEPATH += $$extensionIncludePath() LIBS += $$extensionLibs()

ManifestoO manifesto tambm fica localizado na raiz do diretrio da sinapse e possui as informaes necessrias para sua correta carga e inicializao pelo Cortex. Ele recebe o seguinte nome: synapse.xml O manifesto deve ser validado em relao esquema 'synapse.xsd', fornecido com o Cortex. Um arquivo de manifesto possui as seguintes tags: - contm as informaes bsicas, como id, verso, ttulo, descrio, etc. - define se a synpase iniciadora ou no - define se a synapse singleton ou no - declara as synapses a serem consumidas - declara as extenses requeridas pela synapse As seo do manifesto apenas uma dica de dependncia, mas que nromalmente respeitada a: 1) a dependncia no seja encontrada no ambiente de runtime ou; 2) o manifesto da iniciadora apresente uma dependncia que a suplante, ou seja, implemente a mesma interface de sinapse.

ImplementaoEm termo de implementao, uma sinapse deve possuir: uma interface de servios, estendendo a interface cortex::ISynapse; a implementao dessa insterface, que deve ser uma classe concreta e ser ao mesmo tempo um plugin do Qt vlido.

TODO: explicar a interface ISynapse. TODO: explicar os detalhes necessrias para implementao do plugin.

De volta ao exemploO exemplo da calculadora apresentado na seo Uma Primeira Cirurgia Exploratria foi originalmente desenvolvido como uma prova de conceito do framework, e aqui usado para ilustrar os principais conceitos na implementao de uma sinapse. Trata-se de uma adaptao do Calculator Example fornecido com a documento do Qt, porm consumindo servios para a execuo das operaes aritmticas bsicas, ao invs de usar os operadores prprios da linguagem. O aplicativo uma composio de trs sinapses: br.mil.eb.example.calculator, br.mil.eb.example.calculator.view e br.mil.eb.example.divide. Cada uma delas expe sua prpria interface, respectivamente ICalculatorView, ICalculator e IDivide. importante lembrar que essas so dependncias fracas, graas ao mecanismo de composio fornecido por Cortex, cujos beneficios so alta coeso e baixo acoplamento.

O exemplo executado a partir da sinapse iniciadora, br.mil.eb.example.calculator.view. O ponto de partida para o aplicativo, que tradicionamente seria a funo main(), o mtodo start() da implementao da interface da sinapse, ICalculatorView. medida que o usurio clica nos botes para executar as operaes, a GUI consome os servios prestados pela sinapse br.mil.eb.example.calculator. Como pode ser observado na figura abaixo, a sinapse (representada como um pacote) expe a sua prpria interface (ICalculator), que estende ISynapse, a interface do microkernel.

. A interface ICalculator expe as operaes necessrias para fazer os clculos e retornar os resultados para a exibio para mostrar.

A classe Calculator, por sua vez, implementa implementa as interface ICalculator e ainda herda da classe QObject, o que mandatrio para plugins do Qt

A implementao de ICalculator, a classe Calculadora, realiza as quatro operaes bsicas: adio, subtrao, multiplicao e diviso. Para esta ltima, porm, consome a sinapse br.mil.eb.example.divide.

A seqncia de chamadas de mtodos para o consumo dessa sinapse mostrado na prxima figura, onde pode-se ver o padro Service Locator em ao. Aps obter a instncia de ICortex, Calculator solicita a sinapse que implementa a interface IDivide.

caso na seja encontrada, ICortex chama a implementao do servio, garantindo que ele seja corretamente iniciado antes de devolv-lo sinapse cliente.

Neste ponto, interessante notar que o requisito para a correta execuo da diviso uma sinapse que implemente a interface IDivide. O framework seleciona br.mil.eb.example.divide com base na linha 21 no manifesto de br.mil.eb.example.calculator.

Eletrodos de TesteCortex implementa uma infraestrutura bsica para auxiliar a implementao de testes automatizados de sinapses, tanto de interface quanto das classes internas. Esse mecanismo permite executar os testes ao mesmo tempo em que se dispe da funcionalidade de localizao de servios do Cortex. Com isso, possvel testar comportamentos que so dependentes da presena de determinada sinapse e utilizar implementaes falsas de servios consumidos pela sinapse em teste

ManifestoTODO: ressaltar as peculiaridades de um manifesto de teste.

ImplementaoTODO: explicar a Interface ISynapseTest, abstraindo o framework de testes utilizado. TODO: ressaltar que vantajoso o projeto como um todo usar o mesmo framework.

ArgumentosTODO: citar os argumentos do Cortex para teste. TODO: explicar o tunelamento de argumentos para uso pelo framework de testes escolhido

ExemploTODO: explorar o teste automatizado da calculadora como exemplo.

Nas Entranhas do CortexNesta seo sero abordados com maior profundidade alguns detalhes de implementao do Cortex.

Carregando as SinapsesTODO: detalhar como o Qt Plugin Framework usado para implementar as sinapses TODO: mostrar os loaders (SynapseLoader, TestRunner e ExtensionLoader) TODO: explicar os SynapseContainers (default e singleton)

Resoluo de DependnciasTODO: resumir a implementao da montagem do grafo de dependncias e do DFS antes da carga. ManifestParsers, ComponentManager e DependencySolver

Log da ExecuoTODO: explicar o X9, o logger bsico interno do Cortex