====== 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.
==== Como añadir CORS ====
Para permitir peticiones //cross-domain//, hemos añadido el elemento ////, que es hijo al elemento ////. Veamos un ejemplo:
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:
* **//allowOrigin//**: indica el control de acceso. Es el valor especificado en la cabecera de respuesta //Access-Control-Allow-Origin//.
* **//allowMethods//**: indica los métodos HTTP permitidos para la petición. Es el valor especificado en la cabecera de respuesta //Access-Control-Allow-Methods//. El valor por defecto es //GET//.
* **//allowHeaders//**: indica la lista separada por comas de cabeceras soportadas. Es el valor especificado en la cabecera de respuesta //Access-Control-Allow-Headers//.
* **//allowCredentials//**: indica que en la petición se deben añadir las credenciales. Es el valor especificado en la cabecera de respuesta //Access-Control-Allow-Credentials//. El valor por defecto es //false//.
* **//exposeHeaders//**: indica las cabeceras adicionales que exponen al cliente. Es el valor especificado en la cabecera de respuesta //Access-Control-Expose-Headers//. Las cabeceras que se exponen por defecto al cliente son:
* //Cache-Control//
* //Content-Language//
* //Content-Type//
* //Expires//
* //Last-Modified//
* //Pragma//
* **//maxAge//**: indica el tiempo de validez de una respuesta a una petición //preflight//. Es el valor especificado en la cabecera de respuesta //Access-Control-Max-Age//. El valor por defecto es 86400 segundos (es decir, 24 horas). Indica el tiempo que se cachea la respuesta en el navegador, para permitir realizar menos peticiones //preflight//.
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 ====
* [[https://docs.jboss.org/seam/2.3.1.Final/reference/html/rss.html| JBoss Seam Reference - Chapter 21 - RSS Support]]
* [[https://www.html5rocks.com/en/tutorials/cors/|Using CORS]]
* [[http://enable-cors.org|Enable cross-origin resource sharing]]
* [[https://www.w3.org/TR/cors/|W3C - Cross-Origin Resource Sharing]]
* [[https://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/|Cross-domain Ajax with Cross-Origin Resource Sharing]]
* [[https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS|CORS - Control de acceso HTTP]]