Crear plugins para Openfire

Buenas, probablemente si has llegado hasta aquí es porque sabes qué es Openfire y te interesa saber hacer un plugin. Si no, explico brevemente qué es.

Openfire es un servidor XMPP. El protocolo XMPP es por ejemplo el que usa google para Gtalk. Seguro que con esta información supones para lo que sirve. Sí, Openfire es un servidor de mensajería instántanea libre y que usa un protocolo libre.

De serie openfire trae una herramienta muy potente, que es la consola de administración. Desde ella puedes gestionar absolutamente todo y además de manera visual (se llama consola pero es una interfaz web). Bien, para hacer cosas a mano esta interfaz web está muy bien pero cuando queremos hacer cosas desde una aplicación externa lo más correcto es mediante plugins. También se podría con curl ir navegando por la página pero, creéme, sería una chapuza que no da más que problemas y te lo digo por experiencia 😛Si nuestra aplicación es java, podemos usar directamente el API pero resulta que yo programo las páginas web en PHP. Openfire está hecho en java así que la solución es enviar peticiones al servidor a traves de una conexion http. Un plugin de Openfire recibirá esas peticiones y hará cosas al respecto.

Para comprender fácilmente cómo funcionan estos plugins os pongo mi ejemplo.
En mi página los usuarios pueden hablar entre ellos mediante un chat y un usuario sólo puede hablar con sus amigos. Cuando en la página web dos usuarios se hacen amigos se envía una petición al servidor XMPP para que añada como contactos a los usuarios en sendas cuentas. En mi caso, cuando se hacen amigos se envía una petición del tipo “http://servidor.com:9090/plugins/rosterManager/rostermanager?type=create&username=usuario&[email protected]&secret=tSLl7i5t”

La petición va al puerto 9090 (es por el que escucha openfire) y el plugin es “rosterManager”. Los parámetros son type, username… esos los he puesto yo porque me ha dado la gana, pueden ser los que tu quieras o necesites. Además el servidor nos responde con los resultados que en mi caso son éxito o no éxito (e indicando el problema) siendo así muy fácil saber si todo ha ido bien.

Después de todo este rollo vamos al tema.

SOFTWARE NECESARIO

  • Necesitamos el código fuente de openfire. No es que vayamos a compilar todo openfire, el motivo es que ahí tienen todo preparadito para compilar y empaquetar los plugins. Lo podemos encontrar aquí http://www.igniterealtime.org/downloads/source.jsp
  • Ant. Está en los repositorios así que con aptitude lo instalas
  • JDK para compilar Java
  • Un plugin de ejemplo (para seguir los pasos y tenerlo como base más que nada) http://wixet.googlecode.com/files/rostermanager.tar.gz

Una vez tengas todo esto desempaqueta el código fuente de openfire, entra en el directorio y ejecuta “ant plugins”. Si todo va bien terminará sin errores. Yo tuve un problema y es que el script comprueba tu versión de ant y yo tenía instalada una más nueva. Hay dos opciones, o modificar el script y añadir nuestra version o instalar una versión más vieja. Yo edité el archivo build.xml y por la línea 226 vemos que comprueba las versiones. Añade una línea exactamente igual pero con tu versión. En mi caso metí esta línea

<contains string=”${ant.version}” substring=”1.8″/>

Los plugins compilados y empaquetados se crearán en target/openfire/plugins. El archivo que se genere en este directorio es el que seleccionaremos desde la consola de administración para instalar el plugin. Por último, nuestro código fuente (el que se compilará) lo tenemos en src/plugins.

Si todo ha ido bien ya tenemos todo lo necesario para ponernos picar código.

CREAR EL PLUGIN

Un plugin de openfire está dividido en dos partes:

  • Servlet: Es la parte web. Nos sirve para comunicarnos con el plugin tanto directamente (como lo hará nuestra aplicación externa) como dentro de la consola de administración. Sí, crearemos un apartado dentro de la consola para configurar el plugin. Si te fijas en la url que dije antes (http://servidor.com:9090/plugins/rosterManager/rostermanager?type=create&username=usuario&[email protected]&secret=tSLl7i5t) está el parámetro secret. Esa variable la uso para que sólo quien conozca esa clave pueda mandar órdenes al plugin. Esta clave (así como otras cosas como activar el plugin, direcciones ip admitidas…) se configura desde la sección que crearemos para la consola.
  • La otra parte es el programa en sí. El código java que hará las tareas de verdad. Es sin duda la parte más divertida. Ahora que no me oye, diré que el servlet es un coñazo pero es necesario.

La estructura de directorios del plugin es algo así:

En este caso el plugin se llama rostermanager (roster es como se le llama a la lista de contactos). En el raíz (rostermanager) sólo hay archivos de información, el icono del plugin y esas cosas. Luego pongo para descargar un ejemplo de plugin para que lo veas, que tardarás menos en verlo y comprenderlo que en leer (y quizá entender) mi explicación.

En el directorio “web” tenemos todo lo relacionado con lo que se mostrará en la sección de la consola. Es simplemente un jsp (como un php pero de java). Aquí pones las tablas y todas las cosas que quieras que se muestren. No olvides configurar el archivo “WEB-INF/web-custom.xml”. La configuración de ese archivo sirve para indicar a qué plugin manda la información el jsp y cosas así. Si es un plugin sencillo (como el mío) la configuración consiste en cambiar “rostermanager” por el nombre de tu plugin todas las veces que aparezca.

Ahora nos vamos a la carpeta “plugin”. Dentro encontramos el archivo “RosterManagerPlugin.java”. Que bien por fin un archivo java, ya podemos programar!. Si, en este archivo es donde está todo el meollo. Consiste en una clase a la que le añades todos los métodos que quieras. En mi caso se llama “RosterManagerPlugin” y si estás usando mi archivo de configuración de antes, tu clase se llamaría TuClasePlugin. Esta clase implementa las clases Plugin y PropertyEventListener y por este motivo tienes que definir ciertas funciones que son para inicializar el plugin y esas cosas. Sólo me queda por decir que aquí puedes usar el API de openfire (http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/javadoc/index.html). Este api tiene toda tipo de clases para hacer todo lo que quieras con el servidor xmpp.

Por último vamos al directorio rosterManager (que en tu caso será el nombre de tu plugin) dentro del directorio plugin. En él vemos RosterManagerServlet.java que va a ser quien instancie nuestra clase y nos comunique con el exterior. Este archivo recibirá los parametros de las peticiones y las gestionará. En el ejemplo mencionado anteriormente, (http://servidor.com:9090/plugins/rosterManager/rostermanager?type=create&username=usuario&[email protected]&secret=tSLl7i5t”) a este archivo le llegarán los parámetros type, usuario, jid… y hará lo que tenga que hacer con ellos. Vemos que esta clase tiene un método de inicialización donde obtenemos un objeto que no es más que un objeto de la clase que hemos creado antes.

En mi caso, si el “type” es “create” ejecuto “plugin.createRoster(username,jid);”. El método createRoster(username,jid) está definido en el archivo de antes. Tenemos que pensar que esta clase se ejecutará como una página web. Se hace la petición, se procesan los datos, se muestran y termina. Por este motivo es bueno mostrar datos de lo que ha pasado. En mi caso muestro mensajes en formato json informando de si todo ha ido bien o si ha ocurrido algún problema. Por así decirlo, el metodo doGet sería como el main de una aplicación java normal y el archivo donde creamos la otra clase es una biblioteca.

Y esto es todo. Puede parecer complicado y lioso pero es sencillo. Este tipo de plugin es el básico, una vez cojas práctica puedes liar la madeja todo lo que quieras aunque normalmente los plugin hacen “una cosa y punto”. Recueda que no es bueno hacer “algo” que lo haga todo, sino muchas cosas pequeñas que hagan poco pero que lo hagan bien.

Una plantilla de plugin (que puedes usar y modificar) sería esta http://wixet.googlecode.com/files/rostermanager.tar.gz (la misma que he puesto arriba). Ahora te toca investigar por el API de Openfire para saber cómo usar las clases y todas esas cosas.

Se que este manual no es más que unas pequeñas directrices pero espero que te ayude a asentar una base.

Nos vemos!

You may also like...

10 Responses

  1. Manuel dice:

    Muy buena explicación

    ahora a cachurear en la api de openfire para crear mi plugin!!

  2. albeiro gaviria dice:

    hola muy interesante tu blog eres muy bueno, yo estoy pasando por un problema con el openfire este servidor es excelente y lo manejo con spark para el chat me funciona muy bn claro que tengo como 2 dias cachareandolo, es para implementarlo en el trabjo, lo unico que no me gusta es que las conversaciones uno a uno las guarda en el equipo local donde se conecta el usuario y eso hace que los usuarios borren o modifiquen el historial, y eso es lo que no queremos pues si lo modifican o lo pueden borrar muy seguramente van a estar chatenado todo el dia, hay alguna forma de hacer que las conversaciones de uno a uno las guarde en otra ruta, o que queden guardadas en la base de datos del open fire como sucede en las conferfencias, yo cree una confefencia y lo que hablamos en esa conferencia si queda grabado en la base de datos del openfire, eso es lo que queremos hacer que las conversaciones uno a uno se guarden el la base de datos o al menos en otra ruta, en el servidor o en otro pc.

    Alguna sugerencia gracias

  3. Maxpowel dice:

    Existe un plugin que hace eso, puedes encontrarlo en http://www.igniterealtime.org/projects/openfire/plugins.jsp
    Se llama monitoring service.
    Segun dice en la descripción del plugin, puedes guardar las conversaciones en el servidor pero en cuanto a realizar búsquedas y demás está un poco limitado (a menos que cojas la versión de pago).
    De todas formas, siempre puedes modificar ese plugin para que guarde las conversaciones donde y como tu quieras.

    Un saludo

  4. Alejandro dice:

    hola muy interesante tu blog pero me gustaria si me pudieras aclarar una duda estoy usando openfire desde hace algun tiempo tengo habilitada la transferencia de archivos, aunque me gustaria limitar el tamaño de los archivos que ese se envian por esta via o sea que no excedan los 50 mb si me pudieras hacer esta aclaracion estaria agradecido muchas gracias

  5. Jorge dice:

    estoy muy interesado en crear un plugin para openfire, estuve siguiendo los pasos y no me sale igual. Incluso cuando abro el codigo fuente del openfire me da error.
    Ademas haces referencia a una herramienta que utilizas: el ant plugin, por favor si puedes detallarme mas con esto te lo agradeceria.

  6. Anuar dice:

    Muy bueno tu artículo, yo tengo un problema con el openfire que lo uso con el cliente candy, y es que no sé porqué mantiene las conversaciones de sesiones anteriores, incluso de dos días antes, y si entra al chat un usuario nuevo, ve las conversación que se han producido antes de su entrada, totalmente incomprensible ¿no?

  7. Luz Stella Gómez dice:

    Buen día, gracias por tus aportes soy novata en el tema de openfire, por lo que he visto me parece muy buena herramienta, se que no es el tema pero se nota que sabes sobre openfire y me gustaría saber en dónde y cómo puedo agregar mas emoticón o smail para amenizar las conversaciones.
    Muchas gracias de antemano

  8. Juan dice:

    Buen día, quisiera saber si alguien podría ayudarme con la transferencia de archivos en el openfire.
    El problema es que al enviar un archivo en el mensajero instantáneo después de unos segundos ya expira en el caso que no le de acepar y mi duda es si esto puede descargar automáticamente o aumentar el tiempo de espera de la transferencia del archivo.
    Muchas gracias de antemano y disculpas por las molestias ocacionadas.

  9. david colmenares dice:

    muy bueno (y)

  10. Kael dice:

    Buenos dias muy bien post … lo que me gustaria saber es que si tambien pudiste hacer un plugin para el cliente Spark .. quiero aumentar algunas funcionalidades .. Y no se como crear un proyecto pra poder crear mi Plugin

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *