Usar Objetos Referencia Stringified

Para invocar una operación sobre un objeto CORBA, una aplicación cliente necesita una referencia al objeto. Podemos obtener dicha referencia de una de estas formas, llamando a ORB.resolve_initial_references o suando otro objeto CORBA (como el servicio de nombres). En las lecciones anteriores, usamos ambos métodos para obtener un objeto referencia inicial.

Sin embargo, frecuentemente no hay un serivicio de nombres disponible en el entorno distibuido. En esta situación, los clientes CORBA usan un objeto referencia stringified (encadenada) para encontrar su primer objeto.

En esta lección, aprenderemos cómo crear un objeto referencia stringified como parte de la configuración del servidor, y cómo el cliente obtiene esta referencia y la (desencadena) para usarla como un objeto referencia real. Puedes encontrar la versión completa del código fuente en HelloStringifiedServer.java y en HelloStringifiedClient.java.

Crear un Objeto Referencia Stringified

Para que el cliente tenga disponible un objeto referencia stringified, el servidor debe crear la referencia y almacenarla en algún lugar al que tenga acceso el cliente. Nuestra referencia se escribirá en el disco como un fichero de texto.
  1. Compiamos nuestro fichero existente HelloServer.java.
  2. Como el nuevo servidor escribirá un fichero en el disco, necesitamos añadir una sentencia import:
     
    // needed for output to the file system.
    import java.io.*;
    
  3. El nuevo servidor no usará el servicio de nombres, por lo que no necesitaremos los paquetes CosNaming . Borramos estas líneas del código
     
    // not needed for stringified version
    // remove from code
    import org.omg.CosNaming.*;
    import org.omg.CosNaming.NamingContextPackage.*;
    
  4. Borramos el código que obtiene el contexto de nombrado inicial y resuelve la referencia al objeto Hello:
     
    // Get the root naming context
    org.omg.CORBA.Object objRef =
        orb.resolve_initial_references("NameService");
    NamingContext ncRef = NamingContextHelper.narrow(objRef);
    
    // Bind the object reference in naming
    NameComponent nc = new NameComponent("Hello", "");
    NameComponent path[] = {nc};
    ncRef.rebind(path, helloRef);
    
  5. Llamamos al método object_to_string del ORB y le pasamos la referencia al objeto sirviente. Esto devuelve el objeto referencia en un string que puede sar grabado en un fichero de disco.
     
    String ior = orb.object_to_string(helloRef);
    
  6. Construimos el path al fichero que vamos a almcenar, usando las propiedades del sistema para determinar la estructura y la síntaxis del path:
     
    String filename = System.getProperty("user.home") +
        System.getProperty("file.separator")+"HelloIOR";
    
  7. Usamos las operaciones estándars de Java para escribir el stringified ior en el disco:
     
    FileOutputStream fos = new FileOutputStream(filename);
    PrintStream ps = new PrintStream(fos);
    ps.print(ior);
    ps.close();
    
Cuando se ejecuta HelloStringifiedServer, en vez de llamar al ORB y registrar el objeto sirviente con el nombre, crea el fichero de texto HelloIOR que contiene una referencia stringified al sirviente. El fichero está almacenado en nuestro directorio home.

Obtener un Objeto Referencia Stringified

  1. copiamos nuestro fichero existente HelloStringifiedClient.java.
  2. Como el nuevo vliente leerá un fichero desde el disco, necesimatos cambiar las sentencias import:
     
    // needed for input from the file system.
    import java.io.*;
    
  3. El nuevo cliente no usará el servicio de nombres, por lo que no necesitaremos el paquete CosNaming. Borramos está línea del código:
     
    // not needed for stringified version
    import org.omg.CosNaming.*;
    
  4. Borramos el código que obtiene el contexto de nombrado inicial y registra el sirviente con el servicio de nombres:
     
    // Get the root naming context
    org.omg.CORBA.Object objRef =
        orb.resolve_initial_references("NameService");
    NamingContext ncRef = NamingContextHelper.narrow(objRef);
    
    // Resolve the object reference in naming
    NameComponent nc = new NameComponent("Hello", "");
    NameComponent path[] = {nc};
    
    Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
    
  5. Usamos las operaciones estándards de Java para leer el fichero que tiene el objero referencia. Observamos que los programas cliente y servidor deben conocer el nombre del fichero y donde está almacenado:
     
    String filename = System.getProperty("user.home") + 
            System.getProperty("file.separator") + "HelloIOR";
    FileInputStream fis = new FileInputStream(filename);
    DataInputStream dis = new DataInputStream(fis);
    String ior = dis.readLine();
    
  6. La aplicación HelloStringifiedClient ahora tiene un objeto String que contiene el objeto referencia stringified.

Convertir el Objeto Referencia

Para convertir el objeto referencia en ior, llamamos al método estándard del ORB:
 
org.omg.CORBA.Object obj = orb.string_to_object(ior);
Finalmente, apuntamos el objeto CORBA hacia su propio tipo, para que el cliente pueda invocarlo:
 
Hello helloRef = HelloHelper.narrow(obj);
El resto del código del cliente permanece igual.

Compiliar un Hello World con Stringified

Para compilar Hello World:
  1. Compilamos el código fuente:
     
    javac *.java
    
  2. Corregimos cualquier error que hubiera en los ficheros y compilamos si fuera necesario.
  3. Deberiamos ver HelloStringifiedServer.class, HelloServant.class, y HelloStringifiedClient.class en nuestro directorio.

Ejecutar un Hello World con Stringified

Para asegurarnos que estamos ejecutando nuestro propio servidor, chequeamos que todos lo procesos del servidor Hello y del servicio de nombres se han parado. Y los paramos si están en ejecución.
  1. Arrancamos el servidor Hello:
    java HelloStringifiedServer -ORBInitialPort 1050
    
  2. Ejecutamos la aplicación Hello desde otra ventana:
    java HelloStringifiedClient -ORBInitialPort 1050
    
  3. El cliente imprime el string desde el servidor a la línea de comandos:
    Hello world!!
    
Recuerda parar el proceso HelloStringifiedServer después de que la aplicación cliente retorne de forma satisfactoria.

Ozito