Ok, so at least when generated into common output formats it won't show?;-)
On Tue, Dec 2, 2014 at 2:17 PM, Oliver B. Fischer <[email protected]> wrote: > It is a variable of Asciidoctor, defined in the top level document. > > Am 02.12.14 14:14, schrieb Werner Keil: > > Thanks, is the {Name} at the beginning deliberate, something only GitHub >> shows, or a bug in the code? >> >> Werner >> >> On Tue, Dec 2, 2014 at 2:01 PM, Anatole Tresch <[email protected]> >> wrote: >> >> Hi all >>> find following an additional part of use cases for comment. Note that >>> this >>> area IMO definitively may be improved in several ways. Always keep in >>> mind >>> that I try to setup the design guide similarly in parallel. It can be >>> easily accessed from the GH mirror: >>> >>> >>> https://github.com/apache/incubator-tamaya/blob/master/ >>> docs/design/2_CoreConcepts.adoc >>> >>> Cheers, >>> Anatole >>> >>> Combining Property Providers >>> >>> Looking at the structures of configuration system used by large companies >>> we typically encounter some kind of configuration hierarchies that are >>> combined in arbitrary ways. Users of the systems are typically not aware >>> of >>> the complexities in this area, since they simply know the possible >>> locations, formats and the overriding policies. Framework providers on >>> the >>> other side must face the complexities and it would be very useful if >>> Tamaya >>> can support here by providing prebuilt functionality that helps >>> implementing these aspects. All this leads to the feature set of >>> combining >>> property providers. Hereby the following strategies are useful: >>> >>> - >>> >>> aggregating providers, hereby later providers added >>> - >>> >>> override any existing entries from earlier providers >>> - >>> >>> combine conflicting entries from earlier providers, e.g. into a >>> comma-separated structure. >>> - >>> >>> may throw a ConfigExcepotion ig entries are conflicting >>> - >>> >>> may only add entries not yet defined by former providers, >>> preventing >>> entries that are already present to be overwritte >>> - >>> >>> any custom aggregation strategy, which may be a mix of above >>> - >>> >>> intersecting providers >>> - >>> >>> subtracting providers >>> - >>> >>> filtering providers >>> >>> These common functionality is provided by the PropertyProviders >>> singleton. Additionally to the base strategies above a MetaInfo instance >>> can be passed optionally as well to define the meta information for the >>> newly created provider instances. Let’s assume we have two property >>> providers with the following data: >>> Provider 1 >>> >>> a=a >>> b=b >>> c=c >>> g=g >>> h=h >>> i=i >>> >>> Provider 2 >>> >>> a=A >>> b=B >>> c=C >>> d=D >>> e=E >>> f=F >>> >>> Looking in detail you see that the entries a,b,c are present in both >>> providers, whereas d,e,f are only present in provider 1, and g,h,i only >>> in >>> provider 2. >>> Example Combining PropertyProviders >>> >>> PropertyProvider provider1 = ... >>> PropertyProvider provider2 = ... >>> // aggregate, hereby values from provider 2 override values from >>> provider 1 >>> PropertyProvider unionOverriding = >>> PropertyProviders.aggregate(AggregationPolicy.OVERRIDE(), provider1, >>> provider2);*System*.out.println("unionOverriding: " + >>> unionOverriding); >>> // ignore duplicates, values present in provider 1 are not overriden >>> by provider 2 >>> PropertyProvider unionIgnoringDuplicates = >>> PropertyProviders.aggregate(AggregationPolicy.IGNORE_DUPLICATES(), >>> provider1, provider2);*System*.out.println("unionIgnoringDuplicates: " >>> + unionIgnoringDuplicates); >>> // this variant combines/maps duplicate values into a new value >>> PropertyProvider unionCombined = >>> PropertyProviders.aggregate(AggregationPolicy.COMBINE(), provider1, >>> provider2);*System*.out.println("unionCombined: " + unionCombined); >>> // This variant throws an exception since there are key/value paris in >>> both providers, but with different values*try*{ >>> PropertyProviders.aggregate(AggregationPolicy.EXCEPTION(), >>> provider1, provider2); >>> }*catch*(ConfigException e){ >>> // expected! >>> } >>> >>> The example above produces the following outpout: >>> Example Combining PropertyProviders >>> >>> AggregatedPropertyProvider{ >>> (name = dynamicAggregationTests) >>> a = "[a][A]" >>> b = "[b][B]" >>> c = "[c][C]" >>> d = "[D]" >>> e = "[E]" >>> f = "[F]" >>> g = "[g]" >>> h = "[h]" >>> i = "[i]" >>> } >>> unionOverriding: AggregatedPropertyProvider{ >>> (name = <noname>) >>> a = "A" >>> b = "B" >>> c = "C" >>> d = "D" >>> e = "E" >>> f = "F" >>> g = "g" >>> h = "h" >>> i = "i" >>> } >>> unionIgnoringDuplicates: AggregatedPropertyProvider{ >>> (name = <noname>) >>> a = "a" >>> b = "b" >>> c = "c" >>> d = "D" >>> e = "E" >>> f = "F" >>> g = "g" >>> h = "h" >>> i = "i" >>> } >>> unionCombined: AggregatedPropertyProvider{ >>> (name = <noname>) >>> a = "a,A" >>> b = "b,B" >>> c = "c,C" >>> d = "D" >>> e = "E" >>> f = "F" >>> g = "g" >>> h = "h" >>> i = "i" >>> } >>> >>> No AggregationPolicy is also an interface that can be implemented: >>> AggregationPolicy Interface >>> >>> @FunctionalInterface*public* *interface* *AggregationPolicy* { >>> *String* aggregate(*String* key, *String* value1, *String* value2); >>> } >>> >>> So we can also define our own aggregation strategy using a Lambda >>> expression: >>> Use a Custom AggregationPolicy >>> >>> PropertyProvider provider1 = ...; >>> PropertyProvider provider2 = ...; >>> PropertyProvider props = PropertyProviders.aggregate( >>> (k, v1, v2) -> (v1 != null ? v1 : "") + '[' + v2 + "]", >>> MetaInfo.of("dynamicAggregationTests"), >>> props1, props2);*System*.out.println(props); >>> >>> Additionally we also pass here an instance of MetaInfo. The output of >>> this code snippet is as follows: >>> Listing of dynamic aggregation policy >>> >>> AggregatedPropertyProvider{ >>> (name = dynamicAggregationTests) >>> a = "[a][A]" >>> b = "[b][B]" >>> c = "[c][C]" >>> d = "[D]" >>> e = "[E]" >>> f = "[F]" >>> g = "[g]" >>> h = "[h]" >>> i = "[i]" >>> } >>> >>> Summarizing the PropertyProviders singleton allows to combine >>> providers >>> in various forms: >>> Methods provided on PropertyProviders >>> >>> public final class PropertyProviders { >>> >>> private PropertyProviders() {} >>> >>> public static PropertyProvider fromArgs(String... args) { >>> public static PropertyProvider fromArgs(MetaInfo metaInfo, String... >>> args) { >>> public static PropertyProvider fromPaths(AggregationPolicy >>> aggregationPolicy, String... paths) { >>> public static PropertyProvider fromPaths(String... paths) { >>> public static PropertyProvider fromPaths(List<String> paths) { >>> public static PropertyProvider fromPaths(AggregationPolicy >>> aggregationPolicy, List<String> paths) { >>> public static PropertyProvider fromPaths(MetaInfo metaInfo, >>> List<String> paths) { >>> public static PropertyProvider fromPaths(AggregationPolicy >>> aggregationPolicy, MetaInfo metaInfo, List<String> paths) { >>> public static PropertyProvider fromUris(URI... uris) { >>> public static PropertyProvider fromUris(AggregationPolicy >>> aggregationPolicy, URI... uris) { >>> public static PropertyProvider fromUris(List<URI> uris) { >>> public static PropertyProvider fromUris(AggregationPolicy >>> aggregationPolicy, List<URI> uris) { >>> public static PropertyProvider fromUris(MetaInfo metaInfo, URI... >>> uris) { >>> public static PropertyProvider fromUris(AggregationPolicy >>> aggregationPolicy, MetaInfo metaInfo, URI... uris) { >>> public static PropertyProvider fromUris(MetaInfo metaInfo, List<URI> >>> uris) { >>> public static PropertyProvider fromUris(AggregationPolicy >>> aggregationPolicy, MetaInfo metaInfo, List<URI> uris) { >>> public static PropertyProvider fromMap(Map<String, String> map) { >>> public static PropertyProvider fromMap(MetaInfo metaInfo, >>> Map<String, String> map) { >>> public static PropertyProvider empty() { >>> public static PropertyProvider emptyMutable() { >>> public static PropertyProvider empty(MetaInfo metaInfo) { >>> public static PropertyProvider emptyMutable(MetaInfo metaInfo) { >>> public static PropertyProvider fromEnvironmentProperties() { >>> public static PropertyProvider fromSystemProperties() { >>> public static PropertyProvider freezed(PropertyProvider provider) { >>> public static PropertyProvider aggregate(AggregationPolicy >>> mapping, MetaInfo metaInfo, PropertyProvider... providers){ >>> public static PropertyProvider aggregate(PropertyProvider... >>> providers) { >>> public static PropertyProvider aggregate(List<PropertyProvider> >>> providers) { >>> public static PropertyProvider aggregate(AggregationPolicy >>> mapping, PropertyProvider... propertyMaps) { >>> public static PropertyProvider aggregate(AggregationPolicy >>> mapping, List<PropertyProvider> providers) { >>> public static PropertyProvider mutable(PropertyProvider provider) { >>> public static PropertyProvider intersected(AggregationPolicy >>> aggregationPolicy, PropertyProvider... providers) { >>> public static PropertyProvider intersected(PropertyProvider... >>> providers) { >>> public static PropertyProvider subtracted(PropertyProvider target, >>> PropertyProvider... providers) { >>> public static PropertyProvider filtered(Predicate<String> filter, >>> PropertyProvider provider) { >>> public static PropertyProvider >>> contextual(Supplier<PropertyProvider> mapSupplier, >>> Supplier<String> >>> isolationKeySupplier) { >>> public static PropertyProvider delegating(PropertyProvider >>> mainMap, Map<String, String> parentMap) { >>> public static PropertyProvider replacing(PropertyProvider mainMap, >>> Map<String, String> replacementMap) { >>> } >>> >>> > -- > N Oliver B. Fischer > A Schönhauser Allee 64, 10437 Berlin, Deutschland/Germany > P +49 30 44793251 > M +49 178 7903538 > E [email protected] > S oliver.b.fischer > J [email protected] > X http://xing.to/obf > >
