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.Button;
011 import org.apache.wicket.model.IModel;
012
013 /** Button that provides a submit transaction similar to TransactionalForm. */
014 public abstract class TransactionalButton extends Button {
015 public TransactionalButton(String id, IModel model) {
016 super(id, model);
017 }
018
019 public TransactionalButton(String id) {
020 super(id);
021 }
022
023 /** Called when the form is submitted, do not override if you want transactional behavior. */
024 public void onSubmit() {
025 try {
026 new Transaction<Object>(Databinder.getEntityManager()) {
027 @Override
028 protected Object run() throws SQLException {
029 inSubmitTransaction(Databinder.getEntityManager());
030 return null;
031 }
032 }.execute();
033 } catch (SQLException e) {
034 throw new WicketRuntimeException(e);
035 }
036 afterSubmit();
037 }
038
039 /**
040 * Called inside onSubmit's database transaction.
041 * @param entityManager associated with form, provided for convenience
042 */
043 protected abstract void inSubmitTransaction(EntityManager entityManager) throws SQLException;
044 /** Called after onSubmit's database transaction. */
045 protected void afterSubmit() { };
046 }