Crea tus Feed con RSS o Atom con Spring 3.0 y REST

Tags: , , , , ,

Hola Gente, regreso a las andadas varios meses después con una serie de artículos sobre Spring 3.0. El primero de ellos sera de unas clases nuevas que nos ofrece Spring MVC 3.0 para crear nuestros propios Feed con 2 formatos diferentes, RSS 2.0 o Atom.

Primero vamos a conocer las 2 clases abstractas disponibles desde Spring 3.0 que vamos a usar

AbstractRssFeedView

AbstractFeedView es la clase para crear  nuestra vista principal de RSS y esta a su vez se extiende de AbstractView nos ofrece metodos para crear los encabezados de nuestro RSS.

AbstractAtomFeedView

Esta clase abstracta extiende de AbstractAtomFeedView y esta tambien se extiende de AbstractView.

No es posible crear una sola clase para manejar los dos formatos, asi que trabajaremos solamente con RSS, el proceso para ATOM es practicamente el mismo.

Extendemos AbstractRssFeedView y creamos la siguiente vista. Se deben implementar 2 metodos obligatoriamente, el primero es para crear el encabezado del RSS (ojo, si no lo llenas bien recibiras una bonita excepcion) y el otro metodo es para setear todo el cuerpo del RSS.

public final class MyViewFeedRssView extends AbstractRssFeedView {
 
    /**
     * En el caso de los RSS debemos crear el Channel, parece la gente de Spring se olvido de hacerlo por nosotros, ojo
     * con llenar bien el Channel.
     */
    @Override
    protected Channel newFeed() {
        final Channel channel = new Channel("rss_2.0");
        channel.setPubDate(new Date());
        channel.setDescription("RSS Description");
        channel.setTitle("TITLE");
        channel.setLink("link");
        channel.setCopyright("2010");
        channel.setPubDate(new Date());
        return  channel;
    }
 
    /**
     * Build Feed Entries.
     */
    @SuppressWarnings("unchecked")
    @Override
    protected List buildFeedEntries(Map model, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
         // Obtenemos las entradas que vienen en el modelo desde el Controller
        List contentList = (List) model.get("entries");
        // Creamos una lista de clase de Item, el objeto de ROME que refleja cada elemento del RSS
        List entries = new ArrayList(contentList.size());
        // Iteramos nuestras entradas del blog
        for (EntriesBlog content : contentList) {
                   final Item item = new Item();
            String date = String.format("%1$tY-%1$tm-%1$td", content.getPublicationDateTweet());
            item.setTitle(String.format("On %s, %s publish", date, content.getQuestionBean().getQuestionName()));
            item.setPubDate(content.getPublicationDateTweet());
            item.setLink("http://www.encuestame.org");
            entries.add(entry);
        }
        return entries;
    }
}

Para que esta vista pueda ser interpretada por el MVC de Spring, debemos definir un RESOLVER para que pueda encontrar nuestra vista de RSS, yo siempre le doy un orden prioritario, por si tuvieramos otros RESOLVERS definidos en nuestro MVC.
Tambien agregamos como un Bean nuestra nueva vista y recordemos el ID que pronto lo usaremos.

Ahora vamos con el Controller, que es el encargado de recibir la peticion del Dispacher Servlet , usaremos Anotaciones y mapeo con REST porque somos muuuuu modernos :) . Yo extendi de una clase abstracta, que no tiene nada pero no es necesario para nuestro ejemplo.

@Controller
public class RSSFeedController extends AbstractFeedController {
 
    /**
     * Build Feed Body.
     */
    private void buildTweetPollFeedBody(String username, Model model, HttpServletRequest request, User user){
         model.addAttribute("username", username);
         model.addAttribute("feedTitle", String.format(TWEET_POLL_FEED_TITLE, username));
         model.addAttribute("url", buildDomainWithRequest(request));
         //buscamos nuestras entradas de nuestro blog, por poner un ejemplo
         final List entries = getEntries(user.getUsername());
          // las guardamos en el modelo que pasaremos a la vista y usaremos mas adelante.
         model.addAttribute("entries", entries);
    }
 
    /**
     * Display RSS Feed.
     */
     // Utilizar REST es sencillo, solo debemos definir la variable entre llaves y llamarla con la anotacion @PathVariable
    @RequestMapping(value = "/feed/{username}/entries.rss", method = RequestMethod.GET)
    public String tweetPollRss(@PathVariable String username, Model model, HttpServletRequest request) {
       // Como queremos utilizar el mismo RSS para diferentes usuarios, buscamos nuestro usuario.
        final User user = getByUsername(username);
        if(user == null){
            //TODO: if null do something.
        }
        else{
             // Como somos muy ordenados creamos otro metodo.
            this.buildTweetPollFeedBody(username, model, request, user);
        }
        // Aqui regresaremos una cadena, que no es mas que el ID de nuestra VISTA del Bean RSS.
        return "rssFeedView";
    }
}

Una vez creada toda esta estructura, lo siguiente es pan comido, simplemente cargar en el url la direccion de la siguiente manera, sustituyendo la variable {username} por el usuario virtual para que nos regrese los RSS de ese usuario.

http://localhost/feed/bonachon/entries.rss

Preguntas?

Symfony, el Struts e Hibernate del PHP

Tags: , , , , ,

symfony-logo

Después de un tiempo escribiendo sobre Frameworks de Java, voy a regresar un poco a mis inicios, a PHP, yo he sido un programador de los que decian, los Frameworks atrasan (al menos en mi tiempo), pero debido a mi reciente experiencia con Spring Framework me di cuenta de las grandes ventajas de un Framework y decidí buscar el mejor para PHP.

Symfony es un completo framework diseñado para optimizar, gracias a sus características, el
desarrollo de las aplicaciones web

Symfony es un completo framework diseñado para optimizar, gracias a sus características, el desarrollo de las aplicaciones web, está desarrollado completamente con PHP 5. Ha sido probado en numerosos proyectos reales y se utiliza en sitios web de comercio electrónico de primer nivel. Symfony es compatible con la mayoría de gestores de bases de datos, como MySQL, PostgreSQL, Oracle y SQL Server de Microsoft.

Estas son algunas de sus caracteristicas:

sfACTION, Capa de Presentación

Toma lo mejor de la arquitectura MVC y la implementa de forma que el desarrollo de aplicaciones sea rápido y sencillo, en el siguiente gráfico se puede apreciar como es el flujo de trabajo, y aqui es donde hago a similitud con Struts, donde los ActionServlet y los sfAction tienen caracteristicas parecidas a la hora de manejar las peticiones en la capa de presentación.

mvcsymfony

El flujo de trabajo de Symfony

PROPEL, Acceso a Datos

La lógica de negocio de las aplicaciones web depende casi siempre en su modelo de datos. El componente que se encarga por defecto de gestionar el modelo en Symfony es una capa de tipo ORM realizada mediante el proyecto Propel. En las aplicaciones Symfony, el acceso y la modificación de los datos almacenados en la base de datos se realiza mediante objetos; de esta forma nunca se accede de forma explícita a la base de datos. Este comportamiento permite un alto nivel de abstracción y permite una fácil portabilidad. Practicamente es el Hibernate del PHP, creo que quedó mas que claro.

YALM, Configuración del Sistema

YAML (“YAML Ain’t Markup Language”) es un lenguaje muy sencillo que permite describir los datos como en XML, pero con una sintaxis mucho más sencilla. YAML es un formato especialmente útil para describir datos que pueden ser transformados en arrays simples y asociativos.  Symfony utiliza el formato YAML como el lenguaje preferido para almacenar su configuración.

http://www.symfony-project.org/

http://www.symfony.es/

© 2009 Jotadeveloper Blog. Nuestros contenidos están bajo licencia Creative Commons mientras no se indique lo contrario,
y pueden reproducirse libremente sin más que mencionar la fuente ("JotaDeveloper") y la URL concreta del artículo original. .

This blog is powered by Wordpress and JotaDeveloperTheme.