Re: Objects session persistance and validation

2010-10-28 Thread Anton Mezerny
Resolved the issue - now it works fine:
I extracted validation to the separate method with
@OnEvent(value=EventContants.VALIDATE, component=submitForm)
Also switched to 5.2.1.

@OnEvent(value = EventConstants.VALIDATE, component = registerForm)
void validate(){
detectErrors();
}

@OnEvent(value = EventConstants.SUCCESS, component = registerForm)
Object saveCustomerAndUser() {

user.setPassword(generateHash(user.getPassword()));
customer.addUser(user);
customerService.save(customer);

// redirect with a message parameter
return Index.class;

}

private void detectErrors() {

if (!verifyPassword.equals(user.getPassword())) {
registerForm.recordError(messages.get(error.verify.password));
}
if (userService.getUserByLogin(user.getLogin()) != null) {

registerForm.recordError(messages.get(error.user.already.exists));
}
if
(customerService.getCustomerByBusinessName(customer.getBusinessName()) !=
null) {

registerForm.recordError(messages.get(error.customer.already.exists));
}
}

Anton

2010/10/25 Anton Mezerny anton.meze...@gmail.com

 I am using 5.1.0.7. Also I figured how to reproduce such a behavior - if i
 fill all fields with proper values, but set not equal passwords - all data
 is lost, but if I set invalid email and proper passwords - everything works
 fine.

 P.S. There is one error in previous code - in recordErrors() method shoud
 be:

 registerForm.recordError(messages.get(error.verify.password));
 instead of
 registerForm.recordError(verifyPassword,
 messages.get(error.verify.password));

 2010/10/25 Mark Shead mark.sh...@xeric.net

 Once it is submitted you may want to set the user back to null, that way
 you
 can start fresh when the page is submitted.

 The required,email and email,required things sounds odd. I'm going to see
 if
 I can reproduce that.  What version of tapestry are you using?

 Mark

 On Mon, Oct 25, 2010 at 2:17 PM, Anton Mezerny anton.meze...@gmail.com
 wrote:

  Ok, when i changed order from validation=required,email to
  validation=email,required email validation starts to work properly.
 Looks
  like some magic :). However, I get sometimes user data lost. I can't
  reproduce this bug with 100% probability, but it occurs sometimes. I
 tried
  also to change @Persist(PersistenceConstants.FLASH) to default @Persist.
  But
  it gives me behavior I don't want - it renders user data even if I
 refresh
  the page (I want to show blank form in that case). So FLASH persistance
 is
  what I want, but sometimes data are lost.
 
  My code now looks like this:
 
 
 ---Registration.java-
  public class Registration {
 
 @Property
 @Persist(PersistenceConstants.FLASH)
 private User user;
 
 @Property
 @Persist(PersistenceConstants.FLASH)
  private Customer customer;
 
 @Property
 private String verifyPassword;
 
 @Inject
  private CustomerService customerService;
 
 @Inject
 private UserService userService;
 
 @Component
 private Form registerForm;
 
 @Inject
 private Messages messages;
 
  @OnEvent(value = EventConstants.SUCCESS, component = registerForm)
 Object validateAndSave() {
 
 if (errorsDetected()){
 return null;
 }
 user.setPassword(generateHash(user.getPassword()));
 customer.addUser(user);
 customerService.save(customer);
 
 // redirect with a message parameter
 return Index.class;
 
 }
 
 private boolean errorsDetected(){
 boolean errorDetected = false;
  if (!verifyPassword.equals(user.getPassword())) {
  registerForm.recordError(verifyPassword,
  messages.get(error.verify.password));
  errorDetected = true;
  }
 
 if (userService.getUserByLogin(user.getLogin()) != null) {
 
  registerForm.recordError(messages.get(error.user.already.exists));
  errorDetected = true;
 }
 
 if
  (customerService.getCustomerByBusinessName(customer.getBusinessName())
 !=
  null) {
 
  registerForm.recordError(messages.get(error.customer.already.exists));
 errorDetected = true;
 }
 return errorDetected;
  }
  }
 
 
 
 -Registration.tml
  html t:type=layout title=Customer registration
   t:sidebarTitle=Current Time
   t:pageTitle=Register
   xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
   xmlns:p=tapestry:parameter
 
  fieldset id=register
 form class=full-form t:id=registerForm
 t:errors/
 
 fieldset
 legendCustomer registration (company or private
  person)/legend
 
  t:beaneditor object=customer exclude=literal:id,users
  p:businessName
 t:label 

Re: Objects session persistance and validation

2010-10-25 Thread Mark
Do all the other validations perform as expected other than email? Does the
required validation on email work correctly and give you an error when you
try to submit. Also do you have any types of constraints on the email field
in the database? Is it possible that what you are entering in the email
fields is passing the email validation, but getting rejected by the
database?

I don't remember what Tapestry uses to determine whether or not something is
a valid email address, but I do know that the actual spec for email
addresses is a lot more permissive than you'd think.

Mark

On Mon, Oct 25, 2010 at 6:35 AM, Anton Mezerny anton.meze...@gmail.comwrote:

 So, I removed initializeNewUser() from Registration.java and added @Inject
 annotation to User.java and Customer.java (I also made user and customer
 separate, not nested one into another and I nest user into customer just
 before saving to DB). Now page renders well, but when I try to save user
 and
 customer (and email is invalid) - email validation does not occurs - I just
 have email = null in my customer.email field (even if i set some incorrect
 value, for exapmle 'test_email'). There is no redirect to the registration
 page with error message - program continues execution and tries to save
 data
 to DB.

 2010/10/23 Mark W. Shead mwsh...@gmail.com

  I don't think you want to use flash persistence for this.  Try just
  using @Persist. It looks like you are creating a new user every time
  the page renders.
 
  Mark
 
  On Sat, Oct 23, 2010 at 3:08 PM, Jim O'Callaghan jc1000...@yahoo.co.uk
  wrote:
   I'm not sure if this is relevant to your current problem, but to tell
   Tapestry which constructor to use for the bean editor, you should
  annotate
   the default (no args) constructor with @Inject - this will allow the
 BEF
  to
   create the relevant entity if none if present.  Hope this helps.
  
   Regards,
   Jim.
  
   -Original Message-
   From: Anton Mezerny [mailto:anton.meze...@gmail.com]
   Sent: 23 October 2010 17:02
   To: Tapestry users
   Subject: Objects session persistance and validation
  
   Hi all,
   I'm trying to write simple registration form using beaneditor
 component.
   If I fullfill all reqired fields in the form and submit it - everything
   works fine, but if server validation occurs (for example passwords
 don't
   match), then all data is lost and Registration page renders with
  validation
   errors, but without user data (input values).
   I think the reason for this behaviour is the initializeNewUser()
 method,
   wich rewrites all data if user field is null. But if I delete this
 method
   from code, tapestry throws exception - User can't be instantiated
  (tapestry
   tries to use constructor with most parameters, which has custom
 objects,
  not
   only String, Integer, etc). So how can resolve this problem?
   Thanks in advance.
  
My code (some code is token from Tapestry5 Hotel Booking example):
  
 
 -Registration.java:-
   ---
  
   public class Registration {
  
  @Property
  @Persist(PersistenceConstants.FLASH)
  private User user;
  
  @OnEvent(value = EventConstants.PREPARE, component = registerForm)
  private void initializeNewUser() {
  if (this.user == null) {
  this.user = new User();
  this.user.setCustomer(new Customer());
  } else {
  if (this.user.getCustomer() == null) {
  this.user.setCustomer(new Customer());
  }
  }
  }
  
  
  @Property
  private String verifyPassword;
  
  @Inject
  private UserService userService;
  
  @Component
  private Form registerForm;
  
  @Inject
  private Messages messages;
  
  public Object onSubmitFromRegisterForm() {
  
  if (!verifyPassword.equals(user.getPassword())) {
  
   registerForm.recordError(messages.get(error.verify.password));
  
  return null;
  }
  
  if (userService.getUserByLogin(user.getLogin()) != null) {
  
   registerForm.recordError(messages.get(error.user.already.exists));
  
  return null;
  }
  
  userService.save(user);
  
  return Index.class;
  
  }
   }
  
  
   --Registration.tml
  
  
   html t:type=layout title=Customer registration
t:sidebarTitle=Current Time
t:pageTitle=Register
xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
xmlns:p=tapestry:parameter
  
   fieldset id=register
  form class=full-form t:id=registerForm
  t:errors/
  
  fieldset
  legendCustomer registration(company or private
   person)/legend
  
  t:beaneditor object=user.customer
   exclude=literal:id,users
  p:businessName
  t:label for=businessName/
 

Re: Objects session persistance and validation

2010-10-25 Thread Anton Mezerny
Required validation works on client side, so I have not tested it on server.
I can say, that when my custom validation causes error (password and
password verification don't match), then I have 2 error messages on
registration page (if email is also not valid) - email error and password
verification error.

Anton

2010/10/25 Mark mark-li...@xeric.net

 Do all the other validations perform as expected other than email? Does the
 required validation on email work correctly and give you an error when
 you
 try to submit. Also do you have any types of constraints on the email field
 in the database? Is it possible that what you are entering in the email
 fields is passing the email validation, but getting rejected by the
 database?

 I don't remember what Tapestry uses to determine whether or not something
 is
 a valid email address, but I do know that the actual spec for email
 addresses is a lot more permissive than you'd think.

 Mark

 On Mon, Oct 25, 2010 at 6:35 AM, Anton Mezerny anton.meze...@gmail.com
 wrote:

  So, I removed initializeNewUser() from Registration.java and added
 @Inject
  annotation to User.java and Customer.java (I also made user and customer
  separate, not nested one into another and I nest user into customer just
  before saving to DB). Now page renders well, but when I try to save user
  and
  customer (and email is invalid) - email validation does not occurs - I
 just
  have email = null in my customer.email field (even if i set some
 incorrect
  value, for exapmle 'test_email'). There is no redirect to the
 registration
  page with error message - program continues execution and tries to save
  data
  to DB.
 
  2010/10/23 Mark W. Shead mwsh...@gmail.com
 
   I don't think you want to use flash persistence for this.  Try just
   using @Persist. It looks like you are creating a new user every time
   the page renders.
  
   Mark
  
   On Sat, Oct 23, 2010 at 3:08 PM, Jim O'Callaghan 
 jc1000...@yahoo.co.uk
   wrote:
I'm not sure if this is relevant to your current problem, but to tell
Tapestry which constructor to use for the bean editor, you should
   annotate
the default (no args) constructor with @Inject - this will allow the
  BEF
   to
create the relevant entity if none if present.  Hope this helps.
   
Regards,
Jim.
   
-Original Message-
From: Anton Mezerny [mailto:anton.meze...@gmail.com]
Sent: 23 October 2010 17:02
To: Tapestry users
Subject: Objects session persistance and validation
   
Hi all,
I'm trying to write simple registration form using beaneditor
  component.
If I fullfill all reqired fields in the form and submit it -
 everything
works fine, but if server validation occurs (for example passwords
  don't
match), then all data is lost and Registration page renders with
   validation
errors, but without user data (input values).
I think the reason for this behaviour is the initializeNewUser()
  method,
wich rewrites all data if user field is null. But if I delete this
  method
from code, tapestry throws exception - User can't be instantiated
   (tapestry
tries to use constructor with most parameters, which has custom
  objects,
   not
only String, Integer, etc). So how can resolve this problem?
Thanks in advance.
   
 My code (some code is token from Tapestry5 Hotel Booking example):
   
  
 
 -Registration.java:-
---
   
public class Registration {
   
   @Property
   @Persist(PersistenceConstants.FLASH)
   private User user;
   
   @OnEvent(value = EventConstants.PREPARE, component =
 registerForm)
   private void initializeNewUser() {
   if (this.user == null) {
   this.user = new User();
   this.user.setCustomer(new Customer());
   } else {
   if (this.user.getCustomer() == null) {
   this.user.setCustomer(new Customer());
   }
   }
   }
   
   
   @Property
   private String verifyPassword;
   
   @Inject
   private UserService userService;
   
   @Component
   private Form registerForm;
   
   @Inject
   private Messages messages;
   
   public Object onSubmitFromRegisterForm() {
   
   if (!verifyPassword.equals(user.getPassword())) {
   
registerForm.recordError(messages.get(error.verify.password));
   
   return null;
   }
   
   if (userService.getUserByLogin(user.getLogin()) != null) {
   
registerForm.recordError(messages.get(error.user.already.exists));
   
   return null;
   }
   
   userService.save(user);
   
   return Index.class;
   
   }
}
   
   
--Registration.tml
   
   
html t:type=layout title=Customer registration
 t:sidebarTitle=Current Time
 t:pageTitle=Register
  

Re: Objects session persistance and validation

2010-10-25 Thread Anton Mezerny
Ok, when i changed order from validation=required,email to
validation=email,required email validation starts to work properly. Looks
like some magic :). However, I get sometimes user data lost. I can't
reproduce this bug with 100% probability, but it occurs sometimes. I tried
also to change @Persist(PersistenceConstants.FLASH) to default @Persist. But
it gives me behavior I don't want - it renders user data even if I refresh
the page (I want to show blank form in that case). So FLASH persistance is
what I want, but sometimes data are lost.

My code now looks like this:
---Registration.java-
public class Registration {

@Property
@Persist(PersistenceConstants.FLASH)
private User user;

@Property
@Persist(PersistenceConstants.FLASH)
private Customer customer;

@Property
private String verifyPassword;

@Inject
private CustomerService customerService;

@Inject
private UserService userService;

@Component
private Form registerForm;

@Inject
private Messages messages;

@OnEvent(value = EventConstants.SUCCESS, component = registerForm)
Object validateAndSave() {

if (errorsDetected()){
return null;
}
user.setPassword(generateHash(user.getPassword()));
customer.addUser(user);
customerService.save(customer);

// redirect with a message parameter
return Index.class;

}

private boolean errorsDetected(){
boolean errorDetected = false;
if (!verifyPassword.equals(user.getPassword())) {
registerForm.recordError(verifyPassword,
messages.get(error.verify.password));
errorDetected = true;
}

if (userService.getUserByLogin(user.getLogin()) != null) {

registerForm.recordError(messages.get(error.user.already.exists));
errorDetected = true;
}

if
(customerService.getCustomerByBusinessName(customer.getBusinessName()) !=
null) {

registerForm.recordError(messages.get(error.customer.already.exists));
errorDetected = true;
}
return errorDetected;
}
}

-Registration.tml
html t:type=layout title=Customer registration
  t:sidebarTitle=Current Time
  t:pageTitle=Register
  xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
  xmlns:p=tapestry:parameter

fieldset id=register
form class=full-form t:id=registerForm
t:errors/

fieldset
legendCustomer registration (company or private
person)/legend

t:beaneditor object=customer exclude=literal:id,users
p:businessName
t:label for=businessName/
t:textfield t:id=businessName
value=customer.businessName validate=required/
/p:businessName
p:contactPhone
t:label for=customer_contactPhone/
t:textfield t:id=customer_contactPhone
value=customer.contactPhone validate=required/
/p:contactPhone
p:contactPerson
t:label for=contactPerson/
t:textfield t:id=contactPerson
value=customer.contactPerson validate=required/
/p:contactPerson
p:businessAddress
t:label for=businessAddress/
t:textfield t:id=businessAddress
value=customer.businessAddress validate=required/
/p:businessAddress
p:email
t:label for=customer_email/
t:textfield t:id=customer_email
value=customer.email validate=email,required/
/p:email
/t:beaneditor
/fieldset

fieldset
legendPersonal registration/legend
t:beaneditor object=user exclude=literal:id,roles
add=verifyPassword


p:firstName
t:label for=firstName/
t:textfield t:id=firstName value=user.firstName
validate=required/
/p:firstName


p:middleName
t:label for=middleName/
t:textfield t:id=middleName value=user.middleName
validate=required/
/p:middleName


p:lastName
t:label for=lastName/
t:textfield t:id=lastName value=user.lastName
validate=required/
/p:lastName


p:contactPhone
t:label for=contactPhone/
t:textfield t:id=contactPhone
value=user.contactPhone validate=required/
/p:contactPhone


p:mobilePhone
t:label for=mobilePhone/
t:textfield t:id=mobilePhone value=user.mobilePhone
validate=required/
/p:mobilePhone


p:address
t:label 

Re: Objects session persistance and validation

2010-10-25 Thread Mark Shead
Once it is submitted you may want to set the user back to null, that way you
can start fresh when the page is submitted.

The required,email and email,required things sounds odd. I'm going to see if
I can reproduce that.  What version of tapestry are you using?

Mark

On Mon, Oct 25, 2010 at 2:17 PM, Anton Mezerny anton.meze...@gmail.comwrote:

 Ok, when i changed order from validation=required,email to
 validation=email,required email validation starts to work properly. Looks
 like some magic :). However, I get sometimes user data lost. I can't
 reproduce this bug with 100% probability, but it occurs sometimes. I tried
 also to change @Persist(PersistenceConstants.FLASH) to default @Persist.
 But
 it gives me behavior I don't want - it renders user data even if I refresh
 the page (I want to show blank form in that case). So FLASH persistance is
 what I want, but sometimes data are lost.

 My code now looks like this:

 ---Registration.java-
 public class Registration {

@Property
@Persist(PersistenceConstants.FLASH)
private User user;

@Property
@Persist(PersistenceConstants.FLASH)
 private Customer customer;

@Property
private String verifyPassword;

@Inject
 private CustomerService customerService;

@Inject
private UserService userService;

@Component
private Form registerForm;

@Inject
private Messages messages;

 @OnEvent(value = EventConstants.SUCCESS, component = registerForm)
Object validateAndSave() {

if (errorsDetected()){
return null;
}
user.setPassword(generateHash(user.getPassword()));
customer.addUser(user);
customerService.save(customer);

// redirect with a message parameter
return Index.class;

}

private boolean errorsDetected(){
boolean errorDetected = false;
 if (!verifyPassword.equals(user.getPassword())) {
 registerForm.recordError(verifyPassword,
 messages.get(error.verify.password));
 errorDetected = true;
 }

if (userService.getUserByLogin(user.getLogin()) != null) {

 registerForm.recordError(messages.get(error.user.already.exists));
 errorDetected = true;
}

if
 (customerService.getCustomerByBusinessName(customer.getBusinessName()) !=
 null) {

 registerForm.recordError(messages.get(error.customer.already.exists));
errorDetected = true;
}
return errorDetected;
 }
 }


 -Registration.tml
 html t:type=layout title=Customer registration
  t:sidebarTitle=Current Time
  t:pageTitle=Register
  xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
  xmlns:p=tapestry:parameter

 fieldset id=register
form class=full-form t:id=registerForm
t:errors/

fieldset
legendCustomer registration (company or private
 person)/legend

 t:beaneditor object=customer exclude=literal:id,users
 p:businessName
t:label for=businessName/
t:textfield t:id=businessName
 value=customer.businessName validate=required/
 /p:businessName
p:contactPhone
t:label for=customer_contactPhone/
t:textfield t:id=customer_contactPhone
 value=customer.contactPhone validate=required/
 /p:contactPhone
p:contactPerson
t:label for=contactPerson/
t:textfield t:id=contactPerson
 value=customer.contactPerson validate=required/
 /p:contactPerson
p:businessAddress
t:label for=businessAddress/
t:textfield t:id=businessAddress
 value=customer.businessAddress validate=required/
 /p:businessAddress
p:email
t:label for=customer_email/
t:textfield t:id=customer_email
 value=customer.email validate=email,required/
 /p:email
/t:beaneditor
/fieldset

fieldset
legendPersonal registration/legend
t:beaneditor object=user exclude=literal:id,roles
 add=verifyPassword


p:firstName
t:label for=firstName/
t:textfield t:id=firstName value=user.firstName
 validate=required/
/p:firstName


p:middleName
t:label for=middleName/
t:textfield t:id=middleName value=user.middleName
 validate=required/
/p:middleName


p:lastName
t:label for=lastName/
t:textfield t:id=lastName value=user.lastName
 validate=required/
/p:lastName


p:contactPhone
t:label 

Re: Objects session persistance and validation

2010-10-25 Thread Anton Mezerny
I am using 5.1.0.7. Also I figured how to reproduce such a behavior - if i
fill all fields with proper values, but set not equal passwords - all data
is lost, but if I set invalid email and proper passwords - everything works
fine.

P.S. There is one error in previous code - in recordErrors() method shoud
be:

registerForm.recordError(messages.get(error.verify.password));
instead of
registerForm.recordError(verifyPassword,
messages.get(error.verify.password));

2010/10/25 Mark Shead mark.sh...@xeric.net

 Once it is submitted you may want to set the user back to null, that way
 you
 can start fresh when the page is submitted.

 The required,email and email,required things sounds odd. I'm going to see
 if
 I can reproduce that.  What version of tapestry are you using?

 Mark

 On Mon, Oct 25, 2010 at 2:17 PM, Anton Mezerny anton.meze...@gmail.com
 wrote:

  Ok, when i changed order from validation=required,email to
  validation=email,required email validation starts to work properly.
 Looks
  like some magic :). However, I get sometimes user data lost. I can't
  reproduce this bug with 100% probability, but it occurs sometimes. I
 tried
  also to change @Persist(PersistenceConstants.FLASH) to default @Persist.
  But
  it gives me behavior I don't want - it renders user data even if I
 refresh
  the page (I want to show blank form in that case). So FLASH persistance
 is
  what I want, but sometimes data are lost.
 
  My code now looks like this:
 
 
 ---Registration.java-
  public class Registration {
 
 @Property
 @Persist(PersistenceConstants.FLASH)
 private User user;
 
 @Property
 @Persist(PersistenceConstants.FLASH)
  private Customer customer;
 
 @Property
 private String verifyPassword;
 
 @Inject
  private CustomerService customerService;
 
 @Inject
 private UserService userService;
 
 @Component
 private Form registerForm;
 
 @Inject
 private Messages messages;
 
  @OnEvent(value = EventConstants.SUCCESS, component = registerForm)
 Object validateAndSave() {
 
 if (errorsDetected()){
 return null;
 }
 user.setPassword(generateHash(user.getPassword()));
 customer.addUser(user);
 customerService.save(customer);
 
 // redirect with a message parameter
 return Index.class;
 
 }
 
 private boolean errorsDetected(){
 boolean errorDetected = false;
  if (!verifyPassword.equals(user.getPassword())) {
  registerForm.recordError(verifyPassword,
  messages.get(error.verify.password));
  errorDetected = true;
  }
 
 if (userService.getUserByLogin(user.getLogin()) != null) {
 
  registerForm.recordError(messages.get(error.user.already.exists));
  errorDetected = true;
 }
 
 if
  (customerService.getCustomerByBusinessName(customer.getBusinessName()) !=
  null) {
 
  registerForm.recordError(messages.get(error.customer.already.exists));
 errorDetected = true;
 }
 return errorDetected;
  }
  }
 
 
 
 -Registration.tml
  html t:type=layout title=Customer registration
   t:sidebarTitle=Current Time
   t:pageTitle=Register
   xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
   xmlns:p=tapestry:parameter
 
  fieldset id=register
 form class=full-form t:id=registerForm
 t:errors/
 
 fieldset
 legendCustomer registration (company or private
  person)/legend
 
  t:beaneditor object=customer exclude=literal:id,users
  p:businessName
 t:label for=businessName/
 t:textfield t:id=businessName
  value=customer.businessName validate=required/
  /p:businessName
 p:contactPhone
 t:label for=customer_contactPhone/
 t:textfield t:id=customer_contactPhone
  value=customer.contactPhone validate=required/
  /p:contactPhone
 p:contactPerson
 t:label for=contactPerson/
 t:textfield t:id=contactPerson
  value=customer.contactPerson validate=required/
  /p:contactPerson
 p:businessAddress
 t:label for=businessAddress/
 t:textfield t:id=businessAddress
  value=customer.businessAddress validate=required/
  /p:businessAddress
 p:email
 t:label for=customer_email/
 t:textfield t:id=customer_email
  value=customer.email validate=email,required/
  /p:email
 /t:beaneditor
 /fieldset
 
 fieldset
 legendPersonal registration/legend
 t:beaneditor object=user exclude=literal:id,roles
 

RE: Objects session persistance and validation

2010-10-23 Thread Jim O'Callaghan
I'm not sure if this is relevant to your current problem, but to tell
Tapestry which constructor to use for the bean editor, you should annotate
the default (no args) constructor with @Inject - this will allow the BEF to
create the relevant entity if none if present.  Hope this helps.

Regards,
Jim.

-Original Message-
From: Anton Mezerny [mailto:anton.meze...@gmail.com] 
Sent: 23 October 2010 17:02
To: Tapestry users
Subject: Objects session persistance and validation

Hi all,
I'm trying to write simple registration form using beaneditor component.
If I fullfill all reqired fields in the form and submit it - everything
works fine, but if server validation occurs (for example passwords don't
match), then all data is lost and Registration page renders with validation
errors, but without user data (input values).
I think the reason for this behaviour is the initializeNewUser() method,
wich rewrites all data if user field is null. But if I delete this method
from code, tapestry throws exception - User can't be instantiated (tapestry
tries to use constructor with most parameters, which has custom objects, not
only String, Integer, etc). So how can resolve this problem?
Thanks in advance.

 My code (some code is token from Tapestry5 Hotel Booking example):
-Registration.java:-
---

public class Registration {

@Property
@Persist(PersistenceConstants.FLASH)
private User user;

@OnEvent(value = EventConstants.PREPARE, component = registerForm)
private void initializeNewUser() {
if (this.user == null) {
this.user = new User();
this.user.setCustomer(new Customer());
} else {
if (this.user.getCustomer() == null) {
this.user.setCustomer(new Customer());
}
}
}


@Property
private String verifyPassword;

@Inject
private UserService userService;

@Component
private Form registerForm;

@Inject
private Messages messages;

public Object onSubmitFromRegisterForm() {

if (!verifyPassword.equals(user.getPassword())) {
registerForm.recordError(messages.get(error.verify.password));

return null;
}

if (userService.getUserByLogin(user.getLogin()) != null) {

registerForm.recordError(messages.get(error.user.already.exists));

return null;
}

userService.save(user);

return Index.class;

}
}


--Registration.tml


html t:type=layout title=Customer registration
  t:sidebarTitle=Current Time
  t:pageTitle=Register
  xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
  xmlns:p=tapestry:parameter

fieldset id=register
form class=full-form t:id=registerForm
t:errors/

fieldset
legendCustomer registration(company or private
person)/legend

t:beaneditor object=user.customer
exclude=literal:id,users
p:businessName
t:label for=businessName/
t:textfield t:id=businessName
value=user.customer.businessName validate=required/
/p:businessName
p:contactPhone
t:label for=customer_contactPhone/
t:textfield t:id=customer_contactPhone
value=user.customer.contactPhone validate=required/
/p:contactPhone
p:contactPerson
t:label for=contactPerson/
t:textfield t:id=contactPerson
value=user.customer.contactPerson validate=required/
/p:contactPerson
p:businessAddress
t:label for=businessAddress/
t:textfield t:id=businessAddress
value=user.customer.businessAddress validate=required/
/p:businessAddress
p:email
t:label for=customer_email/
t:textfield t:id=customer_email
value=user.customer.email validate=required,email/
/p:email
/t:beaneditor
/fieldset

fieldset
legendPersonal registration/legend
t:beaneditor object=user exclude=literal:id,roles
add=verifyPassword


p:firstName
t:label for=firstName/
t:textfield t:id=firstName value=user.firstName
validate=required/
/p:firstName


p:middleName
t:label for=middleName/
t:textfield t:id=middleName value=user.middleName
validate=required/
/p:middleName


p:lastName
t:label for=lastName/
t:textfield 

Re: Objects session persistance and validation

2010-10-23 Thread Mark W. Shead
I don't think you want to use flash persistence for this.  Try just
using @Persist. It looks like you are creating a new user every time
the page renders.

Mark

On Sat, Oct 23, 2010 at 3:08 PM, Jim O'Callaghan jc1000...@yahoo.co.uk wrote:
 I'm not sure if this is relevant to your current problem, but to tell
 Tapestry which constructor to use for the bean editor, you should annotate
 the default (no args) constructor with @Inject - this will allow the BEF to
 create the relevant entity if none if present.  Hope this helps.

 Regards,
 Jim.

 -Original Message-
 From: Anton Mezerny [mailto:anton.meze...@gmail.com]
 Sent: 23 October 2010 17:02
 To: Tapestry users
 Subject: Objects session persistance and validation

 Hi all,
 I'm trying to write simple registration form using beaneditor component.
 If I fullfill all reqired fields in the form and submit it - everything
 works fine, but if server validation occurs (for example passwords don't
 match), then all data is lost and Registration page renders with validation
 errors, but without user data (input values).
 I think the reason for this behaviour is the initializeNewUser() method,
 wich rewrites all data if user field is null. But if I delete this method
 from code, tapestry throws exception - User can't be instantiated (tapestry
 tries to use constructor with most parameters, which has custom objects, not
 only String, Integer, etc). So how can resolve this problem?
 Thanks in advance.

  My code (some code is token from Tapestry5 Hotel Booking example):
 -Registration.java:-
 ---

 public class Registration {

   �...@property
   �...@persist(PersistenceConstants.FLASH)
    private User user;

   �...@onevent(value = EventConstants.PREPARE, component = registerForm)
    private void initializeNewUser() {
        if (this.user == null) {
            this.user = new User();
            this.user.setCustomer(new Customer());
        } else {
            if (this.user.getCustomer() == null) {
                this.user.setCustomer(new Customer());
            }
        }
    }


   �...@property
    private String verifyPassword;

   �...@inject
    private UserService userService;

   �...@component
    private Form registerForm;

   �...@inject
    private Messages messages;

    public Object onSubmitFromRegisterForm() {

        if (!verifyPassword.equals(user.getPassword())) {
            registerForm.recordError(messages.get(error.verify.password));

            return null;
        }

        if (userService.getUserByLogin(user.getLogin()) != null) {

 registerForm.recordError(messages.get(error.user.already.exists));

            return null;
        }

        userService.save(user);

        return Index.class;

    }
 }


 --Registration.tml


 html t:type=layout title=Customer registration
      t:sidebarTitle=Current Time
      t:pageTitle=Register
      xmlns:t=http://tapestry.apache.org/schema/tapestry_5_1_0.xsd;
      xmlns:p=tapestry:parameter

 fieldset id=register
    form class=full-form t:id=registerForm
        t:errors/

                fieldset
                    legendCustomer registration(company or private
 person)/legend

                    t:beaneditor object=user.customer
 exclude=literal:id,users
                        p:businessName
                            t:label for=businessName/
                            t:textfield t:id=businessName
 value=user.customer.businessName validate=required/
                        /p:businessName
                        p:contactPhone
                            t:label for=customer_contactPhone/
                            t:textfield t:id=customer_contactPhone
 value=user.customer.contactPhone validate=required/
                        /p:contactPhone
                        p:contactPerson
                            t:label for=contactPerson/
                            t:textfield t:id=contactPerson
 value=user.customer.contactPerson validate=required/
                        /p:contactPerson
                        p:businessAddress
                            t:label for=businessAddress/
                            t:textfield t:id=businessAddress
 value=user.customer.businessAddress validate=required/
                        /p:businessAddress
                        p:email
                            t:label for=customer_email/
                            t:textfield t:id=customer_email
 value=user.customer.email validate=required,email/
                        /p:email
                    /t:beaneditor
                /fieldset

        fieldset
                legendPersonal registration/legend
        t:beaneditor object=user exclude=literal:id,roles
 add=verifyPassword


                p:firstName
                    t:label for=firstName/
                    t:textfield t:id=firstName value=user.firstName
 validate=required/
                /p:firstName