SERVIDOR PUBLISH/SUBSCRIBE

Anuncio
Raúl Llorach Sánchez
Ingeniería Técnica en Informática de Gestión
Director del proyecto:
Pedro García López
Escola Tècnica Superior d’Enginyeria (ETSE)
Universidad Rovira i Virgili (URV)
[SERVIDOR PUBLISH/SUBSCRIBE]
Proyecto Final de Carrera
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Índice
1.- INTRODUCCIÓN ................................................................................................... 1
1.1 – Objetivos del proyecto ..........................................................................................4
2.- ANTECEDENTES ................................................................................................... 5
2.1 – Sistema publish/subscribe ....................................................................................5
2.1.1 – Filtrado de mensajes ......................................................................................5
2.1.2 – Topologías ......................................................................................................6
2.1.3 – Ventajas ..........................................................................................................7
2.1.4 – Desventajas ....................................................................................................8
2.2 – Arquitecturas REST ................................................................................................9
2.2.1 – Recursos .......................................................................................................10
2.3 – Protocolos XML-RPC............................................................................................11
2.4 – Tecnología AJAX ..................................................................................................12
2.5 – Java Server Pages (JSP) ........................................................................................14
2.5.1 – Arquitectura de los JSP .................................................................................16
2.6 – Sindicación web...................................................................................................17
2.6.1 – Agregador .....................................................................................................18
2.6.2 – Variedades....................................................................................................19
2.7 – Formato RSS ........................................................................................................20
2.8 – Formato RDF .......................................................................................................21
2.9 – El Lenguaje HTML ................................................................................................22
2.10 – Google Gadgets .................................................................................................24
3.- ANÁLISIS ........................................................................................................... 25
4.- DISEÑO.............................................................................................................. 28
4.1 – Diseño de la base de datos .................................................................................28
4.2 – Estructura de la aplicación web ..........................................................................30
4.2.1 – ServletREG.java ............................................................................................31
4.2.2 – ServletRPC.java.............................................................................................32
4.2.3 – ServletREST.java ...........................................................................................32
4.3 – Métodos de la aplicación ....................................................................................34
4.3.1 – Methods.java................................................................................................34
4.4 – Gadgets implementados .....................................................................................39
2
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
4.5 – Interfaz de usuario ..............................................................................................42
4.6 – Metodología de desarrollo..................................................................................45
5.- RESULTADOS ..................................................................................................... 46
6.- CONCLUSIÓN ..................................................................................................... 48
7.- TRABAJO FUTURO ............................................................................................. 49
8.- RECURSOS UTILIZADOS ...................................................................................... 50
3
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
1.- INTRODUCCIÓN
Una aplicación web es un sistema informático que los usuarios utilizan
accediendo a un servidor web a través de Internet o de una intranet. Las aplicaciones
web son populares debido a la practicidad del navegador web como cliente ligero. La
facilidad para actualizar y mantener aplicaciones web sin distribuir e instalar software
en miles de potenciales clientes es otra razón de su popularidad. Aplicaciones como los
webmails, wikis, weblogs y tiendas en línea son ejemplos bien conocidos de
aplicaciones web.
En los primeros tiempos de la computación cliente-servidor, cada aplicación tenía su
propio programa cliente y su interfaz de usuario, estos tenían que ser instalados
separadamente en cada estación de trabajo de los usuarios. Una mejora al servidor,
como parte de la aplicación, requería típicamente una mejora de los clientes instalados
en cada una de las estaciones de trabajo, añadiendo un costo de soporte técnico y
disminuyendo la eficiencia del personal.
En contraste, las aplicaciones web generan dinámicamente una serie de páginas en un
formato estándar, soportado por navegadores web comunes como HTML o XHTML. Se
utilizan lenguajes interpretados del lado del cliente, tales como JavaScript, para añadir
elementos dinámicos a la interfaz de usuario. Generalmente cada página web
individual es enviada al cliente como un documento estático, pero la secuencia de
páginas provee de una experiencia interactiva.
Las interfaces web tienen ciertas limitaciones en la funcionalidad del cliente. Métodos
comunes en las aplicaciones de escritorio como dibujar en la pantalla o arrastrar-ysoltar no están soportadas por las tecnologías web estándar. Los desarrolladores web
comúnmente utilizan lenguajes interpretados del lado del cliente para añadir más
funcionalidad, especialmente para crear una experiencia interactiva que no requiera
recargar la página cada vez (cosa que suele molestar a los usuarios). Recientemente se
han desarrollado tecnologías para coordinar estos lenguajes con tecnologías del lado
del servidor. AJAX, es una técnica de desarrollo web que usa una combinación de
varias tecnologías.
Así pues, la creación de aplicaciones web actuales requiere un amplio dominio de
muchas técnicas de programación y en muchas ocasiones usuarios o programadores
carecen de ese dominio. Concretamente me refiero a ese tipo de aplicaciones que más
popularidad están cogiendo en la red. Las aplicaciones publish/subscribe.
Una aplicación publish/subscribe es aquella en la que un servidor da una serie de
servicios, a los usuarios, para gestionar, almacenar y presentar todo tipo de
información, y otros usuarios se suscriben a ella para ser avisados de nuevas
actualizaciones o informaciones.
4
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Así pues, cuando a un técnico se le plantea hacer una aplicación web personalizada,
basada en un sistema publish/subscribe, se va a encontrar, en gran medida con
muchas dificultades que ya están resueltas. Es decir, que si quisiéramos crear un foro,
o un web-chat, o cualquiera de este tipo de aplicaciones web, en todas ellas
tendríamos que repetir un mismo patrón de programación. Por tanto si hubiera alguna
manera de poder utilizar un soporte auxiliar para paliar esos problemas, los técnicos
podrían dedicarse mucho más tiempo en el producto final. Que es su propia aplicación,
teniendo, en gran parte, todo su mecanismo implementado por esa herramienta
auxiliar.
1.1 Objetivos del proyecto
Este proyecto ofrece, a los programadores de aplicaciones web basadas en sistemas
publish/subscribe, un software auxiliar (middleware) que a partir del cual, les ayude a
crear sus propias aplicaciones y gestionarlas. Que pueden ser desde blogs, foros,
canales de noticias hasta chats en tiempo real. En definitiva se quiere diseñar un
servidor que gestione y almacene canales y eventos. Cada canal podrá ser dedicado a
una temática diferente que escogerá el propio usuario, y dentro de cada canal habrá
los distintos eventos que lo formen. Estos eventos al mismo tiempo podrán ser de
publicadores o bien de otros canales, ya que también se permite la sindicación entre
canales o servidores mediante RSS o RDF.
En principio se pretende que el registro al servidor y la creación de canales y eventos
sea libre, pero se ha dado la posibilidad de poder crear canales privados y dar
privilegios solo a ciertos usuarios para poder compartir e enviar eventos a dicho canal.
También se ha proporcionado un api rígida para que ya sea, en segundo plano (vía
REST o vía XML-RPC) o en interfaz gráfica (el mismo servidor presenta una interfaz web
que ofrece las mismas funciones pero con formularios etc.), podamos comunicarnos
con el servidor. Esto sería la base del servidor en sí, que se conseguiría programando
servlets en JAVA y utilizando páginas web JSP de JAVA. También hemos optado por
aplicar en algunas funcionalidades tecnologías AJAX, que nos permiten una rápida
respuesta entre el cliente y el servidor.
Con este planteamiento ya damos un gran avance a los futuros programadores que lo
usen ya que se desprenderán totalmente del diseño de la base de datos y se
despreocuparan de donde y como se guardan sus canales y eventos, ya que todo eso
irá a cargo del middleware desarrollado. En conclusión, se pretende realizar un
middleware que proporcione servicios a los programadores para crear sus propias
aplicaciones web publish/subscribe y gestionar dichas aplicaciones, desprendiéndose
así de gran trabajo e invirtiendo su tiempo en el verdadero objetivo de su proyecto,
diseñar su blog, su web personal etc.
5
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
2.- ANTECEDENTES.
2.1 Sistema Publish/Subscribe
El sistema publish/subscribe es un paradigma de mensajes asíncronos donde los que
envían (Publisher) mensajes no están programados para enviar sus mensajes a
receptores específicos (Subscribers), sino que se envían a algún tipo de servidor. Los
mensajes publicados se caracterizan por clases, sin tener constancia de los
subscribidores que pueda haber. Los subscribidores expresan interés en una o más
clases, y solo reciben mensajes de ese mismo interés, sin tener constancia de qué
publicadores hay. Esta relación independiente entre publicadores y subscribidores
puede permitir una mayor escalabilidad.
El sistema publish/subscribe está muy ligado al paradigma de las colas de mensajes
(Message Queue). Muchos de los sistemas de mensajería soportan en su API (ej. JMS)
los dos, publish/subscribe y el modelo de mensajes en cola.
2.1.1 Filtrado de mensajes
En el modelo publish/subscribe, los subscribidores normalmente tan solo reciben un
subconjunto del total de mensajes publicados. El proceso de selección de mensajes
para su recepción y su procesamiento es llamado ‘Filtrado de mensajes’ (filtering).
Hay dos maneras de filtrar los mensajes: por tópicos o por el contenido de estos.
Cuando hablamos de filtrado por tópicos, decimos que los mensajes son publicados
por “temas” o canales. Los subscribidores en un sistema de filtrado por tópicos
recibirán todos los mensajes publicados, de aquellos tópicos o temas en los cuales se
hayan subscrito, y todos los subscribidores de un tópico o tema recibirán los mismos
mensajes. Son los publicadores, los responsables de definir los diferentes tipos de
temas o tópicos a los cuales se subscribirán los subscribidores.
6
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 2.1 Esquema de un Sistema publish/subscribe.
En nuestro proyecto nos basamos básicamente en este tipo de filtrado, aunque hemos
dado la posibilidad de insertar parámetros adicionales en la creación de canales por si
se quiere implementar otro tipo de filtrado como se verá seguidamente.
Por otro lado, cuando hablamos de filtrado por el contenido de los mensajes, decimos
que los mensajes son enviados a los subscribidores solo si el contenido de estos
coincide con las preferencias que los subscribidores se hayan definido. El subscribidor
es responsable de clasificar los mensajes.
Algunos sistemas soportan una mezcla de los dos; los publicadores envían mensajes a
algunos tópicos o temas mientras que los subscribidores reciben solo algunos
mensajes de cada tópico según su contenido.
2.1.2 Topologías
En muchos sistemas publish/subscribe, los publicadores envían los mensajes a un
servidor intermediario (broker) y los subscribidores hacen sus subscripciones con este
servidor intermediario (broker), permitiendo a este servidor encargarse del filtrado de
los mensajes. Dicho servidor normalmente se encarga del almacenamiento de los
mensajes y a su vez de la gestión de dichos mensajes hacia los subscribidores.
El diseño de este proyecto se ha basado en la utilización de un servidor intermedio,
encargado de almacenar los mensajes y gestionarlos.
7
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 2.2 Esquema Sistema publish/subscribe con broker.
Otros sistemas publish/subscribe eliminan este servidor intermediario (broker) y
distribuyen las funciones de gestión y filtrado entre los publicadores y subscribidores,
algunas veces con ayuda de “daemons”. Otra opción más especializada involucra
mapear todas las IPs de los subscribidores y organizarlas en grupos según sus tópicos o
temas, de esta forma los mensajes podrían enviarse directamente des de los
publicadores a los subscribidores con un único mensaje. El filtrado por contenido
puede entonces llevarse a cabo en el subscribidor, antes de que los mensajes pasen a
la capa superior de la aplicación en sí.
2.1.3 Ventajas
→ Tanto los publicadores como los subscribidores no necesitan saber uno del otro.
Siendo el tópico o tema el objetivo, publicadores y subscribidores pueden permanecer
al margen de la topología del sistema. Cada uno puede operar con normalidad
independientemente del otro. Cosa que no pasaba con el paradigma tradicional
cliente-servidor, el cliente no puede mandar mensajes al servidor mientras el servidor
no está en marcha, ni puede recibir mensajes a no ser que el cliente también esté en
marcha.
→ Para instalaciones relativamente pequeñas, el sistema publish/subscribe da la
oportunidad de una mejor escalabilidad que los tradicionales sistemas cliente-servidor,
mediante operaciones en paralelo, cache de mensajes, etc. No obstante, a medida que
un sistema aumenta hasta el punto de convertirse en un centro de datos con miles de
8
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
servidores compartiendo la infraestructura publish/subscribe, este beneficio,
normalmente, se pierde; de hecho, la escalabilidad para sistemas publish/subscribe
bajo una gran carga es todavía un desafío.
2.1.4 Desventajas
El problema más serio con los sistemas publish/subscribe es, en contrapuesta, su
principal ventaja: la independencia entre el publicador y el subscribidor. El problema
está en que es muy complicado especificar propiedades más fuertes que podrían ser
útiles.
→ Como primer ejemplo, muchos sistemas publish/subscribe intentan enviar mensajes
durante un periodo corto de tiempo y después se detienen. Si una aplicación, por el
motivo que fuese, necesitase una garantía más fuerte (como podría ser: los mensajes
serán siempre enviados y en caso contrario se tendrá que informar al publicador del
hecho), el sistema publish/subscribe probablemente no tendría manera de satisfacer
esta garantía.
→ Otro ejemplo seria, cuando un publicador “asume” que un subscribidor está
escuchando. Supongamos que utilizamos un sistema publish/subscribe para capturar
mensajes de error en una fabrica: cualquier aplicación que produzca un error publicará
un apropiado mensaje, y los mensajes serán puestos en la pantalla de la consola por el
servicio (‘daemon’), el cual se subscribe al tópico “errores”. Si el captador de
excepciones se cuelga, los publicadores no serán capaces de darse cuenta, con lo cual
todos los mensajes de error desaparecerán y no se verán por la consola.
Como se ha dicho anteriormente, los sistemas publish/subscribe se comportan bien
con instalaciones pequeñas, en cuanto escalabilidad se refiere. Pero cuando nos
encontramos con instalaciones más grandes su comportamiento empieza a decaer. Y
esto se manifiesta con inestabilidades como, largos periodos de espera, retardos en
cuanto más y más aplicaciones empiezan a usar el sistema (incluso si se están
comunicando en tópicos distintos), a más de saturar una red local con el trafico de
mensajes.
En cuanto a los sistemas que utilizan servidores (brokers), estos pueden ser objeto de
problemas de seguridad. Pueden ser hackeados para enviar notificaciones a un cliente
erróneo, creando una denegación de servicio hacia dicho cliente. Los servidores
pueden sobrecargarse a medida que van almacenando y gestionando grandes
cantidades de mensajes.
Incluso con sistemas que no dependen de servidores intermedios, un subscribidor
podría ser capaz de recibir información que no le está autorizada. Un publicador no
9
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
autorizado podría ser capaz de introducir mensajes incorrectos o dañinos en el sistema
publish/subscribe. Esto es especialmente verdad en sistemas que envían todos sus
mensajes a todos sus subscriptores. La encriptación (ej. SSL/TLS) puede ser la única vía
de defensa contra accesos desautorizados.
2.2 Arquitecturas REST
La Transferencia de Estado Representacional (Representational State Transfer) o REST
es una técnica de arquitectura software para sistemas hipermedia distribuidos como la
World Wide Web. El término se originó en el año 2000, en una tesis doctoral sobre la
web escrita por Roy Fielding, uno de los principales autores de la especificación del
protocolo HTTP y ha pasado a ser ampliamente utilizado por la comunidad de
desarrollo.
Si bien el término REST se refería originalmente a un conjunto de principios de
arquitectura —descritos más abajo—, en la actualidad se usa en el sentido más amplio
para describir cualquier interfaz web simple que utiliza XML y HTTP, sin las
abstracciones adicionales de los protocolos basados en patrones de intercambio de
mensajes como el protocolo de servicios web SOAP. Es posible diseñar sistemas de
servicios web de acuerdo con el estilo arquitectural REST de Fielding y también es
posible diseñar interfaces XMLHTTP de acuerdo con el estilo de llamada a
procedimiento remoto pero sin usar SOAP. Estos dos usos diferentes del término REST
causan cierta confusión en las discusiones técnicas, aunque RPC no es un ejemplo de
REST.
Los sistemas que siguen los principios REST se llaman con frecuencia RESTful; los
defensores más acérrimos de REST se llaman a sí mismos RESTafaris.
REST afirma que la web ha disfrutado de escalabilidad como resultado de una serie de
diseños fundamentales clave:
-
Un protocolo cliente/servidor sin estado: cada mensaje HTTP contiene toda la
información necesaria para comprender la petición. Como resultado, ni el
cliente ni el servidor necesitan recordar ningún estado de las comunicaciones
entre mensajes. Sin embargo, en la práctica, muchas aplicaciones basadas en
HTTP utilizan cookies y otros mecanismos para mantener el estado de la sesión
(algunas de estas prácticas, como la reescritura de URLs, no son permitidas por
REST)
-
Un conjunto de operaciones bien definidas que se aplican a todos los recursos
de información: HTTP en sí define un conjunto pequeño de operaciones, las
más importantes son POST, GET, PUT y DELETE. Con frecuencia estas
10
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
operaciones se equiparan a las operaciones CRUD que se requieren para la
persistencia de datos, aunque POST no encaja exactamente en este esquema.
-
Una sintaxis universal para identificar los recursos. En un sistema REST, cada
recurso es direccionable únicamente a través de su URI.
-
El uso de hipermedios, tanto para la información de la aplicación como para las
transiciones de estado de la aplicación: la representación de este estado en un
sistema REST son típicamente HTML o XML. Como resultado de esto, es posible
navegar de un recurso REST a muchos otros, simplemente siguiendo enlaces sin
requerir el uso de registros u otra infraestructura adicional.
2.2.1 Recursos
Un concepto importante en REST es la existencia de recursos (elementos de
información), que pueden ser accedidos utilizando un identificador global (un
Identificador Uniforme de Recurso) Para manipular estos recursos, los componentes
de la red (clientes y servidores) se comunican a través de un interfaz estándar (HTTP) e
intercambian representaciones de estos recursos (los ficheros que se descargan y se
envían) - es cuestión de debate, no obstante, si la distinción entre recursos y sus
representaciones es demasiado platónica para su uso práctico en la red, aunque es
popular en la comunidad RDF.
La petición puede ser tramitada por cualquier número de conectores (por ejemplo
clientes, servidores, cachés, túneles, etc.) pero cada uno lo hace sin "ver más allá" de
su propia petición (lo que se conoce como separación en capas, otra restricción de
REST, que es un principio común con muchas otras partes de la arquitectura de redes y
de la información) Así, una aplicación puede interactuar con un recurso conociendo el
identificador del recurso y la acción requerida, no necesitando conocer si existen
cachés, proxys, cortafuegos, túneles o cualquier otra cosa entre ella y el servidor que
guarda la información. La aplicación, sin embargo, debe comprender el formato de la
información devuelta (la representación), que es por lo general un documento HTML o
XML, aunque también puede ser una imagen o cualquier otro contenido.
11
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
2.3 Protocolos XML-RPC
XML-RPC es un protocolo de llamada a procedimiento remoto que usa XML para
codificar los datos y HTTP como protocolo de transmisión de mensajes.
Es un protocolo muy simple ya que sólo define unos cuantos tipos de datos y
comandos útiles, además de una descripción completa de corta extensión. La
simplicidad del XML-RPC está en contraste con la mayoría de protocolos RPC que tiene
una documentación extensa y requiere considerable soporte de software para su uso.
Fue creado por Dave Winer de la empresa UserLand Software en asociación con
Microsoft en el año 1998. Al considerar Microsoft que era muy simple decidió
adicionarle funcionalidades, los cuales después de varias etapas de desarrollo el
estándar dejó de ser sencillo y se convirtió en lo que es actualmente conocido como
SOAP. Una diferencia fundamental es que en los procedimientos en SOAP los
parámetros tienen nombre y no interesan su orden, no siendo así en XML-RPC.
Fig. 2.3 Esquema Protocolo XML-RPC.
12
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
2.4 Tecnología AJAX
AJAX, acrónimo de Asynchronous JavaScript And XML (JavaScript asíncrono y XML), es
una técnica de desarrollo web para crear aplicaciones interactivas o RIA (Rich Internet
Applications). Éstas se ejecutan en el cliente, es decir, en el navegador de los usuarios
y mantiene comunicación asíncrona con el servidor en segundo plano. De esta forma
es posible realizar cambios sobre la misma página sin necesidad de recargarla. Esto
significa aumentar la interactividad, velocidad y usabilidad en la misma.
AJAX es una combinación de tres tecnologías ya existentes:
-
XHTML (o HTML) y hojas de estilos en cascada (CSS) para el diseño que
acompaña a la información.
-
Document Object Model (DOM) accedido con un lenguaje de scripting por
parte del usuario, especialmente implementaciones ECMAScript como
JavaScript y JScript, para mostrar e interactuar dinámicamente con la
información presentada.
-
El objeto XMLHttpRequest para intercambiar datos asincrónicamente con el
servidor web. En algunos frameworks y en algunas situaciones concretas, se
usa un objeto iframe en lugar del XMLHttpRequest para realizar dichos
intercambios.
-
XML es el formato usado comúnmente para la transferencia de vuelta al
servidor, aunque cualquier formato puede funcionar, incluyendo HTML pre
formateado, texto plano, JSON y hasta EBML.
Como el DHTML, LAMP o SPA, AJAX no constituye una tecnología en sí, sino que es un
término que engloba a un grupo de éstas que trabajan conjuntamente.
13
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 2.4 Esquema del funcionamiento de AJAX.
A pesar de que el término «AJAX» fuese creado en 2005, la historia de las tecnologías
que permiten AJAX se remonta a una década antes con la iniciativa de Microsoft en el
desarrollo de Scripting Remoto. Sin embargo, las técnicas para la carga asíncrona de
contenidos en una página existente sin requerir recarga completa remontan al tiempo
del elemento iframe (introducido en Internet Explorer 3 en 1996) y el tipo de elemento
layer (introducido en Netscape 4 en 1997, abandonado durante las primeras etapas de
desarrollo de Mozilla). Ambos tipos de elemento tenían el atributo src que podía
14
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
tomar cualquier dirección URL externa, y cargando una página que contenga javascript
que manipule la página paterna, pueden lograrse efectos parecidos al AJAX.
El Microsoft's Remote Scripting (o MSRS, introducido en 1998) resultó un sustituto más
elegante para estas técnicas, con envío de datos a través de un applet Java el cual se
puede comunicar con el cliente usando JavaScript. Esta técnica funcionó en ambos
navegadores, Internet Explorer versión 4 y Netscape Navigator versión 4. Microsoft la
utilizó en el Outlook Web Access provisto con la versión 2000 de Microsoft Exchange
Server.
La comunidad de desarrolladores web, primero colaborando por medio del grupo de
noticias microsoft.public.scripting.remote y después usando blogs, desarrollaron una
gama de técnicas de scripting remoto para conseguir los mismos resultados en
diferentes navegadores. Los primeros ejemplos incluyen la librería JSRS en el año 2000,
la introducción a la técnica imagen/cookie en el mismo año y la técnica JavaScript bajo
demanda (JavaScript on Demand) en 2002. En ese año, se realizó una modificación por
parte de la comunidad de usuarios al Microsoft's Remote Scripting para reemplazar el
applet Java por XMLHttpRequest.
Frameworks de Scripting Remoto como el ARSCIF aparecieron en 2003 poco antes de
que Microsoft introdujera Callbacks en ASP. NET.
Desde que XMLHttpRequest está implementado en la mayoría de los navegadores,
raramente se usan técnicas alternativas. Sin embargo, todavía se utilizan donde se
requiere una mayor compatibilidad, una reducida implementación, o acceso cruzado
entre sitios web. Una alternativa, el Terminal SVG (basado en SVG), emplea una
conexión persistente para el intercambio continuo entre el navegador y el servidor.
2.5 Java Server Pages (JSP)
Java Server Pages (JSP) es una tecnología Java que permite generar contenido
dinámico para web, en forma de documentos HTML, XML o de otro tipo.
Esta tecnología es un desarrollo de la compañía Sun Microsystems. La Especificación
JSP 1.2 fue la primera que se liberó y en la actualidad está disponible la Especificación
JSP 2.1.
Las JSP's permiten la utilización de código Java mediante scripts. Además es posible
utilizar algunas acciones JSP predefinidas mediante etiquetas. Estas etiquetas pueden
ser enriquecidas mediante la utilización de Librerías de Etiquetas (TagLibs o Tag
Libraries) externas e incluso personalizadas.
15
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Microsoft, la más directa competencia de Sun, ha visto en esta estrategia de Sun una
amenaza, lo que le ha llevado a que su plataforma .NET incluya su lenguaje de scripts
ASP.NET que permite ser integrado con clases .NET (ya estén hechas en C++,
VisualBasic o C#) del mismo modo que jsp se integra con clases Java.
2.5.1 Arquitectura de los JSP
Desde el punto de vista de arquitectura, podríamos situar esta tecnología como una
capa superior a las Servlets dentro de nuestra aplicación, ya que extiende la
Especificación Servlet 2.1. Ambas tecnologías fueron desarrolladas originalmente por
Sun Microsystem.
El funcionamiento general de la tecnología JSP es que el Servidor de Aplicaciones
interpreta el código contenido en la página JSP para construir un Servlet, cuya salida
será un documento estático (típicamente HTML) que se presentará en la pantalla del
Navegador del usuario.
Fig. 2.5 Flujo de la información.
A su vez, es posible enriquecer este lenguaje de etiquetas. Para ello debemos extender
la capa de alto nivel JSP mediante la implementación de Librerías de Etiquetas (Tags
Libraries). Un ejemplo de estas librerías son las proporcionadas por Sun bajo la
denominación de JSTL o las distribuidas por Apache junto con el Framework de Struts.
JSP no se puede considerar un script al 100%, ya que antes de ejecutarse el Servidor de
Aplicaciones compila el contenido del documento JSP (script y etiquetas) y genera una
clase Servlet. Por lo tanto, se puede decir que aunque este proceso sea transparente
para el programador no deja de ser una tecnología compilada.
16
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
La principal ventaja de JSP frente a otros lenguajes es que permite integrarse con
clases Java (.class) lo que permite separar en niveles las aplicaciones web,
almacenando en clases java las partes que consumen más recursos (así como las que
requieren más seguridad) y dejando la parte encargada de formatear el documento
HTML en el archivo JSP. La idea fundamental detrás de este criterio es el de separar la
lógica del negocio de la presentación de la información.
Independientemente de la certeza de la aseveración, Java es conocido por ser un
lenguaje muy portable (su lema publicitario reza: escríbelo una vez, ejecútalo donde
sea) y sumado a las capacidades de JSP se hace una combinación muy atractiva.
Los servlets y Java Server Pages (JSPs) son dos métodos de creación de páginas web
dinámicas en servidor usando el lenguaje Java. En ese sentido son similares a otros
métodos o lenguajes tales como el PHP, los CGIs (common gateway interface),
programas que generan páginas web en el servidor, o los ASP (Active Server Pages), un
método específico de Microsoft. Sin embargo, se diferencian de ellos en otras cosas.
Para empezar, los JSPs y servlets se ejecutan en una máquina virtual Java, lo cual
permite que, en principio, se puedan usar en cualquier tipo de ordenador, siempre que
exista una máquina virtual Java para él. Cada servlet (o JSP, a partir de ahora lo
usaremos de forma indistinta) se ejecuta en su propia hebra, es decir, en su propio
contexto; pero no se comienza a ejecutar cada vez que recibe una petición, sino que
persiste de una petición a la siguiente, de forma que no se pierde tiempo en invocarlo
(cargar programa + intérprete). Su persistencia le permite también hacer una serie de
cosas de forma más eficiente: conexión a bases de datos y manejo de sesiones, por
ejemplo.
Los JSPs son en realidad servlets: un JSP se compila a un programa en Java la primera
vez que se invoca, y del programa en Java se crea una clase que se empieza a ejecutar
en el servidor como un servlet. La principal diferencia entre los servlets y los JSPs es el
enfoque de la programación: un JSP es una página Web con etiquetas especiales y
código Java incrustado, mientras que un servlet es un programa que recibe peticiones
y genera a partir de ellas una página web.
2.6 Sindicación Web
La sindicación web es una forma de redifusión (distribución) de información mediante
la cual parte de una página web que se pone a disposición para su uso desde otras
páginas. Esto puede ser simplemente licenciando el contenido para que puedan usarlo
otras personas; sin embargo, en general, la sindicación web se refiere a ofrecer una
fuente web desde una página web para proporcionar a otras personas una lista
17
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
actualizada de su contenido (por ejemplo, noticias de un periódico, nuevos artículos en
una bitácora, los últimos comentarios en un foro, etcétera).
Las fuentes suelen codificarse en XML, aunque el formato puede ser cualquier cosa
que pueda transportarse a través de HTTP, como el HTML o el Javascript. Las dos
principales familias de formatos de sindicación web son el RSS y el Atom.
Recientemente el término RSS (Sindicación Realmente Simple) se ha usado
indistintamente para referirse a cualquiera de los formatos RSS o Atom.
Para leer una fuente es necesario suscribirse mediante un agregador, que más
adelante explicaremos con más detalle, pero para dar un avance diremos que es una
aplicación (de escritorio o basada en web) que muestra los contenidos nuevos
publicados por el proveedor de la fuente suscrita.
Esto tuvo su origen en las páginas de noticias y los blogs, pero cada vez se utiliza más
para redifundir cualquier tipo de información. La sindicación web también está
ganando importancia en el comercio en línea, ya que los internautas cada vez son más
reacios a proporcionar información personal para información promocional (como
apuntarse a un boletín de noticias) y en cambio esperan la posibilidad de suscribirse a
una fuente de sindicación.
Fig. 2.6 Icono que señala la presencia de feeds RSS.
2.6.1 Agregador
Un agregador o agregador de noticias es un tipo de software para suscribirse a canales
de noticias en formatos RSS, Atom y otros derivados de XML/RDF). El agregador reúne
las noticias o historias publicadas en los sitios web sindicados elegidos, y muestra las
novedades o modificaciones que se han producido en esos canales; es decir, avisa de
qué webs han incorporado contenido nuevo desde nuestra última lectura y cuál es ese
contenido. Esta información es la que se conoce como feed.
Un agregador es muy similar en sus prestaciones a los anteriores lectores de noticias
(client newsreaders/NNTP), pero la tecnología XML y el web semántico los ha hecho
más populares. Hoy en día, una enorme cantidad de blogs y sitios web ofrecen sus
18
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
actualizaciones, que pueden ser fácilmente reunidas y administradas en un solo punto,
como es el caso del servicio My Yahoo!, Google Reader, y otros agregadores de
escritorio.
2.6.2 Variedades
La gran variedad de aplicaciones de software y componentes para publicar feeds es
una prueba de la flexibilidad del formato XML.
-
Basados en web: Los agregadores basados en web son aplicaciones que residen
en servidores remotos y que funcionan como aplicaciones que se ejecutan en la
propia web: Google Reader o Bloglines.
Otros métodos avanzados de agregadores de feeds están construidos en código
AJAX y XML y son también conocidos como Web widgets. Éstos permiten reunir
servicios de email, documentos o feeds en una sola interfaz. Algunos de los
portales que disponen de estas funcionalidades son: iGoogle, Live.com, etc.
El más utilizado en la red es el de My Yahoo!, y para ver las estadísticas de
utilización de agregadores basados en web, más abajo tenemos un diagrama
que nos lo muestra:
Fig. 2.7 Diagrama de los agregadores basados en web más utilizados.
19
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
-
Cliente de software: Los agregadores que funcionan como programas clientes
son aplicaciones que se instalan en los ordenadores y están diseñados para
reunir suscripciones de feeds y agruparlas todas usando una interfaz amigable.
En estos programas, las suscripciones están agrupadas generalmente en la
columna izquierda y las entradas de cada feed se pueden buscar, seleccionar y
leer en la columna o caja de la derecha.
2.7 Formato RSS
RSS es un sencillo formato de datos que es utilizado para redifundir contenidos a
suscriptores de un sitio web. El formato permite distribuir contenido sin necesidad de
un navegador, utilizando un software diseñado para leer estos contenidos RSS
(agregador). A pesar de eso, es posible utilizar el mismo navegador para ver los
contenidos RSS. Las últimas versiones de los principales navegadores permiten leer los
RSS sin necesidad de software adicional.
RSS es parte de la familia de los formatos XML desarrollado específicamente para todo
tipo de sitios que se actualicen con frecuencia y por medio del cual se puede compartir
la información y usarla en otros sitios web o programas. A esto se le conoce como
redifusión web o sindicación web (una traducción incorrecta, pero de uso muy común).
Fig. 2.8 Lecturas de Wikinoticias en inglés realizadas en el formato RSS.
Este acrónimo se usa para referirse a los siguientes estándares:
* Rich Site Summary (RSS 0.91)
* RDF Site Summary (RSS 0.9 y 1.0)
* Really Simple Syndication (RSS 2.0)
* Además es usual que el término RSS sea usado indistintamente para referirse a
cualquiera de los formatos RSS o Atom.
20
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Gracias a los agregadores o lectores de feeds (programas o sitios que permiten leer
fuentes web) se puede obtener resúmenes de todos los sitios que se desee desde el
escritorio del sistema operativo, programas de correo electrónico o por medio de
aplicaciones web que funcionan como agregadores. No es necesario abrir el navegador
y visitar decenas de webs.
Pero lo verdaderamente importante es que a partir de este formato se está
desarrollando una cadena de valor nueva en el sector de los contenidos que está
cambiando las formas de relación con la información tanto de los profesionales y
empresas del sector como de los usuarios. Varias empresas están explorando nuevas
formas de uso y distribución de la información.
La redifusión web no es sólo un fenómeno vinculado a los weblogs, aunque han
ayudado mucho a su popularización. Siempre se han sindicado contenidos y se ha
compartido todo tipo de información en formato XML, de esta forma podemos ofrecer
contenidos propios para que sean mostrados en otras páginas web de forma
integrada, lo que aumenta el valor de la página que muestra el contenido y también
nos genera más valor, ya que normalmente la redifusión web siempre enlaza con los
contenidos originales.
2.8 Formato RDF
El Marco de Descripción de Recursos (del inglés resource description framework, RDF)
es un framework para metadatos en la World Wide Web (WWW), desarrollado por el
World Wide Web Consortium (W3C).
El origen de RDF se debe a Ramanathan V. Guha cuando trabajaba en Apple Computer
en su forma inicial conocida como MCF, más tarde continuada durante su etapa en
Netscape Communications Corporation. Este modelo se basa en la idea de convertir las
declaraciones de los recursos en expresiones con la forma sujeto-predicado-objeto
(conocidas en términos RDF como tripletes). El sujeto es el recurso, es decir aquello
que se está describiendo. El predicado es la propiedad o relación que se desea
establecer acerca del recurso. Por último, el objeto es el valor de la propiedad o el otro
recurso con el que se establece la relación. La combinación de RDF con otras
herramientas como RDF Schema y OWL permite añadir significado a las páginas, y es
una de las tecnologías esenciales de la Web semántica.
21
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 2.9 Ejemplo de un RDF.
En definitiva, vemos que un RDF nos permite:
-
Definir información sobre cualquier dominio.
-
Todo lo que se describen son recursos (identificados por sus URIs).
-
Definido como una tripleta (s,p,o):
• Sujeto – Recurso (http://www.w3c.es/Personal/Martin).
• Predicado – Propiedad (creador).
• Objeto – Literal (“Martín Álvarez”).
-
Utiliza el Lenguaje de Marcado Extensible (XML) para la codificación.
-
Facilita la creación e intercambio de los metadatos.
2.9 El lenguaje HTML
HTML es el acrónimo inglés de HyperText Markup Language, que se traduce al español
como Lenguaje de Etiquetas de Hipertexto. Es un lenguaje de marcado diseñado para
estructurar textos y presentarlos en forma de hipertexto, que es el formato estándar
de las páginas web. Gracias a Internet y a los navegadores como Internet Explorer,
Opera, Firefox, Netscape o Safari, el HTML se ha convertido en uno de los formatos
22
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
más populares y fáciles de aprender que existen para la elaboración de documentos
para web.
En 1989 existían dos técnicas que permitían vincular documentos electrónicos, por un
lado los hipervínculos (links) y por otro lado un poderoso lenguaje de etiquetas
denominado SGML. Por entonces un usuario conocedor de ambas opciones, Tim
Berners-Lee físico nuclear del Centro Europeo para la Investigación Nuclear da a
conocer a la prensa que estaba trabajando en un sistema que permitirá acceder a
ficheros en línea, funcionando sobre redes de computadoras o máquinas electrónicas
basadas en el protocolo TCP/IP.
A principios de 1990, Tim Berners-Lee define por fin el HTML como un subconjunto del
conocido SGML y crea algo más valioso aún, el World Wide Web. En 1991, Tim
Berners-Lee crea el primer navegador de HTML que funcionaría en modo texto y para
UNIX.
Los trabajos para crear un sucesor del HTML, denominado HTML +, comenzaron a
finales de 1993. HTML+ se diseñó originalmente para ser un superconjunto del HTML
que permitiera evolucionar gradualmente desde el formato HTML anterior. A la
primera especificación formal de HTML+ se le dio, por lo tanto, el número de versión 2
para distinguirla de las propuestas no oficiales previas. Los trabajos sobre HTML+
continuaron, pero nunca se convirtió en un estándar, a pesar de ser la base
formalmente más parecida al aspecto compositivo de las especificaciones actuales.
El borrador del estándar HTML 3.0 fue propuesto por el recién formado W3C en marzo
de 1995. Con él se introdujeron muchas nuevas capacidades, tales como facilidades
para crear tablas, hacer que el texto fluyese alrededor de las figuras y mostrar
elementos matemáticos complejos. Aunque se diseñó para ser compatible con HTML
2.0, era demasiado complejo para ser implementado con la tecnología de la época y,
cuando el borrador del estándar expiró en septiembre de 1995, se abandonó debido a
la carencia de apoyos de los fabricantes de navegadores web. El HTML 3.1 nunca llegó
a ser propuesto oficialmente, y el estándar siguiente fue el HTML 3.2, que abandonaba
la mayoría de las nuevas características del HTML 3.0 y, a cambio, adoptaba muchos
elementos desarrollados inicialmente por los navegadores web Netscape y Mosaic. La
posibilidad de trabajar con fórmulas matemáticas que se había propuesto en el HTML
3.0 pasó a quedar integrada en un estándar distinto llamado MathML.
El HTML 4.0 también adoptó muchos elementos específicos desarrollados inicialmente
para un navegador web concreto, pero al mismo tiempo comenzó a limpiar el HTML
señalando algunos de ellos como 'desaprobados'.
23
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
2.10 Google Gadgets
El término gadget (o widget), se ha dado a una nueva categoría de mini aplicaciones,
diseñadas para proveer de información o mejorar una aplicación o servicios de un
ordenador o computadora, o bien cualquier tipo de interacción a través de Internet,
por ejemplo una extensión de alguna aplicación de negocios, que nos provea
información en tiempo real del estatus del negocio u organización.
Un ejemplo de un gadget en una computadora serían los gadgets del Dashboard del
sistema de Apple el Mac OS X Tiger o los de la barra lateral de Windows, que viene
incluida en el nuevo sistema operativo de Microsoft: Windows Vista.
Hasta aquí hemos explicado que es un gadget o widget, pero y los google gadgets? Pos
bien, esto no es nada más que una adaptación que ha hecho google para proporcionar
pequeñas aplicaciones que pueden correr en múltiples sitios, incluyendo iGoogle,
Google Desktop, Google Page Creator, y miles de sitios que utilicen los google gadgets.
Estos gadgets son escritos por autores en un lenguaje modular XML. Cuando un
usuario añade un gadget en su página personal, google lo que hace es convertir el
gadget xml en código HTML y JavaScript normal, permitiendo al gadget poder ser
visualizado con cualquier navegador moderno.
Fig. 2.10 Diferentes Google Gadgets.
24
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
3.- ANÁLISIS
Se pretende crear un middleware para facilitar las bases de un sistema
publish/subscribe. De modo que los desarrolladores de un proyecto puedan dedicarse
única e íntegramente en su objetivo. Para tal fin se ha decidido crear un servidor
intermedio que separará de una forma clara los que son ‘publicadores’ y los que son
‘subscribidores’. Este servidor intermedio será dotado de todas las funciones básicas
necesarias para gestionar los mensajes de los publicadores.
Para desarrollar esta aplicación web utilizaremos un servidor Apache con una base de
datos SQL, las páginas web serán creadas en JAVA (JSP) y AJAX. Utilizaremos
protocolos de comunicación como XML-RPC y los métodos básicos del protocolo HTTP
(GET, POST, PUT, DELETE) para dar soporte al api REST.
Se ha decidido que el filtrado de los mensajes sea en base a un tópico, es decir, que
todos los mensajes que publiquen los publicadores deberán estar dentro de su
correspondiente canal que los clasificará según su temática. No obstante damos cabida
a que se puedan implementar futuras aplicaciones externas a dicho servidor que
puedan gestionar la manera en que se subscriben a diferentes canales. Digo esto
porque se ha dado la posibilidad de poner parámetros extras en la creación de canales
y eventos. Por tanto si se quisiera, también se podría desarrollar un tipo de aplicación
cliente (por parte de los subscribidores) que se subscribieran solamente a esos canales
cuyos parámetros contengan palabras como “coche”, “motor”, etc. Es decir, de alguna
manera damos cabida a que se puedan sindicar a canales también según su contenido.
La idea es crear un entorno que sea libre, en el sentido de que todo el mundo tenga la
posibilidad de crear canales y enviar eventos pero no sin renunciar a la seguridad y a la
privacidad. Por tanto se ha dado la posibilidad de crear canales privados donde
solamente usuarios autorizados puedan leer, publicar y subscribirse. Siguiendo con
este planteamiento también se ha querido dar un aspecto de interoperabilidad entre
diferentes servidores que soporten sindicación RSS o RDF. Con lo cual se podrá crear
canales que al mismo tiempo estén sindicados a otros servidores o canales, para
importar todos sus eventos a nuestro servidor y mantener actualizado dicho canal con
información de otros servidores si se ve necesario. La sindicación a dichos servidores
se programará de manera independiente por parte del servidor, que será el que cada
cierto tiempo vaya preguntando al otro servidor sindicado si hay nueva información
para incorporar. Es decir, es como si hubiéramos implementado un agregador de RSS.
Para gestionar todos los canales se han creado una serie de operaciones básicas que se
podrán utilizar de distintos modos. Hemos creído conveniente que al ser este proyecto
planteado como un middleware, es necesario que se puedan gestionar los canales sin
necesidad de ir específicamente a la interfaz web del servidor, es decir que se puedan
25
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
llamar a dichos métodos en segundo plano para poder ser utilizados des de otras
aplicaciones web. Por tanto se ha dotado al servidor de un api REST que proporcione
los métodos GET, PUT, POST y DELETE para que mediante el protocolo HTTP se pueda
mandar uno de estos métodos con sus parámetros respectivos y haga la acción
deseada. Esta manera de utilizar el servidor en segundo plano es muy sencilla y fácil,
sobre todo si no requerimos tratar el resultado de la acción, ya que dichos métodos
devuelven los resultados directamente en HTTP.
Por otro lado, si lo que pretendemos es realizar una acción y utilizar su resultado para
tratarlo entonces se ha dotado al servidor de una interfaz XML-RPC, en la cual se
pueda llamar a las mismas funciones básicas pero estas devolverán siempre un
formato XML con el resultado de la acción.
Las funciones básicas que proporciona el servidor son las siguientes:
-
List Channels: con esta opción nos listará todos los canales del servidor,
públicos y privados (de estos últimos, claro, no podremos ver su información si
no tenemos privilegios). Dentro de esta opción podemos escoger si queremos
que nos liste tan solo los ‘x’ últimos canales que se han añadido al servidor para
facilitar así la búsqueda.
-
List Events: con esta opción nos listará todos los eventos del servidor, y en que
canales están cada uno de ellos. Dentro de esta opción podemos escoger si
queremos que nos liste tan solo los ‘x’ últimos eventos que se han añadido en
el servidor. Y a más si queremos podemos especificar no solamente en todo el
servidor sino también en un canal concreto.
-
Get Channel: con esta opción podremos conseguir información sobre el canal
concreto que le pidamos.
-
Get Event: con esta opción podremos conseguir información sobre el evento
concreto que le pidamos. Hay que tener en cuenta que si el evento se
encontrara en un canal privado no podríamos verlo si no disponemos de
privilegios.
-
Post Event: esta opción nos permite enviar un evento a un canal concreto. Si el
canal es privado necesitamos tener privilegios para poder enviar eventos.
Dentro de esta opción podemos rellenar todos los campos necesarios para
crear dicho evento.
-
Put Channel: con esta opción podremos crear un canal nuevo con todas sus
opciones y atributos.
26
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
-
Delete Channel: con esta opción eliminaremos un canal y todos sus eventos.
Está claro que para poder realizar esta acción se debe ser el creador del canal
en concreto.
-
Add RSS: con esta opción podremos sindicar cualquier canal ya creado a otro
servidor u otro canal para recibir sus eventos periódicamente.
En algunas de estas funciones se ha incorporado una opción para realizar la acción
pero solo con tus propios canales o eventos. Es decir, hemos creado como “un
espacio” en el cual las acciones que hagas solo tendrán efecto en tus canales, de esta
manera, si quieres listar solo tus canales y no todos los del servidor con esta opción se
podrá hacer.
Como hemos dicho antes todas estas funciones pueden ser ejecutadas des de la
interfaz web de la aplicación o en segundo plano mediante la api REST o mediante la
api XML-RPC.
27
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
4.- DISEÑO
4.1 Diseño de la Base de Datos
La base de datos está formada por 6 tablas que seguidamente vamos a explicar:
CREATE TABLE users (
login
CHAR(11),
pass
CHAR(11),
PRIMARY KEY (login));
Esta tabla corresponde a los usuarios del sistema, en ella guardamos un nombre de
usuario y una contraseña.
CREATE TABLE channels (
login
CHAR(11),
channel
CHAR(25),
description
TEXT(1000),
date
TIMESTAMP,
private
BOOLEAN,
PRIMARY KEY (channel),
FOREIGN KEY (login) REFERENCES users);
En esta segunda tabla guardamos los canales. Cada canal irá asociado con el usuario
que lo ha creado, y tendrá el nombre del canal, su descripción, la fecha de creación del
canal y un booleano indicando si se trata de un canal público o privado.
CREATE TABLE
login
channel
PRIMARY
FOREIGN
FOREIGN
channel_users (
CHAR(11),
CHAR(25),
KEY (login,channel),
KEY (login) REFERENCES users,
KEY (channel) REFERENCES channels);
En esta tabla guardamos los canales privados junto con el usuario que tiene privilegios
para verlo o enviar eventos. De esta forma podemos tener el mismo canal privado
pero con diferentes usuarios, que son los aceptados para que puedan ver dicho canal.
CREATE TABLE events (
channel
CHAR(25),
title
CHAR(255),
description
TEXT(1000),
date
TIMESTAMP,
PRIMARY KEY (channel,title),
FOREIGN KEY (channel) REFERENCES channels);
Esta es la tabla de los eventos, en ella guardamos todos los atributos de un evento.
Que son el canal al cual pertenece dicho evento, el titulo del evento, su descripción y
su fecha de creación.
28
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
CREATE TABLE channel_params (
channel
CHAR(25),
param
CHAR(50),
value
CHAR(255),
PRIMARY KEY (channel,param),
FOREIGN KEY (channel) REFERENCES channels);
Esta tabla guarda los parámetros de cada canal, en ella se especifica el nombre del
canal junto con el nombre del parámetro y su valor.
CREATE TABLE event_params (
channel
CHAR(25),
title
CHAR(255),
param
CHAR(50),
value
CHAR(255),
PRIMARY KEY (channel,title,param),
FOREIGN KEY (channel,title) REFERENCES events);
Finalmente tenemos la última tabla, muy parecida a la anterior, en la que guardamos
los parámetros de un evento, como el canal al que pertenece el evento, el titulo del
evento, el nombre del parámetro y su valor.
Seguidamente mostraremos un pequeño diagrama en el que se ven las relaciones
existentes entre las diferentes tablas que forman la base de datos.
Fig. 4.1 Diagrama Entidad Relación.
Está claro que antes de arrancar la aplicación web las tablas deben de estar creadas y
listas en la base de datos.
29
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Como podemos observar la base de datos consta de un conjunto de canales, cuyo
título será el tópico que determinará la clasificación de los canales y eventos.
Entonces, cada canal puede disponer de ‘x’ eventos y un conjunto de parámetros
extras que servirán, como hemos comentado anteriormente, para dar funcionalidades
extras a posibles aplicaciones clientes externas. Cada canal, a más, vendrá identificado
por el usuario que lo ha creado. Esto se hace para poder tener constancia de su
creador y saber identificarlo cuando se precise hacer operaciones comprometedoras a
dicho canal.
Por otra parte también tenemos la tabla ‘event’, en la cual guardaremos los eventos
publicados por los publicadores. Un evento siempre estará en un canal concreto, y
dispondrá, al igual que en los canales, un conjunto de parámetros que servirán para
dar funcionalidades extras a posibles aplicaciones clientes externas.
Finalmente, la última tabla, ‘channel_users’, será donde guardemos las relaciones de
canal con usuario. Es decir, cada canal con su usuario creador. Esto se hace para poder
tener una rápida referencia al creador de cualquier canal.
4.2 Estructura de la aplicación web
Como he comentado anteriormente la web ha sido creada en JAVA utilizando páginas
JSP y servlets de JAVA. Básicamente el cuerpo de la web son 3 servlets (servletREG,
servletREST, servletRPC). Los 3 se encargan de procesar peticiones o formularios. Más
adelante entraremos en más detalle sobre cada uno de los servlets.
Fig. 4.2 Diagrama de clases y flujo de la información.
30
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Como hemos dicho antes las clases principales son: servletRPC, servletREST y
servletREG. Estas 3 clases reciben peticiones de los clientes y dan respuesta a dichas
peticiones. Pero cada clase tiene una diferencia. El servletRPC devuelve toda respuesta
en formato XML. Siguiendo la especificación XML-RPC. El servletREST devuelve la
respuesta en formato HTML, interpretable por cualquier navegador estándar. Por
último el servletREG sólo recibe peticiones para el registro, logeo y deslogeo del
servidor. Los 3 servlets anteriores descritos utilizan una clase donde van todos los
métodos. Esta clase “Methods” utiliza otras para realizar sus operaciones, como son la
clase JDBC, utilizada para crear la conexión entre java y la base de datos SQL. Y la clase
RSS “Methods”, que contiene los métodos para realizar los archivos XML (RSS) de los
canales.
Una vez se ha construido la respuesta a cierta petición, esta se pasa a las clases
encargadas de dar la vista, es decir, de mostrarlo al cliente. Existen 4 clases distintas
que se utilizan para exponer los resultados. Entre todas ellas se diferencia por la forma
en que dan los resultados.
Acto seguido explicaremos más concretamente que hace cada clase y de que
sentencias está compuesta.
4.2.1 servletREG.java
Este servlet es el encargado de procesar la entrada nueva de un usuario que se acaba
de registrar y la identificación de entrada y salida que hace un usuario ya registrado en
el sistema. Este servlet acepta dos tipos de peticiones (GET y POST). Y para poder
realizar sus operaciones hace uso de otra clase muy importante en el proyecto. La
clase ‘methods’. Esta clase se explicará más adelante pero para dar un pequeño avance
diremos que es la clase donde se guardan todas las operaciones o funciones de las que
es capaz de realizar un usuario en la web.
Con este código conseguimos la sesión que un usuario ha establecido con el servidor
por haberlo visitado y por tanto podemos saber (gracias a la clase Authentication) si el
usuario es anónimo o no. Si es anónimo mostraremos menús para que se pueda
registrar o identificar y al mismo tiempo impediremos que pueda realizar funciones que solo
los miembros registrados pueden hacer.
La clase Authentication tan solo lleva los atributos de un usuario normal, su nombre,
su contraseña, etc.
31
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Para entrar un nuevo usuario a la base de datos simplemente cogemos los valores
introducidos por el usuario y comprobamos que no estén ya en la base de datos o que
no coincida con el usuario ‘Anonymous’. Una vez ha pasado estos trámites el usuario
ya es introducido en el sistema.
4.2.2 servletRPC.java
Este servlet se encarga de la parte XML-RPC, en la que se utilizan los métodos de la
clase methods. Para este fin, utilizamos el método HTTP POST, el cual deberá ser
construido con los parámetros adecuados para poder llamar a la función deseada.
XmlRpcServer xrs = new XmlRpcServer();
xrs.addHandler("method",new Methods());
try {
byte[] datos=xrs.execute(request.getInputStream());
response.setContentType("text/xml");
response.setContentLength(datos.length);
response.setHeader("Cache-Control","no-cache, mustrevalidate");
OutputStream out = response.getOutputStream();
out.write(datos);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
Con este procedimiento podemos coger todas las peticiones xml-rpc que siguen la
especificación exacta del protocolo XML-RPC. Fijémonos bien en la sentencia
“response.setHeader("Cache-Control","no-cache,must-revalidate")”,
esto lo hacemos para asegurarnos que el navegador que reciba los resultados no los
guarde en la caché y erróneamente los utilice para dar futuros resultados con la misma
petición.
4.2.3 servletREST.java
Este último servlet se encarga de las peticiones REST, es decir, procesa los métodos
principales del protocolo HTTP (GET, PUT, POST y DELETE). Este servlet también hace
uso de los métodos de la clase ‘methods’. La diferencia principal con el servlet anterior
es que el anterior devolvía los resultados con un formato XML y en cambio este servlet
devuelve la salida directa en formato HTML. Es decir, este servlet es de gran uso para
hacer las peticiones rápidas sin necesidad de tratar resultados.
El funcionamiento de este servlet es sencillo. Las peticiones que puedes hacer siempre
serán con las cuatro instrucciones expuestas anteriormente, por tanto, en este servlet
32
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
tan solo miramos cuál de esas funciones es. Una vez dentro del método exacto,
tenemos que comprobar que la petición que nos han enviado contenga todos los
parámetros necesarios para realizar la acción, en este estado si no es correcto,
creamos una página de error.
Al devolver una respuesta, tenemos 4 tipos de páginas JSPs (response.jsp,
response1.jsp, response2.jsp, response3.jsp). Realmente la diferencia entre estas
páginas es como muestran los resultados.
-
Response: muestra todos los mensajes de error.
-
Response1: muestra la lista de canales y eventos.
-
Response2: muestra la información de un canal concreto.
-
Response3: muestra la información de un evento concreto.
Fig. 4.2.3 Esquema del flujo de la información.
Los métodos que permite ejecutar el servletREST son los que se explicaran en el
siguiente apartado. Tan solo hay un método que solamente puede ser invocado des de
la api REST, ese método es el “create_rss”. Este método utiliza un conjunto de clases
que están dentro el paquete RSS, que más adelante se explicarán. En ellas hay una
clase llamada RSS mediante la cual se consigue crear un archivo en formato XML (RSS).
Y es el encargado de crear los RSS de los canales del servidor.
33
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
4.3 Métodos de la aplicación
Para implementar todas las funcionalidades de la aplicación web se ha decidido crear
una clase ‘methods’, la cual contendrá todas las operaciones disponibles. Después,
cada servlet, ya es responsable de llamar a dichos métodos.
En un principio queríamos mantener la posibilidad de realizar cualquier operación de
manera anónima y sin ningún tipo de registro, pero dado que se quiere dar seguridad
en algunos aspectos, algunos de los métodos aquí expuestos requieren una
identificación para ser ejecutados, de lo contrario devuelven un error. Esta
identificación no es más que el usuario y la contraseña con la que se registra en el
sistema.
4.3.1 Methods.java
●
Esta primera función se encarga de comprobar si el usuario dado en (login y pass)
existe en la base de datos. Para realizar esta acción es necesario ejecutar la secuencia
SQL siguiente:
Si la instrucción no devuelve ningún valor, se prepara la página de error.
●
Está función permite crear un nuevo usuario en la base de datos. La instrucción SQL a
ejecutar es la siguiente:
En caso de que el usuario ya esté en la base de datos o el usuario introducido sea
incorrecto, la propia base de datos devuelve un error y el sistema construye la página
de error con dicho mensaje.
●
Esta operación lista todos los canales del sistema. El parámetro login solo es necesario
cuando el booleano ‘space’ está a ‘true’. Esto significa que solo se listaran esos canales
que sean del usuario ‘login’. Esto se hace así para facilitar la búsqueda entre canales.
Como se puede observar las operaciones que retornan valores, a no ser que sean tipos
sencillos como ‘Strings’ etc. Estos siempre devolverán vectores. Esto es así porque el
api XML-RPC nos obliga a poner este tipo de datos para la respuesta en formato XML.
34
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
//last_ones==0 && space=true
// last_ones==0&&space=false
// last_ones==1&&space=true
// last_ones==0&&space=false
Aquí se puede ver que dependiendo las opciones de búsqueda que se hayan
seleccionado se tienen diferentes sentencias SQL. La diferencia está en si solo se
buscaran los canales de dicho usuario y si solo se quiere listar los ‘x’ últimos canales.
●
Este método lista todos los eventos del sistema y se comporta de manera similar al
método anterior.
●
Esta operación devuelve un canal en concreto. Para realizar dicha operación se
requiere la autenticación del mismo usuario para validar, si fuese el caso en que el
canal fuese privado, que el usuario tuviera privilegios para poder verlo.
Para realizar la operación se siguen diferentes fases:
1- Se comprueba que el canal que se quiere listar exista.
2- Si el canal es privado, comprobamos si el usuario existe en la base de datos y si
tiene privilegios para poderlo ver.
3- Acto seguido se seleccionará el canal y sus parámetros para poder mostrarlo.
Estas son las sentencias SQL necesarias para realizar la operación.
●
Está operación se comporta exactamente que la anterior, pero en este caso lo que se
va a listar es un evento en concreto. Se requiere un usuario y una contraseña para
verificar, en el caso de que el evento esté en un canal privado, que dicho usuario tenga
35
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
derecho a verlo. Se requiere incluir el canal en el cual está, ya que un mismo título de
un evento podría estar en diferentes canales.
Estas son las instrucciones SQL necesarias para realizar la acción.
●
…
…
Esta operación nos permite enviar un evento, en principio, a cualquier canal de forma
anónima. En caso de que el canal al cual queramos enviar un evento sea privado, se
requiere una identificación mediante un login y una contraseña. Los pasos que se
siguen para realizar dicha acción son los siguientes:
1. Comprobar que el canal al cual queremos hacer el envío existe en el sistema.
2. Comprobar si el canal es privado, y si es así mirar si el usuario existe y tiene
privilegios para poder realizar el envío.
3. En caso afirmativo empezaremos a enviar el evento.
●
…
…
…
…
Esta operación nos permitirá introducir un canal en el sistema. Hay que decir que es
necesario para realizar dicha acción haberse registrado en el sistema. Cuando se crea
un canal se da la posibilidad de sindicarlo a otro servidor, canal, etc. También podemos
optar por ponerlo como privado y elegir los usuarios de la base de datos a los que
daremos permisos para que puedan postear eventos.
36
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Para crear esta funcionalidad, hemos utilizado AJAX que funciona de la siguiente
manera: cuando el usuario presiona el botón “prívate” para hacerlo privado. El
navegador envía una petición al servidor pidiendo todos los usuarios de la base de
datos que más tarde se listan en el cliente otra vez, pareciendo que solo eso se ha
cargado. Aquí es donde podemos ver una utilización óptima de las ventajas de AJAX. El
código asociado a esta acción sigue de esta manera:
Con esta pequeña función creamos el objeto o bien para Microsoft (Explorer) o bien
para Mozilla (Firefox). Este objeto (XMLHttpRequest ()) nos permitirá llamar a
funciones especificas de AJAX. Seguidamente veremos cómo llamamos al método de
listar los usuarios mediante el objeto comentado anteriormente:
…
En el método “open” especificamos el comando HTTP que queremos enviar, a la url
especifica y en el “xmlbody” incluimos los parámetros necesarios para llamar a la
función…
Volviendo a la operación “put_channel”, lo primero que comprobamos antes de crear
el nuevo canal es, si el usuario existe en la base de datos realmente. Seguidamente ya
procedemos a insertar los datos del canal, siempre y cuando no esté ya repetido en el
servidor.
Esta última sentencia SQL sirve solo en caso de que el canal sea privado, ya que ahora
lo que hacemos es introducir los usuarios que tendrán acceso a dicho canal para
postear o ver sus eventos.
37
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
●
Esta operación elimina un canal y todos sus eventos. Por este motivo es necesario que
el usuario que llame a esta función se identifique con un usuario y una contraseña para
validar que el canal sea suyo.
El primer paso es validar que el usuario exista realmente, y después se mira que sea el
creador del canal y que dicho canal también exista realmente. Las sentencias SQL
utilizadas son las siguientes:
…
…
●
Esta operación está pensada para sindicar un canal ya creado a otro servidor o canal
RSS. Para eso debes ser el creador de dicho canal, por eso es necesario un usuario y
una contraseña para la validación. A más, como es lógico debe proporcionarse la url
donde está almacenado el RSS.
Dentro de esta función se llama a un conjunto de clases almacenadas dentro del
paquete RSS. Este conjunto de clases se encarga de la gestión de los RSS (como puede
ser, la sindicación, la creación del RSS de los canales y la programación automática
para ir actualizando los RSS a los que nos hayamos sindicado). No se puede escoger el
tiempo de actualización, que por defecto se ha considerado 60 segundos.
Para lograr esto, se ha recurrido al “timer” de java. A parte se ha creado la clase
“RSSTask” que extiende de “TimerTask” y donde hay el método “run ()”. Este se
encarga de ir leyendo los RSS e ir actualizándose. A continuación tenéis el código
utilizado para coger el RSS.
Volviendo a la operación básica, los pasos que se siguen para añadir un RSS a nuestro
canal son los siguientes:
1. Comprobar que el usuario exista realmente en la base de datos.
2. Comprobar que el canal exista y el usuario sea su creador real.
38
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
●
Finalmente tenemos la última operación disponible que es la de listar todos los
usuarios del sistema. Esta operación es utilizada para privatizar los canales y escoger
que usuarios pueden tener privilegios y cuáles no. Anteriormente ya describimos como
lo hacíamos mediante AJAX.
La única sentencia SQL necesaria para realizar esta acción es la siguiente:
4.4 Gadgets implementados
Una vez teníamos hecho el servidor, queríamos añadir algún tipo de cliente para
probar la aplicación y nos decidimos por crear dos gadgets. Un gadget consiste en un
mini chat, que lo único que hace es listar los eventos que hay en un canal cada ‘x’
segundos. Para hacer esto, lo que hacemos es suscribirnos a un canal, con lo cual
recibimos su RSS. Si esto lo hacemos cada ‘x’ segundos, podemos ver cada vez cuantos
eventos hay en el canal y por tanto podemos ir listándolos, mediante AJAX, como si
fuera un chat vía web.
Esta es la función básica que está continuamente enviando los mensajes que se
escriben y recibiendo los eventos nuevos que se incorporan en el canal. Al mismo
tiempo cada vez que recibimos el RSS del canal, debemos procesarlo para coger los
eventos y escribirlos en pantalla.
39
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Como podemos ver solo mostramos el apartado JavaScript, ya que el resto del código
es simple código HTML que se encarga de la interfaz grafica del usuario.
Fig. 4.4.1 Chat creado con Google Gadgets
El segundo gadget implementado es parecido al anterior. Este consiste en ir listando
cada ‘x’ segundos los comentarios sobre un canal, evento, etc. Básicamente hace
exactamente lo mismo. Reservamos un canal, en el cual vamos a incluir todos los
eventos que hacen referencia a comentarios sobre algún canal o eventos. El gadget se
suscribe a él mediante RSS y cada ‘x’ tiempo vamos listando su contenido. A más
podemos enviar un mensaje mediante dicho gadget que se listará en el canal de
mensajes como uno nuevo.
40
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 4.4 Comments creado con Google Gadgets.
41
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
4.5 Interfaz de usuario
Como hemos comentado anteriormente, esta aplicación web permite dos tipos de
interacción con el servidor. Una en segundo plano mediante XML-RPC o mediante el
api REST. Seguidamente voy a describir la interfaz gráfica utilizada.
La página web principal muestra en la parte derecha de la pantalla el conjunto de
opciones que se pueden realizar. Estas opciones siempre serán mostradas seas el
usuario que seas, es decir, aunque seas un usuario anónimo, serás capaz de ver estas
opciones pero no podrás llevarlas a cabo si se requiere autenticación para ello.
Justo encima de estas opciones, sobre el logotipo de la web, encontramos un pequeño
formulario que nos permitirá entrar en el sistema con un usuario y una contraseña.
Este panel también será mostrado en todos los estados posibles de la web. Si somos
nuevos y todavía no hemos realizado un registro, podemos hacerlo mediante el link
“here” que se muestra en el panel rojo de más abajo. Como podemos ver, en este
panel siempre habrá un mensaje de bienvenida indicando si eres anónimo o un usuario
registrado.
Para realizar las acciones, se abre otra página web que mediante formularios recoge
toda la información necesaria. Seguidamente es procesada mediante servlets.
Fig. 4.5 Interfaz web.
42
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Fig. 4.6 Formularios.
Hay dos apartados más en la interfaz web que nos presentan las diferentes Apis con las
que podemos interactuar con el servidor. Estas Apis nos dan una descripción detallada
de cómo debemos realizar los comandos REST (GET, POST, PUT, DELETE)
correctamente para poder hacer la petición. También se encuentra la descripción para
poder comunicarnos con el servidor mediante el protocolo XML-RPC.
Fig. 4.7 Apis REST y XML-RPC.
43
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
En cuanto a los errores, estos se muestran al cliente mediante la clase “response.jsp”,
en ella se especifica, justo en el título, el servlet que ha provocado la excepción y abajo
se especifica el mensaje de error.
Algunos mensajes son errores concretos que pueden venir ocasionados por la falta de
datos en un formulario, o por datos mal formados en un formulario o incluso que la
acción realizada ha producido algún tipo de error. Otros errores vienen directamente
de la base de datos. Esto ocurre cuando por ejemplo queremos introducir un canal,
cuyo nombre ya existe en la base de datos. En estos casos el error que nos aparecerá
en pantalla tendrá una sintaxis SQL, ya que será un error devuelto por la base de datos.
Fig. 4.8 Error provocado por la base de datos.
Como podemos ver en la figura anterior, ya existe un usuario en la base de datos con
el nombre de ‘admin’, por este motivo el servlet_reg, que se encarga de la entrada de
usuarios en el servidor no avisa que ha sucedido un error provocado por la base de
datos SQL.
Fig. 4.9 Error provocado por el propio servlet.
En cambio en este otro error podemos observar, que aun y haberse provocado en el
mismo servlet (servlet_reg), el mensaje es distinto y ha sido provocado por introducir
un login o contraseña incorrecta.
Se han controlado todos los errores posibles en la interfaz web, excepto los RSS. Estos
en particular no podemos validar que la dirección que se ponga en el campo RSS sea
una dirección válida, o que, si la dirección hace referencia a un canal privado, que
tengas privilegios para poderte suscribir a ese canal.
Por otro lado, todos estos errores se muestran tanto en la interfaz gráfica (web) como
en las otras formas de comunicación con el servidor.
44
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
4.6 Metodología de desarrollo
Antes de todo, hay que aclarar que ninguna de estas etapas se ha realizado con un
inicio y un final claro, sino que se ha empezado a realizar y cuando supuestamente se
ha pensado que el trabajo de esa etapa estaba finalizado se ha empezado la siguiente
etapa. Pero si en algún momento hemos visto oportuno retocar, añadir o modificar
algún aspecto de la etapa anterior, se ha hecho. De esta manera se ha ido
perfeccionando cada una de las etapas a medida que se iba construyendo la aplicación.
La metodología de desarrollo que hemos seguido ha sido primeramente, diseñar la
base de datos. Que tablas tendría que tener, las relaciones entre dichas tablas, etc. Las
instrucciones que darían acceso a estas tablas se han creado junto con las clases que
se iban programando. La creación de todas las clases ha sido la siguiente etapa. En la
cual se ha pensado las posibles clases que podría tener la aplicación.
Es decir, antes de ponernos a hacer el diseño web o la interfaz grafica, hemos definido
los servlets que darían respuesta a todas las peticiones de los clientes. Cada uno de
estos servlets se encargaría de llamar a las funciones correspondientes para realizar
una acción. Una vez finalizada dicha acción el resultado sería devuelto en el formato
correspondiente a cada servlet. Digo esto, porque cada servlet se diferencia del otro
por la salida de datos. De este modo, por ejemplo, el servlet ‘REST’ da una salida de
datos codificados en HTML que se utiliza para ser vista des de un navegador
cualquiera. En cambio, el servlet ‘XML-RPC’ da una salida de datos codificado en un
archivo xml, para poder ser tratado por una aplicación secundaria.
Una vez hechos estos servlets y las clases que nos proporcionarían los métodos para
realizar todas las acciones. Se ha diseñado las clases secundarias que han ido
surgiendo según las necesidades de la web. Un ejemplo de esto sería la necesidad de
registrar un usuario, por lo tanto se han hecho las clases necesarias para poder guardar
la información de un usuario y clases encargadas de gestionar el estado del usuario
(conectado, no conectado, anónimo, registrado…). También para la sindicación RSS se
ha tenido que programar más clases que dieran soporte a estas acciones.
Finalmente, ya solo faltaba empezar el diseño grafico de la web. Para ello, se han
cogido distintos gráficos de internet, ya hechos. Y se ha diseñado las tablas para poder
poner estos gráficos, los textos y opciones que darían cuerpo a lo que sería el sitio
web. Esta tarea ha dado casi tanto trabajo como la programación de las clases. Ya que
se mantienen muchas páginas web para dar respuesta a errores, resultados, vistas, etc.
Una vez ya finalizado el aspecto gráfico de la web se ha implementado los gadgets para
crear un pequeño cliente que probara el servidor.
45
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
5.- RESULTADOS
Para probar toda la aplicación web se requieren muchos tipos de pruebas. Por un lado
se necesitaría probar la aplicación desde su interfaz grafica. Lo cual lo hemos hecho
personalmente probando todas las posibles acciones. Cuando los resultados son
buenos, se realiza la acción y se nos muestra su correspondiente mensaje. Al igual pasa
cuando la acción realizada por algún motivo ha fallado y se nos muestra también su
correspondiente mensaje de error.
En el proceso de prueba con la sindicación RSS tuvimos un pequeño problema. Y es
que en un principio solo se contempló la posibilidad de poder suscribir nuestro canal a
otros RSS, pero después de ciertas pruebas observamos que también existe otro
formato parecido al RSS, que es el RDF, y que no sigue el mismo formato que el RSS. Lo
que hicimos fue adaptar la sindicación de tal forma que ahora se pueda sindicar
nuestro canal tanto a un RSS como a un RDF. Hicimos diferentes pruebas y fueron
satisfactorias. En cuanto a las acciones normales del servidor, probamos de añadir un
canal, sindicarlo a otro, añadirle parámetros, añadirle eventos, listarlo y borrarlo.
Todas estas acciones funcionaron correctamente y en caso contrario mostraron un
mensaje de error totalmente comprensible. También hicimos lo mismo con las
acciones que hacen referencia a los eventos y de igual forma funcionaron
correctamente.
Hay que añadir aquí, que en teoría queríamos que nuestro servidor fuera totalmente
libre, sin necesidad de pedir usuarios ni contraseñas. Pero al querer incorporar la
posibilidad de admitir canales privados nos vimos obligados a implementar métodos
más seguros, es decir, a pedir nombres de usuarios y contraseñas, que han dificultado
un poco la implementación.
En cuanto a otras formas de utilización de nuestro servidor. Nos hicimos una pequeña
aplicación que mandaba mensajes HTTP con los métodos GET, POST, PUT y DELETE. En
todos ellos tuvimos éxito en su ejecución. Las acciones de cada método se realizan y
los resultados son devueltos en formato HTTP que pueden ser interpretados por
cualquier navegador. En la página web de la aplicación se encuentra la especificación
exacta de cómo formar los distintos mensajes para enviarlos.
Siguiendo con la otra forma de utilización del servidor, con el protocolo XML-RPC,
también nos hicimos un pequeño programa, el cual se encargaba de enviar mensajes
POST con sus correspondientes parámetros, tal y como específica el protocolo XMLRPC. En este caso hemos ejecutado todas las operaciones posibles y el resultado ha
sido positivo. Sus acciones se realizaban y nos devolvía el resultado en formato XML tal
y como específica el protocolo. Esto lo hace tanto si el resultado es positivo como si lo
es negativo.
46
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
Una vez visto que las principales acciones funcionan de todas las maneras posibles, se
ha comprobado que también funcionen bajo otras circunstancias susceptibles de que
traigan errores como listar eventos de un canal privado siendo un usuario anónimo,
sindicarme a un canal privado sin permisos, dar privilegios a los usuarios para que
puedan ver mi canal privado, listar los ‘x’ últimos canales/eventos añadidos en el
servidor, etc.
Finalmente para crear un cliente y ver realmente que funcionaba todo, hemos creado
2 gadgets que utilizan el api REST para mandar mensajes y reciben un resultado en
formato XML (en la sindicación de un canal). En este apartado hemos tenido un
problema de seguridad que está asociado al objeto ‘XMLHttpRequest’ de AJAX.
Exactamente consiste en que los métodos de este objeto como ‘open (“url”,…)’ no
pueden acceder a cualquier servidor que no sea el mismo del cual procedan. Es decir,
que en el parámetro “url” no podemos poner el servidor que nosotros queramos, solo
nos permite poner la misma url que nos ha enviado dicho script AJAX. Esto es así para
evitar problemas de seguridad en que un posible componente AJAX se nos pudiera
conectar a otro servidor e intercambiar con él información comprometedora. Esto se
comprobó en el momento que subimos un gadget al directorio de google gadgets. Lo
que quisimos es, acceder a ese gadget de google y que dicho gadget utilizara mi
servidor para listar los eventos de un canal concreto. Pues bien, lo que estábamos
haciendo exactamente era acceder a otro dominio distinto del de google, que era
donde estaba colgado nuestro gadget. Con lo cual en cualquier navegador nos
mostraba el mensaje de ‘permiso denegado’.
Ante este error, si lo que queríamos era, que mediante un gadget de google
pudiéramos acceder a nuestro servidor, lo que hicimos fue alojar este script AJAX en
nuestro servidor, y el gadget que almacenábamos en el directorio de google
simplemente era un código en el cual hacía referencia a nuestro servidor donde tenía
que ir a buscar el código real del gadget. Así en la página principal de google se abría el
gadget, pero realmente lo estaba buscando en mi servidor. De esta manera, ahora si
funcionaba ya que las llamadas a mi servidor se producían en el mismo dominio y no a
una “url” distinta.
A modo de conclusión, se puede decir que todas las pruebas llevadas a cabo con el
servidor y con los gadgets de google han sido satisfactorias demostrando un correcto
funcionamiento del sistema web.
47
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
6.- CONCLUSIÓN
Después de realizar un gran número de pruebas y de obtener los correspondientes
resultados, considero que se han alcanzado los objetivos iníciales de este proyecto. Y
que utilizando el servidor web implementado como a middleware se puede ahorrar
mucho trabajo a futuros programadores de servicios web, como en la implementación
de foros, canales de noticias, etc.
Del diseño del sistema se pueden extraer las siguientes conclusiones. En primer lugar
decir que la utilización de la tecnología AJAX permite dar un paso más en la
programación web. En el sentido de comodidad al cliente, ya que da la sensación de
estar programando una aplicación casi de escritorio y no las típicas aplicaciones web
donde en cada momento estamos cargando el contenido del sitio web. Por otra parte
también hemos visto que depende el uso que hagamos de AJAX lo que podemos
conseguir es que el servidor trabaje más de lo debido y por tanto lo sobrecarguemos
mas. Todo depende de la cantidad de peticiones que hagamos al servidor. También
destacar que el hecho de dar al servidor la característica de recibir y responder
peticiones mediante la api REST y el protocolo XML-RPC permite al sistema dar al
cliente una mayor usabilidad y facilidad en cuanto al uso de dicho servidor como
middleware. Y finalmente el uso de la sindicación vía RSS o RDF, ha permitido dar un
paso más en la comunicación entre servidores y permitir crear una red donde
cualquier servidor puede estar comunicado al instante de cualquier evento en
cualquier otro servidor.
En el ámbito personal, la realización de este proyecto ha sido muy enriquecedora, ya
que me ha permitido conocer casi todas las tecnologías que envuelven una aplicación
web. Por ejemplo, y como gran novedad, la tecnología AJAX. Que al mismo tiempo que
hablamos de AJAX, también hablamos de javascript. Por tanto esta tecnología te obliga
a comprender este lenguaje de programación en el cliente. Con los distintos métodos
de comunicación que permite este servidor también he podido aprender nuevos
protocolos, a parte del HTTP (REST), como es el XML-RPC, que incluso y trabajar bajo
HTTP, sus parámetros son muy diferentes. Y sin dejar de lado, el diseño de una base de
datos comunicándose con servlets de JAVA, que pese a haber hecho algo en la
universidad, con este proyecto he consolidado todavía más todas estas tecnologías y
una vez finalizado el proyecto me he visto capaz de realizar aplicaciones web más
complejas y con las nuevas tecnologías existentes.
48
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
7.- TRABAJO FUTURO
Como he podido observar, crear una aplicación web conlleva un trabajo muy laborioso,
y por tanto esta aplicación web podría mejorarse mucho en cuanto a calidad y
funcionalidades. Como por ejemplo:
-
Añadir más funciones a la interfaz grafica para que los clientes que envían
eventos les sea más fácil esta tarea.
-
Permitir investigar más sobre la escalabilidad del sistema. Comprobar cuántos
clientes pueden conectarse y enviar peticiones y ver sus límites. Y respecto a
esto intentar crear métodos para repartir el trabajo entre distintos servidores
etc.
-
Añadir más formas de comunicarse con el servidor, como por ejemplo, dar la
posibilidad, con el api REST actual, de recibir las respuestas en formato JSON.
Para facilitar todavía más al cliente, el tratar la respuesta del servidor.
Realizando estos cambios conseguiríamos una aplicación web más rica y al mismo
tiempo un sistema más robusto para aguantar un gran volumen de información.
49
SERVIDOR PUBLISH/SUBSCRIBE Raúl Llorach Sánchez
8.- RECURSOS UTILIZADOS
→ http://es.wikipedia.org/wiki/Portada
Esta página web es una gran enciclopedia, que me ha permitido buscar gran
información sobre conceptos en general, (REST, XML-RPC, RSS, RDF, AJAX, etc.).
→ http://www.xmlrpc.com/spec
En esta página web se encuentran todas las especificaciones exactas para poder
trabajar de forma correcta con el protocolo XML-RPC.
→ http://www.rss-specifications.com/rss-specifications.htm
En esta página web se encuentran todas las especificaciones sobre el formato xml que
sigue el RSS. Sus campos, valores, etc.
→ http://www.xfront.com/REST-Web-Services.html
En esta web encontramos una gran explicación de los servicios que funcionan
mediante REST. Da ejemplos y ayuda a comprender su funcionamiento.
→ http://www.dynamicajax.com/
En esta página web encontramos cantidad de tutoriales para adentrarse en el mundo
AJAX.
→ http://dev.mysql.com/doc/refman/5.0/es/index.html
Sitio web donde se encuentra un completo manual sobre la configuración y utilización
de la base de datos MYSQL.
→ http://java.sun.com/j2se/1.5.0/docs/api/
El Api de java utilizado.
50
Descargar