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    }