[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: [reverbel-sod] [EP1] Manipular estado do Customer



On Sun, 2006-04-09 at 22:46 -0300, Rafael de F. Ferreira wrote: 
> Estou com uma dúvida a respeito de como registrar o alguel de um
> exemplar para as entidades Customer.
> 
> Na IDL do Customer não consta nenhuma operação para manipular a
> MovieCopyList dos exemplares alugados. Como a operação rentTo(...) da
> interface MovieCopy recebe uma referência remota para um Customer,
> também não posso fazer um downcast para o tipo do servant do customer.
> Sem contar que não é boa prática ficar fazendo casts o tempo todo.
> 
> Eu pensei em dois workarounds, mas nenhum parece muito legal. Uma
> alternativa seria fazer o servant do Customer buscar em algum lugar
> conhecido a lista de MovieCopy's alugadas para ele no momento em que
> precisasse. 

Essa solução não é ruim. Faça o servente da MovieCopy ter um campo com o
id do Customer para o qual a MovieCopy foi alugada. (Pense em como se
implementa um relacionamento 1 para N num BD relacional: colocando na
tabela correspondente à entidade que aparece com cardinalidade N uma
coluna com a chave estrangeira da tabela correspondente à entidade que
aparece com cardinalidade 1 no relacionamento.) 

Para construir a lista de MovieCopies alugados para um Customer,
percorra a coleção de serventes de MovieCopy e olhe o campo "id do
Customer" de cada servente. (No caso de entidades armazenadas num BD
relacional, você faria isso com um comando SQL: "SELECT ID FROM
MOVIE_COPY MC WHERE MC.CUSTOMER_ID = CUSTOMER_ID".) Note que a coleção
de serventes de MovieCopy servirá também para implementar a interface
MovieCopyHome.

Repare que basta obter o id (chave) de cada MovieCopy. Tendo esses ids,
você pode convertê-los em referências CORBA para objetos MovieCopy
chamando poa.id_to_reference() (caso você use um POA com a política
RETAIN e deixe todos os objetos MovieCopy ativos o tempo todo) ou
poa.create_reference_with_id() (se os objetos MovieCopy não ficarem
ativos o tempo todo -- este vai ser o caso no EP2).

Você também pode fazer conversão de id em referência CORBA para
implementar o método getTaker() no servente da MovieCopy. Tendo o campo
"id do Customer" nesse servente, basta converter o id em referência
CORBA para um Customer.

Em vez de ter, no servente da MovieCopy, um campo com o id desse
Customer que alugou a MovieCopy, uma outra alternativa é ter, nesse
servente, um campo com uma referência CORBA para o Customer que alugou a
MovieCopy. 

> Outra maneira seria implementar o método
> MovieCopy.rentTo(...) de modo a buscar uma referência local para o
> servant concreto do Customer no servidor através do ID dele e chamar
> uma operação como CustomerImpl.rent(MovieCopy).

Só agora entendi que você está querendo estabelecer links na outra
direção (de Customer para uma coleção de MovieCopies). Isso é
desnecessário, basta o link de MovieCopy para Customer.

Reverbel

> Alguém tem alguma sugestão?
> 
> Obrigado;
> --
> Rafael de F. Ferreira.
>