Archivos para Marzo 2008

31
Mar
08

Versión funcional

Hace un par de días que esta subida un versión funcional.

Las búsquedas las puede realizar utilizando un plugin que trabaja contra el motor de búsqueda de yahoo, o bien utilizando un plugin de pruebas que solo devuelve 10 resultados de forma estatica.

Aparte, la clasificación, se realiza con un plugin que tarda un tiempo aleatorio, permitiendo probar los hilos y demás. Ahora, me voy a poner a comenzar la documentación, y a hacer un pequeño plugin de prueba que sea para mejorar la clasificación sobre el tema de las letras de canciones.

Por otra parte, si saco algo de tiempo, me gustaría hacer otro plugin que me permita realizar una búsqueda local, es decir, sobre los archivos en la maquina sobre la que corre el propio server, demostrando de este modo la versatilidad y potencia que puede brindar la modularización y los plugins, que era uno de mis principales ideales.

Un saludo

13
Mar
08

Actualizado Manager de Plugins

He actualizado el Manager de Plugins, cambiando el sistema de loggers por el de log4j, por que después de utilzar el Logger standard de Java, no lo lograba configurar como quería. Por este motivo lo he cambiado y configurado, configurando despues el TestPluginManager.

Un saludo

12
Mar
08

Subidas nuevas versiones de los componentes

Antes de ayer subí las nuevas versiones de los componentes, el mas importante es el manager de plugins, el cual me ha dado muchísimos quebraderos de cabeza, pero finalmente lo tengo funcionando sobre Spring.
Me gustaría comentar el principal y mas paranoico error que he tenido, por que no hay referencias en inet, o yo no las he encontrado (es un fallo muy raro, asi que supongo que será normal que no encontrara nada al respecto), y para solucionarlo he tenido que empaparme bien del funcionamiento de Java. (No hay mal que por bien no venga)
No tenia errores, el fallo era en tiempo de ejecución, y lo que ocurria era que me daba un ClassCastingException debido a que intentaba usar una clase mediante su interfaz, pero habiendo instanciado dicha clase dinamicamente. El problema tenia su base en que la Interfaz era instanciada por un ClassLoader distinto del que usaba para instanciar la Clase.
Y para mas locura, este fallo solo sale a la luz cuando el manager no lo instancio yo, si no que lo instancia Spring y por IoC me lo inyecta a mi clase.
Esto bien pensado, ahora que se la solicion, parece evidente.
Finalmente solucione el problema (me ha costado meses, abandonandolo por imposible y retomandolo varias veces), haciendo que la Clase (en este caso del plugin) la instancie el mismo ClassLoader que me habia instanciado la Interfaz. Esto lo hago con la linea:
ClassLoader cargador = new URLClassLoader(getJarsDeDependencias(), this.getClass().getClassLoader());
Que la ejecuta el archivo PluginManager.java.
De este modo utilizare como ClassLoader el mismo que me haya instanciado el Manager de Plugins (el que haya utilizado Spring), y luego podre realizar correctamente el casting.

Anteriormente, el utilizaba un nuevo ClassLoader con el codigo:
ClassLoader.getSystemClassLoader()

Lo cual provocaba la incompatibilidad de ClassLoaders que he comentado.

Lo dicho, el manager de plugins esta subido y funcionando ! ! ! ;-)

10
Mar
08

Renaciendo de las cenizas

De nuevo a la carga, después de dejar esto muy parado por los examenes y el trabajo (desconocía que trabajar y estudiar fuera tan dificil), voy a volver a retomarlo donde lo deje.

Todo quedo parado en un problema que no era capaz de resolver. El problema radicaba en el pluginManager, por un defecto de concepto, llegando a ser una limitacion tan importante que me planteé la posibilidad de que no fuera un subproyecto independiente, sino incluir ese código dentro de la lógica de negocio propia de la aplicación.
Desde el principio he intentado que todo el código sea lo más reutilizable posible, y por ello quería que el proyecto se dividiese en subproyectos independientes.

El problema del pluginManager (ahora se llama ManagerPlugin) era la instanciación del plugin, en ese punto todo se desvarataba, por que no lograba instanciar el objeto conociendo sólo la interfaz que implementaba. Ademas ha sido complicado por que los errores que obtenia daban muy poca información y no tenian nada que ver con la verdadera raíz del problema.

La solución, ha sido “la tipificación”, sí, eso que utilizamos ahora para decirle a un objeto “List” que clase de objetos va a contener, y que a los novatos les parece inutil y absurdo.

Con la tipificación podemos crear un manager de plugins diciendole previamente que tipo de objetos va a instanciar, y ello nos ayudara a que luego pueda devolvernos los objetos ya instanciados, de tal manera que nosotros nos olvidamos de toda esa parafernalia, y simplemente nos limitamos a usarlo según indique su interfaz (la del plugin).

Yo tenia mucho interes en que este subproyecto se mantuviera independiente del proyecto completo por que estoy seguro que puede serle muy útil a mucha gente, que estarán interesados en añadir la funcionalidad de soporte de plugins a sus aplicaciones

He de subir los ultimos cambios que he hecho este finde semana, mañana Martes los pondre. Ahora quiero ver si logro organizar un poco todo lo que tengo, que es una locura, por si alguien se anima a probarlo.
Un saludo