Great! Thanks, Sven! Martin Grigorov Wicket Training and Consulting https://twitter.com/mtgrigorov
On Tue, Mar 15, 2016 at 11:52 AM, Sven Meier <[email protected]> wrote: > Hi again, > > I added a factory for a read-only variant too. > > To recap all options: > > IModel<String> personNameModel = > > // getter lambda > () -> person.getName(); > // getter instance function reference > person::getName; > // getter and setter lambda > LambdaModel.of(() -> person.getName(), (name) -> > person.setName(name)); > // getter and setter instance function references > LambdaModel.of(person::getName, person::setName); > // target model with getter class function reference > LambdaModel.of(personModel, Person::getName); > // target model with getter and setter class function references > LambdaModel.of(personModel, Person::getName, Person::setName); > > Regards > Sven > > > > On 15.03.2016 11:03, Sven Meier wrote: > >> Hi Sebastien, >> >> for a read-only model you can just use this shortcut: >> >> IModel<String> personNameModel = person::getName; >> >> Or do you mean a read-only for when 'person' is actually a model? >> >> Regards >> Sven >> >> >> On 15.03.2016 10:57, Sebastien wrote: >> >>> Could a read-only model just be like that? >>> IModel<String> personNameModel = LambdaModel.of(person::getName); >>> >>> On Tue, Mar 15, 2016 at 10:43 AM, Sven Meier <[email protected]> wrote: >>> >>> Hi, >>>> >>>> I found a nice additional usage for LambdaModel. With static factory >>>> methods you can use it in two ways now: >>>> >>>> IModel<String> personNameModel = >>>> LambdaModel.of(person::getName, >>>> person::setName); >>>> >>>> ... or if you have a model ... >>>> >>>> IModel<String> personNameModel = LambdaModel.of(personModel, >>>> Person::getName, Person::setName); >>>> >>>> Let me know if you'd rather have a separate class for this. >>>> >>>> Have fun >>>> Sven >>>> >>>> >>>> >>>> On 14.03.2016 22:53, Martin Grigorov wrote: >>>> >>>> I've checked all other IModel implementations but I didn't see more >>>>> candidates for lambd-ification. >>>>> >>>>> Martin Grigorov >>>>> Wicket Training and Consulting >>>>> https://twitter.com/mtgrigorov >>>>> >>>>> On Mon, Mar 14, 2016 at 4:15 PM, Martin Grigorov <[email protected] >>>>> > >>>>> wrote: >>>>> >>>>> I've merged that branch. >>>>> >>>>>> Now the Lambdas class with the factory methods for components and >>>>>> behaviors is also in master. >>>>>> Any ideas for improvements are welcome! >>>>>> >>>>>> Martin Grigorov >>>>>> Wicket Training and Consulting >>>>>> https://twitter.com/mtgrigorov >>>>>> >>>>>> On Mon, Mar 14, 2016 at 4:01 PM, Sven Meier <[email protected]> wrote: >>>>>> >>>>>> I didn't want to put every idea directly in master. >>>>>> >>>>>>> Thanks to this procedure we've progressed a lot with lambdas :). >>>>>>> >>>>>>> Thanks >>>>>>> Sven >>>>>>> >>>>>>> >>>>>>> >>>>>>> On 14.03.2016 15:49, Martin Grigorov wrote: >>>>>>> >>>>>>> I didn't want to put every idea directly in master. >>>>>>> >>>>>>>> First wanted to here opinions. >>>>>>>> But I see how this makes it hard to follow. >>>>>>>> I'll merge this branch to master and then we can just rework >>>>>>>> whatever >>>>>>>> we >>>>>>>> find not optimal directly there. >>>>>>>> >>>>>>>> Martin Grigorov >>>>>>>> Wicket Training and Consulting >>>>>>>> https://twitter.com/mtgrigorov >>>>>>>> >>>>>>>> On Mon, Mar 14, 2016 at 3:16 PM, Sven Meier <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hm, I starting to lose track of what is on which branch :/. >>>>>>>> >>>>>>>> Sven >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On 14.03.2016 14:09, Martin Grigorov wrote: >>>>>>>>> >>>>>>>>> Hi Sven >>>>>>>>> >>>>>>>>> On Mon, Mar 14, 2016 at 1:23 PM, Sven Meier <[email protected]> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Hi Martin, >>>>>>>>>> >>>>>>>>>> speaking of someting to nuke - insteaf of: >>>>>>>>>> >>>>>>>>>>> IModel<String> personNameModel = new >>>>>>>>>>> SupplierCachingModel<>(person::getName); >>>>>>>>>>> >>>>>>>>>>> Why not simply? >>>>>>>>>>> >>>>>>>>>>> IModel<String> personNameModel = >>>>>>>>>>> Model.loadableDetachable(person::getName); >>>>>>>>>>> >>>>>>>>>>> I didn't like the name "Supplier*Caching*Model" anyway. >>>>>>>>>>> >>>>>>>>>>> It is there already >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> https://github.com/apache/wicket/blob/static-factories-for-lambdas/wicket-core/src/main/java/org/apache/wicket/model/Model.java#L208 >>>>>>>>>> >>>>>>>>>> But I agree there is no need of SupplierCachingModel as a separate >>>>>>>>>> class. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Regards >>>>>>>>>> >>>>>>>>>> Sven >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On 14.03.2016 12:36, Martin Grigorov wrote: >>>>>>>>>>> >>>>>>>>>>> Yes! >>>>>>>>>>> >>>>>>>>>>> - IModel<String> personNameModel = new >>>>>>>>>>> >>>>>>>>>>>> SupplierModel<>(person::getName); >>>>>>>>>>>> + IModel<String> personNameModel = >>>>>>>>>>>> person::getName; >>>>>>>>>>>> >>>>>>>>>>>> Definitely makes sense to make it shorter! >>>>>>>>>>>> >>>>>>>>>>>> I'll nuke it now! >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Martin Grigorov >>>>>>>>>>>> Wicket Training and Consulting >>>>>>>>>>>> https://twitter.com/mtgrigorov >>>>>>>>>>>> >>>>>>>>>>>> On Mon, Mar 14, 2016 at 10:55 AM, Sven Meier <[email protected]> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> IModel being a functional interface now, what's the use of >>>>>>>>>>>> >>>>>>>>>>>> SupplierModel >>>>>>>>>>>>> ? >>>>>>>>>>>>> IMHO we can get rid of it. >>>>>>>>>>>>> >>>>>>>>>>>>> Regards >>>>>>>>>>>>> Sven >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On 12.03.2016 23:39, Tobias Soloschenko wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Yep - I am very happy about it, too - cool features for wicket >>>>>>>>>>>>> 8 >>>>>>>>>>>>> :-) >>>>>>>>>>>>> >>>>>>>>>>>>> Great work all! >>>>>>>>>>>>> >>>>>>>>>>>>> kind regards >>>>>>>>>>>>>> >>>>>>>>>>>>>> Tobias >>>>>>>>>>>>>> >>>>>>>>>>>>>> Am 12.03.16 um 23:38 schrieb Sven Meier: >>>>>>>>>>>>>> >>>>>>>>>>>>>> As a bonus IModel is a @FunctionalInterface now and one can do >>>>>>>>>>>>>> things >>>>>>>>>>>>>> >>>>>>>>>>>>>> like: >>>>>>>>>>>>>> >>>>>>>>>>>>>> new Link<String>("", () -> "abc") { >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> @Override >>>>>>>>>>>>>>>> public void onClick() >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> // ... >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> }; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Seems we're getting a grip on Wicket+lambdas finally :) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thanks >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Sven >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 12.03.2016 23:13, Martin Grigorov wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Sat, Mar 12, 2016 at 11:01 PM, Martin Grigorov < >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Sat, Mar 12, 2016 at 7:48 PM, Sven Meier < >>>>>>>>>>>>>>>> [email protected]> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 1) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> we've been twiddling with read-only models for some time >>>>>>>>>>>>>>>>> now, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>> IIRC it >>>>>>>>>>>>>>>>>> never quite worked out. >>>>>>>>>>>>>>>>>> I don't see much benefit in IReadOnlyModel as it is >>>>>>>>>>>>>>>>>> proposed >>>>>>>>>>>>>>>>>> now - >>>>>>>>>>>>>>>>>> perhaps I'm missing the point though. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> How about adding another default to IModel: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> default void setObject(final T object) { >>>>>>>>>>>>>>>>>> throw new UnsupportedOperationException(); >>>>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> This way we can get rid of AbstractReadOnlyModel too :P >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> A minor thing that bothers me here is that currently >>>>>>>>>>>>>>>>>> AROM#setObject() >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> is >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> final, so subclasses are effectively read only too. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> By moving this method to IModel we cannot make any >>>>>>>>>>>>>>>>> guarantees. >>>>>>>>>>>>>>>>> But I guess it will always be used as an anonymous inner >>>>>>>>>>>>>>>>> class, >>>>>>>>>>>>>>>>> as >>>>>>>>>>>>>>>>> AROM is >>>>>>>>>>>>>>>>> used now. If someone wants to have children then (s)he will >>>>>>>>>>>>>>>>> have to >>>>>>>>>>>>>>>>> create >>>>>>>>>>>>>>>>> a custom class and there (s)he can make it 'final'. >>>>>>>>>>>>>>>>> Let's do it! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> As a bonus IModel is a @FunctionalInterface now and one >>>>>>>>>>>>>>>>> can do >>>>>>>>>>>>>>>>> things >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> like: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> new Link<String>("", () -> "abc") { >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> @Override >>>>>>>>>>>>>>>> public void onClick() >>>>>>>>>>>>>>>> { >>>>>>>>>>>>>>>> // ... >>>>>>>>>>>>>>>> } >>>>>>>>>>>>>>>> }; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I don't see a need for this. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Have fun >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Sven >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> how about adding a >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 11.03.2016 22:54, Martin Grigorov wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> At "lambdas" [1] branch there are two more features: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 1) IReadOnlyModel by Michael Mossman >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> At the moment there are AbstractReadOnlyModel and >>>>>>>>>>>>>>>>>>> SupplierModel >>>>>>>>>>>>>>>>>>> (extends >>>>>>>>>>>>>>>>>>> from AROM). >>>>>>>>>>>>>>>>>>> Initially while MM suggested IROM I thought it will be a >>>>>>>>>>>>>>>>>>> parent >>>>>>>>>>>>>>>>>>> interface >>>>>>>>>>>>>>>>>>> of IModel but it is the opposite - IROM extends from >>>>>>>>>>>>>>>>>>> IModel. >>>>>>>>>>>>>>>>>>> I don't see need of IROM. The classes look enough to me. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> 2) stream based iteration of container's children by >>>>>>>>>>>>>>>>>>> Andrea >>>>>>>>>>>>>>>>>>> Del >>>>>>>>>>>>>>>>>>> Bene >>>>>>>>>>>>>>>>>>> I have said my opinion before - the visitor approach is >>>>>>>>>>>>>>>>>>> faster >>>>>>>>>>>>>>>>>>> than >>>>>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>> stream based one. >>>>>>>>>>>>>>>>>>> In addition we have to remove the deprecated >>>>>>>>>>>>>>>>>>> org.apache.wicket.util.iterator.AbstractHierarchyIterator >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>>> its >>>>>>>>>>>>>>>>>>> related >>>>>>>>>>>>>>>>>>> classes because it fails with StackoverflowError when >>>>>>>>>>>>>>>>>>> used >>>>>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>>>>> a >>>>>>>>>>>>>>>>>>> page >>>>>>>>>>>>>>>>>>> with >>>>>>>>>>>>>>>>>>> bigger component tree. >>>>>>>>>>>>>>>>>>> So I don't see a reason for this feature. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Your option on them ? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> 1. https://github.com/apache/wicket/compare/lambdas >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Martin Grigorov >>>>>>>>>>>>>>>>>>> Wicket Training and Consulting >>>>>>>>>>>>>>>>>>> https://twitter.com/mtgrigorov >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >> >
