001    package org.trails.page;
002    
003    import org.apache.tapestry.annotations.Bean;
004    import org.apache.tapestry.annotations.Lifecycle;
005    import org.apache.tapestry.annotations.InjectObject;
006    import org.hibernate.validator.InvalidStateException;
007    import org.trails.persistence.HibernatePersistenceService;
008    import org.trails.persistence.PersistenceException;
009    import org.trails.validation.HibernateValidationDelegate;
010    
011    public abstract class HibernateEditPage extends EditPage
012    {
013    
014            @Bean(lifecycle = Lifecycle.REQUEST)
015            public abstract HibernateValidationDelegate getHibernateValidationDelegate();
016    
017            /**
018             * @todo: remove when the components reuse issue goes away.
019             */
020            public HibernateValidationDelegate getDelegate()
021            {
022                    return getHibernateValidationDelegate();
023            }
024    
025            @InjectObject("service:trails.hibernate.PersistenceService")
026            public abstract HibernatePersistenceService getHibernatePersistenceService();
027    
028            /**
029             * @todo: remove when the components reuse issue goes away.
030             */
031            public HibernatePersistenceService getPersistenceService()
032            {
033                    return getHibernatePersistenceService();
034            }
035    
036            @Override
037            protected boolean save()
038            {
039                    if (!getDelegate().getHasErrors())
040                    {
041                            try
042                            {
043                                    if (isReferencedByParentPage() && isModelNew())
044                                    {
045                                            setModel(getPersistenceService().saveCollectionElement(
046                                                            getAssociationDescriptor().getAddExpression(), getModel(), getParent()));
047                                            setModelNew(false);
048                                    } else
049                                    {
050                                            setModel(getPersistenceService().save(getModel()));
051                                    }
052    
053                            } catch (PersistenceException pe)
054                            {
055                                    getDelegate().record(pe);
056                                    return false;
057                            } catch (InvalidStateException ivex)
058                            {
059                                    getDelegate().record(getClassDescriptor(), ivex);
060                                    return false;
061                            }
062                            return true;
063                    }
064                    return false;
065            }
066    }