miércoles, 11 de julio de 2007

Pasar un parametro en jsf

Para no sobrecargar las llamadas al servidor desde el renderizado de la página jsf, podemos guardar valores dentro del componente ui:param de xmlns:ui="http://java.sun.com/jsf/facelets"

<ui:param name="path" value="../"/>

y en el resto de la página solamente llamaremos a #{path}

martes, 10 de julio de 2007

Acceder a componente core.manager y core.ConversationEntries en PhaseId.INVOKE_APPLICATION

Para acceder a la lista de conversaciones desde nuestro código java y pretendemos hacerlo de la forma
@In
Manager manager

Nos dará error de illegalArgumentException cuando instancie el componente.
Para solucionarlo podemos acceder directamente con:
Manager manager = Manager.instance();
ConversationEntries conversationEntries = ConversationEntries.instance();

y de esta forma tendremos las conversaciones (ConversationEntry ) y toda su funcionalidad :
for(ConversationEntry idConversacion:conversationEntries.getConversationEntries()) {
if(idConversacion.isCurrent())log.error("cURRENT!!");
log.error("idConversacion_"+idConversacion.getId()+" view"+idConversacion.getViewId());
}

jueves, 5 de julio de 2007

Interfaces en ejb3, herencia

El componente Seam con estado tiene una interfaz pública por lo cual obtendremos un error si intentamos implementar varias interfaces solo desde la implementación y no desde la interface.

ej mal hecho--- > ERROR:
public interface CatalogoAction {
...
}

public class CatalogoActionImpl implements Serializable, CatalogoAction, ListadoResultados{
....
}


ej bien hecho:

public interface CatalogoAction extends ListadoResultados {
}

public class CatalogoActionImpl implements Serializable, CatalogoAction{
....
}

martes, 3 de julio de 2007

No funciona el estado del componente cuando se intenta cambiar un valor

Cuando intento cambiar una propiedad de un componente con estado a través de sus metodos get/setter que se definen en la interface, no funciona!
Tenía un problema con la etiqueta h:form, había 1 formulario dentro de otro y eso hacía el error

SelectOneMenu con entidades y valor nulo

<h:selectOneMenu value="#{search.category}">

<s:convertEntity />

<ui:remove> <f:selectItem itemLabel="Any" itemValue="#{anyCategory}" /></ui:remove>

<s:selectItems value="#{allCategories.resultList}" var="category"

label="#{category.name}"

noSelectionLabel="ANY" />

</h:selectOneMenu

Recargar factoria de elementos al acabar una conversación

Para recargar una factoría de objetos que tendremos cargados en session para optimizar el rendimiento de la base de datos, podemos utilizar los eventos, los cuales al finalizar una tarea/conversación se pueden encargar de forma transparente (programación orientada a aspectos) de acceder a variables de otros componentes para su inicialización.
Ejemplo:
al finalizar un pedido de compra se necesita que el catalogo de productos muestre el stock actualizado.

public class CheckOutBean implements CheckOut, Serializable{
...
@End
@RaiseEvent("limpiarCatalogo")
public void enviarPedido() {
persist.order()

}
}

public class CatalogoBean implements Serializable, Catalogo {
...

@Observer("limpiarCatalogo")
public void limpiarPiezas(){
log.error("RESET CATALOGO ");
piezasList=null;

}
}


**** Esto puede parecer obvio, pero si lo que hacemos es recargar la colección en vex de limpiarla no funcionará, ya que la transacción depende de las phases de jsf, es decir que no se producirá la actualización hasta que no se salga de la PhaseId.INVOKE_APPLICATION.

Eventos en Seam

Seam contempla varios modelos de eventos:

  • JSF eventos
    • <h:commandButton value="enviar" action="#{helloWorld.sayHello}"/>
  • jBPM transition events (.jpdl), se especifican en la etiqueta event en la cual hay que definir el tipo de evento (node-enter, node-leave, process-start, process-end, task-create, task-assign, task-start, task-end, before-signal, after-signal). Hay que distinguir entre bussiness process (varios usuarios implicados) y pageflow (un usuario)
    • <event type="">
  • Seam page actions (pages.xml), se ejecutan antes del renderizado de una página
    • <pages>
      <page view-id="hello.jsp" action="#{helloWorld.sayHello}"/>
      </pages>

  • Seam component-driven events
    • se puede definir en el archivo components.xml o en el propio código java a través de anotaciones o referencias a componentes propios de Seam es decir Events.instance
      • anotacion para observar un evento @Observer("nombreEvento")
      • anotación para lanzar un evento @RaiseEvent("nombreEvento")
  • Seam contextual events
    • componentes Seam siempre instalados
      • preSetVariable, postSetVariable, preRemoveVariable ...
En @RaiseEvent(value="nombreEvento")
se produce cuando el metodo devuelve un not-null y sin excepciones!

lunes, 2 de julio de 2007

¿qué es un pageflow?

Pageflow podríamos definirlo como definición de proceso o flujo de negocio. Para su representación se utiliza jPDL que tiene sintaxis XML y puede editarse gráficamente con un plugin de eclipse. En dicha representación se concretan los diferentes estados, decisiones, tareas, páginas web, etc con las cuales interactua el usuario.

Existen dos formas de definir un pageflow en Seam:

  1. Sin estado - faces-config.xml /pages.xml
  2. Con estado - jPDL

continuará ....