giovedì 26 gennaio 2012

Wicket - Label, Property Model e stringa alternativa

Ieri mi sono trovato in una classica situazione programmativa che in Wicket ha richiesto i soliti voli pindarici. Questo mi permetterà di introdurre una funzione di wicket propria agli oggetti che estendono WebComponent e che in questo esempio è rappresentato da una Label.

Abbiamo già visto come si associa una Label ad una proprietà di un oggetto ma per precauzione, rimettiamo il codice:

add(new Label("idwicket",new PropertyModel<String>(oggetto, "proprieta")));

In questo caso creiamo e aggiungiamo un oggetto Label associato ad una proprietà interna di un oggetto. Questo significa che dinamicamente, se cambia la proprietà dell'oggetto, anche il contenuto della label cambierà dinamicamente.

La mia esigenza era scrivere qualcosa di alternativo nel caso in cui la proprietà fosse vuota (null o stringa vuota).

NB: Se l'oggetto associato al property model è NULL, esplode tutto ma in questo caso stiamo gestendo il caso in cui la proprietà interna lo è e non l'oggetto stesso.

Per risolvere questo problema ho creato una nuova classe che estendesse la label di wicket. Andiamola a vedere:

import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;

/**
 * Estensione della Label di wicket per inserire una stringa alternativa
 * nel caso quella legata al property model usato sia vuota o nulla 
 */
public class StringLabel extends Label{
    private static final long serialVersionUID = 1L;
    private String ifEmpty;
    
    public StringLabel(final String id, IModel<?> model,String ifEmpty)
    {
        super(id, model);
        this.ifEmpty = ifEmpty;
    }
    
    /**
     * Se la property string da renderizzare è vuota o null, inserisce la
     * stringa alternativa espressa dai ifEmpty
     */
    protected void onComponentTagBody(MarkupStream markupStream,
            ComponentTag openTag) {
        super.onComponentTagBody(markupStream, openTag);
        String value = getDefaultModelObjectAsString();
        if (value.length() == 0 || value == null) {
            replaceComponentTagBody(markupStream, openTag, this.ifEmpty);
        }
    }

}

Estendiamo ovviamente Label e implementiamo un costruttore che prende l'id del componente e il modello (come la vecchia label) ma anche una stringa alternativa.

Il metodo più importante è invece onComponentTagBody (che hanno tutti i WebComponent) che viene chiamata quando Wicket renderizza l'oggetto ed in questo caso ne renderizza proprio la parte body.

In questo frangente ci facciamo dare la stringa che dovrebbe stampare tramite l'istruzione getDefaultModelObjectAsString() e lo confrontiamo nell'IF. Se vuoto o nullo, facciamo un replace del contenuto (come fare una innerHTML in javascript).


Nessun commento:

Posta un commento