Espero que te vaya bien con los exámenes. No he mirado muy detenidamente las librerías xD, pero he vista una cosa
para comentarla.
En la clase Body (del paquete protocol creo) por como está estructurado tal vez sea útil usar un tabla hash
(java.util ya tiene una), tal vez eso ahorre o ayude la implementación.
Solo esa idea, saludos!!
Primero: para tener algo testeable sólo faltan implementar algunos
métodos y la estructura del SocketListener, encargada de procesar las
respuestas y ejecutar las llamadas de aviso. Luego hay que implementar
todo ConnectionProperties
La idea es que uno instancia un nuevo Messenger, luego le carga todos
los listeners y lo invoca en su propio thread. Para agregar un
listener, la clase que contiene los métodos que van a manejar un
suceso deben implementar CommEventHandler, que son los métodos a los
que el Observer llama. Los métodos (hasta ahora) son: newMessage,
messengerShutdown, serverDied y assignedProperties, y cada uno es
llamado cuando llega un mensaje.
¿Para qué está cada uno?
void newMessage(Message message): pasa el mensaje P2P que le llegó al
Messenger. Nunca te llegan los mensajes de sistema, sólo los de
plugin-a-lista o plugin-a-plugin (cuando se recibe no se puede
diferenciarlos). ;)
void messengerShutdown(): cuando se llama el proceso de apagado, el
Messenger envía el requisito al servidor, que luego de aceptarlo le
responde, lo saca de la lista y corta todas las conexiones. Esto sirve
para apagar el programa de una forma ordenada.
void serverDied(): lo mismo que el anterior, pero el servidor no
responde o lanza una excepción. La idea es que de este modo se capture
el error de una manera limpia.
ConnectionProperties assignedProperties(ConnectionProperties props):
una vez conectado llama a este método. Debería devolver el nombre del
plugin con el que fue registrado, los servicios actuales y el
directorio de usuarios. Para actualizar los datos se envía un mensaje
con el método factoría "updateList" de ConnectionProperties.
Hay un "enforcing bug". El Messenger no considera como erróneo que se
manden mensajes de sistema desde fuera del generador. En realidad
nadie va a tocar eso, pero por las dudas debería implementarse.
Al final esto resultó mucho más complejo que implementar D-Bus... Pero
el 90% de lo que estoy usando lo aprendí ahora, y con D-Bus no lo
hubiese visto jamás.
Creo que el Proyecto Rolgps está creciendo por sobre los límites que
habíamos planeado. Eso es bueno, al menos si tenemos en cuenta el
avance que logramos y la forma en que se resolvieron los problemas.
Por una parte, encontré que el mayor problema está en empezar desde
atrás: librolgps no debería existir como tal y tampoco debería
llamarse así, mientras que libTransportLink es una pieza fundamental
del IPC a pesar de ser la librería... Porque es necesaria tanto por el
cliente como el servidor (define un estándar en el parser, mensaje y
un par de datos más).
Creo que luego de esto me concentraré en libedb, aunque ya mismo es
utilizable. Lo que falta allí es terminar el Manager y el
QueryBuilder, que son métodos "ayudantes".