|
|
Em construção... |
Descrição Geral |
Vamos construir uma "versão enxuta" de um sistema de informações sobre
"peças" ou "componentes" (parts). O sistema será distribuído
por múltiplos servidores CORBA, cada qual implementando um repositório
de informações sobre peças. Cada peça será representada por um objeto
cuja interface é Part
. Cada servidor implementará um objeto
PartRepository
, que é essencialmente uma coleção de
Part
s.
As definições (em IDL) das interfaces Part
e
PartRepository
encontram-se neste arquivo. 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.
Cada objeto Part
encapsula as seguintes informações:
(subPart, quant)
, onde subPart
referencia um sub-componente da peça, e quant
indica
quantas unidades do sub-componente aparecem na peça. Uma peça primitiva
tem lista de componentes vazia.
Os sub-componentes de um objeto Part
agregado são também
objetos Part
. Esses objetos não são necessariamente
implementados pelo servidor CORBA que implementa a peça agregada. Eles
podem estar distribuídos por múltiplos servidores. Tais servidores podem
inclusive ter sido escritos por diferentes equipes de projeto.
Metas |
Cada equipe de projeto escreverá um "programa servidor" e um "programa cliente".
O Servidor |
O programa servidor implementará as interfaces
PartRepository
e Part
. Escreva-o tendo em
mente que poderão ocorrer várias execuções simultâneas do programa
servidor: cada "processo servidor" (uma execução do programa servidor)
implementará um objeto PartRepository
, mais a
correspondente coleção de objetos Part
. Isto significa que
o programa servidor deve receber como argumentos, na linha de comando,
certos parametros que tem de variar de um processo servidor para outro
(o nome do servidor, por exemplo).
O Cliente |
O programa cliente será usado para exercitar o sistema. Ele deve permitir que o usuário:
bind
|
Faz o cliente se conectar a outro servidor e muda o repositório corrente. Este comando recebe o nome de um repositório e obtém do serviço de nomes uma referência para esse repositório, que passa a ser o repositório corrente. |
listp
|
Lista as peças do repositório corrente. |
getp
|
Busca uma peça por código. A busca é efetuada no repositório corrente. Se encontrada, a peça passa a ser a nova peça corrente. |
showp
|
Mostra atributos da peça corrente. |
clearlist
|
Esvazia a lista de sub-peças corrente. |
addsubpart
|
Adiciona à lista de sub-peças corrente n unidades da
peça corrente.
|
addp
|
Adiciona uma peça ao repositório corrente. A lista de sub-peças corrente é usada como como lista de sub-componentes diretos da nova peça. (É só para isto que existe a lista de sub-peças corrente.) |
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 (incompleta, por sinal), 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!
Etapas |
O projeto será dividido em 3 etapas. Ao final da terceira etapa as equipes farão uma demonstração do funcionamento de seus sistemas.
Primeira Etapa |
Todas as operações estão implementadas, mas as informações sobre peças não são armazenadas em disco. Quando um servidor encerrar sua execução, todos os dados que ele mantinha se perderão.
Use o cliente para exercitar e testar o sistema como um todo. Enquanto todos os servidores envolvidos estiverem ativos, tudo deverá funcionar (inclusive os relacionamentos entre peças e sub-peças distribuídas por vários servidores).
Segunda Etapa |
DefaultServant
para os objetos Part
.
Agora as informações sobre peças são armazenadas persistentemente. A queda e a reativação de servidores não devem ter nenhum efeito sobre os relacionamentos entre as peças mantidas por esses servidores.
Considere que o número de objetos Part
implementados
por um servidor pode ser grande a ponto de não ser possível manter
em memória um servente para cada Part
. Use um
DefaultServant
para resolver este problema.
Terceira Etapa |
ServantLocator
para os objetos Part
.
Os requisitos são os mesmos da etapa anterior: as informações
sobre peças são armazenadas persistentemente e o número de objetos
Part
no servidor pode ser grande a ponto de não ser
possível manter em memória um servente para cada um deles.
Em vez ter um servente default para todos as Part
s no
servidor, use um ServantLocator
para fazer
instanciação de serventes sob demanda. Aplique o evictor
pattern para manter um cache dos serventes que foram
utilizados mais recentemente e para se livrar dos demais.
Prazos |
Etapa 1: 18 de outubro | |
Etapa 2: 16 de novembro | |
Etapa 3: 29 de novembro |
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 4 de outubro.
Equipes registradas:
|