Shouldnt contextual config be built on top of the builder just adding the
spi for servieloader?
 Le 22 janv. 2015 21:27, "Anatole Tresch" <[email protected]> a écrit :

> Hi Romain
>
> so we are on the same page, I hope. I would like to have a service
> providing configuration and have a builder functionality that gives you the
> possibility to create your own Configuration instance by hand. I also dont
> think we need 2c, I just wanted to ask, if we have similar concepts in
> mind.
> As a consequence we would have to add these "builder" stuff into the API.
> This is basically possible, but will required also some SPI defined that
> provide the effective builder implementation. I propose you ensure together
> with Oliver, you get the functionality you would like to see, and we will
> then take up this stream again and discuss integration or extension
> possibility related to the API. Basically the builder functionality can be
> added both as an extension (would then not require an API) or as part of
> the API (I guess you would prefer the ladder)...
>
> OK so far?
>
>
>
> 2015-01-22 21:11 GMT+01:00 Romain Manni-Bucau <[email protected]>:
>
> > not sure why 2c is needed - assuming I got it you want to create a
> > config from the builder and inject it in the system "current()". If
> > you use the builder to create an instance I guess you are fine wiring
> > it to your code yourself so current() would be useless in such a case
> > - could even be general and contextual current() feature could be seen
> > as an extension more generally since it is not bound to runtime API
> > but only bootstrrap (this is also why i prefer this factory pattern
> > than current one in terms of API - impl is close).
> >
> >
> > Romain Manni-Bucau
> > @rmannibucau
> > http://www.tomitribe.com
> > http://rmannibucau.wordpress.com
> > https://github.com/rmannibucau
> >
> >
> > 2015-01-22 20:32 GMT+01:00 Anatole Tresch <[email protected]>:
> > > 2) I think both approaches are feasible:
> > > 2a) A company (eg Credit Suisse) defines the complete config system and
> > > provides with the infrastructure deployment. Users will never (and this
> > is
> > > good so, mess up with the platform config system).
> > > 2b) You want to setup all manually, so I think the builder support
> > planned
> > > by Oliver is the best. I originally also had some similar approach.
> > > 2c) The question is, if you prefer to register your built
> configurations
> > > somehow, after having created it. Of if you want to have some factory
> > > classes defined by the SPI, which you are then implementing... ?
> > >
> > >
> > >
> > > 2015-01-22 19:59 GMT+01:00 Romain Manni-Bucau <[email protected]>:
> > >
> > >> 1) ok
> > >>
> > >> 2) we spoke about it earlier but I think here a builder would be the
> > >> easiest and cleaner solution. Extensions can work on the builder IMO
> > >> but shouldn't be able to modify at runtime the configuration itself.
> > >>
> > >>
> > >> Romain Manni-Bucau
> > >> @rmannibucau
> > >> http://www.tomitribe.com
> > >> http://rmannibucau.wordpress.com
> > >> https://github.com/rmannibucau
> > >>
> > >>
> > >> 2015-01-22 19:44 GMT+01:00 Anatole Tresch <[email protected]>:
> > >> > Hi Romain¨
> > >> >
> > >> > so lets focus on the first aspect:
> > >> >
> > >> > 1) I would agree to provide ConfigurationProvider as an accessor
> > >> singleton
> > >> > class in Java 7 and 8 similarly. As a consequence I would agree to
> > >> > remove Configuration.current()
> > >> > in Java 8 and use ConfigurationProvider as the entry point into
> Tamaya
> > >> > config.
> > >> > 2) I would then define a ConfigurationProviderSpi, which implements
> > >> exactly
> > >> > how Configuration instances are managed, depending on the context or
> > >> > whatever is appropriate. This class is loaded from the
> ServiceContext
> > >> once
> > >> > and then hold as a static variable within ConfigurationProvider.
> What
> > is
> > >> > happening inside ConfigurationProvider/ConfigurationProviderSpi is
> > >> > basically completely transparent. In SE it will be true singleton,
> in
> > >> > EE/OSGI environments something different perhaps.
> > >> >
> > >> > -> This should give you a direct OOTB API to decide how
> Configuration
> > >> > instances are managed.
> > >> >
> > >> > 2a) If we would remove ConfigurationContext, we might add the method
> > >> >
> > >> > /**
> > >> >      * This method can be used for programmatically adding {@link
> > >> > PropertySource}s.
> > >> >      * It is not needed for normal 'usage' by end users, but only
> for
> > >> > Extension Developers!
> > >> >      *
> > >> >      * @param propertySourcesToAdd the PropertySources to add
> > >> >      */
> > >> >     void addPropertySources(PropertySource... propertySourcesToAdd);
> > >> >
> > >> > to the Configuration interface.
> > >> >
> > >> > 2b) The other methods look nevertheless somehow detailed, and when
> > >> writing
> > >> > extensions they may be still very helpful. So basically if we want
> to
> > >> > remove ConfigurationContext completely some of them would end up on
> > >> > Configuration.
> > >> > Best we can do is probably to add a method ConfigurationContext
> > >> > getContext() on Configuration, or on ConfigurationProvider.
> > Disadvantage
> > >> is
> > >> > that PropertyFilter and PropertySource also get API artefacts
> > (basically
> > >> > PropertyConverter already is one, since it can be passed as
> parameter
> > for
> > >> > adhoc conversion), so let's see what Mark thinks on that...
> > >> >
> > >> > WDYT? Would that match at least first couple of aspects you
> mentioned?
> > >> >
> > >> > -Anatole
> > >> >
> > >> >
> > >> > 2015-01-22 17:47 GMT+01:00 Romain Manni-Bucau <
> [email protected]
> > >:
> > >> >
> > >> >> few more comments inline
> > >> >>
> > >> >>
> > >> >>
> > >> >> 2015-01-22 17:41 GMT+01:00 Tresch, Anatole <
> > >> >> [email protected]>:
> > >> >> > inline as usual
> > >> >> >
> > >> >> > 2015-01-22 16:56 GMT+01:00 Tresch, Anatole <
> > >> >> [email protected]>:
> > >> >> >> Feedback inline:
> > >> >> >>
> > >> >> >> -----Original Message-----
> > >> >> >> From: Romain Manni-Bucau [mailto:[email protected]]
> > >> >> >> Sent: Donnerstag, 22. Januar 2015 16:18
> > >> >> >> To: [email protected]
> > >> >> >> Subject: Re: PropertyQuery
> > >> >> >>
> > >> >> >> shouldnt prevent us to go futher but also means we make a lot of
> > >> noise
> > >> >> >> and no progress...
> > >> >> >> -> That depends on the quality of discussion, not on the fact
> > that we
> > >> >> discuss ;). And if you say my posts are noise, well... I take that
> > into
> > >> >> account. Thanks.
> > >> >> >>
> > >> >> >
> > >> >> > we all tend to do it but that's hard to follow where we are and
> > >> >> > finally 1-2 people are doing the product which is bad IMO
> > >> >> > -> I agree. And I also trying to motivate my colluegues to
> > participate
> > >> >> the discussions...
> > >> >> >
> > >> >> >> That said here the feedbacks I try to make precise:
> > >> >> >> -> Nice, thanks!
> > >> >> >>
> > >> >> >> - java 7 module:
> > >> >> >> -- ConfigurationProvider should be called ConfigurationFactory
> IMO
> > >> (see
> > >> >> next)
> > >> >> >> -> NO! NO! NO! We already discussed multiple times that this is
> > not
> > >> >> necessarily a factory.
> > >> >> >>
> > >> >> >> - org.apache.tamaya.spi.ServiceContext#getServices should
> > disappear
> > >> ->
> > >> >> >> no usage at least
> > >> >> >> -> Of course it is used. How do you think the services in core
> are
> > >> >> loaded from? Read the code before you state things that are not
> true
> > or
> > >> >> join our hangouts.
> > >> >> >>
> > >> >> >
> > >> >> > not justified if you prefer. Said otherwise we shouldn't get a
> > single
> > >> >> > ServiceLoader abstraction since both needs are really different.
> > >> >> > -> I do not agree here, but I am not sure I got your point.
> > >> >> ServiceLoader is not powerful enough and users may want to use a
> > >> different
> > >> >> approach. Also for testing you might want to have a more flexible
> > >> solution
> > >> >> as well.
> > >> >> >
> > >> >>
> > >> >> Point is we are exactly in between 2 states. We should either
> fuilly
> > >> >> control programmatically the config config (the context more or
> less)
> > >> >> with just good default fully overridable or not at all. ATM we
> can't
> > >> >> fully control it but we can modify it a bit which is just a
> > workaround
> > >> >> IMO for several sub config cases.
> > >> >>
> > >> >> >
> > >> >> >> -- Configuration.current() miss the "config" stage where you can
> > >> >> >> select your impl: Configuration.byDefaultProvider() or
> > >> >> >> Configuration.byProvider(MySuperProvider.class) and then we just
> > call
> > >> >> >> build() (or we can add in between addPropertySource/Converter).
> > Doing
> > >> >> >> it we don't need to cache
> > >> >> >>
> > >> >>
> > >>
> >
> org.apache.tamaya.spi.ServiceContextManager#serviceContextProviderDelegate
> > >> >> >> which makes it more reliable
> > >> >> >> -> Obviously you still in case of a factory, which it is not. It
> > is a
> > >> >> service!!!
> > >> >> >
> > >> >> > this is broken in most of environment...just test, check you
> > leaked,
> > >> >> > check you don't have the config you should etc...mainly works in
> SE
> > >> >> > only where this abstraction is useless
> > >> >> > -> Just a claim. Credit Suisse runs plusminus 800 plus instances
> > also
> > >> >> with low latency requirements successfully. Some are running in
> > >> Weblogic,
> > >> >> some in Tomcat, some standalone...
> > >> >> >      Also here: your expertise is welcome, but your argument is
> > simply
> > >> >> not true.
> > >> >> >
> > >> >>
> > >> >> Cause your property sources are not everywhere in the app parts I
> > >> >> guess. You can say I can just switch the "locator" to solve it, it
> is
> > >> >> true but not the default :(.
> > >> >>
> > >> >> >> -> For me it seems you are still stuck in the commons config
> > design
> > >> >> somehow. Oliver BTW is currently trying to build an extension
> module,
> > >> where
> > >> >> you can "build" your configuration in such/similar way.
> > >> >> >>     So you can still do your own coding of everything there. We
> > can
> > >> >> then still discuss if we want to have that moved into the core/API
> > part
> > >> at
> > >> >> a later stage.
> > >> >> >>
> > >> >> >> - org.apache.tamaya.spi.ConfigurationContext#context has no real
> > >> >> >> meaning IMO and shouldn't be public if it is needed (it is not
> > IMO)
> > >> >> >> -> tbd. This could be an implementation detail, indeed (or I
> > missed
> > >> >> something).
> > >> >> >>
> > >> >> >> - org.apache.tamaya.spi.PropertySource#isScannable is not used
> ATM
> > >> >> >> AFAIK so we should remove it IMO
> > >> >> >> -> That is not true as well. Non scannable property source are
> not
> > >> >> called for Configuration.getProperties().
> > >> >> >>
> > >> >> >
> > >> >> > ok - I should have a cache issue in Idea, sorry
> > >> >> > ->  fair enough.
> > >> >> >
> > >> >> >
> > >> >> >> - I'd remove org.apache.tamaya.ConfigOperator and just allow to
> > >> export
> > >> >> >> a Config as a Map -> then use Map API to actually "map"
> > >> >> >> - ConfigQuery -> same as previous comment
> > >> >> >> -> adapt Configuration with 2 previous comments
> > >> >> >> -> Well, JSR 310 as well as JSR 354 use this concept very
> > >> successfully.
> > >> >> I would definitively deny removing it. If you don’t get it talk
> with
> > >> >> Stephen Colebourne.
> > >> >> >> -> In many cases exporting to the full Map is not necessary.
> > >> >> >> -> Creating of views will get implementation dependent.
> > >> >> >> -> Summarizing: no way! IMO useless and inefficient proposal
> > compared
> > >> >> to what we have.
> > >> >> >>
> > >> >> >> - finally check it does worth to keep this j8 module (think only
> > >> >> >> drawback removing it would be to loose Configuration.current() -
> > or
> > >> >> >> new equivalent - which is not a big deal IMO.
> > >> >> >>
> > >> >> >> -> Again this is not true again. There are as well the
> additional
> > >> >> accessor using Optional, which are legit additions if someone uses
> > Java
> > >> 8.
> > >> >> >
> > >> >> > yep which is a very poor gain IMO for a lot of complexity:
> > >> >> > -> on our side
> > >> >> > -> on user side (in real life you often have multiple java
> version
> > so
> > >> >> > multiple apis?)
> > >> >> > -> fair enough. your opinion, I have another one!
> > >> >> >
> > >> >> >> -> And to say it again once more: if you don’t want to support
> > Java 8
> > >> >> as a first citizen, many people here on the list would probably
> leave
> > >> the
> > >> >> project.
> > >> >> >>
> > >> >> > please shout guys if that statement is true
> > >> >> >
> > >> >> > -> yes please!
> > >> >> >
> > >> >> >>
> > >> >> >>
> > >> >> >> Romain Manni-Bucau
> > >> >> >> @rmannibucau
> > >> >> >> http://www.tomitribe.com
> > >> >> >> http://rmannibucau.wordpress.com
> > >> >> >> https://github.com/rmannibucau
> > >> >> >>
> > >> >> >>
> > >> >> >> 2015-01-22 16:01 GMT+01:00 Tresch, Anatole <
> > >> >> [email protected]>:
> > >> >> >>> Hi Romain
> > >> >> >>>
> > >> >> >>>>well why I want to step back is just cause we slowly leave
> config
> > >> >> >>>>field and we are implementing a storage solution.
> > >> >> >>>
> > >> >> >>> Do we? I am only focused on config related use cases and know
> > about
> > >> >> what I am talking:
> > >> >> >>> - Exposing a part of the internals as API does not make a
> storage
> > >> >> solution.
> > >> >> >>> - Using TypeLiteral for property conversion does not have
> > anything
> > >> in
> > >> >> common with a storage solution.
> > >> >> >>>
> > >> >> >>>  -> So please stay on the topic and keep off things that are
> not
> > >> >> relevant, please.
> > >> >> >>>
> > >> >> >>>>There are already
> > >> >> >>>>numerous projects doing it at apache - even if they can
> sometimes
> > >> >> >>>>mandate some infra - so we should stick to the first goal of
> > tamaya.
> > >> >> >>>
> > >> >> >>> -> Which is providing a configuration solution. I have well
> > defined
> > >> >> and well important use cases. If you don’t have them, well...
> > >> >> >>> -> I do not care (too much) what other projects do. Often
> others
> > >> >> provide good features, but also some less good ones. To argue not
> to
> > >> >> repeat, what others did
> > >> >> >>>     IMO is useless. We should take the good things and combine
> it
> > >> >> here, so we get a good solution. And again: if you have something
> > that
> > >> >> disturbs you, be
> > >> >> >>>     explicit. Just claiming or writing down your feelings does
> > not
> > >> >> help anybody here. Either you write down your concerns clearly, at
> > the
> > >> end
> > >> >> by code, or your input
> > >> >> >>>    is not much of use. It is that simple IMO. I am exposing me
> by
> > >> >> writing down and trying to do things as Java API, simply because
> > that is
> > >> >> the only way it works to get
> > >> >> >>>    a common understanding. Sorry for the hard words here.
> > >> >> >>>
> > >> >> >>>> I also not fully agree with the basis - in particular the SPI
> > to be
> > >> >> >>>> clear - we have ATM.
> > >> >> >>>>
> > >> >> >>>>To sumamrize a first release with:
> > >> >> >>>>1) SPI ("provider" + property source)
> > >> >> >>>>2) basic merge/conflict policy
> > >> >> >>>>3) String read API
> > >> >> >>>>4) basic convertion support
> > >> >> >>>>
> > >> >> >>>>Is far enough IMO.
> > >> >> >>>>
> > >> >> >>>>Once all of it is clear I'd like we do a release to gather
> > feedback
> > >> >> >>>>then continue building on top of it - we are ATM in the tunnel
> > ;).
> > >> >> >>>
> > >> >> >>> -> So we have a scope discussion for the new release now. IMO
> the
> > >> >> current artifacts within the API are clearly in focus for release 1
> > >> (from
> > >> >> an API perspective). If you want to remove anything, you should
> > >> >> >>>      exactly write down, WHAT should be removed and also WHY.
> > >> >> >>> -> About Collection support, we may have a vote on it. Or other
> > >> people
> > >> >> here on the mailing list should add their cents ;)
> > >> >> >>> -> Gathering feedback is OK. Nevertheless we can mark the
> > release as
> > >> >> alpha, so everybody is clear that things may still change.
> > >> >> >>> -> And again discussing what should be part of release 1 IMO
> must
> > >> not
> > >> >> constrain us to discuss on further concepts as long as the threads
> > are
> > >> >> clearly separated and not too many. So help us constructively with
> > the
> > >> >> >>>     discussion instead of throwing woods into our legs all the
> > >> times.
> > >> >> That would be great!
> > >> >> >>>
> > >> >> >>>
> > >> >> >>> Romain Manni-Bucau
> > >> >> >>> @rmannibucau
> > >> >> >>> http://www.tomitribe.com
> > >> >> >>> http://rmannibucau.wordpress.com
> > >> >> >>> https://github.com/rmannibucau
> > >> >> >>>
> > >> >> >>>
> > >> >> >>> 2015-01-22 13:47 GMT+01:00 Tresch, Anatole <
> > >> >> [email protected]>:
> > >> >> >>>> Hi Romain/all
> > >> >> >>>>
> > >> >> >>>> I think we have quite a common agreement on the basic
> functions
> > >> >> designed so far and I do not want to
> > >> >> >>>> reinvent or change any of the basic mechanism. I simply come
> up
> > >> with
> > >> >> a simple request to use the algorithm pattern
> > >> >> >>>> for a small subset of a functionality (how the final property
> > value
> > >> >> is evaluated). The usage of TypeLiteral was even your
> > >> >> >>>> own proposal AFAIK, when we discussed PropertyConverters ;) ).
> > >> >> >>>>
> > >> >> >>>> Our current configuration model in general IMO is a very good
> > >> start.
> > >> >> It is already so flexible that I can implement 60-70% of use cases
> > >> >> >>>> I have currently in use within Credit Suisse (this is somehow
> my
> > >> >> "benchmark", which from my discussions I had during the last years
> > >> covers a
> > >> >> >>>> majority of use cases when dealing with distributed and
> modular
> > >> >> systems).
> > >> >> >>>>
> > >> >> >>>> I am sure you remember, we had a discussion on another mail
> > thread
> > >> >> yesterday about Collection support. My proposal
> > >> >> >>>> basically is the outcome of having played around to extend our
> > API
> > >> to
> > >> >> support collections based only on Map<String,String>
> > >> >> >>>> only as internal PropertySource representation thus avoiding
> the
> > >> >> String[] getListProperty(String) methods.
> > >> >> >>>>
> > >> >> >>>> So for getting type information and define the content type of
> > >> >> collections we need TypeLiterals, which similarly is useful perhaps
> > for
> > >> >> other non collection
> > >> >> >>>> cases.  Since collection entries can be defined in different
> > >> property
> > >> >> sources, a final list may want to contain all the properties found,
> > >> instead
> > >> >> of overriding,
> > >> >> >>>> so values of different property sources are to be  combined.
> > AFAIK
> > >> >> you already agreed on that UC. Hardcoding yet another strategy IMO
> > makes
> > >> >> >>>> no sense, so I would recommend use the default for all common
> > >> aspects
> > >> >> (that is what we already have in place) and add support for
> adapting
> > the
> > >> >> default
> > >> >> >>>> where it is not appropriate. Thinking on this IMO both aspects
> > >> >> (TypeLiterals and the collector) are the same for evaluating single
> > >> >> property values as well,
> > >> >> >>>> so regarding that it makes no sense to model collections
> > >> differently,
> > >> >> but extend/flexibilize the way how we can access properties in
> > general.
> > >> >> >>>>
> > >> >> >>>> I tried to combine both aspects in one class, which I called
> > >> >> PropertyQuery. Perhaps also the name PropertyQuery is confusing.
> > >> Alternates
> > >> >> would be
> > >> >> >>>> PropertyRequest, PropertyAccess,... or whatever you like, I am
> > >> >> completely open here ;)
> > >> >> >>>>
> > >> >> >>>> We can postpone that discussion, but just stopping this
> > discussion
> > >> >> now will not solve anything. Also we already invested a lot of
> > >> discussing
> > >> >> collection support, why stop here.
> > >> >> >>>> We have enough time I think. We have important use cases to
> > solve
> > >> >> that may affect the Configuration interface as a whole. Adding them
> > >> later
> > >> >> may be a bad idea, so we
> > >> >> >>>> should sort out these things now IMO.
> > >> >> >>>>
> > >> >> >>>> So I am curious to see your concrete (improvement) proposals
> > ;), so
> > >> >> we can continue to see, if we end up in a common view. If so,
> others
> > on
> > >> the
> > >> >> mailing list also have a
> > >> >> >>>> chance to join us again, I think.
> > >> >> >>>>
> > >> >> >>>> Anatole
> > >> >> >>>>
> > >> >> >>>>
> > >> >> >>>> -----Original Message-----
> > >> >> >>>> From: Romain Manni-Bucau [mailto:[email protected]]
> > >> >> >>>> Sent: Donnerstag, 22. Januar 2015 09:45
> > >> >> >>>> To: [email protected]
> > >> >> >>>> Subject: Re: PropertyQuery
> > >> >> >>>>
> > >> >> >>>> not exactly, it is different to expose MapReduce in API and to
> > >> >> >>>> implement it behind another concept, ATM it is an
> implementation
> > >> >> >>>> detail.
> > >> >> >>>>
> > >> >> >>>> Why I worry a bit about Query stuff is we start to leave
> > >> configuration
> > >> >> >>>> layer to enter backend one, not sure it does worth it *to
> > start* -
> > >> I
> > >> >> >>>> understand your feature even if I never needed it but I'd
> really
> > >> like
> > >> >> >>>> we ensure our basis are solid enough before adding features on
> > top
> > >> of
> > >> >> >>>> them.
> > >> >> >>>>
> > >> >> >>>> Said otherwise I think we should now focus on trying to make a
> > 0.1
> > >> -
> > >> >> >>>> we can add alpha to make obvious we are not done - and stop
> > adding
> > >> >> >>>> anything before being fully agree on all we have.
> > >> >> >>>>
> > >> >> >>>> Does it make sense?
> > >> >> >>>>
> > >> >> >>>>
> > >> >> >>>>
> > >> >> >>>> Romain Manni-Bucau
> > >> >> >>>> @rmannibucau
> > >> >> >>>> http://www.tomitribe.com
> > >> >> >>>> http://rmannibucau.wordpress.com
> > >> >> >>>> https://github.com/rmannibucau
> > >> >> >>>>
> > >> >> >>>>
> > >> >> >>>> 2015-01-22 9:39 GMT+01:00 Anatole Tresch <[email protected]
> >:
> > >> >> >>>>> Hi Romain
> > >> >> >>>>>
> > >> >> >>>>> About lamba friendly I can still have a Builder that creates
> a
> > >> >> query. Works perfectly.
> > >> >> >>>>> The default use cases would remain as is. Queries would just
> > add
> > >> >> about 3 methods to Configuration. We get as well all the
> flexibility
> > we
> > >> >> would need for collection support as well ;)
> > >> >> >>>>>
> > >> >> >>>>> Mapreduce? Well what else is evaluating a chain of
> propsources
> > by
> > >> >> overridding? Its already there, but hardcoded the same, which is
> > >> obviously
> > >> >> not flexible enough!
> > >> >> >>>>>
> > >> >> >>>>> -
> > >> >> >>>>> Anatole Tresch
> > >> >> >>>>> Glärnischweg 10
> > >> >> >>>>> 8620 Wetzikon
> > >> >> >>>>> Tel +41 (43) 317 05 30
> > >> >> >>>>> -
> > >> >> >>>>> Send from Mobile
> > >> >> >>>>>
> > >> >> >>>>>> Am 22.01.2015 um 09:11 schrieb Romain Manni-Bucau <
> > >> >> [email protected]>:
> > >> >> >>>>>>
> > >> >> >>>>>> isnt it too complicated for most common use cases (+ not
> that
> > >> lambda
> > >> >> >>>>>> friendly cause of the 4 parameters which dont help writing
> > >> readable
> > >> >> >>>>>> code IMO).
> > >> >> >>>>>>
> > >> >> >>>>>> Functionally it works but it makes default cases "hard" and
> > >> actually
> > >> >> >>>>>> you just want to implement the MapReduce pattern so maybe we
> > >> should
> > >> >> >>>>>> call it this way if we go this way.
> > >> >> >>>>>>
> > >> >> >>>>>>
> > >> >> >>>>>> Romain Manni-Bucau
> > >> >> >>>>>> @rmannibucau
> > >> >> >>>>>> http://www.tomitribe.com
> > >> >> >>>>>> http://rmannibucau.wordpress.com
> > >> >> >>>>>> https://github.com/rmannibucau
> > >> >> >>>>>>
> > >> >> >>>>>>
> > >> >> >>>>>> 2015-01-22 8:44 GMT+01:00 Anatole Tresch <
> [email protected]
> > >:
> > >> >> >>>>>>> Dear all
> > >> >> >>>>>>>
> > >> >> >>>>>>> *let's think about additional use cases:*
> > >> >> >>>>>>> 1) as mentioned in my last mail about collection types,*
> > >> >> overriding may not
> > >> >> >>>>>>> always be the right resolution policy *for accessing a
> > >> configured
> > >> >> value
> > >> >> >>>>>>> (e.g. for collecting all configured values in a final
> > set/list).
> > >> >> >>>>>>> 2) sometimes I want to define my own PropertyConverters
> > (already
> > >> >> >>>>>>> implemented)
> > >> >> >>>>>>> 3) sometimes I even would like to evaluate multiple keys
> > taking
> > >> >> the result
> > >> >> >>>>>>> of the first property key that returns a config property
> > (nice
> > >> >> convenience)
> > >> >> >>>>>>>
> > >> >> >>>>>>> When we will add all this kind of aspect into
> Configuration,
> > we
> > >> >> will end up
> > >> >> >>>>>>> in a messy interface, e.g. for
> > >> >> >>>>>>> String get(String);
> > >> >> >>>>>>> <T> T get(String, Class<T>);
> > >> >> >>>>>>> <T> T get(String, Class<T>, PropertyConverter);
> > >> >> >>>>>>>
> > >> >> >>>>>>> String get(String, ValueCollector);
> > >> >> >>>>>>> <T> T get(String, Class<T>, ValueCollector);
> > >> >> >>>>>>> <T> T get(String, Class<T>, PropertyConverter,
> > ValueCollector);
> > >> >> >>>>>>> ...
> > >> >> >>>>>>>
> > >> >> >>>>>>> Obviously that does not make sense.
> > >> >> >>>>>>>
> > >> >> >>>>>>> Instead of I would propose, we would define a
> PropertyQuery,
> > >> which
> > >> >> >>>>>>> basically is
> > >> >> >>>>>>>
> > >> >> >>>>>>>   - is the same as a TypeLiteral<T> solving the type
> aspects
> > >> >> >>>>>>>   - has a list of *keys* to be evaluated, at least one
> > >> >> >>>>>>>   - optionally has a ValueCollector
> > >> >> >>>>>>>   - optionally has a list of PropertyConverter
> > >> >> >>>>>>>
> > >> >> >>>>>>> With that our interface gets much leaner, but still
> flexible
> > >> >> enough to
> > >> >> >>>>>>> accommodate the use cases above:
> > >> >> >>>>>>>
> > >> >> >>>>>>> String get(String);
> > >> >> >>>>>>> <T> T get(String, Class<T>);
> > >> >> >>>>>>> <T> T get(String, Class<T>, PropertyConverter); // may be
> > >> ommitted
> > >> >> as well ?
> > >> >> >>>>>>> <T> get(PropertyQuery<T> query);
> > >> >> >>>>>>> ...
> > >> >> >>>>>>>
> > >> >> >>>>>>> This solves all use cases above and gives us an easy way to
> > add
> > >> >> additional
> > >> >> >>>>>>> feature, if needed (I dont see any, but who knows). Hereby
> > >> >> ValueCollector
> > >> >> >>>>>>> would be defined as follows:
> > >> >> >>>>>>>
> > >> >> >>>>>>> @FunctionalInterface
> > >> >> >>>>>>> public interface ValueCollector {
> > >> >> >>>>>>>
> > >> >> >>>>>>>    /**
> > >> >> >>>>>>>     * Method that is called for each value returned by a
> > >> >> PropertySource
> > >> >> >>>>>>> for the given key.
> > >> >> >>>>>>>     * @param currentValue the current value, including
> null.
> > >> >> >>>>>>>     *                     The collector should either
> combine
> > >> the
> > >> >> existing
> > >> >> >>>>>>> value with value from {@code currentValue}
> > >> >> >>>>>>>     *                     or replace the value in {@code
> > >> >> currentValue}
> > >> >> >>>>>>> with {@code valueRead}, hereby returning the
> > >> >> >>>>>>>     *                     result to be used as new {@code
> > >> >> currentValue}.
> > >> >> >>>>>>>     * @param key The current key to be evaluated.
> > >> >> >>>>>>>     * @param newValue the new value read from the current
> > {@code
> > >> >> >>>>>>> propertySource}, not null.
> > >> >> >>>>>>>     * @param propertySource The PropertySource that
> returned
> > the
> > >> >> current
> > >> >> >>>>>>> value (either as the result of a direct
> > >> >> >>>>>>>     *                       access of as a property Map
> > >> containing
> > >> >> the
> > >> >> >>>>>>> given key. The PropertySource given
> > >> >> >>>>>>>     *                       may be evaluated for additional
> > >> >> meta-data, how
> > >> >> >>>>>>> the given values are to be combined.
> > >> >> >>>>>>>     * @return the value to be used for future evaluation.
> > >> >> >>>>>>>     */
> > >> >> >>>>>>>    String collect(String key, String newValue,
> PropertySource
> > >> >> >>>>>>> propertySource,
> > >> >> >>>>>>>                   String currentValue);
> > >> >> >>>>>>>
> > >> >> >>>>>>>    /**
> > >> >> >>>>>>>     * Default overriding collector.
> > >> >> >>>>>>>     */
> > >> >> >>>>>>>    public final ValueCollector
> DEFAULT_OVERRIDING_COLLECTOR =
> > >> (k,
> > >> >> nv, ps,
> > >> >> >>>>>>> cv) -> nv;
> > >> >> >>>>>>> }
> > >> >> >>>>>>>
> > >> >> >>>>>>> Feedback?
> > >> >> >>>>>>>
> > >> >> >>>>>>> Cheers,
> > >> >> >>>>>>> Anatole
> > >> >>
> > >> >
> > >> >
> > >> >
> > >> > --
> > >> > *Anatole Tresch*
> > >> > Java Engineer & Architect, JSR Spec Lead
> > >> > Glärnischweg 10
> > >> > CH - 8620 Wetzikon
> > >> >
> > >> > *Switzerland, Europe Zurich, GMT+1*
> > >> > *Twitter:  @atsticks*
> > >> > *Blogs: **http://javaremarkables.blogspot.ch/
> > >> > <http://javaremarkables.blogspot.ch/>*
> > >> >
> > >> > *Google: atsticksMobile  +41-76 344 62 79*
> > >>
> > >
> > >
> > >
> > > --
> > > *Anatole Tresch*
> > > Java Engineer & Architect, JSR Spec Lead
> > > Glärnischweg 10
> > > CH - 8620 Wetzikon
> > >
> > > *Switzerland, Europe Zurich, GMT+1*
> > > *Twitter:  @atsticks*
> > > *Blogs: **http://javaremarkables.blogspot.ch/
> > > <http://javaremarkables.blogspot.ch/>*
> > >
> > > *Google: atsticksMobile  +41-76 344 62 79*
> >
>
>
>
> --
> *Anatole Tresch*
> Java Engineer & Architect, JSR Spec Lead
> Glärnischweg 10
> CH - 8620 Wetzikon
>
> *Switzerland, Europe Zurich, GMT+1*
> *Twitter:  @atsticks*
> *Blogs: **http://javaremarkables.blogspot.ch/
> <http://javaremarkables.blogspot.ch/>*
>
> *Google: atsticksMobile  +41-76 344 62 79*
>

Reply via email to