001 package net.databinder.components.ao;
002
003 import java.sql.SQLException;
004
005 import net.databinder.ao.Databinder;
006 import net.java.ao.EntityManager;
007 import net.java.ao.Transaction;
008
009 import org.apache.wicket.WicketRuntimeException;
010 import org.apache.wicket.markup.html.form.Form;
011 import org.apache.wicket.model.IModel;
012
013 /** Form subclass that runs a submit callback in a transaction. */
014 public abstract class TransactionalForm extends Form {
015
016 public TransactionalForm(String id, IModel model) {
017 super(id, model);
018 }
019
020 /** Called when the form is submitted, do not override if you want transactional behavior. */
021 @Override
022 protected void onSubmit() {
023 try {
024 new Transaction<Object>(Databinder.getEntityManager()) {
025 @Override
026 protected Object run() throws SQLException {
027 inSubmitTransaction(Databinder.getEntityManager());
028 return null;
029 }
030 }.execute();
031 } catch (SQLException e) {
032 throw new WicketRuntimeException(e);
033 }
034 afterSubmit();
035 }
036
037 /**
038 * Called inside onSubmit's database transaction.
039 * @param entityManager associated with form, provided for convenience
040 */
041 protected abstract void inSubmitTransaction(EntityManager entityManager) throws SQLException;
042 /** Called after onSubmit's database transaction. */
043 protected void afterSubmit() { };
044 }