You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Stephan Windmüller <st...@cs.tu-dortmund.de> on 2009/06/29 11:36:58 UTC

Validating nested loops with helper classes

Hello!

I am trying to create a simple use-case with Tapestry components, but I
am unsure how to handle this correctly. Perhaps someone knows a solution.

The site is used to assign users to jobs. Each job has a java.util.List
of users assigned to it. Of course a user should not be assigned twice
to a job. So basically my class should look like

public class Job {
	private String title;
	private List<User> assignments;

        ... getter/setter ...
}

Unfortunately the List is not part of the class, I have to get it
directly from the database. So I wrote a helper bean class DisplayJob
which contains the assignments.

Now I want to create a page that displays all jobs and for each job the
assigned users. My first try is a table with

-----

<tr t:type="loop" t:source="jobs" t:encoder="jobEncoder" t:value="job">
 <td>${job.title}</td>

 <td t:type="loop" t:source="job.assignments" t:value="user"
t:encoder="jobEncoder">

 <select t:type="select" t:id="job" t:model="userModel" t:value="user"
t:encoder="userEncoder" blankLabel="Unassigned" />

 </td>
</tr>

-----

All jobs and select boxes are drawn as expected, but now I am stuck.
After submitting the form the values reset, job.assignments is never
changed. Also I am unable to validate if a user has been assigned twice
or more to a job.

JobEncoder creates a new DisplayJob, reading the assignments from the
database, so the data is of course not changed. But where is the place
to change the database?

Does anyone know how I can accomplish this task? Or is it even possible
to display the data in a Grid component?

TIA
 Stephan

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Validating nested loops with helper classes

Posted by Stephan Windmüller <st...@cs.tu-dortmund.de>.
Stephan Windmüller wrote:

> Please, is there anyone who can tell me how to iterate over a list and
> store data in it?

I found the solution. It was a mixture of three different things:

1. Using the formState="literal:VALUES" in loops.
2. The two value-elements from select and loop must not be the same
   value, otherwise the object references do not match.
3. Losing the session after reloading the tomcat application or even
   restarting tomcat is not the same as manually logging out.

Another solution I found on this list is using the index-parameter of
the loop, removing the Property-Annotation and using the index in
getAssignedUser.

Hope that helps others.

- Stephan

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Validating nested loops with helper classes

Posted by Stephan Windmüller <st...@cs.tu-dortmund.de>.
Stephan Windmüller wrote:

> As long as I do not use a List to store the objects, all works fine. But
> when I submit the form above, it always resets and the list consists of
> "undecided" users.

The next thing I found out: This has nothing to do with my helper
classes. Even when I use a list of Strings for the assignments and
construct the select component like

 <t:select model="literal:User1,User2,User3" value="selectedUser"/>

the users are not stored in the list. I tried different values for the
formState-Parameter, nothing helped. Even when I print all values from
the sychronizeValues-Event, all are empty.

Please, is there anyone who can tell me how to iterate over a list and
store data in it?

Regards
 Stephan

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Validating nested loops with helper classes

Posted by Stephan Windmüller <st...@cs.tu-dortmund.de>.
On Mon, 29. Jun 2009, Stephan Windmüller wrote:

> The site is used to assign users to jobs. Each job has a java.util.List
> of users assigned to it. Of course a user should not be assigned twice
> to a job.

To clarify this I modified the example from
http://wiki.apache.org/tapestry/Tapestry5HowtoSelectWithObjects

-----

SelectTest.java

package de.ls5.ocs.webclient.tapestry.pages;

import java.util.ArrayList;
import java.util.List;

import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;

import de.ls5.ocs.backend.ConferenceController;
import de.ls5.ocs.backend.User;
import de.ls5.ocs.webclient.tapestry.services.GenericSelectModel;
import de.ls5.ocs.webclient.tapestry.util.ASO;

public class SelectTest {
    @Persist
    private List<User> assignments;
    @Inject
    private PropertyAccess _access;
    
    @Persist
    @Property
    private User selectedUser;
     
    @Inject
    private ConferenceController conferenceController;
	
    private GenericSelectModel<User> selectableUsers;
    
    void onActivate() {
    	System.out.println("OnActivate");
    	if (assignments == null) {
    		User emptyUSer = new User("None", "Undecided", "none");
    		System.out.println("Filling List");
    		assignments = new ArrayList<User>();
    		assignments.add(emptyUSer);
    		assignments.add(emptyUSer);
    		assignments.add(emptyUSer);
    	} else {
    		System.out.println("List was already filled with " + assignments.size() + " elements.");
    	}
    	
    	// Getting NullPointerException if this is missing. Why?
    	if (selectedUser == null) {
    		System.out.println("Setting selectedUser");
    		selectedUser = new User("bla");
    	}
    }

    public SelectTest(){
        selectableUsers = new GenericSelectModel<User>(DAO.getAllUsers(),User.class,"fullName","id",_access);
    }
    
    public List<User> getAssignments(){
       return assignments;
    }

    public void setAssignments(List<User> assignments){
       this.assignments = assignments;
    }
    
    public GenericSelectModel<User> getSelectableUsers(){
       return selectableUsers;
    }
}




SelectTest.tml

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
    <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <title>Select test</title>
    </head>
    <body style="font-family:Courier new">
    
        <form t:type="Form">
        <table>
        	<tr t:type="loop" t:source="assignments" t:encoder="selectableUsers" t:value="selectedUser">
        		<td>
                	<t:select model="selectableUsers" encoder="selectableUsers" value="selectedUser"/>
                </td>
            </tr>
        </table>
                <t:submit/>
        </form>
value: ${assignments}
    </body>
</html>

-----

As long as I do not use a List to store the objects, all works fine. But
when I submit the form above, it always resets and the list consists of
"undecided" users.

Regards
 Stephan

Re: Validating nested loops with helper classes

Posted by Stephan Windmüller <st...@cs.tu-dortmund.de>.
Christine schrieb:

>> All jobs and select boxes are drawn as expected, but now I am stuck.
>> After submitting the form 
> How do you submit the form?

With a standard submit component:

 <input type="submit" t:type="submit" value="${message:assign}"/>

I even tried the GenericSelectModel described on [0] for displaying the
user data, but it seems that my main problem is the storing of values in
a Java List. :(

Is it even possible to iterate over such a list, storing values there?

Regards
 Stephan

[0] http://wiki.apache.org/tapestry/Tapestry5HowtoSelectWithObjects

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Validating nested loops with helper classes

Posted by Christine <ch...@christine.nl>.
Stephan Windmüller wrote:
> All jobs and select boxes are drawn as expected, but now I am stuck.
> After submitting the form 
How do you submit the form?

> the values reset, job.assignments is never
> changed. Also I am unable to validate if a user has been assigned twice
> or more to a job.
>
> JobEncoder creates a new DisplayJob, reading the assignments from the
> database, so the data is of course not changed. But where is the place
> to change the database?
>
> Does anyone know how I can accomplish this task? Or is it even possible
> to display the data in a Grid component?
>
> TIA
>  Stephan
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>   


-- 
dagdag is just a two-character rotation of byebye.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org