|
|
Descrição Geral |
Vamos construir uma "versão enxuta" de um sistema que mantém
registros distribuídos por vários servidores. Os registros
serão objetos CORBA cuja interface é Record
. Um
Record
contém um conjunto de pares (nome, valor). Esses pares
são os atributos do registro. Eis um exemplo de registro:
* titulo alien ano 1979 diretor ridley scott com sigourney weaver com harry dean stanton com yaphet kottoAs linhas acima representam os atributos do registro. A primeira coluna traz o nome do atributo e a segunda o valor. Um registro pode ter vários atributos com o mesmo nome. (O registro acima tem três atributos com o nome "com".) Todo registro tem um atributo chave especificado na criação do registro. (O atributo chave do registro acima é o título, que aparece marcado com um asterisco.) O nome do atributo chave é único dentro do registro, ou seja, nenhum outro atributo do registro pode ter o mesmo nome que o atributo chave.
Cada servidor implementará um objeto RecordSet
, que é
essencialmente uma coleção de Record
s. Um registro de um
RecordSet
é univocamente identificados por seu atributo
chave. Em outras palavras: num RecordSet
não podem existir
dois registros com nomes iguais e valores iguais no atributo chave.
As definições (em IDL) das interfaces Record
e
RecordSet
encontram-se no arquivo sod.idl
. Use-o sem fazer alteração
nenhuma. Para que os programas escritos pelas diferentes equipes
funcionem em conjunto, é crucial que todos se baseiem nas mesmas
definições de interfaces.
Etapas |
Numa primeira etapa os servidores implementados pelas várias equipes
serão isolados. Cada servidor implementará um objeto
RecordSet
com os registros mantidos localmente pelo
servidor.
Na segunda etapa os servidores deixam de ser isolados. Cada servidor
implementará dois objetos RecordSet
:
Exemplificando: os dois registros locais abaixo geram um só registro global.
* titulo alien ano 1979 com sigourney weaver com yaphet kotto
* titulo alien diretor ridley scott com harry dean stanton
* titulo alien ano 1979 com sigourney weaver com yaphet kotto diretor ridley scott com harry dean stanton
Metas |
Cada equipe de projeto escreverá um "programa servidor" e um "programa cliente".
O Servidor |
O programa servidor implementará as interfaces descritas
descritas no arquivo sod.idl
. Na
primeira etapa não será implementado o conjunto de registros global (o
globalRecordSet
será null
).
O Cliente |
O programa cliente será usado para exercitar o sistema. Ele deve permitir que o usuário:
RecordSet
local e (na segunda etapa)
com o RecordSet
global implementado pelo servidor,
RecordSet
novos registros,RecordSet
por atributo
chave,RecordSet
,RecordSet
que contém algum atributo
de um conjunto especificado;RecordSet
que contém todos os atributos
de um conjunto especificado;Record
, referência essa
previamente obtida como resultado de uma busca por atributo
chave ou de uma adição de registro, interaja com esse registro,
Provavelmente o mais fácil é escrever um cliente com uma interface tipo linha de comando. Uma possibilidade é um cliente "linha de comando" que mantenha duas variáveis:
RecordSet
com o qual toda interação ocorre;
local
|
Faz o cliente se conectar a outro servidor e passa a trabalhar com o
RecordSet local desse servidor. Este comando recebe o
nome de um servidor, obtém do serviço de nomes uma referência para o
objeto Server correspondente, e deste objeto obtém uma
referência para o conjunto de registros local do Server .
Este conjunto de registros passa a ser o RecordSet
corrente.
|
global
|
Faz o cliente se conectar a outro servidor e passa a trabalhar com o
RecordSet global fornecido por esse servidor. Este
comando recebe o nome de um servidor, obtém do serviço de nomes uma
referência para o objeto Server correspondente, e deste
objeto obtém uma referência para o conjunto de registros global do
Server . Este conjunto de registros passa a ser o
RecordSet corrente.
|
addrec
|
Adiciona um registro ao RecordSet corrente. Recebe o
atributo chave do novo registro, que passa a ser o
Record corrente.
|
getbykey
|
Busca um registro por atributo chave. A busca é efetuada no
RecordSet . Se encontrado, o registro passa a ser o novo
registro corrente.
|
all
|
Lista os (atributos chaves) de todos os registros do repositório corrente. |
findone
|
Lista os (atributos chaves dos) registros do RecordSet
corrente que contém algum dos atributos de uma lista especificada.
|
findall
|
Lista os (atributos chaves dos) registros do RecordSet
corrente que contém todos os atributos de uma lista especificada.
|
addattr
|
Adiciona um atributo ao registro corrente. |
attrs
|
Mostra todos os atributos do registro corrente e indica qual deles é o atributo chave do registro. |
quit
|
Encerra a execuçao do cliente. |
A lista acima tem a finalidade de ilustrar como um cliente "linha de comando" poderia funcionar. Tome-a como uma sugestão (provavelmente incompleta), que pode ser seguida ou não. Se você tiver gás para escrever um cliente com uma interface com o usuário mais elaborada e amigável (GUI), vá em frente!
Especificações Adicionais |
Server
,
RecordSet
e Record
devem ser
persistentes. As referências para RecordIterator
s
devem ser transientes.
Server
e os
dois RecordSet
s do servidor devem ser instanciados
no main do servidor.
Record
s locais devem ser implementados por
serventes instanciados dinâmicamente por um
ServantLocator
.
Record
s globais devem ser implementados por
um serventes default.
Forma de Entrega e Prazos |
build.xml
que gere tanto o
servidor como o cliente.
Makefile
que gera o cliente C++ e um
build.xml
que gera o servidor Java.
build.xml
e, se for o caso, o
Makefile
. Ele deve também conter um subdiretório
com a árvore de fontes Java e, se for o caso, outro subdiretório
com os fontes C++.
Registro das Equipes |
O projeto será desenvolvido em equipes de um ou dois alunos. As equipes devem se registrar com o professor, via email, até o dia 15 de abril.
![]() |
Equipes registradas:
|