Cassiano Bergmann Maciel (cbm@inf.ufrgs.br)
Tharso de Bittencourt
Borges (tharso@aton.inf.ufrgs.br)
Manuele Kirsch Pinheiro (manuele@inf.ufrgs.br / Manuele.Kirsch_Pinheiro@inrialpes.fr)
5.Estrutura de comunicação entre BW e Amaya
3.Modificações dentro do Amaya
·Framework BW: uma exposição sobre o funcionamento e a estrutura deste framework;
·A ferramenta Amaya: um resumo da estrutura deste software;
·Estrutura de comunicação entre BW e Amaya: esta seção explica como a comunicação entre BW e Amaya funciona;
·Evento de teste: esta seção expõe o evento de teste escolhido para se fornecer awareness neste primeiro protótipo;
·Implementação: aqui são fornecidos detalhes sobre a implementação deste teste. Estes detalhes incluem informações sobre as características gerais, o protocolo de comunicação e sobre as modificações realizadas nos códigos do Amaya e BW;
·Conclusões: as conclusões deste processo de inclusão de percepção de eventos passados no Amaya
Chama-se de "past events awareness" este suporte a eventos passados, e é a introdução deste tipo de suporte no software Amaya que é descrita neste documento.
O framework BW foi implementado em Java (JDK 1.1.x) e sua implementação seguiu a mesma divisão em pacotes (conforme a Figura 1). No pacote kernel encontra-se todas descrições dos eventos e de outras informações utilizadas pelo BW, como por exemplo, os grupos, seus membros e papéis. Em adição, o pacote control é responsável pela gestão de informações, incluindo o tratamento dos eventos que são reportados e também o tratamento das informações para o usuário. Finalmente, os pacotes interface e storage são responsáveis, respectivamente, pela interface com o usuário e pelo armazenamento das informações.
Todo o funcionamento do framework BW é organizado em três etapas: inicialmente, a ferramenta cooperativa registra os eventos junto ao framework BW. Cada tipo de evento registrado no BW corresponde a um único tipo de atividade possível na ferramenta cooperativa. Este processo permitirá ao usuário escolher sobre quais atividades serão fornecidas as informações de awareness. Após, ao passo que as atividades são finalizadas (completadas) dentro das ferramentas cooperativas, os eventos correspondentes a essas atividades são gerados e enviados para o framework. Esta segunda etapa se repete durante a realização do trabalho cooperativo. A terceira etapa compreende a própria notificação das informações de awareness para o usuário. Essa notificação é feita através da interface entre o framework e o usuário, que utiliza as funções descritas no pacote interface e deve também estar bem integrada à própria interface da ferramenta de cooperação.
Analisando
os recursos de edição colaborativa do amaya foram encontrados
poucos recursos dentre eles umsistema
de anotação colaborativa baseada em RDF (Resource Description
Framework), XPointer e Xlink que permite que várias pessoas possam
anexar anotações, comentários à um documento,
bastando para isto ter acesso a internet e ao servidor de anotações
do documento.[KOI01].
Apesar do amaya proporcionar um certo tipo de percepção através das anotações e da visualização de como o documento esta a cada momento não foi encontrado no mesmo um sistema de awareness de eventos passados; devido a tal limitação , decidiu-se introduzir nele um módulo de “past events awareness”, utilizando o framework BW, que já foi comentado anteriormente.
Figura 2 Arquitetura utilizada
Essa arquitetura de comunicação foi escolhida pois o Amaya e o BW foram construídos com linguagens de programação diferentes, e essa arquitetura se mostrou a mais simples para fazer a integração dos sistemas. O Byzance é um software escrito em C com uma base de dados (base de dados fornecida pela biblioteca Thot), enquanto o framework BW foi escrito em Java. Além disso, nesta implementação foi utilizada uma base de dados centralizada (fornecida pelo software PostgreSQL), criada anteriormente para uma outra utilização do framework BW. Dessa forma, foi escolhida essa opção de modelo cliente-servidor, utilizando TCP/IP, para ser inserida na arquitetura atual do Amaya que ainda conta com um servidor central de anotações.
O armazenamento e a leitura das informações neste sistema passa pelas seguintes fases:
1.Quando o usuário concluir uma atividade (e por conseqüência, um evento é gerado), o Amaya irá realizar seus procedimentos habituais, e após, ele irá enviar as informações de awareness para o cliente TCP/IP dentro do módulo de awareness (Awareness Module). Este cliente, que foi escrito na linguagem C, vai tratar e enviar essas informações para o lado servidor do módulo. Este servidor, escrito em Java, localiza-se na mesma máquina do cliente e inclui o framework BW. Ele repassa ao BW as informações recebidas, que são então estocadas pelo BW através de uma base de dados PostgreSQL remota;
2.Quando o usuário pede uma notificação das informações de awareness, o Amaya passa as informações desta requisição para o lado cliente do módulo de awareness. Este cliente repassa essa requisição para o lado servidor do módulo, que, utilizando o framework BW, lê as informações de awareness da base de dados. Estas informações lidas são então repassadas ao cliente TCP/IP, que mostra as informações para o usuário.
Depois da definição da arquitetura, escolheu-se um evento para verificar a primeira implementação deste sistema. Esta escolha está descrita abaixo.
·Um título com o nome do documento;
·Uma seqüência de linhas que mostra as seguintes informações de cada evento "Save Document" ocorrido:
§a data de quando o documento foi salvo;
§a url onde o documento foi armazenado;
§o nome do usuário que salvou o documento.
Com este primeiro evento, objetivou-se testar a inclusão do suporte à “past events awareness” dentro do Amaya. Existem ainda diversos outros eventos interessantes que podem ser incluídos após a validação deste teste. Por exemplo, é possível, com esse suporte, mostrar quais usuários já visualizaram a última versão de um fragmento, ou ainda mostrar quantas versões de um fragmento foram geradas desde a última visualização por parte de um usuário, etc.
O primeiro passo dessa comunicação é a criação, e posterior identificação, do socket. Esse processo utiliza as funções padrão das bibliotecas C/UNIX (write, para enviar as informações, e read, para sua leitura). Quando o socket for criado com sucesso, pode-se requisitar uma conexão com o servidor, utilizando-se uma porta anteriormente definida (onde o servidor espera as conexões dos clientes). Quando o servidor aceita essa conexão, está definido um caminho para o fluxo de informações, e a comunicação em dois sentidos (cliente - servidor e servidor - cliente) é estabelecida. Por conseqüência, pode-se utilizar o mesmo socket para enviar e receber as informações.
Utilizou-se, para receber as informações a função "read", as quais, no caso de falha de comunicação bloqueiam o processo, não permitindo o uso do Amaya até que exista uma resposta do servidor . Por outro lado, utilizou-se funções não bloqueantes para enviar as informações (write). Isso significa que o processo somente com a função "write" não irá esperar até que seja obtida uma resposta confirmando a transmissão, por isto é utilizada uma chamada (read) logo após o envio de dados para o servidor, que por ser bloqueante espera o envio de uma resposta por este. Deste modo, garante-se que as informações serão transmitidas corretamente. Ao utilizar-se funções bloqueantes corre-se o risco de impedir o trabalho do usuário, se o tempo de espera for muito longo. Entretanto, como o servidor e o cliente são locais à mesma máquina, os tempos de espera não serão longos.
Já do lado do servidor do módulo de awareness, quando este recebe as informações do cliente, sua primeira atitude é transformar o conjunto de bytes recebidos em objetos “evento”, que serão manipulados e armazenados pelo BW.
A escolha dessas duas estratégias, comunicação TCP e streams, dá uma melhor confiabilidade na entrega das informações, pois facilita a detecção de erros e perdas de pacotes durante a comunicação. Além disso, essas estratégias suportam a entrega seqüencial dos pacotes. É fácil imaginar os possíveis problemas causados pela entrega fora de ordem. Nesses casos, poderia-se obter informações incompletas ou mesmo perder dados essenciais ao bom funcionamento do serviço.
Comando
|
Funcionalidade
|
BEGIN
|
Inicia
todas as transmissões
|
BEGINEVENT
|
Indica
o início de um evento
|
ENDEVENT
|
Indica
o fim do último evento reportados
|
CANCELEVENT
|
Anula
o último evento que iniciou
|
NEWUSER
|
Adiciona
um novo usuário ao grupo ou muda as informações de
um usuário
|
SETUSERPROFILE
|
Muda
o conjunto de profiles do usuário. Esses profiles são uma
estrutura do BW que informa quais são os eventos que interessam
ao usuário.
|
GETEVENTS
|
Requisita
os eventos, que foram produzidos em um intervalo de tempo passado, e que
interessam ao usuário.
|
BYE
|
Finaliza
as transmissões
|
OK
|
Resposta
do servidor a um comando bem sucedido
|
NOK
|
Resposta
do servidor a um comando mal sucedido
|
As informações que são enviadas dependem do comando, e têm sua própria sintaxe geral (exceto no caso das informações do comando SETUSERPROFILE):
<
atributo1= "valor" & atributo2= "valor" & atributo3= "valor" &
... & atributoN="valor" >
Estes
atributos são os mesmos que foram definidos nas classes “BW_Member”,
“BW_Event”, “BW_Profile” e “BW_AwarenessProfile” do framework BW. Essas
classes descrevem, respectivamente, os usuários, os eventos, os
profiles gerais e os profiles dos usuários. A sintaxe completa destes
comandos está representada abaixo.
Comando
:
BEGIN
< type="4" & login="login" & name="nom" & machine="nom de
la machine" >
informações
:
O comando BEGIN passa as informações básicas sobre o usuário ativo. resposta do servidor: OK - Se tudo foi bem. NOK - Se houveram problemas servidor. |
comando
:
BEGINEVENT
< type="n" & name="nom du evento" & description="description
du evento" & details="détails sur l'evento" >
informações
:
O comando BEGINEVENT passa as informações sobre o evento que começa. Os atributos "description" e "details" podem ser vazios (exemplo : details=""). resposta do servidor : OK - Se tudo foi bem. NOK - Se houveram problemas no servidor. |
comando
:
ENDEVENT
< type="n" & name="nom du evento" & description="description
du evento" & details="détails sur l'evento" >
informações
:
O comando ENDEVENT passa algumas informações sobre o evento que termina. Os atributos "description" e "details" podem ser vazios (exemplo : details=""). resposta do servidor : OK - Se tudo foi bem. NOK - Se houveram problemas no servidor. |
comando
:
CANCELEVENT
< type="n" & name="nom du evento" & description="description
du evento" & details="détails sur l'evento" >
informações
:
O comando CANCELEVENT passa as informações sobre o evento que foi anulado. Os atributos "description" e "details" podem ser vazios (exemplo : details=""). resposta do servidor : OK - Se tudo foi bem. NOK - Se houveram problemas no servidor. |
comando
:
NEWUSER
< type="4" & login="login" & name="nom de l'usuário"
& homepage="page web personnelle de l'usuário" & mail="courrier
électronique de l'usuário" & machine="nom de la machine
utilisée par l'usuário" & paper1="première rôle
de l'usuário" & paper2="deuxième rôle de l'usuário"
& ... & paperN="rôle N de l'usuário">
informações
:
O comando NEWUSER passa as informações sobre um usuário. Os atributos "homepage", "mail" e "name" podem ser vazios (exemplo : homepage=""). observação : O número "4" é uma sugestão de um identificador único para o tipo de informação "usuário". resposta do servidor : OK - Se tudo foi bem. NOK - Se houveram problemas no servidor. |
comando
:
SETUSERPROFILE
< type="n" & membertype="identification du type de l'usuário"
& memberlogin="login de l'usuário" & membermachine="nom
de la machine utilisée par l'usuário" & event1="type=n;
name=nom" & ... &
eventN="type=n; name=nom" & interval="jour:moins:an:heur:minute; jour:moins:an:heur:minute">
informações
:
O comando SETUSERPROFILE passa algumas informações sobre um usuário e as informações sobre seu profile. Existe uma pequena diferença na estrutura do atributo "eventX". Este atributo inclui o tipo de evento e o nome do evento, ambos separados por um ";" e sem as aspas. No atributo "interval", as informações iniciais e finais de data e hora do evento são também separadas por um ";", sendo que as informações individuais dentro destas (dia, mês, ano, hora e minuto) são separados por ":" cada um. resposta do servidor : OK - Se tudo foi bem. NOK - Se houveram problemas no servidor. |
comando
:
GETEVENTS
< type="n" & login="login de l'usuário" & machine="nom
de la machine utilisée par l'usuário" >
informações
:
O comando GETEVENTS passa algumas informações sobre um usuário, o qual deseja receber as informações de awareness de seu interesse. resposta do servidor : A resposta do servidor será os eventos passados, que acordam com os profiles do usuário. Esta resposta tem a seguinte sintaxe: <details="détails
sur l'evento" & type="n" & objid="n" & name="nom de l'evento"
& description="description de l'evento" & interval="jour:moins:an:heure:minute;
jour:moins:an:heure:minute" & memberlogin="login de l'usuário"
& membername="nom de l'usuário" & memberhomepage="URL" &
membermail="courrier elétronique " & membermachine="maquina"
> <details="détails
sur l'evento" & type="n" & objid="n" & name="nom de l'evento"
& description="description de l'evento" & interval="jour:moins:an:heure:minute;
jour:moins:an:heure:minute" & memberlogin="login de l'usuário"
& membername="nom de l'usuário" & memberhomepage="URL" &
membermail="courrier elétronique " & membermachine="maquina"
> ... <details="détails
sur l'evento" & type="n" & objid="n" & name="nom de l'evento"
& description="description de l'evento" & interval="jour:moins:an:heure:minute;
jour:moins:an:heure:minute" & memberlogin="login de l'usuário"
& membername="nom de l'usuário" & memberhomepage="URL" &
membermail="courrier elétronique " & membermachine="maquina"
> |
comando
:
BYE
informações
:
O comando BYE termina as transmissões entre cliente e servidor |
·Arquivo HTMLsave.c: neste arquivo, inseriu-se no fim da função "SaveDocument" uma chamada à função "AwCoordDoc". Esta chamada ocorre após o salvamento do documento e vai acionar o socket de comunicação com o BW.
Os demais códigos específicos do lado cliente do módulo de awareness estão limitados a um único arquivo (awareness.c), no diretório "opera/byzance/awareness". Neste arquivo, encontram-se as funções para o tratamento do protocolo e de outras funções de comunicação. As funções mais importantes são descritas na tabela 2.
Tabela
2 Funções do lado cliente do módulo de awareness
Função
|
Descrição
|
AwCoordDoc
AwCoordApp
|
Estas
funções recebem as informações importantes
do Amaya e as repassa às funções que irão gerenciar
o tratamento dos eventos.
|
AwExecOnSaveDoc
|
Esta
função gerencia a comunicação TCP/IP entre
o cliente e o servidor quando um evento "Save Document" ocorre.
|
AwExecReportSaveDoc
|
Função
que gerencia a comunicação entre o cliente e o servidor quando
um usuário solicita seu relatório de awareness.
|
MountBegin
|
Esta
função cria a string para o comando BEGIN do protocolo.
|
MountBeginEvent
|
Esta
função cria a string para o comando BEGINEVENT do
protocolo.
|
MountEndEvent
|
Esta
função cria a string para o comando ENDEVENT do protocolo.
|
MountGetEvent
|
Esta
função cria a string para o comando GETEVENT do protocolo.
|
TreatResp
|
Esta
função trata da resposta enviada pelo servidor.
|
AwSendString
|
Esta
função envia as strings do protocolo do cliente até
o servidor.
|
Finalmente, também se alterou o procedimento de compilação do Amaya:
-Foram criados os arquivos awareness/makefile.in e awareness/makefile.awareness com as instruções de compilação do novo módulo.
-Alterações
no arquivo amaya/makefile.in para que o arquivo awareness/awareness.c seja
compilado e adicionado no binário do programa amaya.
Com base nestas modificações foram introduzidos dois novos fluxos de informação para as funções de awareness. O primeiro ocorre no momento da criação de um evento. Quando um evento monitorado ocorre, o Amaya ativa as funções de coordenação(AwCoordDoc ou AwCoordApp), as quais recebem as informações necessárias do Amaya e as repassam para as funções gerenciadoras (por exemplo, a função AwExecOnSaveDoc). Estas funções gerenciadoras controlam o envio destas informações capturadas do cliente para o servidor, onde se encontra o framework BW. Este controle incluiu a criação das strings do protocolo (funções MountBeginEvent, MountEndEvent, etc.) e o envio ou a recepção destas strings.
O segundo fluxo ocorre quando um usuário solicita as informações de awareness. O Amaya, neste momento, ativa uma função de coordenação que recebe as informações necessárias a este processo, e as repassa às funções gerenciadoras. Estas funções, por sua vez, solicitam a criação da string do protocolo para o comando GETEVENT (função MountGetEvent), e o envio deste comando. Quando servidor recebe este comando, ele passa o pedido ao framework BW, o qual o trata, lendo informações de awareness interessantes para o usuário. Estas informações serão enviadas do servidor para o cliente, o qual as tratará e mostrará ao usuário, utilizando a função " AwExecReportSaveDoc ".
Após estas modificações para o correto preenchimento da base de dados, remodelou-se o mediador existente da aplicação anterior para as necessidades do Amaya. Primeiramente, substituiu-se as definições dos eventos da antiga aplicação para a definição do evento teste ("SAVEDOCUMENT") desta aplicação.
Para a interação com o Amaya, o mediador foi dividido em duas classes : uma, que trata da conexão com o cliente e desmembra a string recebida deste em uma hashtable, e a segunda, o mediador por si próprio, com métodos para transformar os dados da hashtable num objeto BW_Event e comunicar-se com o BW.
A primeira classe, chamada de BWComm, é composta de três métodos : o método “main”, que inicializa o BW e seta o objeto mediador, e inicia o ciclo de espera por conexões; o método “run”, que é disparado cada vez que o servidor recebe uma mensagem do cliente (assim, cada mensagem é tratada por uma thread exclusiva). Este método recebe a mensagem via sockets e dispara o terceiro método, “MessageParser”. Este terceiro método desmembra a string enviada pelo cliente numa hashtable, e envia esta como parâmetro para o método tratador do mediador.
No mediador, alguns métodos da classe foram modificados. Foram alterados os métodos "makePrototypes" e"getPrototypes", que objetivam a criação e a captura, respectivamente, dos protótipos dos eventos, a fim de tratar corretamente os atributos do evento teste. Alterou-se também o método "_start", que faz a inicialização do mediador, para tornar esta inicialização bem adaptada ao caso do Byzance; o método “fillEvent, que preenche os campos ainda em branco do evento recem gerado; o método readDefaults, que lê as informações de grupo e papel default do sistema.
Foram acrescentados também novos métodos, os quais são destinados ao tratamento da mensagem recebida pelo clienteAmaya. Estes métodos transformam a mensagem recebida através da hashtable de forma que seja compatível com o BW, e então ativa os métodos necessários para a continuidade do tratamento. Os principais métodos incluídos são descritos na tabela 3.
Tabela
3 Os mais importantes métodos introduzidos no mediador
Métodos
|
Descrição
|
AWtreatBegin
|
Este
método é ativado no início da conexão, verificando
se o usuário já está cadastrado.
|
AWtreatBeginEvent
|
Este
método recebe a hashtable , a transforma em um objeto BW_Event
(evento), e assinala o início de um evento.
|
AWtreatEndEvent
|
Este
método recebe a hashtable, a transforma em um objeto BW_Event
(evento), e assinala o fim deste evento.
|
AWtreatCancelEvent
|
Este
método recebe a hashtable, a transforma em um objeto BW_Event
(evento), e assinala o cancelamento deste evento.
|
AWtreatGetEvent
|
Este
método recebe a a hashtable, e solicita os eventos passados
para o framework BW.
|
AwtreatBye
|
Este
método é usado no final da conexão, a fim de deslogar
o usuário do BW.
|
Como o mediador atua, no caso do Amaya, como servidor de awareness (ou como o lado servidor deste módulo), ele deve estar inicializado quando o cliente começar a executar. Por causa disto, a classe BWComm deve ser “executada” a partir de seu método “main”.
Uma conseqüência deste comportamento é a possibilidade de ter vários eventos ocorrendo ao mesmo tempo. Por causa disto, introduziu-se a idéia de multi-threading, a fim de tratar cada requisição em um novo fluxo de controle específico, deixando o fluxo principal (servidor) mais disponível para as outras requisições.
Logo, quando o lado cliente do módulo de awareness no Amaya envia as informações através do canal de comunicação TCP/IP, estas são recebidas pelo BWComm por um de seus fluxos de controle, e elas são tratadas pela função “MessageParser
De forma similar, quando um pedido de relatório de awareness (comando GETEVENT) chega, o fluxo de controle que o recebe chamará a função de tratamento ("AwtratarGetEvent"). Esta função solicitará ao framework BW os eventos passados, montará a string de resposta e a enviará para o cliente. Quando todos estes eventos são recebidos pelo lado cliente do módulo de awareness, o cliente os apresenta ao usuário em uma janela de interface similar à interface utilizada no Amaya.
A interface com o usuário é definida no lado cliente, junto ao Amaya, à fim de bem integrar-se a este.
·[GUT
99] Gutwin, C.; Greenberg, S. A framework of awareness for small groups
in shared-workspace groupware. Techinical Report 99-1, Departament of Computer
Science, University of Saskatchewan, Canadá. Disponible: <http://www.cpcs.ucalgary.ca/grouplab/papers/1999/99-AwarenessTheory/html/theory-tr99-1.html>
(set., 1999).
·[KOI01]
KOIVUNEN, Marja. Annotea
Project . Disponible
< http://www.w3.org/2001/Annotea/>
(jun., 2001)
·[OPE
99] Opera Group. Byzance. Disponble: <http://www.inrialpes.fr/opera/Byzance.fr.html>
(jun.1999).
·[PIN
01a] Pinheiro, Manuele Kirsch. Mecanismo de suporte à percepção
em ambientes cooperativos. Dissertação de mestrado. Porto
Alegre, Brasil : PPGC/UFRGS, 2001. Disponible:
<http://www.inf.ufrgs.br/~manuele/teseFinalPDF.zip>
(jun.,2001).
·[PIN 01b]Pinheiro, Manuele Kirsch; Lima, José Valdeni; Borges, Marcos R.S. Awareness em Sistemas de Groupware. In IV Jornadas Iberoamericanas de Ingenieria de Requisitos y Ambientes de Software. Memorias. Santo Domingo,. Costa Rica : CIT, 2001.
·[PIN
01c] Pinheiro, Manuele Kirsch; Lima, José Valdeni. An
Adaptable Framework for Past Events Awareness Support. Disponible:
<http://www.inf.ufrgs.br/~manuele/ArtBW.zip>
(jun.,2001).
·[QUI
99a]QUINT, Vincent;VATTON, Irène. Thot Tool Kit API. Disponble:
<http://www.inrialpes.fr/Thot/Doc/APIman.html>
(fev.1999).
·[SAL
98] SALCEDO, Manuel
Romero. Alliance sur l'Internet: support pour l'édition coopérative
des documents struturés sur um réseau à grande distance.
Grenouble, France: INPG, 1998.
·[SOH 99]Sohlenkamp, M. Supporting group awareness in multi-user enviroment through perceptualization. Dissertation. Fachbereich Mathematik-Informatik der Universität - Gesamthochschule - Paderborn. Fevereiro, 1998. Disponible: <http://orgwis.gmd.edu/projects/POLITeam/ poliawac/ms-diss/> (jul., 1999)