Trying to do something complicated with ListMultipleChoice model
Hi, I'm pretty new to Wicket and trying to get a better understanding of how models work. That's probably why this is such a tricky problem for me. On my site, users are submitting a form for a new Issue to be created. One of the fields of this Issue is affectedParties; in the data model, this is represented by a collection of PartyIssue objects, which associate a Party with an Issue. Here's the simplified code: public class Issue { ... private Set PartyIssue affectedParties; public Set PartyIssue getAffectedParties () { ... } public void setAffectedParties (Set PartyIssue affectedParties) { ... } ... } public class Party { ... } public class PartyIssue { private Issue issue; private Party party; ... } The new Issue Form uses a new Issue object as the argument for the CompoundPropertyModel. What I want to do is allow users to specify the affected parties by multi-selecting from a list of Parties. Then, at the time of submission, we should iterate through this list and construct corresponding PartyIssues, which are associated with the Issue and then created by the service layer (with validation etc.). So, how would I do this? This is how I've been trying to construct the ListMultipleChoice: private Set Party affectedParties = new HashSet Party (); private ListMultipleChoice Party buildPartyDropdown (String property) { IModel Collection Party affectedPartyModel = new IModel Collection Party () { @Override public Collection Party getObject () { return affectedParties; } @Override public void setObject (Collection Party arg0) { affectedParties.clear (); affectedParties.addAll (arg0); } @Override public void detach () { // Nothing to do here } }; IChoiceRenderer Party partyListRenderer = new IChoiceRenderer Party () { private static final long serialVersionUID = -1588547331340300417L; @Override public Object getDisplayValue (Party arg0) { return arg0.getFullName (); } @Override public String getIdValue (Party arg0, int arg1) { return Long.toString (arg0.getRecordId ()); } }; ListMultipleChoice Party choice = new ListMultipleChoice Party (property, affectedPartyModel, new Vector Party (getAllParties ()), partyListRenderer); return choice; } In my onSubmit() code for the Form, I attempt to iterate through the affectedParties Set to create the Set of PartyIssues. However, this is always turning out to be empty no matter what is selected on the form. The problem isn't in the onSubmit() code because the rest of the form is processed and persisted properly, and log messages show that affectedParties is empty at that point. Note that the list choices are being rendered properly. I'm sure I'm doing something very wrong so I'd appreciate any guidance.
Re: Trying to do something complicated with ListMultipleChoice model
Hi, ListMultipleChoice puts all selected parties into the model object you're returning in #getObject(). Either you should return a copy of your collection in #getObject() or just do nothing in #setObject(). Your current call to #clear() is effectively clearing the new selection (i.e. affectedParties and arg0 are identical). Regards Sven Ray Weidner wrote: Hi, I'm pretty new to Wicket and trying to get a better understanding of how models work. That's probably why this is such a tricky problem for me. On my site, users are submitting a form for a new Issue to be created. One of the fields of this Issue is affectedParties; in the data model, this is represented by a collection of PartyIssue objects, which associate a Party with an Issue. Here's the simplified code: public class Issue { ... private Set PartyIssue affectedParties; public Set PartyIssue getAffectedParties () { ... } public void setAffectedParties (Set PartyIssue affectedParties) { ... } ... } public class Party { ... } public class PartyIssue { private Issue issue; private Party party; ... } The new Issue Form uses a new Issue object as the argument for the CompoundPropertyModel. What I want to do is allow users to specify the affected parties by multi-selecting from a list of Parties. Then, at the time of submission, we should iterate through this list and construct corresponding PartyIssues, which are associated with the Issue and then created by the service layer (with validation etc.). So, how would I do this? This is how I've been trying to construct the ListMultipleChoice: private Set Party affectedParties = new HashSet Party (); private ListMultipleChoice Party buildPartyDropdown (String property) { IModel Collection Party affectedPartyModel = new IModel Collection Party () { @Override public Collection Party getObject () { return affectedParties; } @Override public void setObject (Collection Party arg0) { affectedParties.clear (); affectedParties.addAll (arg0); } @Override public void detach () { // Nothing to do here } }; IChoiceRenderer Party partyListRenderer = new IChoiceRenderer Party () { private static final long serialVersionUID = -1588547331340300417L; @Override public Object getDisplayValue (Party arg0) { return arg0.getFullName (); } @Override public String getIdValue (Party arg0, int arg1) { return Long.toString (arg0.getRecordId ()); } }; ListMultipleChoice Party choice = new ListMultipleChoice Party (property, affectedPartyModel, new Vector Party (getAllParties ()), partyListRenderer); return choice; } In my onSubmit() code for the Form, I attempt to iterate through the affectedParties Set to create the Set of PartyIssues. However, this is always turning out to be empty no matter what is selected on the form. The problem isn't in the onSubmit() code because the rest of the form is processed and persisted properly, and log messages show that affectedParties is empty at that point. Note that the list choices are being rendered properly. I'm sure I'm doing something very wrong so I'd appreciate any guidance. - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org
Re: Trying to do something complicated with ListMultipleChoice model
Hi Sven, Thanks, that did the trick. I thought that the Collection argument was being generated by the framework, but now I understand what's happening. On Sat, Apr 10, 2010 at 4:00 PM, Sven Meier s...@meiers.net wrote: Hi, ListMultipleChoice puts all selected parties into the model object you're returning in #getObject(). Either you should return a copy of your collection in #getObject() or just do nothing in #setObject(). Your current call to #clear() is effectively clearing the new selection (i.e. affectedParties and arg0 are identical). Regards Sven Ray Weidner wrote: Hi, I'm pretty new to Wicket and trying to get a better understanding of how models work. That's probably why this is such a tricky problem for me. On my site, users are submitting a form for a new Issue to be created. One of the fields of this Issue is affectedParties; in the data model, this is represented by a collection of PartyIssue objects, which associate a Party with an Issue. Here's the simplified code: public class Issue { ... private Set PartyIssue affectedParties; public Set PartyIssue getAffectedParties () { ... } public void setAffectedParties (Set PartyIssue affectedParties) { ... } ... } public class Party { ... } public class PartyIssue { private Issue issue; private Party party; ... } The new Issue Form uses a new Issue object as the argument for the CompoundPropertyModel. What I want to do is allow users to specify the affected parties by multi-selecting from a list of Parties. Then, at the time of submission, we should iterate through this list and construct corresponding PartyIssues, which are associated with the Issue and then created by the service layer (with validation etc.). So, how would I do this? This is how I've been trying to construct the ListMultipleChoice: private Set Party affectedParties = new HashSet Party (); private ListMultipleChoice Party buildPartyDropdown (String property) { IModel Collection Party affectedPartyModel = new IModel Collection Party () { @Override public Collection Party getObject () { return affectedParties; } @Override public void setObject (Collection Party arg0) { affectedParties.clear (); affectedParties.addAll (arg0); } @Override public void detach () { // Nothing to do here } }; IChoiceRenderer Party partyListRenderer = new IChoiceRenderer Party () { private static final long serialVersionUID = -1588547331340300417L; @Override public Object getDisplayValue (Party arg0) { return arg0.getFullName (); } @Override public String getIdValue (Party arg0, int arg1) { return Long.toString (arg0.getRecordId ()); } }; ListMultipleChoice Party choice = new ListMultipleChoice Party (property, affectedPartyModel, new Vector Party (getAllParties ()), partyListRenderer); return choice; } In my onSubmit() code for the Form, I attempt to iterate through the affectedParties Set to create the Set of PartyIssues. However, this is always turning out to be empty no matter what is selected on the form. The problem isn't in the onSubmit() code because the rest of the form is processed and persisted properly, and log messages show that affectedParties is empty at that point. Note that the list choices are being rendered properly. I'm sure I'm doing something very wrong so I'd appreciate any guidance. - To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org