miércoles, 4 de julio de 2007

Crear estadisticas en Seam con programación orientada a aspectos

En el ejemplo del blog podemos aprender como grabar estadisticas con un enfoque AOP, es decir manteniendo esta finalidad totalmente separada de la finalidad del blog que sería mostrar las entradas de forma cronológica o filtrada por categorías

En JBoss Seam hay varias formas de aplicar AOP (Aspect Oriented Programming) a nuestro código OOP (Object Oriented Programming): por medio de anotaciones, a través de jBPM-pageflow, a través del archivo pages.xml, components.xml ...

En este caso, el ejemplo del blog, se utiliza el archivo pages.xml para definir una acción (grabar estadística) relacionada con otro aspecto de la aplicación (seam blog)

en el pages.xml se incluyen las siguientes lineas:

<page view-id="*">
<action execute="#{blog.hitCount.hit}"/>
</page>


Estas lineas indican que al entrar en cualquier página de la aplicación (view-id="*") se ejecuta la acción blog.hitCount.hit
Dentro de las facilidades que nos proporciona el pages.xml se encuentra el condicional if dentro de la etiqueta action, con el cual podemos supeditar la acción al estado de cualquier componente de la aplicacion por ejemplo action execute="#{gestor.editarEntrada}" if="#{usuario.admin}"

A continuación se muestran las entidades participantes en esta acción, que al ser entidades persistentes y al utilizar en este ejemplo el org.jboss.seam.jsf.TransactionalSeamPhaseListener, en el renderizado de cada petición de página se produce una transacción y la consecuente actualización de datos en las entidades persistentes, con lo cual no tenemos que llamar al metodo persist() para que nuestros datos se actualicen en la base de datos

@Entity
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Blog {
....
public HitCount getHitCount()
{
return hitCount;
}

}


@Entity
public class HitCount
{
@Id
@Column(name="blog_name")
private String blogName;

@OneToOne(optional=false)
@JoinColumn(insertable=false, updatable=false)
private Blog blog;

private int pageviews;

public int getPageviews()
{
return pageviews;
}
public void hit()
{
System.out.print(FacesContext.getCurrentInstance().getViewRoot().getViewId());
pageviews++;
}
}



Configuración del faces-config para la gestión de persistencia

<faces-config>
<!-- Facelets support -->
<application>
<message-bundle>messages</message-bundle>
<view-handler>org.jboss.seam.ui.facelet.SeamFaceletViewHandler</view-handler>
</application>
<!-- Select one of the two standard persistence lifecycle models for the Seam application -->
<lifecycle>
<phase-listener>org.jboss.seam.jsf.TransactionalSeamPhaseListener</phase-listener>
</lifecycle>
</faces-config>

No hay comentarios: