Thanks for your reply. I think I can (at least partially) understand
your position and think there aren't any new arguments here I can
mention. So the discussions seems to be at an end here.

Maybe it is a matter of taste... If I find any time, I will create a
patch...


Regards,

Johannes

On Sat, 2009-03-07 at 12:40 -0800, Igor Vaynberg wrote:
> you are right, the components that just read a collection do just
> that, read it. they simply ignore the setter method in imodel. no big
> deal, just because you are given an interface doesnt mean you have to
> use all the methods in it. thus abstractreadonlymodel.
> 
> however, a lot of components manipulate items in the collection. you
> are right, they can do this without ever needing a setter, but it is
> very convenient to have a callback that lets you know that the
> collection has been updated. it is even more convenient to have a
> callback be part of model itself because in wicket you often factor
> out conversions and other transformations into the model
> implementation itself so they are reusable across multiple components.
> keep in mind models are the glue between components and your domain
> model, so if any kind of massaging needs to be done for the domain
> model to work smoothly with the component the model is the perfect
> place to do it.
> 
> -igor
> 
> On Sat, Mar 7, 2009 at 12:25 PM, Johannes Schneider
> <maili...@cedarsoft.com> wrote:
> >
> >> i think "misuse" is a pretty bold word considering you are talking to
> >> people who designed and built imodel, dont you think? :)
> >
> > Well, I think you are right. Sorry for that.
> > I just mean, that it has a bad smell here...
> >
> >>
> >> if we do what you suggest then we would end up with:
> >>
> >> interface imodel { object getobject(); }
> >> interface icollectionmodel extends imodel { object convert(object); }
> >> interface iwhatevermodel extends imodel { void setobject(object); }
> >>
> >> then things that are built on top of imodel now have to be built on
> >> top of at least two hierarchies (imodel and iwhatevermodel -
> >> considering icollectionmodel can be a mixin which all implementations
> >> have to check for which makes it dirty), so we will end up with double
> >> the classes like loadabledetachablemodel, etc.
> >
> > Yes, I think we need at least two interfaces. I don't know whether we
> > need the icollectionmodel... I think that can be discussed.
> >>
> >> where as right now this works perfectly and is quiet elegant:
> >>
> >> abstract class collectionconverter<new,old> implements 
> >> imodel<collection<new>> {
> >>   private final imodel<collection<old>> delegate;
> >>
> >>   public collection<new> getobject() {
> >>     list<new> list=new arraylist<new>(delegate.getobject().size());
> >>     for (old o:delegate.getobject()) {
> >>          list.add(converttonew(o));
> >>     }
> >>     return list;
> >>   }
> >>
> >>   public void setobject(collection<new> object) {
> >>     delegate.getobject().clear();
> >>     for (new o:object) {
> >>          delegate.getobject().add(converttold(o));
> >>     }
> >>   }
> >>
> >>   abstract new converttonew(old o);
> >>   abstract old converttoold(new o);
> >> }
> >
> > Don't know, whether that is really "elegant". It feels more like a
> > misuse... ;).
> > I think there is a reason you don't simply take an object for everything
> > (what might be the most elegant)...
> >
> > I really don't understand why IModel must handle the conversion stuff.
> > That conversion thing could/should be done using some wrapper or
> > something else. But I don't get all the concepts of Wicket.
> > I just think that components that just *read* a collection, should just
> > read the collection...
> >
> > But well, as you mentioned correctly, you have designed it, so it is
> > your choice...
> >
> >
> > Regards,
> >
> > Johannes
> >
> >
> >>
> >> -igor
> >>
> >> >
> >> > Regards,
> >> >
> >> > Johannes
> >> >
> >> > >
> >> > > -igor
> >> > >
> >> > > On Wed, Mar 4, 2009 at 4:50 AM, Johannes Schneider
> >> > > <maili...@cedarsoft.com> wrote:
> >> > > > Hi,
> >> > > >
> >> > > > the concept of IModel seems to be very obvious. It is simply some 
> >> > > > kind
> >> > > > of reference and offers a getter and a setter.
> >> > > >
> >> > > > When used with ordinary object, everything works fine. An IModel that
> >> > > > contains a String can easily be mapped to a TextField.
> >> > > > The text field calls "getObject" to show the initial value and sets 
> >> > > > the
> >> > > > changed string to the model using "setObject" on form commit.
> >> > > >
> >> > > >
> >> > > > Everything becomes a little more complicated when collections are
> >> > > > affected. The problem is, that it is not obvious what those 
> >> > > > collections
> >> > > > represent.
> >> > > >
> >> > > > 1) A collection might be read-only (e.g. the possible choices for a
> >> > > > selection).
> >> > > > 2) But it also might be necessary to add/remove single elements (e.g.
> >> > > > privileged users shown within a shuffle list).
> >> > > > 3) And sometimes the complete collection is changed (can't find an
> >> > > > example here).
> >> > > >
> >> > > >
> >> > > > IModel only supports the *third* method where the complete 
> >> > > > collection is
> >> > > > replaced.
> >> > > > (Don't forget that the reference to the collection changes which will
> >> > > > lead to several other problems.)
> >> > > > I strongly recommend the usage of a wrapping class for that case.
> >> > > > But this case is not very common. Maybe someone finds a good example 
> >> > > > - I
> >> > > > can't.
> >> > > >
> >> > > >
> >> > > > For the other two cases it does *not* make any sense to call
> >> > > > IModel#setObject.
> >> > > >
> >> > > >
> >> > > > Summary: Nearly in every case when the IModel contains a collection, 
> >> > > > the
> >> > > > "setObject" method does not make any sense and must not be called.
> >> > > >
> >> > > >
> >> > > > Conclusion: I think we should have created some sort of 
> >> > > > IModelProvider
> >> > > > (contains only the getObject method) and IModel (with both methods).
> >> > > > Components that just *read* values from the model, accept the read 
> >> > > > only
> >> > > > interface now.
> >> > > >
> >> > > > For special cases where a magic component adds/removes elements to a
> >> > > > collection, we need some sort of ICollectionModel that offers "add" 
> >> > > > and
> >> > > > "remove" methods (but no setter).
> >> > > > That interface - of course - will be based upon a collection 
> >> > > > *without*
> >> > > > wildcards...
> >> > > >
> >> > > >
> >> > > >
> >> > > > Regards,
> >> > > >
> >> > > > Johannes Schneider
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > > ---------------------------------------------------------------------
> >> > > > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> >> > > > For additional commands, e-mail: users-h...@wicket.apache.org
> >> > > >
> >> > > >
> >> > >
> >> > > ---------------------------------------------------------------------
> >> > > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> >> > > For additional commands, e-mail: users-h...@wicket.apache.org
> >> > >
> >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> >> > For additional commands, e-mail: users-h...@wicket.apache.org
> >> >
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> >> For additional commands, e-mail: users-h...@wicket.apache.org
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > For additional commands, e-mail: users-h...@wicket.apache.org
> >
> >
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to