You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Ray Weidner <se...@gmail.com> on 2010/04/10 21:19:21 UTC

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

Posted by Ray Weidner <se...@gmail.com>.
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 <sv...@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-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Trying to do something complicated with ListMultipleChoice model

Posted by Sven Meier <sv...@meiers.net>.
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-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org