SOD - Etapa 2 do projeto

. Atualização do arquivo IDL
. SQL e JDBC
. Dicas de última hora


Atualização do arquivo IDL

Esta é a segunda versão do arquivo IDL. A idéia é não mexer mais nesse arquivo, ou seja, usá-lo também na etapa 3 do projeto. Por isso ele inclui coisas que só serão efetivamente implementadas na etapa 3.

As principais novidades são:

. os tipos InfoExemplar, InfoExemplares e InfoLivro;

. a operação Biblioteca::pegaInfoLivro();

. a operação Biblioteca::pegaExemplarDeLivro();

. as definições incluídas tendo em vista a etapa 3 do projeto: o tipo Alcance e a interface BibliotecaVirtual.

Fica para a etapa 3 a implementação de quatro objetos BibliotecaVirtual com alcances distintos (LOCAL, CIDADE, ESTADO e GLOBAL). Nesta segunda etapa será implementado somente o objeto BibliotecaVirtual com alcance LOCAL. (Essa BibliotecaVirtual é praticamente igual à Biblioteca "normal".) A operação BibliotecaVirtual::bibliotecaComAlcance funcionará com a restrição (provisória) abaixo:

. Se invocada com parâmetro alcance diferente de LOCAL, a operação BibliotecaVirtual::bibliotecaComAlcance levanta a exceção AlcanceNaoSuportado. Se invocada com parâmetro alcance igual a LOCAL, essa operação retorna uma referência para a própria BibliotecaVirtual.


SQL e JDBC

Conforme discutimos em classe, a segunda etapa do seu projeto ficará muito mais interessante e realista se você mantiver num banco de dados o estado de cada um dos seus objetos. O uso de um banco de dados não é obrigatório (o sistema de arquivos pode também ser usado para guardar objetos), mas é fortemente recomendado.

O sistema que temos na rede do IME é o MySQL, um servidor SQL lightweight ("leve" e veloz, porém sem suporte a transações). O servidor MySQL está rodando no sushi. Para acessá-lo você precisará de um nome de usuário (com uma senha) e de direitos de acesso a um banco de dados. Escreva-me dizendo que senha gostaria de ter, que eu criarei um usuário MySQL e um banco de dados para você.

O programa mysql é um cliente com o qual você pode emitir comandos SQL interativamente. Se você já tiver uma conta no MySQL, abra uma sessão num host Solaris (jaca, rebutosa, fradim, sushi, ...) e diga

    mysql -h sushi -u seu_username -p seu_banco_de_dados

(O "-h sushi" é desnecessário se você estiver no próprio sushi.) Agora você pode interagir com seu banco de dados (que no início estará completamente vazio), dando comandos create table, insert, select, etc.

Para mais detalhes, veja a documentação do MySQL:

. MySQL Reference Manual (Table of Contents)
. MySQL Documentation

Você usará um driver JDBC para acessar o servidor MySQL de um cliente Java. (Seu servidor CORBA será cliente do servidor MySQL!) Para isso, inclua em seu CLASSPATH o arquivo jar com o driver JDBC. Na rede do IME esse arquivo está em /home/mac/reverbel/JDBC/jdbc-mysql-mm.jar.

A documentação do driver JDBC contém a "receita" que seu servidor deverá seguir para registrar o driver e se conectar com um banco de dados:

. MM MySQL JDBC Driver (API documentation)

É bom olhar também um exemplo de uso do driver JDBC. Aqui está um programa de teste do driver, que serve como exemplo de utilização.

Para mais informações sobre JDBC, veja a página JDBC - Connecting Java and Databases e, em especial, o documento JDBC Guide: Getting Started.


Dicas de última hora

Algumas equipes tiveram muitos problemas para fazer a ativação dinâmica de objetos funcionar. As dicas abaixo são fruto da nossa experiência "caçando" esses problemas...

. Uma object reference para um objetos ativado dinâmicamente contém o nome associado ao Activator do objetos (o "nome do serviço"). Para evitar conflitos, use nomes que tenham o seu username como prefixo. Exemplos: "reverbelLivro" (em vez de "LivroService"), "reverbelExemplar" (em vez de "ExemplarService").

. A object reference contém também o port do servidor. Faça seu servidor usar sempre o mesmo port, passando a propriedade "OAport" na chamada a BOA_init:
    java.util.Properties boaprops = new java.util.Properties();
    boaprops.put("OAport", "o_numero_do_port_do_seu_servidor");
    BOA boa = orb.BOA_init("TPool", boaprops); // pode usar "TPool" ou "TSession" 
Para evitar conflitos entre os servidores, use como número de port o número de sua equipe mais 20000, considerando esta numeração de equipes. No servidor da equipe 3 (por exemplo), a iniciação do BOA deve ser feita assim:
    java.util.Properties boaprops = new java.util.Properties();
    boaprops.put("OAport", "20003");
    BOA boa = orb.BOA_init("TPool", boaprops); // pode usar "TPool" ou "TSession" 
Não deveria ser preciso fixar números de ports. Mas só assim conseguimos fazer funcionar a ativação dinâmica de objetos...

. Use o comando printIOR para ver o que há numa IOR. Chamando printIOR com uma IOR para um objeto ativado dinamicamente voce poderá conferir se o host, o port, o nome do serviço e o id do objeto aparecem corretamente na IOR.

. Se seu servidor tiver mais de um ativador, ele deve fazer mais de uma chamada a boa.impl_is_ready(). Cuidado: o código abaixo não funciona. (Porquê?)
    boa.impl_is_ready("reverbelLivro", new LivroActivator(boa));
    boa.impl_is_ready("reverbelExemplar", new ExemplarActivator(boa));
O código correto é
    boa.impl_is_ready("reverbelLivro", new LivroActivator(boa), false);
    boa.impl_is_ready("reverbelExemplar", new ExemplarActivator(boa));

. Quando registrar seu servidor via oadutil reg, não se esqueça de incluir o driver JDBC no CLASSPATH passado ao executável. Note que, no caso de um servidor com ativação dinâmica de objetos, deve-se usar a opção "-s" e deve-se registrar todos os ativadores implementados pelo servidor. Exemplo:
    oadutil reg -s reverbelLivro \
                 -cpp /usr/local/jdk1.1.4/bin/java \
                 -a -classpath -a um_classpath_enorme_aqui \
                 -a Server

    oadutil reg -s reverbelExemplar \
                 -cpp /usr/local/jdk1.1.4/bin/java \
                 -a -classpath -a um_classpath_enorme_aqui \
                 -a Server


Last modified: Thu Nov 5 12:21:38 EDT 1998
Francisco Reverbel
reverbel at ime.usp.br