>> "Should Cayenne by default work without prefixed accessors". > > My answer to this : "By default, no. As a fallback or a custom strategy, > possibly."
Fair enough. > 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. Sounds awesome :). I wish I could be the one to step forward given I'm the one raising a fuss, but after looking at the changes involved and given my knowledge, I'm a bit hesitant to start hacking away on such a core part of Cayenne's design at this time. Cheers, - hugi > > 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 >>>>>>> >>>>>> >>>>> >>>> >>> >> >