> 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
> > > <[email protected]> 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: [email protected]
> > > > For additional commands, e-mail: [email protected]
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [email protected]
> > > For additional commands, e-mail: [email protected]
> > >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to