A maior rede de estudos do Brasil

Grátis
118 pág.
poojava

Pré-visualização | Página 37 de 37

e Java
Uma vez definida ou obtida a interface IDL para um serviço, as classes auxiliares para acessar o
objeto remoto que implementa o serviço são obtidas pela compilação da interface, usando o aplicativo
idlj (ou idltojava ou ainda idl2java em versões anteriores à Java 1.3). Além de classes para
stubs e skeletons, são geradas classes auxiliares (helpers e holders) para permitir a comunicação entre
objetos Java e dados estabelecidos em outras linguagens.
Na plataforma Java há uma implementação para o serviço de nomes de CORBA, oferecida pelo
aplicativo tnameserv. Esse serviço está mapeado por default para a porta 900, podendo esta ser
modificada pela opção -ORBInitialPort".
A interação entre um ORB e um programa Java dá-se através de métodos da classe ORB. Para
inicializar a referência ao ORB, utiliza-se o método estático init() dessa classe. Para obter uma
referência para o serviço de nomes utiliza-se o método resolve_initial_references(),
tendo a NameService como argumento.
O exemplo a seguir é a implementação usando CORBA do clássico programa “Hello, world”. É
composto por três arquivos: a interface IDL, o cliente e o servidor.
A Interface IDL descreve um serviço com um único método, sendo aqui definida usando as
construções da linguagem IDL:
1 module HelloApp {
2 interface Hello {
3 string sayHello();
4 }
5 }
Usando-se o aplicativo idlj, gera-se a interface Java correspondente, com a tradução das cons-
truções IDL para as primitivas Java segundo o padrão estabelecido em CORBA, além de outros
arquivos auxiliares (stub, skeleton, helper, holder), não apresentados aqui:
1 package HelloApp;
2 public interface Hello
3 extends org.omg.CORBA.Object {
4 String sayHello();
5 }
c
�
2001 FEEC/UNICAMP 114
Programação orientada a objetos com Java 5.4. Programação com objetos distribuídos
O código cliente ativa o ORB, obtém uma referência para o serviço de nomes e, a partir deste
serviço, obtém uma referência remota para o objeto com o serviço Hello. Obtida a referência, o
método é invocado normalmente:
1 import HelloApp.*;
2 import org.omg.CosNaming.*;
3 import org.omg.CORBA.*;
4 public class HelloClient {
5 public static void main (String args[]) {
6 try {
7 ORB meuOrb = ORB.init(args,null);
8 org.omg.CORBA.Object objRef =
9 meuOrb.resolve_initial_references("NameService");
10 NamingContext ncRef = NamingContextHelper.narrow(objRef);
11 NameComponent nc = new NameComponent("Hello","");
12 NameComponent path[] = {nc};
13 Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
14 String hi = helloRef.sayHello();
15 System.out.println(hi);
16 }
17 catch(Exception e) {
18 System.out.println(e);
19 e.printStackTrace(System.out);
20 }
21 }
22 }
Nesse exemplo, combina-se a implementação do serviço e o correspondente servidor. A classe
HelloServer é um servidor que ativa o ORB, cria o objeto que implementa o serviço, obtém uma
referência para o serviço de nomes e registra o objeto neste diretório associado ao nome Hello. A
classe HelloServant é uma implementação do serviço especificado; observe que essa classe é
uma extensão de _HelloImplBase, o skeleton definido pelo aplicativo idlj:
1 import HelloApp.*;
2 import org.omg.CosNaming.*;
3 import org.omg.CosNaming.NamingContextPackage.*;
4 import org.omg.CORBA.*;
5 public class HelloServer {
6 public static void main(string args[]) {
7 try {
8 // Create the ORB
9 ORB orb = ORB.init(args,null);
10 // Instantiate the servant object
11 HelloServant helloRef = new HelloServant();
12 // Connect servant to the ORB
13 orb.connect(helloRef);
c
�
2001 FEEC/UNICAMP 115
Programação orientada a objetos com Java 5.4. Programação com objetos distribuídos
14 //Registering the servant
15 org.omg.CORBA.Object objRef =
16 orb.resolve_initial_references("NameService");
17 NamingContext ncRef = NamingContextHelper.narrow(objRef);
18 NameComponent nc = new NameComponent("Hello","");
19 NameComponent path[] = {nc};
20 ncRef.rebind(path, helloRef);
21 // Wait for invocation
22 java.lang.Object sync = new java.Lang.Object();
23 synchronized(sync) {
24 sync.wait();
25 }
26 }
27 catch(Exception e) {
28 System.out.println(e);
29 e.printStackTrace(System.out);
30 }
31 }
32 }
33 class HelloServant extends _HelloImplBase {
34 public String sayHello() {
35 return "\nHelloWorld!\n";
36 }
37 }
c
�
2001 FEEC/UNICAMP 116
Apêndice A
Palavras chaves de Java
As palavras a seguir são de uso reservado em Java e não podem ser utilizadas como nomes de
identificadores:
abstract double int static
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float null throw
char for package throws
class goto private transient
const if protected try
continue implements public void
default import return volatile
do instanceof short while
117