CORBA,BONOBO,C Y JAVA.
Acerca de gnome, bonobo y java. Como dice ariel rios de #gnome-hispano: «las cosas que queria saber de Bonobo/corba y nadie le decia». :) Hay que tener en cuenta que es para quienes han trabajado algo con c, glib,java,corba y bonobo.
INICIO
Pues bien, la situación es:
Usar bonobo/corba/orbit en gnome con c y java.
Para conocer de corba y bonobo en el lenguaje c, no hay problemas, en la red se pueden encontrar buenos tutoriales que ayudan a su comprensión:
http://www.djcbsoftware.nl/projecten/bonobo-controls/bonobo-controls.html
- Nota: Las bibliotecas de desarrollo de bonobo vienen con su distribución de linux.
Antes de seguir soy quien afirma que c es un lenguaje con el cual se pueden hacer objetos. Claro también se puede usar gobject de gnome ;).
Para java/bonobo la documentación es pobre, pero se encuentra mucho sobre java y corba. Oficialmente no hay una implementación(almenos que yo sepa.
) de bonobo sobre java que haya hecho SUN, o por lo menos que tenga publicidad conocida.
Hay algo interesante llamado monkeybeans(2), hecho por varios tipos:
- Bill Haneman.
- Louise Miller.
- Gergõ Érdi.
- Laszlo (Laca) Peter.
- Antonio Xu.
Los monkeysbeans están en soportados por Gnome y áun se pueden acceder desde el cvs de éste con:
anonymous@anoncvs.gnome.org Es verdad que gnome se ha pasado a «suversion» y recientemente a git, pero al parecer no lo han hecho con algunos paquetes. Depués de descargar los archivos, hay que compilarlos e instalarlos en el sistema.Hay que leer el archivo README que viene cuando se obtienen las fuentes. No sobra demás tener encuenta que se necesita el jdk 1.4 o superior, con las bibliotecas de bonobo y los «bindings» de java.
Primero:
- Se podría decir que corba es un sistema(protocolos) diseñado para compartir servicios, objetos y otras cosas en sistemas distribuidos dentro un mismo computador y sistemas en red.
- Orbit es la biblioteca para gnome de corba que cumple con muchas de las especificaciones del protocolo, aunque no todas.
Bononbo es una capa por encima de orbit en gnome, que ayuda al desarrollo de componentes corba, además de dar la capacidad de incrustar aplicaciones gráficas una, dentro de otra. Eso no quiere decir que siempre haya que usar bonobo para corba en gnome, igualmente se puede usar orbit. Bonobo se puede asemejar a la estructura o sistema com/ole de microsoft. El trabajo con bonobo ayuda mucho en el desarrollo de sistemas corba en gnome.
Segundo:
#include <Bonobo.idl>
#include <Bonobo_Unknown.idl>
'
interface programa : Bonobo::Unknown
{
/* --- Es una pequeña función encargada de levantar un programa--*/
/*---específico cuando es llamada la función */
- void ejecuta_programa();
};
- El archivo se llamó servidor_orbit.idl y sobre éste los compiladores IDL generan los nombres de sus respectivos archivos. En el ejemplo se llaman las bibliotecas de soporte para bonobo y se hace un objeto llamado programa que tiene sólo una función, que no retorna valor y se llama: ejecuta_programa().
Tercero:
- Resulta que cada lenguaje de programación tiene su propio compilador corba, que toma el archivo idl y genera los archivos necesarios para ser usados en el lenguaje respectivo.
Gnome ( c/c++ ) tiene su compilador y se llama orbit-idl-2 ,que genera los cabos y esqueltos que corresponden al archivo idl que en este caso se llama servidor_orbit.idl.
- Además entrega el código base para el servidor y el cliente de su servicio.
- De la misma manera java posee su compilador para idl, llamado idlj, que también genera la implementación idl en java con sus cabos y esqueletos y el código para el servidor y el cliente.
- Aquí puede ver un ejemplo de corba con java:
http://java.sun.com/j2se/1.4/docs/guide/idl/jidlExample.html.
- Hay que tener en cuenta que el compilador idlj de java puede poner problemas en algunos archivos *.idl relacionados con bonobo y por tal razón hay que hacerles ajustes a esos archivos. Sí es así, entonces todo los archivos que molestan pueden contener algo por el estilo:
#if !defined(CUALQUIER_COSA) && defined(LA_OTRA_COSA')
Hay que cambiarlo por:
#ifndef 'CUALQUIER_COSA
#ifdef LA_OTRA_COSA
- ..
- ..
- #endif
#endif *
(*)Acuérdese de agregarle sus respectivos #endif
Cuarto:
- Depués de haber generado los archivos *.c y *.java de acuerdo a su *.idl (para el caso servidor_orbit.idl). Se procede a escribir el código necesario para implementar el servicio deseado en cada lenguaje.
Como deseo que el servidor sea escrito en c, entonces edito el archivo: servidor_orbit-sklimpl.c y en la parte donde aparece el comentario:
/*
insert method code here
- */
- . Entonces se escribe lo siguiente:
- . char* arg[2];
system("/usr/bin/gnumeric"); //si quiere hacerlo sólo c
arg[0]="/usr/bin/gnumeric"; //si quiere hacerlo modo gnome.
- arg[1]=NULL;
- g_spawn_async_with_pipes(NULL,arg,NULL,G_SPAWN_STDERR_TO_DEV_NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); '
- Luego lo compila...
Quinto:
- En el archivo principal de c , se escribe el servidor bonobo:
- int main (int argc, char* argv[])
- {
PortableServer_POA poa; programa objref; CORBA_Environment ev; CORBA_ORB orb;
char* ior; /*--- El archivo ---
- FILE *file = NULL;
CORBA_exception_init (&ev); orb = bonobo_activation_init (argc, argv);
poa = (PortableServer_POA) CORBA_ORB_resolve_initial_references ( orb, "RootPOA", &ev );
PortableServer_POAManager_activate (PortableServer_POAget_the_POAManager ( poa, &ev ), &ev);
objref=impl_programacreate(poa,&ev);
if (objref == CORBA_OBJECT_NIL|| ev._major!=CORBA_NO_EXCEPTION)
{
printf ( "no se pudo obtener el objref\n" );
return 1;
}
bonobo_activation_active_server_register("OAFIID:programa:63eeb14f-7608-47af-b49f-3639f9198bdc",objref);
ior = CORBA_ORB_object_to_string(bonobo_activation_orb_get(),objref,&ev);
if ((file=fopen("/home/usuario_pepe/programa.ref", "w"))==NULL)
g_error (" no se pudo abrir programa.ref\n" );
fprintf (file, "%s\n",ior);
fflush (file); fclose (file);
while (1)
g_main_iteration (TRUE);
} Luego se compila y se depura.
Sexto:
- Al terminar, ha de crear un archivo llamado programa.server y guardándolo en /usr/lib/bonobo/servers/, En ése archivo se escriben sentencias xml donde se le dice al sistema bonobo que servidores, objetos pueden estar en el sistema.
- En gnome hay que hacer el *.server,en él ,están los parámetros con que se registra en el sistema. Cuando se usa activation-client como función para buscar el componente bonobo que se necesita, entonces ha de tener un identificador único. El identificador único se pone dentro de los atributos del archivo .server
. <oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:Bonobo/GenericFactory:1.0"/>
--> el importante---> <item value="IDL:programa/prueba/bonobo:0.1"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
- Conociendo ése identificador se puede llamar el objeto por medio activation-client. (de acuerdo al atributo :"repo_ids".).
Séprimo:
- Programa en java, encargado de llamar el servicio.
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
- import org.omg.CORBA.*;
- import org.GNOME.Bonobo.*;
- import org.GNOME.Bonobo.Activation.*; //Monkeybeans
- //programaHelper es generado por el idlj.
- public class primero extends programaHelper
- {
- static programa helloImpl; //programa generado por idlj
static ActivationUtil activa; //monkeybeans
- public static void main(String args[])
- {
activa= new ActivationUtil();
- // hace e inicializa el ORB
- ORB orb = ORB.init(args, null); // El nombre de referencia bonobo del servidor.
String name = "IDL:programa/prueba/bonobo:0.1";
- /*Obtiene el objecto objRef dircetamente , tener que pasarlo de cadena a objeto*/
- //es una función de monkey beans.
- org.omg.CORBA.Object objRef = activa.activationObjectReference(name); helloImpl=(programa)objRef; // cambio de tipo.
- System.out.println("el objeto: " + objRef);
System.out.println(el objeto
: " + helloImpl);
- helloImpl.ejecuta_programa();
- }
- catch (Exception e)
- {
- System.out.println("ERROR : " + e) ; e.printStackTrace(System.out);
- }
- }
- }
- static programa helloImpl; //programa generado por idlj
Después de compilar, ejecuta el servidor en c, el cliente de java y tendrá a gnumeric en su pantalla.
- Escrito por:
- Made by: Exell Enrique Franklin Jiménez.