martes, 22 de julio de 2008

¡¡¡Proyecto Leído!!! (y clausura)

Finalmente, el miércoles 16 de julio, a las 5 de la tarde leí mi proyecto fin de carrera. La lectura se llevó a cabo en el salón de actos de la EUITIO, con algo de público y sin nada especialmente digno de mención, aparte de la calificación alcanzada que fue de sobresaliente.
En cuanto al proyecto, finalmente se desarrolló utilizando el motor wiki Screw Turn Wiki, principalmente gracias a su arquitectura, a su formato y al hecho de que dispongo de más experiencia con aplicaciones .NET que J2EE (el otro candidato principal era JSPWiki).
Puede que en algún momento futuro haga más referencias al proyecto pero por ahora esto es todo.
Dejo un resumen para que quede constancia de en qué consistió el proyecto finalmente:
El presente proyecto consistió, como su nombre indica, en el Análisis y mejora de la
Arquitectura Software para Wikis. En cuanto al análisis, se estudiaron más de 100
motores wiki de código abierto con el objetivo de encontrar, por un lado, la arquitectura
más indicada para un motor wiki y, por otro, determinar cuál de ellos es más indicado
para utilizar en el desarrollo del presente proyecto. Éste resultó ser ScrewTurn Wiki, un
wiki desarrollado en ASP .NET/C#, principalmente por la arquitectura seguida en su
desarrollo. En cuanto a la mejora, se propusieron e implementaron varios cambios para
conseguirla, mediante el uso de patrones de diseño, de tal manera que la arquitectura
fuese más flexible.
Por otro lado, con el objetivo de aumentar la utilidad de un wiki, se dotó al motor wiki
seleccionado de acceso programático mediante servicios web, de tal manera que la
funcionalidad principal del mismo, como la creación de nuevas páginas, su asignación a
categorías o su consulta, no sólo puede llevarse a cabo con un navegador sino mediante
cualquier otro programa que lo desee.
El resultado obtenido es un wiki capaz de adaptarse a más contextos y de integrarse
fácilmente con otras aplicaciones. Además, en caso de ser necesaria una modificación
del mismo para adaptarlo a unos requisitos concretos, podría llevarse a cabo de manera
relativamente sencilla gracias a la flexibilidad de la arquitectura.

Por último, mediante estas líneas dejo clausurado el blog (al menos en principio). Si alguien tiene interés en algún aspecto puede dejar un comentario y trataré de responder a la mayor brevedad posible.

sábado, 26 de enero de 2008

Análisis

Aunque no sé durante cuanto tiempo podré seguir actualizando el blog con contenidos del PFC, pero como aún puedo, pues a ello.
Voy a incluir unos diagramas de casos de uso. Por supuesto, en mi proyecto, he refinado mucho más el análisis con descripciones y escenarios, pero por el momento me lo reservo.
Los diagramas incluidos no son todos, sino sólo la parte que describe genéricamente el funcionamiento de un wiki.


















































Como es lógico el diagrama más interesante es el de artículos, dado que se ocupa de los aspectos más característicos de un wiki.
Por el momento esto es todo. Ahora ¡a por el diseño!

domingo, 6 de enero de 2008

Breve estudio del resto de wikis candidatos

Dado que el orden no tiene mayor importancia, seguiremos orden alfabético para analizar los otros wikis.

Bitweaver


A pesar de haber buscado con ahínco, no he conseguido encontrar un solo diagrama que me permita acercarme al diseño de este wiki. Lo más aproximado es la documentación realizada con Doxygen, en la que se pueden ver pequeños fragmentos de diagrama indicando las relaciones de herencia de cada clase (es decir, para cada clase puede verse su padre, como se ve en la siguiente figura).

























También se puede obtener un diagrama completo de herencia haciendo click en la clase BitBase que es a Bitweaver lo que Object es a Java, pero, además de no ser muy práctico ni manejable por su formato, no aporta toda la información relevante, sino sólo las relaciones de herencia.
Por otro lado, como indiqué en otra entrada, parte del wiki está escrito siguiendo el paradigma estructurado, por lo que esta ausencia de diagramas de clases resulta bastante lógica (sobre todo teniendo en cuenta que algunas de las partes que están así desarrolladas son de gran importancia, como lo relacionado con los ficheros de la carpeta users).
En resumen, para poder averiguar algo acerca del diseño de este wiki haría falta estudiar el código fuente, bien "a mano", bien con una herramienta que lo realice de manera automática, y saber algo de dicho diseño es imprescindible para poder estudiar y entender cómo resolvieron los autores los problemas más frecuentes de desarrollo de wikis para su caso particular.


Daisy Wiki


Como ya se comentó en entradas anteriores, el aspecto más original de este wiki es el modo en que accede a la información del repositorio, a través de servicios web. Por eso, si quisiéramos emular algo similar en el caso de JSPWiki, sería necesario cambiar por completo el modelo, así como sus comunicaciones con la vista y el controlador.
Otro aspecto interesante de este wiki es que puede albergar diferentes versiones de un mismo documento. De este modo, sin necesidad de crear un nuevo documento, podría haber diferentes puntos de vista sobre el mismo, o el propio artículo podría estar editado en varios idiomas,... Todo este tema está actualmente en boga debido al próximo lanzamiento de Google: Knol, una especie de wiki para competir con Wikipedia y una de cuyas ventajas más valoradas es ésta. Todo esto, probablemente haga que muchos de los wikis que son objeto de este estudio modifiquen su funcionamiento para incorporar esta característica. Volviendo a lo que nos ocupa, integrar este aspecto con JSPWiki puede ser algo muy trabajoso, ya que los cambios a realizar afectarían a partes de todas las capas.
Para finalizar, pese a haber buscado durante varias horas en distintos servidores, el diagrama más interesante que encontré fue el siguiente que, realmente, no es que aporte mucho, puesto que representa sólo una pequeña parte de la arquitectura.

















Por último, añadir que sería posible obtener un sucedáneo de diseño mediante herramientas, pero que no creo que sea la mejor opción para tener que trabajar sobre el diseño.

XWiki


Como se vio en entradas anteriores, se trata de un wiki muy interesante. Además, el servidor de documentación ya ha sido actualizado y contiene abundante documentación para desarrolladores, aunque, en la mayor parte de los casos, resulta bastante mejorable, como veremos más tarde.
Empecemos con un vistazo general a la arquitectura:















En este diagrama de la arquitectura a nivel global se pueden observar las distintas partes que componen el wiki: el motor del wiki (XWikiEngine), el almacén de información (Store), los documentos que se componen a partir de dicha información (XWikiDocument), el API que accede a los documentos (XWikiAPI, en el grupo Rendering), los aspectos visuales (Rendering) y todo lo relacionado con usuarios y su autenticación (Authentication & User Rights). También se pueden ver las relaciones entre estas partes, como por ejemplo los documentos que acceden al almacén para obtener la información y a su vez son accedidos por el motor y la API, pudiendo ser modificados sólo por el primero,... Para más detalles, obsérvese el diagrama.
Vayamos ahora más al detalle. Los desarrolladores de XWiki nos ofrecen diagramas de clases de varios de los módulos. Veamos algunos.
Empecemos por la API. A continuación podemos ver el diagrama de clases:


















Lo primero que llama la atención de este diagrama es la clase API, situada en el centro y de la cual heredan directamente las clases más importantes como XWiki, Document, User, Context y Element. Por otro lado se observa también la importancia de la clase Collection, de la cual heredan varias como Class, PropertyClass y object.
Continuemos ahora con el módulo XML-RPC, que se ocupa de las llamadas a procedimientos remotos:
















En este caso, existen relaciones con clases de paquetes externos, que vienen en color azul y el diagrama no está tan centralizado como el anterior sino que es más complejo, por lo que remito al diagrama para más detalles.
El diagrama del módulo de documentos no resulta especialmente interesante (a alto nivel) pues apenas se indica relación alguna sirviendo principalmente para ver los métodos y propiedades de las clases XWikiDocument, XWikiAttachment, ... Por resultar poco útil en este momento lo omito.
Seguiremos con el módulo Store, que sirve para el almacenamiento de información como su propio nombre indica:
















En este caso, se trata de unas interfaces situadas en el centro del diagrama, una de almacenamiento y otra de caché, que son implementadas por el almacén por defecto (XWikiDefaultStore) y por XWikiCache respectivamente. A su vez, las clases XWikiRCSFileStore y XWikiHibernateStore heredan de la citada XWikiDefaultStore.
También nos proveen los desarrolladores de XWiki de un diagrama de clases del módulo Rendering y User and Rights que, según indican no están actualizados por lo que, por ahora, serán obviados, aunque pueden ser consultados en cualquier momento.
Pasemos al diagrama del módulo objetos:


















Este diagrama me parece bastante claro: de la interfaz ElementInterface derivan PropertyInterface y ObjectInterface, que son implementadas por BaseProperty y BaseObject respectivamente. Por otro lado, del resto del diagrama parece desprenderse que se serializarán objetos de clases propiedad y objeto (es un tanto extraño, pero viendo el diagrama se entiende bien).
Sigamos con el módulo de clases:














Lo primero que destaca de este diagrama es el hecho de incluir 2 interfaces y una clase del anterior módulo: ObjectInterface, PropertyInterface y BaseCollection respectivamente. A partir de ellas y de otras del propio paquete, surgen las distintas clases que se podrán almacenar luego en la base de datos.
Y para terminar, el módulo de MetaClasses:















De nuevo podemos hablar de una interfaz y una clase externas al paquete a partir de las cuales y otras más propias del paquete, se derivan/implementan los distintos tipos de metaclases que contempla XWiki.


Conclusiones


Teniendo en cuenta lo anterior, podemos concluir que los únicos wikis que están documentados suficientemente como para poder extraer algo de información sin necesidad de recurrir al código fuente son XWiki y JSPWiki.
Por otro lado, cabe destacar también las ideas extraídas de DaisyWiki de separar el repositorio y hacer accesible a través de servicios web de tal manera que incluso el propio wiki acceda a la información de esta manera y, además, que puedan existir diversas versiones de cada artículo y no un sólo punto de vista o un solo lenguaje.
Para finalizar, decir que a partir de ahora es necesario replantearse el diseño del wiki elegido (utilizando patrones de diseño) para poder continuar.
¡Hasta la próxima entrada!

jueves, 3 de enero de 2008

Breve estudio del diseño de JSPWiki

JSPWiki tiene una sección de la documentación para desarrolladores específicamente dedicada al diseño. En esa página es donde se explica la estructura general, que es el ya citado patrón MVC. A continuación traduciré de la mejor manera posible lo que se dice sobre el tema en la página:

Estructura



JSPWiki sigue el paradigma Modelo-Vista-Controlador:

Modelo

Está manejado por la clase WikiEngine (motor wiki) y sus clases subsidiarias. A través del uso de diferentes objetos Gestores, maneja el almacenamiento de páginas (ver Proveedores de páginas), etc...

Vista

Es manejada a través de varias páginas JSP, que son almacenadas en el directorio templates/ (plantillas/). Normalmente JSPWiki usa la plantilla por defecto, pero es posible cambiarla al realizar el despliegue.


Controlador

Se maneja a través de varias páginas JSP personalizadas (Wiki.jsp, Edit.jsp, etc) que se encuentran en el directorio raíz. A diferencia de la mayor parte de frameworks (marcos) de aplicaciones, JSPWiki utiliza páginas JSP en lugar de servlets como el principal punto de entrada, debido a dos razones:

1.- Las páginas JSP permiten mayor flexibilidad: se puede cambiar la funcionalidad, los parámetros, etc... de tu instalación de JSPWiki muy fácilmente, sin tener que recompilarlo.
2.- Las páginas JSP son servlets. Es decir, se está ejecutando un sistema basado en servlets.

En mi opinión está bastante clara la estructura: el modelo almacena, la vista genera la página final, lo que ve el usuario y el controlador se encarga de llevar a cabo las acciones que le solicita el usuario (bueno, esto no es una sorpresa, en realidad es un resumen del patrón).
Por otro lado, hay 4 archivos ajuntos a la página que nos ayudarán a entrar un poco más a fondo en el diseño, aunque dada su antigüedad no hay muchas garantías de que sigan siendo del todo válidos. Estos archivos son: un diagrama con las clases más importantes y sus relaciones en pdf, un diagrama de clases, un diagrama de secuencia y un archivo jsp con una tabla en la que supone deberían listarse todos los archivos.
Aquí podemos ver el diagrama de clases:










Lo primero que llama la atención de este diagrama es la gran cantidad de relaciones que tienen las clases WikiEngine y WikiTagBase, tratándose en el primer caso de asociaciones y en el segundo de herencias (como su propio nombre indica, WikiTagBase es la clase base para etiquetas). Como se decía en la descripción general, la clase WikiEngine y sus clases subsidiarias de lo que se encargan es del modelo, dentro del patrón MVC.
Por su lado, la clase WikiTagBase y sus clases herederas se ocupan de generar las etiquetas html de la página que se presentarán al usuario, dicho de otra manera a la vista.
Ahora veamos el diagrama de secuencia:



Opino que resulta bastante claro. Se puede observar cómo, parte por parte, se va componiendo la respuesta html para ser finalmente enviada. Variables, link RSS, menús, etc, etc...
Y creo que hasta aquí ya es suficiente por hoy. Posteriormente realizaré un somero estudio del resto de wikis que se limitará a lo que de la documentación pueda extraer. A continuación comenzaré el proceso de aplicación de patrones de diseño.
¡Hasta la siguiente entrada!