Patron observer en un comando JONIC desde Bean

En la estructura de JONIC, no podemos crear el comando que extienda de Observable (porque ya extiende de ResultCommand), por lo que creamos una clase interna que si lo haga.

 

public class ConsultaMasivaCMD extends ResultCommand<List>

public PorcentajeMasivoObservable myobs = new PorcentajeMasivoObservable();

public class PorcentajeMasivoObservable extends Observable
{
private int porcentaje = 0;
public int getPorcentaje()
{
return porcentaje;
}
public void setPorcentaje(int porcentaje)
{
this.porcentaje=porcentaje;
setChanged();
notifyObservers();
}

}

 

Y dentro de nuestro comando en el runcommand:

@Override
public ResultCommand<List<Resultado>> runCommand() throws Exception {

      for (int i = 0; i <=array.size() - 1; i++) {

          ... 
          myobs.setPorcentaje(porcentaje);
      }

}

Ahora que ya tenemos la clase observable nos vamos al bean:

public class ConsultaFicherosBean extends RequestAbstractBean implements Serializable, Observer {

private ConsultaMasivaCMD.PorcentajeMasivoObservable pmo =null;

private Integer progress;

public String acConsultar() {

ConsultaMasivaCMD cmd = (ConsultaMasivaCMD)createCommand(ConsultaMasivaCMD.class);
cmd.setObj(this);
pmo=cmd.myobs;
pmo.addObserver(this);
cmd = (ConsultaMasivaCMD) runCommand(cmd);
if (cmd != null && cmd.getResult() != null)
result.addAll(cmd.getResult());

return "donde sea";
}

@Override
public void update(Observable o, Object arg) {
if (o==pmo){
progress=pmo.getPorcentaje();
}

}

En el xhtml ponemos una barra de progreso con un poll para indicar el estado del progreso.

<h:form id="dataForm">

<p:commandButton id="viewButton" value="Enviar Petición"
action="#{consultaFicherosBean.acConsultar}"

onclick="PF('pb').start();PF('poll').start();"
onstart="PF('dlg').show()"
oncomplete="PF('dlg').hide();PF('pb').cancel();PF('poll').stop();"
update=":dataForm :prg"

icon="ui-icon-pin-s" />

</h:form>

<p:dialog widgetVar="dlg"
appendTo="@(body)"
modal="true"
width="400"
height="100"
header="Progreso"
draggable="false"
closable="false"
closeOnEscape="false"
resizable="false"
minimizable="false">
<h:form id="prg">

  <p:poll interval="1"
  widgetVar="poll"
  autoStart="false"
  async="true"
  update=":prg"
  immediate="true"/>

<!-- progressbar-->
<p:progressBar widgetVar="pb"
ajax="true"
value="#{consultaFicherosBean.progress}"
labelTemplate="{value}%"
styleClass="animated"
global="false">
</p:progressBar>
</h:form>
</p:dialog>

Con esto el comando avisa en cada iteración del porcentaje, el Bean se entera y actualiza su variable de progreso y la página mediante el poll y la barra de progreso puede informar al usuario de como va la tarea.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

* Please enter the Biggest Number