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?

Problemas entre Spring 3.0 y Spring Web Flow 2.0.8

Tags: , , ,

Hace unos dias intentando integrar Spring Security 3.0 con Spring Web Flow en su última version 2.0.9 al día de hoy, como en el ejemplo siguiente.

   <bean id="securityFlowExecutionListener" class="org.springframework.webflow.security.SecurityFlowExecutionListener" />
 
   <webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
        <webflow:flow-execution-listeners>
            <webflow:listener ref="securityFlowExecutionListener" />
        </webflow:flow-execution-listeners>
    </webflow:flow-executor>

Esta configuracion en Web Flow basicamente lo que hace es que podamos restringir ciertas vistas o flujos enteros en base a Roles con Spring Security

 <secured attributes="ROLE_USER"/>
 
<view-state id="main">
        <on-render>
            <render fragments="zona3"/>
        </on-render>
        <transition on="paso1" to="reviewHotels">
              <secured attributes="ROLE_EDITOR"/>
             <evaluate expression="bean.metodo1()" />
             <render fragments="zona1"/>
        </transition>
        <transition on="paso2" >
              <secured attributes="ROLE_ADMIN"/>
             <evaluate expression="bean.metodo2() />
             <render fragments="zona1"/>
        </transition>
    </view-state>

y obtenia este error al compilar.

Caused by: java.lang.ClassNotFoundException: org.springframework.security.vote.AffirmativeBased
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
... 65 more

Pero parece no tener solución por ahora salvo que tu apliques el parche publicado en JIRA hace unos dias.

Aunque hoy mismo publicaron que el parche saldria hasta la versión Spring Web Flow 2.1 y no en la 2.0.9 como hace 48 horas estaba publicado.

https://jira.springsource.org/browse/SWF/fixforversion/11441

En pocas palabras, a esperar.

Cómo crear el schema de la base datos con Anotaciones de Hibernate y Spring

Tags: , , , ,

A veces es necesario hacer cambios a nuestra base de datos, y siempre estaremos lidiando con las herramientas gráficas o desde la consola, con los cambios en la base de datos, pero existen formas de hacer este trabajo “sucio” mucho más rapido y ahorrando tiempo.

En nuestro caso, usaremos Spring 2.5 y Hibernate 3.3 y MySQL, donde es necesario ya tengas armado los beans de conexión a la base de datos. El siguiente código es un array de cadenas, si en nuestro caso tenemos segmentado los xml de spring, los añadiremos de la siguiente manera.

// array de string para agregar todos tus archivos de configuración de spring
private static final String[] SPRING_CONFIG_FILES =
new String[]{"source/spring/config/xxxxxx-db-context.xml", "source/spring/config/xxxxxxx-param-context.xml"};

A continuación, el código necesario para generar nuestra base de datos, el FileSystemXmlApplicationContext carga el Contexto de la Aplicación, y una vez teniendo el contexto obtenemos el SessionFactory, que en nuestro caso usamos Anotaciones, creamos el bean en base a la clase AnnotationSessionFactoryBean , esto es importante pues en base a esta clase usaremos los metodos dropDatabaseSchema(); para borrar el actual schema (tablas, relaciones , etc) y luego ejecutamos createDatabaseSchema(); para crear el nuevo schema.

// carga el application context de Spring
 FileSystemXmlApplicationContext appContext = new FileSystemXmlApplicationContext(SPRING_CONFIG_FILES);
// Obtiene el bean del session factory
 AnnotationSessionFactoryBean annotationSF = (AnnotationSessionFactoryBean)  appContext.getBean("&sessionFactory");
// si quieres eliminar el schema de la base de datos
 annotationSF.dropDatabaseSchema();
// para crear nuevamente el schema de la base de datos
 annotationSF.createDatabaseSchema();

Los archivos de configuración de Spring, deben lucir de la siguiente manera, hay que destacar el hibernate.dialect donde indicamos el dialecto que usaremos para crear el schema, en el caso de MySQL puede ser MySAM o InnoDB, luego el parametro hibernate.hbm2ddl.delimiter que también indicamos el tipo de tablas que usaremos en mi caso usaré type=InnoDB.

<bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${datasource.classname}" />
        <property name="url" value="${datasource.urldb}" />
        <property name="username" value="${datasource.userbd}" />
        <property name="password" value="${datasource.pass}" />
    </bean>
 
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
          <list>
              <value>Clase1</value>
              <value>Clase2</value>
          </list>
        </property>
        <property name="hibernateProperties">
           <props>
                <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                <prop key="hibernate.dialect">${datasource.dialect}
                </prop>
                <prop key="hibernate.show_sql">${datasource.showsql}</prop>
                <prop key="hibernate.hbm2ddl.delimiter">${datasource.delimited}</prop>
            </props>
        </property>
      </bean>

Lo Nuevo de Spring 3.0 RC1

Tags: , ,

springsource

Hace poco el equipo de Spring Source liberó Spring 3.0 RC1 y viene con muchas nuevas características interesantes, para mi una de las mas interesantes es que ya viene con soporte para Java 6 y completamente basado en Java 5, ya era hora !. Me tomado el permiso de pegar la traducción que hizo Dos Ideas.

  • Completamente basado en Java 5. Esta la primer versión de Spring que necesita Java 5 o superior para funcionar, y que utiliza la sintáxis de Java 5 en todo el API de Spring, y también en su implementación. Por ejemplo, el API del BeanFactory retorna instancias tipadas con generics cuando es posible, y un ApplicationListener puede declarar tipos de eventos específicos con generics. En comparación, Spring 2.5 (la versión actual de Spring) todavía es compatible con el JDK 1.4, aunque mucha funcionalidad de alto nivel se construía en Java 5.
  • Lenguaje de expresiones de Spring (SpEL – Spring Expression Language). Un parser de expresiones para usar en la definición de los beans, que permite referenciar a estructuras anidadas (por ejemplo, propiedades de otros beans), y también a estructuras del sistema (por ejemplo, variables de entorno) usando la sintáxis común #{…} en el valor de las propiedaes de un bean. Esto también sirve como base para otras características basadas en expresiones en otros proyectos de Spring.
  • Soporte extendido para componentes basados en anotaciones. Se incluye el concepto de clases de configuración y métodos de factory anotados – ¡las características fundamentales del proyecto Spring JavaConfig finalmente están disponibles en Spring!. Sprint también permite inyectar valores de configuración a través de expresiones @Value, y referirse a valores de la configuración usando expresiones dinámicas #{…} o estáticas ${…}.
  • Modelo de estereotipos. Permite crear anotaciones “de atajo” a través del uso de meta-anotaciones. Por ejemplo, para determinar scopes predeterminados o características de transacción predeterminadas en estereotipos propios. Imaginen una anotación propia @MiServicio que indica @Service, @Scope(“request”) y @Transactional(readOnly=true) usando una única anotación. Este es el principio de No Repetirse aplicado al uso de anotaciones de componentes.
  • Anotaciones de inyección de dependencias estándar. Spring 3.0 provee un soporte inicial para el JSR-330 specification for Dependency Injection in Java- inyección a través de anotaciones usando javax.inject.Inject y sus calificadores asociados y modelo de proveedores, como una forma alternativa a la anotación @Autowired propia de Spring. Tengan en cuenta que el JSR-330 todavía no está terminado; el soporte para javax.inject en Spring se irá completando a medida que madure la especificación.
  • Modelo de validaciones declarativo basado en anotaciones de restricciones. Configuración al estilo de Spring de un proveedor de JSR-303 Bean Validation (como ser, Hibernate Validator 4.0). Spring 3.0 viene con una opción para hacer validaciones basadas en anotaciones en Spring MVC, exponiendo una vista unificada cuando no se cumplen las restricciones. Tengan en cuenta que el JSR-303 está próximo a terminarse, aunque todavía puede tener modificaciones.
  • Soporte para REST extendido. Soporte nativo para REST en Spring MVC, como ser mapeos de peticiones REST, extracción de variables URI a través de parámetros @PathVariable, y resolución de vistas guiadas por la negociación del contenido. Imaginen Spring MVC 2.5 con soporte de primera clase para REST – y manteniendo en enfoque de MVC. Hay soporte para el lado del cliente de REST a través de la clase RestTemplate.
  • Mapeo Objeto/XML (OXM). Tal como se usaba en Spring Web Services, ahora dentro del núcleo de Spring Framework. Abstracciones para el marshalling y unmarshalling con soporte directo para JAXB 2, Castor, etc. Se provee opciones de integración para soporte de contenidos XML en Spring MVC y Spring JMS.
  • Soporte para Portlet 2.0. Spring MVC soporta completamente los entorno de Portlet 2.0 y el nuevo modelo de recursos y eventos de Portlet 2.0. Se incluyen facilidades de mapeo para peticiones de portlet típicas: @ActionMapping, @RenderMapping, @ResourceMapping, @EventMapping.
  • Nuevo sistema de scheduling. Nuevos mecanismos de TaskScheduler y Trigger con soporte estilo cron, alineados con el mecanismo de Spring TaskExecutor. Spring 3.0 provee un namespace que soporta anotaciones @Async y @Scheduled. Esto se puede ejecutar sobre pooles nativos de hilos o en pooles manejados por Servidores de Aplicaciones, incluyendo soporte para los servidores de aplicaciones Java EE más populares.
  • Y por último, soporte inicial para Java EE 6. Spring 3.0 soporte el uso de JSF 2.0 y JPA 2.0 dentro de Spring, junto al soporte de JSR-303 y JSR-330. Se irá incluyendo soporte para otras tecnologías de Java EE 6 (como Servlet 3.0) a medida que se vayan concretando los productos.

© 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.