package net.databinder.components.ao; import java.sql.SQLException; import net.databinder.ao.Databinder; import net.java.ao.EntityManager; import net.java.ao.Transaction; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.html.form.Button; /** Button that provides a submit transaction similar to TransactionalForm. */ public abstract class TransactionalButton extends Button { public TransactionalButton(String id) { super(id); } /** Called when the form is submitted, do not override if you want transactional behavior. */ public void onSubmit() { try { new Transaction<Object>(Databinder.getEntityManager()) { @Override protected Object run() throws SQLException { inSubmitTransaction(Databinder.getEntityManager()); return null; } }.execute(); } catch (SQLException e) { throw new WicketRuntimeException(e); } afterSubmit(); } /** * Called inside onSubmit's database transaction. * @param entityManager associated with form, provided for convenience */ protected abstract void inSubmitTransaction(EntityManager entityManager) throws SQLException; /** Called after onSubmit's database transaction. */ protected void afterSubmit() { }; }