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 }