Hi Maik. As I'm the one researched this, let me answer :) I failed to make BeanAccessor pluggable last time because I realized that it's deep inside code not managed by Cayenne DI. But looking again at it I wonder will this straightforward solution [1] solve your problems? And I'm really interested what is your use case? Do you perform lots of in-memory filtering and/or calculations using Cayenne Expressions?
[1] https://github.com/apache/cayenne/pull/363/files?utf8=✓&diff=unified#diff-4f928c7d2ac0e22cabde0c9732de774fR214 On Thu, Jan 31, 2019 at 7:22 PM Maik Musall <m...@selbstdenker.ag> wrote: > > Hi Andrus, > > did you have a chance to look at this yet? The reason I ask is that our > application hit the memory limit this week again (-Xmx at 96 GB), and > according to some profiling, almost half of that is used up by HashMap nodes. > So we're really eager to upgrade to Cayenne 4.1 to be able to use field-based > DataObjects, but this is preventing us from going ahead. > > Thanks > Maik > > > > > Am 25.09.2018 um 16:23 schrieb Andrus Adamchik <and...@objectstyle.org>: > > > >> "Should Cayenne by default work without prefixed accessors". > > > > My answer to this : "By default, no. As a fallback or a custom strategy, > > possibly." > > > > I actually agree about Java beans. They are almost irrelevant now. And I > > wish Java gets "data classes" and some transparent form of "properties". > > > > As things stand now though, there's no common established alternative based > > on a naming convention that we can safely hardcode without causing grief > > for someone because they didn't expect that their method would be called > > when evaluating expressions. Hence my preference for a DI fix. > > > > So how about this... Unless someone else steps in by then, let me > > brainstorm it with Nikita a couple of weeks from now and see if we can do a > > DI solution. It is not nearly as involved as it appears. > > > > Andrus > > > > > >> On Sep 25, 2018, at 9:59 AM, Hugi Thordarson <h...@karlmenn.is> wrote: > >> > >> Hi Andrus and thanks for the reply, > >> > >> allowing replacement of the entire reflection strategy is certainly nice > >> and would allow me to make the customizations I need. > >> > >> However, if it's OK with you, rather than discuss implementation details, > >> I'd like to take two steps back and revert to the more philosophical > >> design question of: > >> > >> "Should Cayenne by default work without prefixed accessors". > >> > >> What is there to be lost or gained from keeping or abandoning the > >> prefix-requirement? > >> > >> I believe I can safely assert that Cayenne works fine without accessor > >> prefixes, since I've used it that way on dozens of projects, so it looks > >> like a somewhat arbitrary limitation. It's only with the introduction of > >> field based DOs that we get a problem in a very isolated part of the > >> framework. > >> > >> It seems to me that the java ecosystem is moving towards more modern API > >> design—we've even got the architect of the Java language calling the > >> bean-style "at best a questionable -- and certainly overused -- API naming > >> convention" [http://cr.openjdk.java.net/~briangoetz/amber/datum.html > >> <http://cr.openjdk.java.net/~briangoetz/amber/datum.html>] (pardon the > >> appeal to authority, but considering where it comes from, it's probably a > >> good barometer for where java language and API design is headed). > >> > >> I'd say that the framework would be well served and future-proofed by > >> dropping the requirement for hard-coded accessor prefixes as a baked in > >> requirement. > >> > >> Cheers, > >> - hugi > >> > >> > >> > >>> On 25 Sep 2018, at 11:15, Andrus Adamchik <and...@objectstyle.org> wrote: > >>> > >>> Hi Hugi, > >>> > >>> My vote would be to do it right. There is a positive side effect that the > >>> entire reflection strategy suddenly becomes customizable. > >>> > >>> Andrus > >>> > >>> > >>>> On Sep 25, 2018, at 7:11 AM, Hugi Thordarson <h...@karlmenn.is> wrote: > >>>> > >>>> Hi Andrus, and y'all. > >>>> > >>>> I've been looking into this and it seems like a rather large change to > >>>> allow something relatively simple (allowing DataObjects to have accessor > >>>> methods that don't start with a "get"-prefix). > >>>> > >>>> Would people be diametrically opposed to just changing BeanAccessor so > >>>> that it seeks for a non-prefixed method if a prefixed one isn't found? > >>>> That modification is minimal and shouldn't affect any current users, so > >>>> I can think of. > >>>> > >>>> Cheers, > >>>> - hugi > >>>> > >>>> > >>>> > >>>>> On 20 Sep 2018, at 16:08, Andrus Adamchik <and...@objectstyle.org> > >>>>> wrote: > >>>>> > >>>>> Hi Maik, > >>>>> > >>>>> In Cayenne a canonical way to override services is via DI. A PR that > >>>>> follows that approach has a good chance of acceptance. > >>>>> > >>>>> From a quick glance, I wonder if this new DI endpoint should be a > >>>>> factory of ClassDescriptorMap (which is currently lazily created inside > >>>>> EntityResolver). We can't make ClassDescriptorMap itself DI-managed as > >>>>> it depends on the mapping state, but a factory for it can be a DI > >>>>> singleton. Inside your custom factory (a few levels down actually) you > >>>>> can provide a subclass of BeanAccessor (maybe also via its own DI > >>>>> factory?). > >>>>> > >>>>> Andrus > >>>>> > >>>>> > >>>>>> On Sep 19, 2018, at 8:35 AM, Maik Musall <m...@selbstdenker.ag> wrote: > >>>>>> > >>>>>> Hi all, > >>>>>> > >>>>>> I'd like to pull up this discussion from one year ago again. I'm > >>>>>> currently running 4.0 and testing upgrading to 4.1 using field-based > >>>>>> DataObjects, and I'm hitting the hard-coded prefixes in BeanAccessor > >>>>>> that prevent me from proceeding. > >>>>>> > >>>>>> Yes, in theory I could sigh, yield, and use "get" prefixes, but not > >>>>>> only do I dislike introducing the "get" boilerplate everywhere. I am > >>>>>> also somewhat reluctant to make a refactoring touching some 800+ files > >>>>>> in my project. To be honest, I'd rather patch BeanAccessor to personal > >>>>>> taste and deal with the consequences. > >>>>>> > >>>>>> BeanAccessor is currently always called by it's constructor. In > >>>>>> addition to the options Hugi described in his original mail in this > >>>>>> thread, I could also imagine a way to modify this to be able to inject > >>>>>> a custom Accessor implementation as an alternative. What do you think? > >>>>>> > >>>>>> And… what would happen if someone would submit a pull request actually > >>>>>> implementing one of these options? :-) > >>>>>> > >>>>>> Cheers > >>>>>> Maik > >>>>>> > >>>>>> > >>>>>>> Am 26.09.2017 um 15:32 schrieb Hugi Thordarson <h...@karlmenn.is>: > >>>>>>> > >>>>>>> Hi Michael, > >>>>>>> > >>>>>>> thanks for an honest attempt to convince me. Hard sell, though. :) > >>>>>>> > >>>>>>> I use a lot of 3rd party libraries and I've only hit one time where > >>>>>>> using the bean spec was necessary — JasperReports. That was easily > >>>>>>> fixed by providing *BeanInfo classes, in accordance with the Bean > >>>>>>> spec. But Cayenne doesn't really follow the Java Bean Spec, it just > >>>>>>> hardcodes "is", "get" and "set". > >>>>>>> > >>>>>>> As for the Eclipse thing… Well. A standard DataObject already has > >>>>>>> five methods prefixed with "get" so that list is questionable. And I > >>>>>>> don't miss this functionality. > >>>>>>> > >>>>>>> I think it's important to note that the change I'm proposing would > >>>>>>> not affect those who choose to add the prefix. It just accommodates > >>>>>>> those of us who choose not to, thus expanding the audience of the > >>>>>>> framework. > >>>>>>> > >>>>>>> Cheers, > >>>>>>> - hugi > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>>> On 26 Sep 2017, at 12:01, Michael Gentry <blackn...@gmail.com> wrote: > >>>>>>>> > >>>>>>>> Hi Hugi, > >>>>>>>> > >>>>>>>> Let me try to sell you on the "get" prefix. :-) > >>>>>>>> > >>>>>>>> (I did a lot of WebObjects/EOF in the past, in Objective-C and Java, > >>>>>>>> so I > >>>>>>>> understand the reluctance.) > >>>>>>>> > >>>>>>>> * The "get" prefix is part of the JavaBeans standard/contract. With > >>>>>>>> the > >>>>>>>> exception of "is" for booleans (with a little "b"). > >>>>>>>> > >>>>>>>> * There are tons of Java frameworks out there that expect and > >>>>>>>> utilize the > >>>>>>>> JavaBeans contract, so it is great for folding external frameworks > >>>>>>>> into > >>>>>>>> your code. Or folding Cayenne into other frameworks, such as > >>>>>>>> Tapestry. I > >>>>>>>> can specify Cayenne object/relationship paths in Tapestry (and other > >>>>>>>> frameworks) such as > >>>>>>>> t:value="currentItem.resourceSummary.grossCost.costs.continuingFootnote" > >>>>>>>> (real example). Since Tapestry expects the JavaBeans contract and > >>>>>>>> Cayenne > >>>>>>>> provides it, this works flawlessly. > >>>>>>>> > >>>>>>>> * In Eclipse (and others, I'm sure) I can do anObject.get[pause or > >>>>>>>> control-space] and see all the getters associated with that object. > >>>>>>>> Without the get prefix, they are spread out a-z and therefore you > >>>>>>>> can't get > >>>>>>>> as concise a list. > >>>>>>>> > >>>>>>>> mrg > >>>>>>>> > >>>>>>>> > >>>>>>>> On Tue, Sep 26, 2017 at 7:02 AM, Hugi Thordarson <h...@karlmenn.is> > >>>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Hi all > >>>>>>>>> > >>>>>>>>> Touching on an old subject that has now become more important with > >>>>>>>>> field-based Data Objects. > >>>>>>>>> > >>>>>>>>> All of my DataObjects use accessor methods without the > >>>>>>>>> "get"-prefix. This > >>>>>>>>> was fine with Map Based data objects (where a MapAccessor would get > >>>>>>>>> property values by name), but now that my objects are field based, > >>>>>>>>> along > >>>>>>>>> comes BeanAccessor which is hardcoded to have every getter prefixed. > >>>>>>>>> > >>>>>>>>> I propose that BeanAccessor be modified to allow accessor methods > >>>>>>>>> without > >>>>>>>>> the "get"-prefix. Methods with "get" would get precedence, but if > >>>>>>>>> no method > >>>>>>>>> with a "get"-prefix exists, check for the existence of a method > >>>>>>>>> with only > >>>>>>>>> the property name. > >>>>>>>>> > >>>>>>>>> Although it's a minimal change in code, I realise it comes with a > >>>>>>>>> bit of > >>>>>>>>> potential baggage WRT testing. But this is not just to scratch a > >>>>>>>>> personal > >>>>>>>>> itch; once Cayenne 4.0 is out I want to start a large scale > >>>>>>>>> introduction of > >>>>>>>>> Cayenne to the EOF world where the get prefix is generally not > >>>>>>>>> liked and > >>>>>>>>> this change would have a big appeal. Besides, I'm not a big fan of > >>>>>>>>> the > >>>>>>>>> get-prefix myself, I find it a bit redundant :). > >>>>>>>>> > >>>>>>>>> An alternative would be to adhere to the Bean standard, and make > >>>>>>>>> BeanAccessor read bean meta information (usually specified in > >>>>>>>>> *BeanInfo > >>>>>>>>> classes) and get names of getter/setter methods from there. But > >>>>>>>>> that would > >>>>>>>>> be a much larger change than just checking for a method with > >>>>>>>>> propertyName > >>>>>>>>> if the getPropertyName method doesn't exist. > >>>>>>>>> > >>>>>>>>> What do you think? > >>>>>>>>> > >>>>>>>>> Cheers, > >>>>>>>>> - hugi > >>>>>>> > >>>>>> > >>>>> > >>>> > >>> > >> > > > -- Best regards, Nikita Timofeev