Pubblicato il 14 Giugno 2013 da Paolo Predonzani

Qual è il modo più semplice per implementare un workflow? Sicuramente sono richieste un'interfaccia utente (uno o più bottoni) e della logica applicativa (uno o più metodi che rispondono ai bottoni). La corrispondenza fra bottone e metodo è intuitiva. In Portofino 4 è anche esplicita a livello di codice tramite opportune annotazioni.

Il seguente frammento di codice

@Button(list="crud-read", key="my.label", order=10.0d)
public Resolution myWorkflowAction() {
    /* button logic here*/
}

è responsabile sia per la generazione del bottone, sia per la logica eseguita alla sua pressione. Il segreto è nell'annotazione @Button che permette di specificare posizione, etichetta e ordine del bottone, oltre a identificare il metodo a cui sarà collegato.

La corrispondenza fra interfaccia utente e metodo della action è ancora più evidente in caso di bottoni condizionati. Se una certa condizione è verificata, allora è necessario mostrare il bottone e abilitare la chiamata del metodo. Altrimenti è necessario nascondere il bottone e inibire la chiamata del metodo. In Portofino 4 questo è gestito tramite l'annotazione @Guard:

@Guard(test="myWorkflowCondition()")
@Button(list="crud-read", key="my.label", order=10.0d)
public Resolution myWorkflowAction() {
    /* button logic here */
}

boolean myWorkflowCondition() {
    if (/* condition verified*/)
        return true;
    else
        return false;
}

La condizione myWorkflowCondition() controlla sia la visualizzazione del bottone sia la possibilità di invocare myWorkflowAction().

In questo video riprendo il CRUD creato nel precedente tutorial e lo estendo con un semplice workflow basato su bottoni. Ho considerato la tabella 'm_product' ed in particolare la colonna 'isactive'. Isactive dice se un prodotto del catalogo è attivo oppure no. Mi sono immaginato un semplice workflow in cui isactive funziona da stato. Se il prodotto è attivo lo posso disattivare (cioè escluderlo dal catalogo dei prodotti correnti), se è inattivo lo posso riattivare.

Alcuni punti in evidenza tratti dal video

Fra parentesi quadre, il minuto/secondo a cui faccio riferimento:

[0:12] Nel CRUD, filtro i prodotti attivi tramite query HQL


[1:22] Connetto un'IDE Java all'istanza di Portofino 4


[3:51] Utilizzo l'annotazione @Button sul metodo deactivate()


[4:45] Utilizzo Hibernate per rendere persistente il cambiamento di stato


[5:47] Creo un CRUD “All products” per copia del CRUD “Current catalog”


[7:49] Utilizzo l'annotazione @Guard per abilitare/disabilitare i bottoni in modo condizionato


[9:38] Internazionalizzazione delle etichette dei bottoni

 

comments powered by Disqus