|
|
| 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
Parts.
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 Parts 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:
|