Currently not. It is not yet pushed, since I have first to reorganize my folders with the latest modules changes. And first of all I am interested in a content-wise feedback/questions. I dont care if we put it into branch A or B ... this does not mean I cannot push it into some branch.... but this takes more time, around WE or so. And I thaught we can start with some basic discussions ahead...
2016-10-18 17:27 GMT+02:00 Werner Keil <werner.k...@gmail.com>: > Would that be in a separate branch to start with? > > Werner > > > On Tue, Oct 18, 2016 at 4:42 PM, Anatole Tresch <atsti...@gmail.com> > wrote: > > > Hi all > > > > based on the work to see how easy some of the ideas of Dimitry (the > > designated Oracle spec lead for config) could be implemented I would like > > to propose some adaptions and changes: > > > > - I would basically resolve the current duplication of the builder > > pattern (in the builder module as well as in the core API). The core > API > > itself is already based on an interface, which if done right IMO gives > > all > > the flexibility needed and also would make some of the more implicit > > mechanism more explicit. > > - The main API changes required are on the > *ConfigurationContextBuilder* > > SPI interface: > > - this interface as of now already contains methods for adding and > > removing of property sources, filters and converters. Most of the > > methods > > are implemented in two variants as of now: once taking a > Collection, > > once > > using an ellipse operator taking single items or arrays. > > Unfortunately some > > of the methods are not fully present in both variants, so I > > propoase to add > > the missing counterparts. This basically is not a functional > change, > > but > > makes the API more concise. > > - currently the implementation of the builder implicitly applies > > sorting of property sources and filters using its internal sorting > > algorithm. This works well, but in case, where I dont want to use > the > > ordinal pattern, e.g. because I have configured a different > > hierarchy in a > > XML meta-config file, this implicit sorting makes it hard to build > > up a > > property source chain in a transparent and clear way (using the > > builder). I > > would expect the builder to NOT perform any sorting implicitly. > > Instead > > sorting is controlled by calling the appropriate sort methods > hereby > > passing a *Comparator*. So I propose to add to methods > > *sortPropertySources(Comparator) > > *and *sortPropertyFilters(Comparator) *to the builder interface. > > - Given that the *ConfigurationContextBuilder* actually manages an > > ordered list of property sources. In case I want to > increase/decrese > > the > > priority of a property source or make it the most/least significant > > one. > > Therefore I propose to add the methods *(incresePriority( > > PropertySource), > > decresePriority(PropertySource), lowestPriority(PropertySource), > > highestPriority(PropertySource)*. One use case is creating a > builder > > from an existing *ConfigurationContext* and change the priority of > > some of its property sources. Also these methods do strictly > > operate on the > > ordering only, they will not change implicitly any ordinals. > > - For implementing module it has shown that access tot he current > > property sources, filters and converters of a builder is useful. > > Creating a > > context and accessing later does not work, since the builder > supports > > building an instance only once. So I propose to add the methods > > *getPropertySources(),getPropertyFilters(), > > getPropertyConverter()*. > > - Finally given a *ConfigurationContext* built with the builder, I > want > > to create a *Configuration* instance. The corresponding method > > *createConfiguration(ConfigurationContext) > > *is already defined on the *ConfigurationProviderSpi* interface. So I > > would like to add it as well on the *ConfigurationProvider*. Obviously > > building a configuration MUST resepct/ensure the precendece of > property > > sources as defined by its context (which by now, was not the case). > > > > With these changes we have a much better separation of concerns: > > > > - we have an ordered list of property sources. The ordering hereby can > > be ordinal based (used by default). > > - But using the ConfigurationContextBuilder alternate strategies can > be > > easily defined by implementing a different Comparator being used or > > applying the ordering required using the methods offerend on the > > builder. > > - Using ordinals is the default way provided, but using modules we can > > easily provide alternate strategies as well. > > - This will quite probably also help with contextual aspects, once it > is > > more clear, what contextuality means regarding configuration and also > > make > > implementation of a company specific strategy much more easier. > > > > There is one disadvantage I dont want to omit: the changes in the > > implementation are not fully behavioural compatible wuth code that > already > > is using the builder pattern. Since the method for creating a new > > Configuration instance has not been exposed I expect the changes only > > affect code within Tamaya itself (basically mostly some testing and code > in > > the core, but not much). > > > > Feedback is welcome. The changes described are actually implemented, > > testing and are all working and have proven to work well. So if nobody > > complains I will checkin the changes on Thursday-WE the latest. > > > > J Anatole > > > > > > Following the source of the ConfigurationContextBuilder with marks for > > additions: > > > > /** > > * A builder for creating new or adapting instances of {@link > > ConfigurationContext}. > > * Builders can be obtained in exactly two ways: > > * <ol> > > * <li>By accessing a preinitialized builder from an existing > > {@link ConfigurationContext}, > > * by calling {@link > > org.apache.tamaya.spi.ConfigurationContext#toBuilder()}.</li> > > * <li>By accessing an empty builder instance from > > * {@link org.apache.tamaya.ConfigurationProvider# > > getConfigurationContextBuilder()}.</li> > > * </ol> > > * After all changes are applied to a builder a new {@link > > ConfigurationContext} instance can > > * be created and can be applied by calling > > * {@link org.apache.tamaya.ConfigurationProvider# > > setConfigurationContext(org.apache.tamaya.spi.ConfigurationContext)}. > > * > > */ > > public interface ConfigurationContextBuilder { > > > > /** > > * Init this builder instance with the given {@link > > ConfigurationContext} instance. This > > * method will use any existing property sources, filters, > > converters and the combination > > * policy of the given {@link ConfigurationContext} and initialize > > the current builder > > * with them. > > * > > * @param context the {@link ConfigurationContext} instance to be > > used, not null. > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder setContext(ConfigurationContext > context); > > > > /** > > * This method can be used for adding {@link PropertySource}s. > > * Hereby the property source is added to the tail of property > sources > > with > > * lowest priority regardless of its current ordinal value. To > > sort the property > > * sources based on their ordinals call {@kink #sortPropertySources}. > > * > > * @param propertySources the PropertySources to add > > * @return this builder, for chaining, never null. > > * @throws IllegalArgumentException If a property source with a > > given name already > > * exists. > > */ > > ConfigurationContextBuilder addPropertySources(PropertySource... > > propertySources); > > > > /** > > * This method can be used for programmatically adding {@link > > PropertySource}s. > > * Hereby the property source is added to the tail of property > sources > > with > > * lowest priority regardless of its current ordinal value. To > > sort the property > > * sources based on their ordinals call {@kink #sortPropertySources}. > > * > > * @param propertySources the PropertySources to add > > * @return this builder, for chaining, never null. > > * @throws IllegalArgumentException If a property source with a > > given name already > > * exists. > > */ > > ConfigurationContextBuilder > > addPropertySources(Collection<PropertySource> propertySources); > > > > /** > > * Removes the given property sources, if existing. The existing > > order of property > > * sources is preserved. > > * > > * @param propertySources the property sources to remove, not null. > > * @return the builder for chaining. > > */ > > ConfigurationContextBuilder > > removePropertySources(PropertySource... propertySources); > > > > /** > > * Removes the given property sources, if existing. The existing > > order of property > > * sources is preserved. > > * > > * @param propertySources the property sources to remove, not null. > > * @return the builder for chaining. > > */ > > ConfigurationContextBuilder > > removePropertySources(Collection<PropertySource> propertySources); > > > > /** > > * Access the current chain of property sources. Items at the end > > of the list have > > * precedence/more significance. > > * > > * @return the property source chain, never null. > > */ > > List<PropertySource> getPropertySources(); > > > > /** > > * Access the current chain of property filters. Items at the end > > of the list have > > * precedence/more significance. > > * > > * @return the property source chain, never null. > > */ > > List<PropertyFilter> getPropertyFilters(); > > > > /** > > * Access the current registered property converters. > > * > > * @return the current registered property converters. > > */ > > Map<TypeLiteral<?>, Collection<PropertyConverter<?>>> > > getPropertyConverter(); > > > > /** > > * Increases the priority of the given property source, by moving > > it towards the end > > * of the chain of property sources. If the property source given > > is already at the end > > * this method has no effect. This operation does not change any > > ordinal values. > > * > > * @param propertySource the property source to be incresed > > regarding its significance. > > * @return the builder for chaining. > > * @throws IllegalArgumentException If no such property source > > exists in the current > > * chain. > > */ > > ConfigurationContextBuilder increasePriority(PropertySource > > propertySource); > > > > /** > > * Decreases the priority of the given property source, by moving > > it towards the start > > * of the chain of property sources. If the property source given > > is already the first > > * this method has no effect. This operation does not change any > > ordinal values. > > * > > * @param propertySource the property source to be decresed > > regarding its significance. > > * @return the builder for chaining. > > * @throws IllegalArgumentException If no such property source > > exists in the current > > * chain. > > */ > > ConfigurationContextBuilder decreasePriority(PropertySource > > propertySource); > > > > /** > > * Increases the priority of the given property source to be > > maximal, by moving it to > > * the tail of the of property source chain. If the property source > > given is > > * already the last item this method has no effect. This operation > > does not change > > * any ordinal values. > > * > > * @param propertySource the property source to be maximized > > regarding its significance. > > * @return the builder for chaining. > > * @throws IllegalArgumentException If no such property source > > exists in the current > > * chain. > > */ > > ConfigurationContextBuilder highestPriority(PropertySource > > propertySource); > > > > /** > > * Decreases the priority of the given property source to be > > minimal, by moving it to > > * the start of the chain of property source chain. If the > > property source given is > > * already the first item this method has no effect. This > > operation does not change > > * any ordinal values. > > * > > * @param propertySource the property source to be minimized > > regarding its significance. > > * @return the builder for chaining. > > * @throws IllegalArgumentException If no such property source > > exists in the current > > * chain. > > */ > > ConfigurationContextBuilder lowestPriority(PropertySource > > propertySource); > > > > /** > > * Adds the given PropertyFilter instances, hereby the instances are > > added > > * to the end of the list with highest priority. The ordering of > > existing > > * property filters remains unchanged. To sort the property > > * filters call {@kink #sortPropertyFilter}. > > * > > * @param filters the filters to add > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder addPropertyFilters(PropertyFilter... > > filters); > > > > /** > > * Adds the given PropertyFilter instances, hereby the instances are > > added > > * to the end of the list with highest priority. The ordering of > > existing > > * property filters remains unchanged. To sort the property > > * filters call {@kink #sortPropertyFilter}. > > * > > * @param filters the filters to add > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder > > addPropertyFilters(Collection<PropertyFilter> filters); > > > > /** > > * Removes the given PropertyFilter instances, if existing. The > > order of the remaining > > * filters is preserved. > > * > > * @param filters the filter to remove > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder > > removePropertyFilters(PropertyFilter... filters); > > > > /** > > * Removes the given PropertyFilter instances, if existing. The > > order of the remaining > > * filters is preserved. > > * > > * @param filters the filter to remove > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder > > removePropertyFilters(Collection<PropertyFilter> filters); > > > > /** > > * This method can be used for adding {@link PropertyConverter}s. > > * Converters are added at the end after any existing converters. > > * For converters already registered for the current target type the > > * method has no effect. > > * > > * @param typeToConvert the type for which the converter is for > > * @param propertyConverters the PropertyConverters to add for this > > type > > * @return this builder, for chaining, never null. > > */ > > <T> ConfigurationContextBuilder > > addPropertyConverters(TypeLiteral<T> typeToConvert, > > > > PropertyConverter<T>... propertyConverters); > > > > /** > > * This method can be used for adding {@link PropertyConverter}s. > > * Converters are added at the end after any existing converters. > > * For converters already registered for the current target type the > > * method has no effect. > > * > > * @param typeToConvert the type for which the converter is for > > * @param propertyConverters the PropertyConverters to add for this > > type > > * @return this builder, for chaining, never null. > > */ > > <T> ConfigurationContextBuilder > > addPropertyConverters(TypeLiteral<T> typeToConvert, > > > > Collection<PropertyConverter<T>> propertyConverters); > > > > /** > > * Removes the given PropertyConverter instances for the given type, > > * if existing. > > * > > * @param typeToConvert the type which the converter is for > > * @param propertyConverters the converter to remove > > * @return this builder, for chaining, never null. > > */ > > <T> ConfigurationContextBuilder > > removePropertyConverters(TypeLiteral<T> typeToConvert, > > > > PropertyConverter<T>... propertyConverters); > > > > /** > > * Removes the given PropertyConverter instances for the given type, > > * if existing. > > * > > * @param typeToConvert the type which the converter is for > > * @param propertyConverters the converter to remove > > * @return this builder, for chaining, never null. > > */ > > <T> ConfigurationContextBuilder > > removePropertyConverters(TypeLiteral<T> typeToConvert, > > > > Collection<PropertyConverter<T>> propertyConverters); > > > > /** > > * Removes all converters for the given type, which actually > > renders a given type > > * unsupported for type conversion. > > * > > * @param typeToConvert the type which the converter is for > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder > > removePropertyConverters(TypeLiteral<?> typeToConvert); > > > > /** > > * Sorts the current registered property sources using the given > > comparator. > > * > > * NOTE: property sources at the beginning have minimal significance. > > * > > * @param comparator the comparator to be used, not null. > > * @return this instance for chaining. > > */ > > ConfigurationContextBuilder > > sortPropertySources(Comparator<PropertySource> comparator); > > > > /** > > * Sorts the current registered property filters using the given > > comparator. > > * > > * NOTE: property filters at the beginning have minimal significance. > > * > > * @param comparator the comparator to be used, not null. > > * @return this instance for chaining. > > */ > > ConfigurationContextBuilder > > sortPropertyFilter(Comparator<PropertyFilter> comparator); > > > > /** > > * Sets the {@link PropertyValueCombinationPolicy} used to > > evaluate the final > > * property values. > > * > > * @param policy the {@link PropertyValueCombinationPolicy} used, > not > > null > > * @return this builder, for chaining, never null. > > */ > > ConfigurationContextBuilder > > setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy > > policy); > > > > /** > > * Builds a new {@link ConfigurationContext} based on the data in > > this builder. The ordering of property > > * sources and property filters is not changed, regardless of > > their ordinals. For ensure a certain > > * ordering/significance call {@link > > #sortPropertyFilter(Comparator)} and/or {@link > > #sortPropertySources(Comparator)} > > * before building the context. > > * > > * @return the final context to be used to create a configuration. > > * @see org.apache.tamaya.ConfigurationProvider#createConfiguration( > > ConfigurationContext) > > */ > > ConfigurationContext build(); > > > > } > > > -- *Anatole Tresch* PPMC Member Apache Tamaya JCP Star Spec Lead *Switzerland, Europe Zurich, GMT+1* *maketechsimple.wordpress.com <http://maketechsimple.wordpress.com/> * *Twitter: @atsticks, @tamayaconf*