Tabla de Contenidos

Lanzar Eventos mediante Objetos JAVA

Se ha añadido a JBoss Seam una nueva forma de lanzar y registrar eventos mediante instancias de objetos (clases) JAVA.

Forma Tradicional de Lanzar Eventos en JBoss Seam

La forma tradicional de lanzar eventos en Seam es mediante la clase org.jboss.seam.core.Events, utilizando un String, ejemplo:

    if (Events.exists()) {
        Events.instance().raiseEvent("org.jboss.seam.security.loginSuccessful");
    }

y registramos los oyentes (listeners u observers) utilizando el mismo String, ejemplo:

    @Observer("org.jboss.seam.security.loginSuccessful")
    public void miObserver() {
        // realizar tareas
    }

o mediante el fichero components.xml, ejemplo:

	<event type="org.jboss.seam.security.notLoggedIn">
		<action execute="#{redirect.captureCurrentView}" />
	</event>
	<event type="org.jboss.seam.security.loginSuccessful">
		<action execute="#{redirect.returnToCapturedView}" />
	</event>

Nueva Forma de Lanzar Eventos en JBoss Seam mediante Instancias de Objetos

Disponible tambien para FundeWeb 1.5.

Con la nueva forma, vamos a utilizar POJOS, que son a al vez, contenedores de propiedades y el identificador del evento en si mismo. Para eso el POJO tiene que implementar la inteface org.jboss.seam.core.EventObject, ejemplo:

package es.um.atica.prueba.events;
 
import org.jboss.seam.core.EventObject;
 
public class PruebaEvent implements EventObject {
 
    private String propiedadUno = null;
    private boolean propiedadDos = false;
 
    public PruebaEvent() {
    }
 
    public PruebaEvent( String propiedadUno, boolean propiedadDos ) {
        this.propiedadUno = propiedadUno;
        this.propiedadDos = propiedadDos;
    }
 
    public String getPropiedadUno() {
        return propiedadUno;
    }
 
    public void setPropiedadUno( String propiedadUno ) {
        this.propiedadUno = propiedadUno;
    }
 
    public boolean isPropiedadDos() {
        return propiedadDos;
    }
 
    public void setPropiedadDos( boolean propiedadDos ) {
        this.propiedadDos = propiedadDos;
    }
 
    @Override
    public String toString() {
        return "PruebaEvent[P1= " + propiedadUno + ", P2= " + propiedadDos + "]";
    }
 
}

para lanzar el evento, utilizamos la clase Events, ejemplo:

    public void lanzaEventoSincrono() {
        log.info( "Entra en lanzaEventoSincrono" );
        PruebaEvent event = new PruebaEvent("lanzaEvento", true);
        if ( Events.exists() ) {
            Events.instance().raiseEvent( event );
        }
        log.info( "Sale de lanzaEventoSincrono" );
    }
 
    public void lanzaEventoAsincrono() {
        log.info( "Entra en lanzaEventoAsincrono" );
        PruebaEvent event = new PruebaEvent("lanzaEvento", true);
        if ( Events.exists() ) {
            Events.instance().raiseAsynchronousEvent( event );
        }
        log.info( "Sale de lanzaEventoAsincrono" );
    }

y registramos los oyentes (listeners u observers) sin utilizar un String, ejemplo:

package es.um.atica.prueba.backbeans;
 
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.core.Events;
import org.jboss.seam.log.Log;
 
import es.um.atica.prueba.events.PruebaEvent;
 
@Name("pruebaEventObject")
public class PruebaEventObject {
 
    @Observer
    public void listenerEvento(PruebaEvent event) {
        log.info( "Entra en listenerEvento: recibido #0", event );        
    }
 
}

Para este tipo de lanzamiento de eventos, el método oyente (tiene la anotación @Observer) solo puede tener un parámetro, que es el propio evento.

Para registrarlo mediante el fichero components.xml, el String de registro es el que forman la concatnacion del paquete y el nombre de la clase, separados por un '.', ejemplo:

    <event type="es.um.atica.prueba.events.PruebaEvent">
        <action execute="#{pruebaEventObject.listenerEvento(event)}" />
    </event>

donde event, es una variable de contexto accesible por EL. Se puede crear mediante código o mediante la anotación @Out en un componente Seam (las clases que tienen la anotación @Name o declaradar en el fichero components.xml.


JUAN MIGUEL BERNAL GONZALEZ 02/08/2018 08:08