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    }