Fully agree with Emond!
As a user I will hate such kind of change.
Several years ago this change might be OKish, but now with Java 8 default
methods it would be insane to break everyone's code when default methods
make it invisible.
Until 7.x I'd have to add empty impl for detach() when I don't need it.
With Wicket 8.x I won't bother at all!

Is your branch complete ? I see no changes in wicket-examples. Maybe it is
because several months ago I've cleaned all empty impls of #detach(). I did
it because I did it. It was compiling even without removing them. But with
your changes everyone will have to go all over his/her code and fix it!
If you remember the days when people migrated from 1.4.x to 1.5.x, or from
1.5.x to 6.x - many users sent a lot of negative feedback for such kind of
changes. Changes without deprecation cycle and changes without real benefit
from user point of view.

-1

On Wed, Mar 29, 2017 at 7:53 PM, Emond Papegaaij <emond.papega...@gmail.com>
wrote:

> Hi Pedro,
>
> I fail to see why it is a problem for IModel to be IDetachable. It is
> an integral part of the lifecycle of IModel. One could say that the
> sole purpose of the detach traversal is to detach all models. A model
> knows how to retrieve data, update data and to detach its internal
> representation from the backend for future request handling. A model
> that does not require special processing to detach, simply omits this
> method: it has a default, empty implementation. Calling this empty
> method is cheap and likely to cause problems.
>
> Changing this part of the API will break the world. All
> implementations of IModel need to either implement IDetachable or
> remove detach(). All calls to detach() need to be guarded with an
> instanceof check and a cast. You can be sure many users will be very
> upset with such a change.
>
> What is your usecase for IIAmNotActuallyDetachabe? Why not simply call
> detach and have it do nothing when nothing needs to be done?
>
> Best regards,
> Emond
>
> On Wed, Mar 29, 2017 at 6:12 PM, Pedro Santos <pedros...@gmail.com> wrote:
> > From user's perspective this is a symmetrical problem. This sadness is
> > carried over to an user in the other side, in need to avoid any detach
> > logic or processing in his component or model if the target model isn't
> > detachable. Right know he would have to come up with his own marker e.g.:
> > IIAmNotActuallyDetachabe interface. Given the symmetry, I would choose
> the
> > side that is not semantically wrong.
> >
> > Also this instanceof test is more common for us, Wicket's core
> developers.
> > For the final user the AbstractWrapModel class and a helper function (I
> can
> > propose one) should hide this complexity. We can't judge how sad it's for
> > the final user base on how common it's for *us* to have this instanceof
> > check, and without even try to abstract this complexity.
> >
> > Yes, I think this fix should be carried over to FeedbackMessage,
> > ICellPopulator and IDataProvider.
> >
> >>The current solution - even if semantically wrong - is simpler.
> >
> > It's simpler only because of the instanceof test that should be
> abstracted
> > from the user?
> >
> >
> > Pedro Santos
> >
> > On Wed, Mar 29, 2017 at 11:48 AM, Sven Meier <s...@meiers.net> wrote:
> >
> >> Hi Pedro,
> >>
> >> for Wicket your changes look fine.
> >>
> >> But I have an objection from a user's perspective:
> >> If I hold a reference to a model (in a component or another wrapping
> >> model), I'll always have to check the instance and do a cast before
> >> detaching it:
> >>
> >>     class MyComponent {
> >>       private IModel<Foo> foo;
> >>
> >>       @Override
> >>       public void detachModels() {
> >>         if (foo instanceof IDetachable) {
> >>           ((IDetachable)foo).detach();
> >>         }
> >>       }
> >>     }
> >>
> >> Sad :/.
> >>
> >> Furthermore what about FeedbackMessage, ICellPopulator and
> IDataProvider?
> >> Will their implementations no longer be forced to implement IDetachable
> too?
> >>
> >> IMHO your missing an important aspect of IDetachable: yes, many
> >> implementations really don't need to detach anything. But many places
> >> *have* to detach these objects, *iff* they are detachable.
> >> The current solution - even if semantically wrong - is simpler.
> >>
> >> Best regards
> >> Sven
> >>
> >>
> >>
> >> On 29.03.2017 15:52, Pedro Santos wrote:
> >>
> >>> Hi team,
> >>>
> >>> Not every model is detachable, but right now all models extends from
> >>> IDetachable because this contract is forced to any implementation for
> >>> IModel.
> >>>
> >>> The only way users have to communicate their model isn't detachable,
> for
> >>> their own purpose, is by creating their own mechanism; but I think
> >>> IDetachable interface should serve its purpose and to mark / be
> extended
> >>> by
> >>> detachable models, like documented in its own javadoc.
> >>>
> >>> I did the changes necessary for this improvement in the branch
> >>> 'not-detachable' at [1], and hope you can give your input. While
> working
> >>> on
> >>> the branch I noticed a few problems in Wicket's code and already added
> a
> >>> fix:
> >>>
> >>> - LabeledWebMarkupContainer called wrapped model detach twice (fixed)
> >>>
> >>> - SessionSizeModel has no detach logic but was being detached at
> >>> SessionSizeDebugPanel (fixed)
> >>>
> >>> - The following classes had anonymous model wrappers that weren't
> >>> extending
> >>> from IWrapModel, that would better communicates their purpose(fixed):
> >>> LambdaColumn, IModel, LambdaModel, AjaxEditableLabel, LambdaColumn
> >>>
> >>> 1 - https://github.com/pedrosans/wicket/tree/not-detachable
> >>>
> >>> Pedro Santos
> >>>
> >>>
> >>
>

Reply via email to