I wrote a comment on this issue explaining why it is not a bug. Please have
a look.

https://issues.apache.org/jira/browse/WICKET-3538?focusedCommentId=13007777&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13007777
<https://issues.apache.org/jira/browse/WICKET-3538?focusedCommentId=13007777&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13007777>
Bruno Borges
www.brunoborges.com.br
+55 21 76727099

"The glory of great men should always be
measured by the means they have used to
acquire it."
 - Francois de La Rochefoucauld



On Tue, Mar 15, 2011 at 3:46 PM, Sjoerd Smeets <ssme...@gmail.com> wrote:

> Hi Pedro,
>
> I've created a quickstart and put it in a ticket.
> https://issues.apache.org/jira/browse/WICKET-3538
>
> <https://issues.apache.org/jira/browse/WICKET-3538>Thanks for your help,
> Sjoerd
>
> On Tue, Mar 15, 2011 at 1:12 PM, Pedro Santos <pedros...@gmail.com> wrote:
>
> > double check the Location hash/equals implementation, if it keeps not
> > working send us a quickstart
> >
> >
> > On Tue, Mar 15, 2011 at 2:04 PM, Sjoerd Smeets <ssme...@gmail.com>
> wrote:
> >
> >> Hi Pedro,
> >>
> >> Thanks for all your help so far. locationsInput.listAsSet() indeed
> returns
> >> the data that is persisted. To try something else, I have created an
> IModel
> >> class called LocationsModel as below and I've changed the concerning bit
> to:
> >>
> >> listChoice.setDefaultModel(new LocationsModel(new
> >> Model(details),details.getLocations()));
> >> //listChoice.setModelObject(locationsInput.listAsSet());
> >>
> >> Unfortunately the result is the same: the data is persisted correctly
> into
> >> my database, but the checkboxes are not checked when the page is
> reloaded or
> >> reopened. I can confirm that details.getLocations() contains all the
> >> locations. Btw, details.getlocations returns a HasSet.
> >>
> >>    private static class LocationsModel implements IModel {
> >>         /** the selected sites. */
> >>        private IModel locationContainingModel;
> >>        private Set<Location> locations;
> >>
> >>        public LocationsModel(IModel locationContainingModel,
> Set<Location>
> >> locations){
> >>            this.locationContainingModel = locationContainingModel;
> >>            this.locations = locations;
> >>        }
> >>
> >>        public Object getObject() {
> >>            Details details = (Details)
> >> locationContainingModel.getObject();
> >>            return details.getLocations();
> >>        }
> >>
> >>        public void setObject(Object object) {
> >>            Details details = (Details)
> >> locationContainingModel.getObject();
> >>            details.setLocations((Set<Location>)object);
> >>        }
> >>
> >>        public void detach() {
> >>            locationContainingModel.detach();
> >>        }
> >>    }
> >>
> >> On Tue, Mar 15, 2011 at 12:22 PM, Pedro Santos <pedros...@gmail.com
> >wrote:
> >>
> >>> Hi Sjoerd, double check the listChoice. If you want it presenting the
> >>> persisted data, you should use an model containg it, does the
> >>> locationsInput.listAsSet() give you that?
> >>>
> >>> change
> >>>
> >>> listChoice.setDefaultModel(new
> >>> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>> listChoice.setModelObject(locationsInput.listAsSet());
> >>>
> >>> to
> >>>
> >>> listChoice.setDefaultModel(modelContainingCollectionOfPersistedData);
> >>>
> >>> In the example the Input type has an instance variable named: "sites".
> >>> This is exactly the wicket id of the CheckBoxMultipleChoice.
> >>>
> >>> class Input {
> >>>  public List sites = new ArrayList();
> >>> }
> >>>
> >>> final Input input = new Input();
> >>> setModel(new CompoundPropertyModel(input));
> >>> CheckBoxMultipleChoice listChoice = new CheckBoxMultipleChoice("sites",
> >>> SITES);  <-- the model object of thi component will be the "sites" list
> at
> >>> the Input
> >>>
> >>> On Tue, Mar 15, 2011 at 1:00 PM, Sjoerd Smeets <ssme...@gmail.com
> >wrote:
> >>>
> >>>> Hi Pedro,
> >>>>
> >>>> I've changed the code as you suggested and the result is the same. The
> >>>> data is persisted correctly (as it was in previous cases as well),
> however
> >>>> the check boxes are not checked when the page is reopened. Just to be
> clear,
> >>>>  the locations variable of LocationsInput is set properly when
> >>>>
> >>>> final LocationsInput locationsInput = new LocationsInput(details);
> >>>>
> >>>> is being called. I can also confirm this when I check the variables is
> >>>> debug mode and when I add some extra logging.
> >>>>
> >>>> Am I correct that the checkboxes should be checked when
> >>>> setDefaultModel(new
> >>>> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>> is called?
> >>>>
> >>>> I understand the purpose of CompoundPropertyModels and PropertyModels.
> >>>> In the example code (example<
> http://wicketstuff.org/wicket13/compref/?wicket:bookmarkablePage=:org.apache.wicket.examples.compref.CheckBoxMultipleChoicePage
> >),
> >>>> the CompoundPropertyModel is used, but it is not exactly clear why to
> me.
> >>>>
> >>>> Could it be that the problem is that in the example an ArrayList of
> >>>> Strings is returned and in my code an ArrayList of Locations is
> returned by
> >>>> the LocationInput class?
> >>>>
> >>>> Alternatively, is there an other way to manually check the checkboxes
> >>>> via loop or something? Performance is of less concern.
> >>>>
> >>>> Thanks again,
> >>>> Sjoerd
> >>>>
> >>>> On Tue, Mar 15, 2011 at 11:03 AM, Pedro Santos <pedros...@gmail.com
> >wrote:
> >>>>
> >>>>> Your code is not saving the collection of checked locations,
> >>>>>
> >>>>> change
> >>>>>
> >>>>>  details.setLocations(locationsInput.listAsSet());
> >>>>> ...
> >>>>> up.persist(details);
> >>>>>
> >>>>> to
> >>>>>
> >>>>> details.setLocations(listChoice.getModelObject())
> >>>>> ...
> >>>>> up.persist(details);
> >>>>>
> >>>>> and it will start to use the collection in the CheckBoxMultipleChoice
> >>>>> model, so the persisted data will be the user input, and not an new
> >>>>> collection created inside the listAsSet method.
> >>>>>
> >>>>> there is good info about CPM in:
> >>>>>
> https://cwiki.apache.org/WICKET/working-with-wicket-models.html#WorkingwithWicketmodels-CompoundPropertyModels
> >>>>>
> >>>>> On Tue, Mar 15, 2011 at 10:54 AM, Sjoerd Smeets <ssme...@gmail.com
> >wrote:
> >>>>>
> >>>>>> Hi Pedro,
> >>>>>>
> >>>>>> Thanks for your reply. I'm not sure if I understand what you mean
> with
> >>>>>> "use nested components id as property expressions". The persisting
> >>>>>> part works fine with this code, however checking the correct boxes
> when the
> >>>>>> details page opens does not work. I have tried the following:
> >>>>>> ====
> >>>>>>
> >>>>>> setDefaultModel(new
> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>>>> ====
> >>>>>>
> >>>>>> listChoice.setDefaultModel(new
> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>>>> ====
> >>>>>>
> >>>>>> listChoice.setDefaultModel(new
> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>>>> listChoice.setModelObject(locationsInput.listAsSet());
> >>>>>>
> >>>>>> and they all persist the check checkboxes correctly when the user
> hits
> >>>>>> the submit button, but when reopening the page, the checkboxes are
> not
> >>>>>> checked. What is the easiest way to do this?
> >>>>>>
> >>>>>> Thanks again,
> >>>>>> Sjoerd
> >>>>>>
> >>>>>> On Tue, Mar 15, 2011 at 7:40 AM, Pedro Santos <pedros...@gmail.com
> >wrote:
> >>>>>>
> >>>>>>> Hi, this code is weird:
> >>>>>>>
> >>>>>>>
> >>>>>>> listChoice.setDefaultModel(new
> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>>>>>        listChoice.setModelObject(locationsInput.listAsSet());
> >>>>>>>
> >>>>>>> because CompoundPropertyModel is useful to use nested components id
> >>>>>>> as property expressions
> >>>>>>>
> >>>>>>> If details in form submit code is an LocationsInput, then the user
> >>>>>>> input will never be considered.
> >>>>>>>
> >>>>>>> At listAsSet an new collection is created and passed as parameter
> to
> >>>>>>> listChoice:
> >>>>>>> class LocationsInput {
> >>>>>>>         public HashSet<Location> listAsSet(){
> >>>>>>>            return new HashSet<Location>(locations);
> >>>>>>>        }
> >>>>>>> }
> >>>>>>> And a new one is used to be persisted:
> >>>>>>> onSubmit{
> >>>>>>>     details.setLocations(locationsInput.listAsSet());
> >>>>>>>     up.persist(details);
> >>>>>>> }
> >>>>>>>
> >>>>>>> On Mon, Mar 14, 2011 at 2:53 PM, Sjoerd Smeets <ssme...@gmail.com
> >wrote:
> >>>>>>>
> >>>>>>>>  Hi,
> >>>>>>>>
> >>>>>>>> I'm facing an issue where I'm not able to check the checkboxes of
> a
> >>>>>>>> list of
> >>>>>>>> Locations that are already have been persisted in the Details
> object
> >>>>>>>> (similar like the preselection of checkboxes). I followed the
> >>>>>>>> CheckBoxMultipleChoicePage example
> >>>>>>>> (example<
> >>>>>>>>
> http://wicketstuff.org/wicket13/compref/?wicket:bookmarkablePage=:org.apache.wicket.examples.compref.CheckBoxMultipleChoicePage
> >>>>>>>> >
> >>>>>>>>
> >>>>>>>> ).
> >>>>>>>>
> >>>>>>>> So basically when a user wants to edit their detail page, it
> should
> >>>>>>>> select
> >>>>>>>> the checkboxes of the locations the user already selected. saving
> >>>>>>>> the form
> >>>>>>>> works fine, so when I select locations, it is persisted correctly
> to
> >>>>>>>> the
> >>>>>>>> details object. Could someone indicate what I am missing?
> >>>>>>>>
> >>>>>>>> I have the following code:
> >>>>>>>>
> >>>>>>>> public class DetailsPage extends Panel {
> >>>>>>>>
> >>>>>>>>    ....
> >>>>>>>>    private final List<Location> LOCATIONS = getLocs();
> >>>>>>>>
> >>>>>>>>    public void generateForm(){
> >>>>>>>>
> >>>>>>>>        final LocationsInput locationsInput = new
> >>>>>>>> LocationsInput(details);
> >>>>>>>>        add(new FeedbackPanel("feedBack"));
> >>>>>>>>        ....
> >>>>>>>>
> >>>>>>>>        Form editDetails = new Form("detailsForm"){
> >>>>>>>>
> >>>>>>>>            protected void onSubmit() {
> >>>>>>>>
> >>>>>>>>                detailsPersistence up = new detailsPersistence();
> >>>>>>>>                details.setLocations(locationsInput.listAsSet());
> >>>>>>>>                logger.info("Saving the following locs:
> >>>>>>>> {}",locationsInput.toString());
> >>>>>>>>                if(newdetails){
> >>>>>>>>                    up.editDetails(details);
> >>>>>>>>                } else {
> >>>>>>>>                    up.updatedetails(details);
> >>>>>>>>                }
> >>>>>>>>                setResponsePage(OverViewDetailssPage.class);
> >>>>>>>>            }
> >>>>>>>>        };
> >>>>>>>>
> >>>>>>>>        ...
> >>>>>>>>        CheckBoxMultipleChoice<Location> listChoice =
> >>>>>>>>                new CheckBoxMultipleChoice<Location>("locations",
> >>>>>>>> LOCATIONS);
> >>>>>>>>        listChoice.setDefaultModel(new
> >>>>>>>> CompoundPropertyModel<LocationsInput>(locationsInput));
> >>>>>>>>        listChoice.setModelObject(locationsInput.listAsSet());
> >>>>>>>>        editDetails.add(listChoice);
> >>>>>>>>
> >>>>>>>>        add(editDetails);
> >>>>>>>>
> >>>>>>>>    }
> >>>>>>>>
> >>>>>>>>       private static class LocationsInput implements IClusterable
> {
> >>>>>>>>        /** the selected sites. */
> >>>>>>>>        public List<Location> locations = new ArrayList();
> >>>>>>>>
> >>>>>>>>        public LocationsInput(){
> >>>>>>>>            Location roermond = new Location();
> >>>>>>>>            roermond.setName("Roermond");
> >>>>>>>>            locations.add(roermond);
> >>>>>>>>        }
> >>>>>>>>
> >>>>>>>>        /** adds pre-selected items to the choices list */
> >>>>>>>>        public LocationsInput(details details)
> >>>>>>>>        {
> >>>>>>>>
> >>>>>>>>            Set<Location> locs = details.getLocations();
> >>>>>>>>            for(Location loc : locs){
> >>>>>>>>                logger.info("details has {} as a
> >>>>>>>> location.",loc.getName());
> >>>>>>>>                locations.add(loc);
> >>>>>>>>            }
> >>>>>>>>        }
> >>>>>>>>
> >>>>>>>>        @Override
> >>>>>>>>        public String toString(){
> >>>>>>>>            return "locations = " + listAsString(locations);
> >>>>>>>>        }
> >>>>>>>>
> >>>>>>>>        private String listAsString(List<Location> list){
> >>>>>>>>            StringBuffer b = new StringBuffer();
> >>>>>>>>            for (Iterator<Location> i = list.iterator();
> >>>>>>>> i.hasNext();){
> >>>>>>>>                b.append(i.next().getName());
> >>>>>>>>                if(i.hasNext()){
> >>>>>>>>                    b.append(", ");
> >>>>>>>>                }
> >>>>>>>>            }
> >>>>>>>>            return b.toString();
> >>>>>>>>        }
> >>>>>>>>
> >>>>>>>>        public String[] listAsStringArray(){
> >>>>>>>>            String[] locNames = new String[locations.size()];
> >>>>>>>>            int i =0;
> >>>>>>>>            for(Location loc : locations){
> >>>>>>>>                locNames[i] = loc.getName();
> >>>>>>>>                i++;
> >>>>>>>>            }
> >>>>>>>>            for(String l : locNames){
> >>>>>>>>                logger.info("String array: {}",l);
> >>>>>>>>            }
> >>>>>>>>            return locNames;
> >>>>>>>>        }
> >>>>>>>>
> >>>>>>>>        public HashSet<Location> listAsSet(){
> >>>>>>>>            return new HashSet<Location>(locations);
> >>>>>>>>        }
> >>>>>>>>    }
> >>>>>>>>
> >>>>>>>>    private List<Location> getLocs(){
> >>>>>>>>        LocationPersistence up4 = new LocationPersistence();
> >>>>>>>>        return up4.getAllLocations();
> >>>>>>>>    }
> >>>>>>>>
> >>>>>>>> }
> >>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> --
> >>>>>>> Pedro Henrique Oliveira dos Santos
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>> --
> >>>>> Pedro Henrique Oliveira dos Santos
> >>>>>
> >>>>
> >>>>
> >>>
> >>>
> >>> --
> >>> Pedro Henrique Oliveira dos Santos
> >>>
> >>
> >>
> >
> >
> > --
> > Pedro Henrique Oliveira dos Santos
> >
>

Reply via email to