Utilizando DropDownChoice do Wicket associado a um Map

Padrão

Wicket

Um dia desses precisei de mudar uma página (WebPage) para que permitisse persistir um atributo simples em uma entidade. Primeiramente pensei em usar um Enum, porém estou usando persistência JPA com Hibernate, e fiquei com receio da forma como o Hibernate iria manipular esse Enum ao fazer buscas ou coisas mais complicadas. Então decidi criar um atributo do tipo Integer e setar nele uma constante.

Este é um exemplo de código usando um Map para exibir uma lista de opções (DropDownChoice) no Wicket para persistir uma constante (Integer) em uma entidade.

Código da entidade ControlSerum onde vamos persistir o atributo status:

@Entity
public class ControlSerum {
  private Integer status;

  public final static int STATUS_PREP = 0;
  public final static int STATUS_ACTIVE = 1;
  public final static int STATUS_INACTIVE = 2;
  private final static Map<Integer, String> statusMap = new HashMap<Integer, String>();

  static{
    statusMap.put(STATUS_PREP, "Em preparo");
    statusMap.put(STATUS_ACTIVE, "Ativo");
    statusMap.put(STATUS_INACTIVE, "Inativo");
  }

  @Column(nullable=false)
  public Integer getStatus() {
    return status;
  }
  public void setStatus(Integer status) {
    this.status = status;
  }

  @Transient
  public static Map<Integer, String> getStatusMap(){
    return new HashMap<Integer, String>(statusMap);
  }
}

Na classe da página ControlSerumEditPage, implementei um IChoiceRenderer para renderizar corretamente as opções do select, utilizando a chave do Map como sendo o valor a ser submetido pelo option e o valor do Map como sendo o nome para exibição do option.

Trecho de código do construtor da classe ControlSerumEditPage onde é instanciado e adicionado ao Form, um renderizador para o DropDownChoice:

IChoiceRenderer choicesRenderer = new IChoiceRenderer() {
  @Override
  public String getDisplayValue(Integer object) {
    return ControlSerum.getStatusMap().get(object);
  }
  @Override
  public String getIdValue(Integer object, int index) {
    return object.toString();
  }
};

IModel optionsModel = new Model(){
  @Override
  public Serializable getObject() {
    return new ArrayList(ControlSerum.getStatusMap().keySet());
  }
};

IModel statusModel = new PropertyModel<Integer>(controlSerum, "status");

DropDownChoice<Integer> status = new DropDownChoice<Integer>("status", statusModel, optionsModel, choicesRenderer);
form.add(status);

Para baixar o código completo desta aplicação (ainda em desenvolvimento):
http://github.com/ziglee/biomedcalib

Façam seus comentários e envie quaisquer dúvidas que prontamente responderei!