• Nenhum resultado encontrado

4.4 Funcionalidades Suportadas e Primitivas da Interface de Programação

4.4.3 Comunicação entre participantes

Os mecanismos de comunicação oferecidos pela plataforma Imagine dividem-se em três tipos: mensagens; eventos; espaço partilhado. Nesta secção é apresentada a componente relativa à comunicação directa entre participantes (1-1) e à difusão de mensagens por membros de um grupo (1-n).

Como mencionado anteriormente, existem alguns aspectos que são incorporados da plataforma JXTA. A estruturação das mensagens é um desses aspectos no qual o conteúdo

das mensagens é definido com uma lista de pares, em que cada par contém um conteúdo e uma chave que o identifica. Esta organização permite estruturar o conteúdo das men- sagens e facilita o tratamento da mensagem, dado ser possível aceder directamente aos pares que se pretende manipular através das chaves desses pares.

A título de exemplo, apresenta-se a estrutura de uma mensagem que contém dois pares:

• <"From"; "User01»

• <"Welcome"; "Welcome new user!»

O conteúdo da mensagem apresentada consiste em dois pares, no qual o primeiro par tem como chave From e tem o conteúdo "User01" e o segundo par tem como chave

Welcomee tem o conteúdo "Welcome new user!". 4.4.3.1 Comunicação directa

A comunicação directa entre dois participantes é alcançada através de uma de duas pri- mitivas.

A primeira primitiva permite o envio de uma lista de conteúdos, que segue a estru- tura apresentada anteriormente. A segunda primitiva é uma simplificação da primeira que permite o envio de um único par, evitando a criação explícita da lista de conteúdos.

Listing 4.10: Envio de diversos conteúdos numa mensagem directa

1 void Users.send(name, list, listenerName, listenerParam)

Face ao envio de uma mensagem directa entre dois participantes, esta é alcançada através da primitiva Users.send e tem os seguintes argumentos:

• name, nome do participante destinatário;

• list, lista de conteúdos a enviar;

• listenerName, qual o nome do objecto de escuta;

• listenerParam, qual o parâmetro do objecto de escuta.

Listing 4.11: Envio de um par numa mensagem directa

1 void Users.send(name, key, message, listenerName, listenerParam)

Esta segunda primitiva (Users.send) permite o envio de um único par numa men- sagem, sendo que os argumentos name, listenerName e listenerParam têm o mesmo signi- ficado que a primitiva apresentada anteriormente e é necessário indicar qual é a chave e conteúdo a enviar através dos respectivos argumentos (key e message).

4.4.3.2 Difusão de mensagens por membros de um grupo

A difusão de mensagens pelos membros de um grupo segue a mesma abordagem ine- rente ao envio de mensagens directo entre participantes, isto é, existem duas primitivas para a difusão de mensagens por membros de um grupo. A primeira permite o envio de uma lista de conteúdos e uma segunda que permite o envio de um único par.

Apenas um membro do grupo pode enviar mensagens para esse grupo. Todos os membros irão receber essa mensagem mas apenas os membros que têm o objecto de escuta registado de forma correcta, isto é, associado ao grupo com o nome e parâmetro correcto, irão interpretar a mensagem.

Listing 4.12: Difusão de uma mensagem com diversos conteúdos para um grupo

1 void Groups.send(groupName, list, listenerName, listenerParam)

Para a difusão de mensagens pelos membros de um grupo está disponível a primitiva Groups.sende que conta com os seguintes argumentos:

• groupName, nome do grupo destino; • list, lista de conteúdos a enviar;

• listenerName, qual o nome do objecto de escuta; • listenerParam, qual o parâmetro do objecto de escuta.

Listing 4.13: Difusão de uma mensagem com um conteúdo para um grupo

1 void Groups.send(groupName, key, message, listenerName, listenerParam)

Esta segunda primitiva (Groups.send) simplifica o envio de um par numa men- sagem, sendo que os argumentos groupName, listenerName e listenerParam têm o mesmo significado da primitiva anterior e é necessário fornecer a chave e conteúdo a enviar atra- vés dos argumentos key e message.

4.4.3.3 Recepção de mensagens

Como mencionado, a recepção de mensagens na plataforma Imagine é efectuada à custa de objectos de escuta e existem primitivas para registo e eliminação desses objectos.

Registo de um objecto de escuta

É possível registar objectos de escuta por cada participante, no contexto de um grupo com um determinado nome e parâmetro, de forma a que este consiga receber mensagens enviadas para si, quer mensagens directas como difusão de mensagens para um grupo em que este participante é membro.

As mensagens directas entre participantes são enviadas no contexto do grupo global e para manipular os objectos de escuta no contexto do grupo global basta submeter null no nome do grupo.

Listing 4.14: Registo de um objecto de escuta

1 void Groups.addIncomingListener(groupName, listener, listenerName, listenerParam)

De forma a registar um objecto de escuta para a recepção de mensagens, deve-se utilizar a primitiva Groups.addIncomingListener. Esta primitiva tem os seguintes argumentos:

• groupName, nome do grupo;

• listener, instância do objecto de escuta;

• listenerName, qual o nome do objecto de escuta; • listenerParam, qual o parâmetro do objecto de escuta.

Relativamente ao nome de grupo submetido no registo de um objecto de escuta, se este for null então o objecto de escuta fica associado ao grupo global.

De seguida apresenta-se um exemplo de um objecto de escuta. Todos os objectos de escuta têm de estender a classe EndpointListener disponibilizada por JXTA.

Listing 4.15: Exemplo de um objecto de escuta

1 class Listener extends EndpointListener {

2 public void processIncomingMessage(Message msg, EndpointAddress srcAddr, EndpointAddress dstAddr) {

3 // Do something...

4 }

5 }

Como se pode verificar na listagem de código4.15, um objecto de escuta sempre que recebe uma mensagem, tem sempre três argumentos definidos: a mensagem recebida; o endereço de quem enviou; o enderenço para o qual foi enviada a mensagem. Estes três argumentos são instanciados por JXTA aquando da recepção de uma mensagem.

Eliminação de um objecto de escuta

É dada a possibilidade de eliminar um objecto de escuta previamente registado, sendo esta funcionalidade particularmente interessante quando se pretende actualizar o funci- onamento de um objecto de escuta, sendo necessário eliminar o antigo objecto de escuta e registar o novo.

Listing 4.16: Eliminação de um objecto de escuta

1 void Groups.removeIncomingListener(groupName, listenerName, listenerParam)

Para a eliminação de uma instância de um objecto de escuta previamente registado deve-se utilizar a primitiva Groups.removeIncomingListener.

• groupName, nome do grupo;

• listenerName, qual o nome do objecto de escuta; • listenerParam, qual o parâmetro do objecto de escuta.

4.4.3.4 Exemplo de comunicação directa entre dois participantes

Nesta secção apresenta-se um pequeno exemplo do envio de uma mensagem do partici- pante user01 para o participante user02 (ver figura4.5).

Grupo Global User01 User02 Send Listener <Chave1, Conteúdo1> <Chave2, Conteúdo2> Message

Figura 4.5: Envio de uma mensagem de um participante para outro, sendo a recepção efectuada através de um objecto de escuta

Listing 4.17: Exemplo que demonstra os passos essenciais ao envio e recepção de uma mensagem

1 // Contexto do user01

2 list = <"key1" -> "Content of the first key", "key2" -> "Content of the second key">

3 Users.send("user02", list, "listener", ""); 4

5 // Contexto do user02

6 class Listener extends EndpointListener {

7 public void processIncomingMessage(Message msg, EndpointAddress srcAddr, EndpointAddress dstAddr) {

8 System.out.println(msg.getMessageElement("key1")); 9 System.out.println(msg.getMessageElement("key2"));

10 }

11 }

12 Groups.addIncomingListener(null, new Listener(), "listener", "");

O participante que envia a mensagem necessita apenas de invocar a primitiva Users. send(linha 3) e submeter os argumentos pretendidos para enviar a mensagem para o ou- tro participante.

Quanto ao participante que irá receber a mensagem, este necessita registar um objecto de escuta (linha 12) que contém o tratamento da mensagem e neste exemplo, o objecto de escuta limita-se a imprimir o conteúdo da mensagem, sendo imprimido "Content of the first key" e "Content of the second key".