001    package org.tynamo.hibernate.pages;
002    
003    
004    import org.apache.tapestry5.ValidationException;
005    import org.apache.tapestry5.annotations.Component;
006    import org.apache.tapestry5.annotations.Log;
007    import org.apache.tapestry5.beaneditor.BeanModel;
008    import org.apache.tapestry5.corelib.components.Form;
009    import org.apache.tapestry5.ioc.annotations.Inject;
010    import org.hibernate.validator.InvalidStateException;
011    import org.slf4j.Logger;
012    import org.tynamo.FlashMessage;
013    import org.tynamo.components.Flash;
014    import org.tynamo.descriptor.TynamoClassDescriptor;
015    import org.tynamo.hibernate.validation.HibernateClassValidatorFactory;
016    import org.tynamo.hibernate.validation.HibernateValidationDelegate;
017    import org.tynamo.util.Utils;
018    
019    public abstract class HibernateEditPage extends HibernateModelPage
020    {
021    
022            @Inject
023            private Logger logger;
024    
025            @Component
026            private Form form;
027    
028            @Component
029            private Flash flash;
030    
031            private boolean shouldStayHere;
032    
033            @Inject
034            private HibernateClassValidatorFactory hibernateClassValidatorFactory;
035    
036            @Inject
037            private HibernateValidationDelegate hibernateValidationDelegate;
038    
039            public Form getForm()
040            {
041                    return form;
042            }
043    
044            void pageLoaded()
045            {
046                    // Make other changes to the bean here.
047            }
048    
049            @Override
050            protected void activate(Object bean, TynamoClassDescriptor classDescriptor, BeanModel beanModel)
051            {
052                    shouldStayHere = false;
053                    super.activate(bean, classDescriptor, beanModel);
054            }
055    
056            @Log
057            protected void onValidateFormFromForm() throws ValidationException
058            {
059                    //add more validation logic here
060                    try
061                    {
062                            /**
063                             * The hibernate validate listener is enabled by default, so if nothing is wrong this entity will be
064                             * validated twice, once here, and once in session.saveOrUpdate(instance);
065                             */
066                            hibernateClassValidatorFactory.validateEntity(getBean());
067                    } catch (InvalidStateException ise)
068                    {
069                            hibernateValidationDelegate.record(getClassDescriptor(), ise, getForm().getDefaultTracker(), getMessages());
070                    }
071            }
072    
073            void onApply()
074            {
075                    shouldStayHere = true;
076            }
077    
078            @Log
079            protected Object onSuccess()
080            {
081                    try
082                    {
083                            getPersitenceService().save(getBean());
084                            if (shouldStayHere)
085                            {
086                                    flash.addFlashByKey(getSuccessMessageKey(), FlashMessage.MessageType.SUCCESS, getBean());
087                                    return this;
088                            } else
089                            {
090                                    return back();
091                            }
092    
093                    } catch (InvalidStateException ise)
094                    {
095                            hibernateValidationDelegate.record(getClassDescriptor(), ise, getForm().getDefaultTracker(), getMessages());
096                    } catch (Exception e)
097                    {
098    //                      missing ExceptionUtils (Lang 2.3 API)
099    //                      form.recordError(ExceptionUtil.getRootCause(e));
100                            getForm().recordError(e.getMessage());
101                            logger.error(e.getMessage());
102                            e.printStackTrace();
103                    }
104    
105                    return null;
106            }
107    
108            @Override
109            protected BeanModel createBeanModel(Class clazz)
110            {
111                    return getBeanModelSource().createEditModel(clazz, getMessages());
112            }
113    
114            protected String getSuccessMessageKey()
115            {
116                    return Utils.SAVED_MESSAGE;
117            }
118    }