Tabla de Contenidos

Cómo crear un Canal RSS

RSS son las siglas de Rich Site Summary, un formato XML para compartir contenido en la web. Se utiliza para difundir información actualizada frecuentemente a usuarios que se han suscrito a la fuente de contenidos. A continuación explicamos como integrarlo en tu aplicación

El primer paso para la creación de este servicio es comprobar que tenemos cargada la librería Seam jboss-seam-rss que, en principio, ya está incluida en el arquetipo de la aplicación y por lo tanto cargada en nuestro proyecto base.

Cración de entidades

Lo primero que tenemos que hacer es crear en nuestro esquema de base de datos, dos tablas que como mínimo deben tener, los siguientes campos y restricciones:

  CREATE TABLE "FUNDEWEB"."ENTRY"
  (
    "ID"      VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "TITLE"   VARCHAR2(150 BYTE) NOT NULL ENABLE,
    "LINK"    VARCHAR2(200 BYTE),
    "AUTHOR"  VARCHAR2(20 BYTE),
    "SUMMARY" VARCHAR2(256 BYTE),
    "PUBLISHED" DATE,
    "UPDATED" DATE,
    "ID_FEED" VARCHAR2(20 BYTE),
    CONSTRAINT "ENTRY_PK" PRIMARY KEY ("ID") USING INDEX PCTFREE 0 
    INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 
    MAXEXTENTS 10 PCTINCREASE 0 FREELISTS 1 FREELIST 
    GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "FUNDEWEB" ENABLE,
    CONSTRAINT "ID_FEED_FK1" FOREIGN KEY ("ID_FEED") 
    REFERENCES "FUNDEWEB"."FEED" ("ID") ENABLE
  )
  TABLESPACE "FUNDEWEB" ; 
  
  CREATE TABLE "FUNDEWEB"."FEED"
  (
    "ID"       VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "TITLE"    VARCHAR2(100 BYTE) NOT NULL ENABLE,
    "SUBTITLE" VARCHAR2(256 BYTE),
    "UPDATED" DATE,
    "LINK" VARCHAR2(100 BYTE),
    CONSTRAINT "FEED_PK" PRIMARY KEY ("ID") USING INDEX PCTFREE 0 
    INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 
    16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 10 PCTINCREASE 0 
    FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 
    TABLESPACE "FUNDEWEB" ENABLE
  )
  TABLESPACE "FUNDEWEB" ; 
  

Estas tablas contienen la mínima información para un RSS. En la Tabla Feed, cada entrada representa un Rss o feed que queremos sindicar en un fichero xml. Las entradas de cada uno de estos Rss se almacenan en la tabla entry. Tras crear estas tablas en base de datos, debemos crear los POJO (clases java que los representa) respectivos para poder tratar los datos introducidos en ambas desde nuestra aplicación.

El POJO que contenga a la entidad Feed debemos añadirle una consulta namedQuery para poder recuperar el RSS adecuado desde el bean de respaldo.

 @NamedQuery(name = "feed.findById", query = "SELECT feed FROM Feed feed WHERE feed.id = :id")  

Bean de respaldo

Es necesario crear un bean de respaldo para recuperar nuestro rss (feed) y las entradas asociadas a el. Una vez recuperado, las pasamos a la vista que se encargará de ir metiendo cada propiedad de las entradas del feed, en su etiqueta correspondiente. El usuario se abstrae de esta operación, que realiza Seam por medio de la libreía añadida jboss-seam-rss.

package org.umu.atica.components;
 
import javax.persistence.EntityManager;
import javax.persistence.Query;
 
import model.entity.Feed;
 
import org.jboss.seam.annotations.Create;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
 
@Name("rss")
@Scope(ScopeType.APPLICATION)
public class RssNovedades {
 
    public static final long RSS_ID = 1;
 
    @In
    private EntityManager entityManager;
 
    private Feed feed;
 
 
 
   @Create
   public void create() {
       Query q = entityManager.createNamedQuery("feed.findById").setParameter("id", RSS_ID);
       this.feed = (Feed) q.getSingleResult();
   }
 
    public Feed getFeed() {	
	return this.feed;
    }
 
    public void refreshFeed() {
	feed = this.entityManager.find(Feed.class,this.feed.getId());
	this.entityManager.refresh(feed);
    }
 
}

Fichero xhtml

Finalmente, tenemos que diseñar como será el diseño del RSS de cara al usuario y que propiedades vamos a mostrar. Destacar la importancia de usar la etiqueta r:feed proporcionada por la librería jboss-seam-rss. Esta librería se encarga de la creación del xml correspondiente a las entradas con la estructura que un RSS debe tener.

Cabe destacar que el código mostrado a continuación debe estar en un fichero xhtml independiente del resto y no integrado en ningún otro.

<rss:feed xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rss="http://jboss.org/schema/seam/rss"
	xmlns:h="http://java.sun.com/jsf/html"
	title="#{rss.feed.title}"
	uid="#{rss.feed.id}" subtitle="#{rss.feed.subtitle}"
	updated="#{rss.feed.updated}" link="#{rss.feed.link}">
 
	<ui:repeat value="#{rss.feed.entries}" var="entry">	
		<rss:entry uid="#{entry.id}" title="#{entry.title}" link="#{entry.link}"
			author="#{entry.author}" summary="#{entry.summary}"
			published="#{entry.published}" updated="#{entry.updated}" />
	</ui:repeat>
 
</rss:feed>

Como añadir CORS

Para permitir peticiones cross-domain, hemos añadido el elemento <rss:cors>, que es hijo al elemento <rss:feed>. Veamos un ejemplo:

<rss:feed xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rss="http://jboss.org/schema/seam/rss"
	xmlns:h="http://java.sun.com/jsf/html"
	title="#{rss.feed.title}"
	uid="#{rss.feed.id}" subtitle="#{rss.feed.subtitle}"
	updated="#{rss.feed.updated}" link="#{rss.feed.link}">
 
	<rss:cors allowOrigin="*" />
 
	<ui:repeat value="#{rss.feed.entries}" var="entry">	
		<rss:entry uid="#{entry.id}" title="#{entry.title}" link="#{entry.link}"
			author="#{entry.author}" summary="#{entry.summary}"
			published="#{entry.published}" updated="#{entry.updated}" />
	</ui:repeat>
 
</rss:feed>

En este ejemplo, permitimos todos las peticiones cross-domain, pero se pueden restringir, ya sea por puerto, dominio, protocolo, etc.

Las propiedades disponibles son las siguientes:

Una petición preflight, es la que se utiliza para verificar que se pueden establecer peticiones cross-domain desde determinados dominios y métodos HTTP.

Bibliografía