Adapted to comply with JSR API. Signed-off-by: Anatole Tresch <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/581c92e7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/581c92e7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/581c92e7 Branch: refs/heads/configjsr Commit: 581c92e70777af1fa9ec6a4af0ca8d95b334526b Parents: 06f29e1 Author: Anatole Tresch <[email protected]> Authored: Mon Dec 25 11:41:21 2017 +0100 Committer: Anatole Tresch <[email protected]> Committed: Mon Dec 25 11:41:21 2017 +0100 ---------------------------------------------------------------------- modules/functions/pom.xml | 5 - .../tamaya/functions/CombinedConfiguration.java | 130 ++---- .../functions/ConfigWrappingConfigSource.java | 73 ++++ .../functions/ConfigWrappingPropertySource.java | 84 ---- .../functions/ConfigurationFunctions.java | 415 ++++++------------ .../tamaya/functions/EnrichedConfiguration.java | 138 ++---- .../tamaya/functions/FilteredConfiguration.java | 88 +--- .../tamaya/functions/MappedConfiguration.java | 92 ++-- .../functions/CombinedConfigurationTest.java | 420 ++++++------------- .../functions/ConfigurationFunctionsTest.java | 38 +- .../functions/EnrichedConfigurationTest.java | 355 +++++++--------- .../functions/MappedConfigurationTest.java | 11 +- 12 files changed, 620 insertions(+), 1229 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/pom.xml ---------------------------------------------------------------------- diff --git a/modules/functions/pom.xml b/modules/functions/pom.xml index 839b67e..17de980 100644 --- a/modules/functions/pom.xml +++ b/modules/functions/pom.xml @@ -32,11 +32,6 @@ under the License. <packaging>jar</packaging> <dependencies> - <dependency> - <groupId>org.apache.tamaya</groupId> - <artifactId>tamaya-api</artifactId> - <version>${tamaya-apicore.version}</version> - </dependency> <!-- Test scope only, do not create a code dependency! --> <dependency> <groupId>org.apache.tamaya</groupId> http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java index 2e3f0cc..10961b4 100644 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java @@ -18,19 +18,15 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; - +import javax.config.Config; +import javax.config.spi.ConfigSource; import java.util.*; /** * Combines a set of child configurations to a new one, by overriding the first entries with result from * later instances. */ -class CombinedConfiguration implements Configuration{ +class CombinedConfiguration implements Config{ /** The name of the new configuration. */ private final String name; @@ -38,85 +34,48 @@ class CombinedConfiguration implements Configuration{ * The configuration's in evaluation order. Instances with higher indices * override results with lower ones. */ - private final ArrayList<Configuration> configurations = new ArrayList<>(); + private final ArrayList<Config> configurations = new ArrayList<>(); /** * Creates a combined configuration instance. * @param configName the name of the new config. * @param configs the configurations hereby instances with higher indices override results with lower ones. */ - public CombinedConfiguration(String configName, Configuration... configs) { + public CombinedConfiguration(String configName, Config... configs) { this.name = configName; if (null != configs) { - for (Configuration config : configs) { + for (Config config : configs) { if (config == null) { continue; } - - addConfiguration(config); + configurations.add(config); } } } @Override - public String get(String key) { - String curValue = null; - for(Configuration config: getConfigurations()){ - String value = config.get(key); - if(value!=null){ - curValue = value; + public <T> T getValue(String key, Class<T> type) { + T curValue = null; + for(Config config: configurations){ + Optional<T> value = config.getOptionalValue(key, type); + if(value.isPresent()){ + curValue = value.get(); } } return curValue; } @Override - public String getOrDefault(String key, String defaultValue) { + public <T> Optional<T> getOptionalValue(String key, Class<T> type) { Objects.requireNonNull(key, "Key must be given."); - Objects.requireNonNull(defaultValue, "Value must be given."); - - String val = get(key); - - if (val == null) { - return defaultValue; - } - - return val; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { Objects.requireNonNull(type, "Type must be given."); - Objects.requireNonNull(key, "Key must be given."); - Objects.requireNonNull(defaultValue, "Default value must be given."); - - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T get(String key, Class<T> type) { - T curValue = null; - for(Configuration config: getConfigurations()){ - T value = config.get(key, type); - if(value!=null){ - curValue = value; - } - } - return curValue; - } - @Override - public <T> T get(String key, TypeLiteral<T> type) { - T curValue = null; - for(Configuration config: getConfigurations()){ - T value = config.get(key, type); - if(value!=null){ + Optional<T> curValue = Optional.empty(); + for(Config config: configurations){ + Optional<T> value = config.getOptionalValue(key, type); + if(value!=null && value.isPresent()){ curValue = value; } } @@ -124,45 +83,21 @@ class CombinedConfiguration implements Configuration{ } @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - Objects.requireNonNull(key, "Key must be given."); - Objects.requireNonNull(type, "Type must be given."); - Objects.requireNonNull(defaultValue, "Default value must be given."); - - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public Map<String, String> getProperties() { - Map<String, String> result = new HashMap<>(); - for(Configuration ps : getConfigurations()){ - result.putAll(ps.getProperties()); + public Iterable<String> getPropertyNames() { + Set<String> result = new HashSet<>(); + for(Config ps : configurations){ + ps.getPropertyNames().forEach(result::add); } return result; } @Override - public Configuration with(ConfigOperator operator) { - Objects.requireNonNull(operator, "Operator must be given."); - - return operator.operate(this); - } - - @Override - public <T> T query(ConfigQuery<T> query) { - Objects.requireNonNull(query, "Query must be given."); - - return query.query(this); - } - - @Override - public ConfigurationContext getContext() { - // TODO thjink on combining the participating contexts... - return configurations.get(0).getContext(); + public Iterable<ConfigSource> getConfigSources() { + List<ConfigSource> configSources = new ArrayList<>(); + for(Config ps : configurations){ + ps.getConfigSources().forEach(configSources::add); + } + return configSources; } @Override @@ -173,13 +108,4 @@ class CombinedConfiguration implements Configuration{ '}'; } - protected void addConfiguration(Configuration config) { - configurations.add(config); - } - - protected List<Configuration> getConfigurations() { - return configurations; - } - - } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java new file mode 100644 index 0000000..3461ed4 --- /dev/null +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tamaya.functions; + +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.*; + +/** + * PropertySource that wraps a Configuration instance. + */ +final class ConfigWrappingConfigSource implements ConfigSource { + /** The property source name. */ + private final String name; + /** The ordinal. */ + private final int ordinal; + /** The wrapped config. */ + private final Config config; + + /** + * Constructor. + * @param name the property source name, not null. + * @param ordinal ths ordinal + * @param config the wrapped config, not null. + */ + public ConfigWrappingConfigSource(String name, int ordinal, Config config){ + this.name = Objects.requireNonNull(name); + this.ordinal = ordinal; + this.config = Objects.requireNonNull(config); + } + + public int getOrdinal() { + return ordinal; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue(String key) { + return config.getOptionalValue(key, String.class).orElse(null); + } + + @Override + public Map<String,String> getProperties() { + Map<String,String> result = new HashMap<>(); + config.getPropertyNames().forEach(key -> result.put(key, config.getValue(key, String.class))); + return result; + } + + @Override + public String toString(){ + return "ConfigWrappingPropertySource(name="+name+", ordinal="+ordinal+", config="+config+")"; + } +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java deleted file mode 100644 index dbad205..0000000 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tamaya.functions; - -import org.apache.tamaya.Configuration; -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertyValue; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * PropertySource that wraps a Configuration instance. - */ -final class ConfigWrappingPropertySource implements PropertySource { - /** The property source name. */ - private final String name; - /** The ordinal. */ - private final int ordinal; - /** The wrapped config. */ - private final Configuration config; - - /** - * Constructor. - * @param name the property source name, not null. - * @param ordinal ths ordinal - * @param config the wrapped config, not null. - */ - public ConfigWrappingPropertySource(String name, int ordinal, Configuration config){ - this.name = Objects.requireNonNull(name); - this.ordinal = ordinal; - this.config = Objects.requireNonNull(config); - } - - public int getOrdinal() { - return ordinal; - } - - @Override - public String getName() { - return name; - } - - @Override - public PropertyValue get(String key) { - return PropertyValue.of(key, config.get(key), getName()); - } - - @Override - public Map<String, PropertyValue> getProperties() { - Map<String,PropertyValue> result = new HashMap<>(); - for(Map.Entry<String,String> en:config.getProperties().entrySet()){ - result.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), getName())); - } - return result; - } - - @Override - public boolean isScannable() { - return true; - } - - @Override - public String toString(){ - return "ConfigWrappingPropertySource(name="+name+", ordinal="+ordinal+", config="+config+")"; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java index ccb6396..76581b7 100644 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java @@ -18,26 +18,12 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; -import org.apache.tamaya.spi.ConfigurationContextBuilder; -import org.apache.tamaya.spi.PropertyConverter; -import org.apache.tamaya.spi.PropertyFilter; -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertyValueCombinationPolicy; - +import javax.config.Config; +import javax.config.spi.ConfigSource; import java.net.Inet4Address; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; +import java.util.*; +import java.util.function.Function; +import java.util.function.UnaryOperator; import java.util.logging.Level; import java.util.logging.Logger; @@ -54,56 +40,26 @@ public final class ConfigurationFunctions { /** * Implementation of an empty propertySource. */ - private static final Configuration EMPTY_CONFIGURATION = new Configuration() { - - @Override - public String get(String key) { - return null; - } - - @Override - public String getOrDefault(String key, String defaultValue) { - return defaultValue; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { - return defaultValue; - } + private static final Config EMPTY_CONFIGURATION = new Config() { @Override - public <T> T get(String key, Class<T> type) { + public <T> T getValue(String key, Class<T> type) { return null; } @Override - public <T> T get(String key, TypeLiteral<T> type) { - return null; - } - - @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - return defaultValue; + public <T> Optional<T> getOptionalValue(String key, Class<T> type) { + return Optional.empty(); } @Override - public Map<String, String> getProperties() { - return Collections.emptyMap(); + public Iterable<String> getPropertyNames() { + return Collections.emptySet(); } @Override - public Configuration with(ConfigOperator operator) { - return operator.operate(this); - } - - @Override - public <T> T query(ConfigQuery<T> query) { - return query.query(this); - } - - @Override - public ConfigurationContext getContext() { - return EMPTY_CONFIGURATION_CONTEXT; + public Iterable<ConfigSource> getConfigSources() { + return Collections.emptySet(); } @Override @@ -112,58 +68,6 @@ public final class ConfigurationFunctions { } }; - private static final ConfigurationContext EMPTY_CONFIGURATION_CONTEXT = new ConfigurationContext() { - @Override - public void addPropertySources(PropertySource... propertySourcesToAdd) { - // ignore - } - - @Override - public List<PropertySource> getPropertySources() { - return Collections.emptyList(); - } - - @Override - public PropertySource getPropertySource(String name) { - return null; - } - - @Override - public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) { - // ignore - } - - @Override - public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() { - return Collections.emptyMap(); - } - - @Override - public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) { - return Collections.emptyList(); - } - - @Override - public List<PropertyFilter> getPropertyFilters() { - return Collections.emptyList(); - } - - @Override - public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() { - return PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR; - } - - @Override - public ConfigurationContextBuilder toBuilder() { - throw new UnsupportedOperationException("Cannot build from ConfigurationContext.EMPTY."); - } - - @Override - public String toString(){ - return "ConfigurationContext.EMPTY"; - } - }; - /** * Private singleton constructor. */ @@ -177,13 +81,8 @@ public final class ConfigurationFunctions { * @param filter the filter, not null * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator filter(final PropertyMatcher filter) { - return new ConfigOperator() { - @Override - public Configuration operate(Configuration config) { - return new FilteredConfiguration(config, filter, "FilterClass: " + filter.getClass().getName()); - } - }; + public static UnaryOperator<Config> filter(final PropertyMatcher filter) { + return config -> new FilteredConfiguration(config, filter, "FilterClass: " + filter.getClass().getName()); } /** @@ -193,13 +92,8 @@ public final class ConfigurationFunctions { * @param keyMapper the keyMapper, not null * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator map(final KeyMapper keyMapper) { - return new ConfigOperator() { - @Override - public Configuration operate(Configuration config) { - return new MappedConfiguration(config, keyMapper, null); - } - }; + public static UnaryOperator<Config> map(final KeyMapper keyMapper) { + return config -> new MappedConfiguration(config, keyMapper, null); } /** @@ -210,7 +104,7 @@ public final class ConfigurationFunctions { * @param areaKey the section key, not null * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator section(String areaKey) { + public static UnaryOperator<Config> section(String areaKey) { return section(areaKey, false); } @@ -222,30 +116,24 @@ public final class ConfigurationFunctions { * @param stripKeys if set to true, the section key is stripped away fromMap the resulting key. * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator section(final String areaKey, final boolean stripKeys) { - return new ConfigOperator() { - @Override - public Configuration operate(Configuration config) { - Configuration filtered = new FilteredConfiguration(config, - new PropertyMatcher() { - @Override - public boolean test(String k, String v) { - return isKeyInSection(k, areaKey); - } - }, "section: " + areaKey); + public static UnaryOperator<Config> section(final String areaKey, final boolean stripKeys) { + return config -> { + Config filtered = new FilteredConfiguration( + config, + (k, v) -> isKeyInSection(k, areaKey), + "section: " + areaKey); if (stripKeys) { - return new MappedConfiguration(filtered, new KeyMapper(){ - @Override - public String mapKey(String key) { - if(key.startsWith(areaKey)) { - return key.substring(areaKey.length()); - } - return areaKey + key; - } - }, "stripped"); + return new MappedConfiguration( + filtered, + key -> { + if(key.startsWith(areaKey)) { + return key.substring(areaKey.length()); + } + return areaKey + key; + }, + "stripped"); } return filtered; - } }; } @@ -283,19 +171,16 @@ public final class ConfigurationFunctions { * * @return s set with all sections, never {@code null}. */ - public static ConfigQuery<Set<String>> sections() { - return new ConfigQuery<Set<String>>() { - @Override - public Set<String> query(Configuration config) { + public static Function<Config,Set<String>> sections() { + return config -> { final Set<String> areas = new TreeSet<>(); - for (String s : config.getProperties().keySet()) { + for (String s : config.getPropertyNames()) { int index = s.lastIndexOf('.'); if (index > 0) { areas.add(s.substring(0, index)); } } return areas; - } }; } @@ -307,12 +192,10 @@ public final class ConfigurationFunctions { * * @return s set with all transitive sections, never {@code null}. */ - public static ConfigQuery<Set<String>> transitiveSections() { - return new ConfigQuery<Set<String>>() { - @Override - public Set<String> query(Configuration config) { + public static Function<Config,Set<String>> transitiveSections() { + return config -> { final Set<String> transitiveAreas = new TreeSet<>(); - for (String s : config.query(sections())) { + for (String s : sections().apply(config)) { transitiveAreas.add(s); int index = s.lastIndexOf('.'); while (index > 0) { @@ -322,7 +205,6 @@ public final class ConfigurationFunctions { } } return transitiveAreas; - } }; } @@ -335,20 +217,16 @@ public final class ConfigurationFunctions { * @param predicate A predicate to deternine, which sections should be returned, not {@code null}. * @return s set with all sections, never {@code null}. */ - public static ConfigQuery<Set<String>> sections(final Predicate<String> predicate) { - return new ConfigQuery<Set<String>>() { - @Override - public Set<String> query(Configuration config) { + public static Function<Config,Set<String>> sections(final Predicate<String> predicate) { + return config -> { Set<String> result = new TreeSet<>(); - for (String s : sections().query(config)) { + for (String s : sections().apply(config)) { if (predicate.test(s)) { result.add(s); } } return result; - } }; - } /** @@ -360,18 +238,15 @@ public final class ConfigurationFunctions { * @param predicate A predicate to deternine, which sections should be returned, not {@code null}. * @return s set with all transitive sections, never {@code null}. */ - public static ConfigQuery<Set<String>> transitiveSections(final Predicate<String> predicate) { - return new ConfigQuery<Set<String>>() { - @Override - public Set<String> query(Configuration config) { + public static Function<Config,Set<String>> transitiveSections(final Predicate<String> predicate) { + return config -> { Set<String> result = new TreeSet<>(); - for (String s : transitiveSections().query(config)) { + for (String s : transitiveSections().apply(config)) { if (predicate.test(s)) { result.add(s); } } return result; - } }; } @@ -382,7 +257,7 @@ public final class ConfigurationFunctions { * @param sectionKeys the section keys, not null * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator sectionsRecursive(String... sectionKeys) { + public static UnaryOperator<Config> sectionsRecursive(String... sectionKeys) { return sectionRecursive(false, sectionKeys); } @@ -395,20 +270,20 @@ public final class ConfigurationFunctions { * by entries of the later instances. * @return the resulting configuration instance. */ - public static Configuration combine(String configName, Configuration... configs) { + public static Config combine(String configName, Config... configs) { return new CombinedConfiguration(configName, configs); } /** - * Creates a {@link PropertySource}, based on the given {@link Configuration}. The keys and propertx map + * Creates a {@link ConfigSource}, based on the given {@link Config}. The keys and propertx map * are dynamically calculated, so the returned PropertySource is a real dynamic wrapper. * @param name the name of the property source, not null. * @param ordinal ordinal of the property source. * @param config the config to be mapped, not null. * @return a property source wrapping the configuration. */ - public static PropertySource propertySourceFrom(final String name, final int ordinal, final Configuration config){ - return new ConfigWrappingPropertySource(name, ordinal, config); + public static ConfigSource propertySourceFrom(final String name, final int ordinal, final Config config){ + return new ConfigWrappingConfigSource(name, ordinal, config); } /** @@ -419,26 +294,19 @@ public final class ConfigurationFunctions { * @param stripKeys if set to true, the section key is stripped away fromMap the resulting key. * @return the section configuration, with the areaKey stripped away. */ - public static ConfigOperator sectionRecursive(final boolean stripKeys, final String... sectionKeys) { - return new ConfigOperator() { - @Override - public Configuration operate(Configuration config) { - Configuration filtered = new FilteredConfiguration(config, new PropertyMatcher() { - @Override - public boolean test(final String k, String v) { - return isKeyInSections(k, sectionKeys); - } - }, "sections: " + Arrays.toString(sectionKeys)); - if (stripKeys) { - return new MappedConfiguration(filtered, new KeyMapper() { - @Override - public String mapKey(String key) { - return PropertySourceFunctions.stripSectionKeys(key, sectionKeys); - } - }, "stripped"); - } - return filtered; + public static UnaryOperator<Config> sectionRecursive(final boolean stripKeys, final String... sectionKeys) { + return (config) -> { + Config filtered = new FilteredConfiguration( + config, + (k,v) -> isKeyInSections(k, sectionKeys), + "sections: " + Arrays.toString(sectionKeys)); + if (stripKeys) { + return new MappedConfiguration( + filtered, + k -> PropertySourceFunctions.stripSectionKeys(k, sectionKeys), + "stripped"); } + return filtered; }; } @@ -447,7 +315,7 @@ public final class ConfigurationFunctions { * * @return the given query. */ - public static ConfigQuery<String> jsonInfo() { + public static Function<Config,String> jsonInfo() { return jsonInfo(null); } @@ -458,29 +326,27 @@ public final class ConfigurationFunctions { * parameters. * @return the given query. */ - public static ConfigQuery<String> jsonInfo(final Map<String, String> info) { - return new ConfigQuery<String>() { - @Override - public String query(Configuration config) { - Map<String, String> props = new TreeMap<>(config.getProperties()); - props.put("__timestamp", String.valueOf(System.currentTimeMillis())); - if(info!=null) { - for (Map.Entry<String, String> en : info.entrySet()) { - props.put("__" + escape(en.getKey()), escape(en.getValue())); - } + public static Function<Config,String> jsonInfo(final Map<String, String> info) { + return config -> { + Map<String, String> props = new TreeMap<>(); + config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class))); + props.put("__timestamp", String.valueOf(System.currentTimeMillis())); + if(info!=null) { + for (Map.Entry<String, String> en : info.entrySet()) { + props.put("__" + escape(en.getKey()), escape(en.getValue())); } - StringBuilder builder = new StringBuilder(400).append("{\n"); - for (Map.Entry<String, String> en : props.entrySet()) { - builder.append(" \"").append(escape(en.getKey())).append("\": \"" ) - .append(escape(en.getValue())).append("\",\n"); - } - if(builder.toString().endsWith(",\n")){ - builder.setLength(builder.length()-2); - builder.append('\n'); - } - builder.append("}\n"); - return builder.toString(); } + StringBuilder builder = new StringBuilder(400).append("{\n"); + for (Map.Entry<String, String> en : props.entrySet()) { + builder.append(" \"").append(escape(en.getKey())).append("\": \"" ) + .append(escape(en.getValue())).append("\",\n"); + } + if(builder.toString().endsWith(",\n")){ + builder.setLength(builder.length()-2); + builder.append('\n'); + } + builder.append("}\n"); + return builder.toString(); }; } @@ -489,7 +355,7 @@ public final class ConfigurationFunctions { * * @return the given query. */ - public static ConfigQuery<String> xmlInfo() { + public static Function<Config,String> xmlInfo() { return xmlInfo(null); } @@ -500,25 +366,23 @@ public final class ConfigurationFunctions { * parameters. * @return the given query. */ - public static ConfigQuery<String> xmlInfo(final Map<String, String> info) { - return new ConfigQuery<String>() { - @Override - public String query(Configuration config) { - Map<String, String> props = new TreeMap<>(config.getProperties()); - props.put("__timestamp", String.valueOf(System.currentTimeMillis())); - if(info!=null) { - for (Map.Entry<String, String> en : info.entrySet()) { - props.put("__" + escape(en.getKey()), escape(en.getValue())); - } - } - StringBuilder builder = new StringBuilder(400); - builder.append("<configuration>\n"); - for (Map.Entry<String, String> en : props.entrySet()) { - builder.append(" <entry key=\"" + escape(en.getKey()) + "\">" + escape(en.getValue()) + "</entry>\n"); + public static Function<Config,String> xmlInfo(final Map<String, String> info) { + return config -> { + Map<String, String> props = new TreeMap<>(); + config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class))); + props.put("__timestamp", String.valueOf(System.currentTimeMillis())); + if(info!=null) { + for (Map.Entry<String, String> en : info.entrySet()) { + props.put("__" + escape(en.getKey()), escape(en.getValue())); } - builder.append("</configuration>\n"); - return builder.toString(); } + StringBuilder builder = new StringBuilder(400); + builder.append("<configuration>\n"); + for (Map.Entry<String, String> en : props.entrySet()) { + builder.append(" <entry key=\"" + escape(en.getKey()) + "\">" + escape(en.getValue()) + "</entry>\n"); + } + builder.append("</configuration>\n"); + return builder.toString(); }; } @@ -527,7 +391,7 @@ public final class ConfigurationFunctions { * * @return the given query. */ - public static ConfigQuery<String> textInfo() { + public static Function<Config,String> textInfo() { return textInfo(null); } @@ -536,27 +400,25 @@ public final class ConfigurationFunctions { * @param info configuration values to use for filtering. * @return the given query. */ - public static ConfigQuery<String> textInfo(final Map<String, String> info) { - return new ConfigQuery<String>() { - @Override - public String query(Configuration config) { - Map<String, String> props = new TreeMap<>(config.getProperties()); - props.put("__timestamp", String.valueOf(System.currentTimeMillis())); - if(info!=null) { - for (Map.Entry<String, String> en : info.entrySet()) { - props.put("__" + escape(en.getKey()), escape(en.getValue())); - } + public static Function<Config,String> textInfo(final Map<String, String> info) { + return config -> { + Map<String, String> props = new TreeMap<>(); + config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class))); + props.put("__timestamp", String.valueOf(System.currentTimeMillis())); + if(info!=null) { + for (Map.Entry<String, String> en : info.entrySet()) { + props.put("__" + escape(en.getKey()), escape(en.getValue())); } - StringBuilder builder = new StringBuilder(400).append("Configuration:\n"); - for (Map.Entry<String, String> en : props.entrySet()) { - builder.append(" " + escape(en.getKey()) + ": " + escape(en.getValue()).replace("\n", "\n ") + ",\n"); - } - if(builder.toString().endsWith(",\n")){ - builder.setLength(builder.length() - 2); - } - builder.append("\n"); - return builder.toString(); } + StringBuilder builder = new StringBuilder(400).append("Configuration:\n"); + for (Map.Entry<String, String> en : props.entrySet()) { + builder.append(" " + escape(en.getKey()) + ": " + escape(en.getValue()).replace("\n", "\n ") + ",\n"); + } + if(builder.toString().endsWith(",\n")){ + builder.setLength(builder.length() - 2); + } + builder.append("\n"); + return builder.toString(); }; } @@ -566,13 +428,8 @@ public final class ConfigurationFunctions { * @param override if true, all items existing are overridden by the new ones passed. * @return the ConfigOperator, never null. */ - public static ConfigOperator addItems(final Map<String,Object> items, final boolean override){ - return new ConfigOperator() { - @Override - public Configuration operate(Configuration config) { - return new EnrichedConfiguration(config,items, override); - } - }; + public static UnaryOperator<Config> addItems(final Map<String,Object> items, final boolean override){ + return config -> new EnrichedConfiguration(config,items, override); } /** @@ -580,7 +437,7 @@ public final class ConfigurationFunctions { * @param items the items, not null. * @return the operator, never null. */ - public static ConfigOperator addItems(Map<String,Object> items){ + public static UnaryOperator<Config> addItems(Map<String,Object> items){ return addItems(items, false); } @@ -589,7 +446,7 @@ public final class ConfigurationFunctions { * @param items the items. * @return the operator for replacing the items. */ - public static ConfigOperator replaceItems(Map<String,Object> items){ + public static UnaryOperator<Config> replaceItems(Map<String,Object> items){ return addItems(items, true); } @@ -598,7 +455,7 @@ public final class ConfigurationFunctions { * * @return the given query. */ - public static ConfigQuery<String> htmlInfo() { + public static Function<Config,String> htmlInfo() { return htmlInfo(null); } @@ -607,16 +464,13 @@ public final class ConfigurationFunctions { * @param info configuration values to use for filtering. * @return the given query. */ - public static ConfigQuery<String> htmlInfo(final Map<String, String> info) { - return new ConfigQuery<String>() { - @Override - public String query(Configuration config) { - StringBuilder builder = new StringBuilder(); - addHeader(builder); - builder.append("<pre>\n").append(textInfo(info).query(config)).append("</pre>\n"); - addFooter(builder); - return builder.toString(); - } + public static Function<Config,String> htmlInfo(final Map<String, String> info) { + return config -> { + StringBuilder builder = new StringBuilder(); + addHeader(builder); + builder.append("<pre>\n").append(textInfo(info).apply(config)).append("</pre>\n"); + addFooter(builder); + return builder.toString(); }; } @@ -649,19 +503,12 @@ public final class ConfigurationFunctions { } /** - * Accesses an empty {@link Configuration}. - * @return an empty {@link Configuration}, never null. + * Accesses an empty {@link Config}. + * @return an empty {@link Config}, never null. */ - public static Configuration emptyConfiguration(){ + public static Config emptyConfig(){ return EMPTY_CONFIGURATION; } - /** - * Accesses an empty {@link ConfigurationContext}. - * @return an empty {@link ConfigurationContext}, never null. - */ - public static ConfigurationContext emptyConfigurationContext(){ - return EMPTY_CONFIGURATION_CONTEXT; - } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java index a223a45..0a9c549 100644 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java @@ -18,22 +18,16 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.*; /** * Configuration, that has values added or overridden. */ -class EnrichedConfiguration implements Configuration { +class EnrichedConfiguration implements Config { - private final Configuration baseConfiguration; + private final Config baseConfiguration; private final Map<String, Object> addedProperties = new HashMap<>(); @@ -46,127 +40,59 @@ class EnrichedConfiguration implements Configuration { * @param properties the properties to be added, not null. * @param overriding true, if existing keys should be overriden, or config should be extended only. */ - EnrichedConfiguration(Configuration configuration, Map<String, Object> properties, boolean overriding) { + EnrichedConfiguration(Config configuration, Map<String, Object> properties, boolean overriding) { this.baseConfiguration = Objects.requireNonNull(configuration); this.addedProperties.putAll(properties); this.overriding = overriding; } @Override - public String get(String key) { - Objects.requireNonNull(key, "Key must be given."); - - if (overriding) { - Object val = addedProperties.get(key); - if (val != null) { - return val.toString(); - } - return baseConfiguration.get(key); - } - String val = baseConfiguration.get(key); - if (val != null) { - return val; - } - Object val2 = addedProperties.get(key); - if (val2 != null) { - return val2.toString(); - } - return null; + public <T> T getValue(String key, Class<T> type) { + return getOptionalValue(key, type).orElse(null); } @Override - public String getOrDefault(String key, String defaultValue) { + public <T> Optional<T> getOptionalValue(String key, Class<T> type) { Objects.requireNonNull(key, "Key must be given."); - Objects.requireNonNull(defaultValue, "Default value must be given."); - - String val = get(key); - if (val == null) { - return defaultValue; - } - return val; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { - Objects.requireNonNull(key, "Key not given."); - Objects.requireNonNull(type, "Class not given."); - Objects.requireNonNull(defaultValue, "Default value not given."); - - T val = get(key, type); - if (val == null) { - return defaultValue; - } - return val; - } - - @Override - public <T> T get(String key, Class<T> type) { - return (T) get(key, TypeLiteral.of(type)); - } - - @Override - public <T> T get(String key, TypeLiteral<T> type) { + Objects.requireNonNull(type, "Type must be given."); if (overriding) { Object val = addedProperties.get(key); - if (val != null && type.getRawType().isAssignableFrom(val.getClass())) { - return (T) val; + if (val != null){ + if(type.isAssignableFrom(type)){ + return Optional.of((T)val); + }else if(type == String.class) { + return Optional.of((T)val.toString()); + } + return baseConfiguration.getOptionalValue(key, type); } - return baseConfiguration.get(key, type); } - T val = baseConfiguration.get(key, type); - if (val != null) { + Optional<T> val = baseConfiguration.getOptionalValue(key, type); + if (val !=null && val.isPresent()) { return val; } Object val2 = addedProperties.get(key); - if (val2 != null && type.getRawType().isAssignableFrom(val2.getClass())) { - return (T) val2; - } - return null; - } - - @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - Objects.requireNonNull(key, "Key not given."); - Objects.requireNonNull(type, "Type not given."); - Objects.requireNonNull(defaultValue, "Default value not given."); - - T val = get(key, type); - if (val == null) { - return defaultValue; - } - return val; - } - - @Override - public Map<String, String> getProperties() { - Map<String, String> allProps = new HashMap<>(); - if (overriding) { - allProps.putAll(baseConfiguration.getProperties()); - for (Map.Entry<String, Object> en : addedProperties.entrySet()) { - allProps.put(en.getKey(), en.getValue().toString()); - } - } else { - for (Map.Entry<String, Object> en : addedProperties.entrySet()) { - allProps.put(en.getKey(), en.getValue().toString()); + if (val2 != null){ + if(type.isAssignableFrom(val2.getClass())) { + return Optional.of((T) val2); + }else if(type == String.class) { + return Optional.of((T)val2.toString()); } - allProps.putAll(baseConfiguration.getProperties()); } - return allProps; + return Optional.empty(); } - @Override - public Configuration with(ConfigOperator operator) { - return operator.operate(this); - } @Override - public <T> T query(ConfigQuery<T> query) { - return query.query(this); + public Iterable<String> getPropertyNames() { + Set<String> allKeys = new HashSet<>(); + baseConfiguration.getPropertyNames().forEach(allKeys::add); + addedProperties.keySet().forEach(allKeys::add); + return allKeys; } @Override - public ConfigurationContext getContext() { - return baseConfiguration.getContext(); + public Iterable<ConfigSource> getConfigSources() { + return baseConfiguration.getConfigSources(); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java index e8acaaa..b61c730 100644 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java @@ -18,101 +18,57 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.*; /** * Configuration that filters part of the entries defined by a matcher predicate. */ -class FilteredConfiguration implements Configuration { +class FilteredConfiguration implements Config { - private final Configuration baseConfiguration; + private final Config baseConfiguration; private final PropertyMatcher matcher; private final String filterType; - FilteredConfiguration(Configuration baseConfiguration, PropertyMatcher matcher, String filterType) { + FilteredConfiguration(Config baseConfiguration, PropertyMatcher matcher, String filterType) { this.baseConfiguration = Objects.requireNonNull(baseConfiguration); this.matcher = Objects.requireNonNull(matcher); this.filterType = filterType!=null?filterType:this.matcher.toString(); } @Override - public String get(String key) { - return get(key, String.class); - } - - @Override - public String getOrDefault(String key, String defaultValue) { - String val = get(key); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T get(String key, Class<T> type) { - return (T)get(key, TypeLiteral.of(type)); - } - - @Override - public <T> T get(String key, TypeLiteral<T> type) { - String value = baseConfiguration.get(key); - if (matcher.test(key, value)) { - return baseConfiguration.get(key, type); + public <T> T getValue(String key, Class<T> type) { + String stringValue = baseConfiguration.getValue(key, String.class); + if (matcher.test(key, stringValue)) { + return baseConfiguration.getValue(key, type); } return null; } @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; + public <T> Optional<T> getOptionalValue(String key, Class<T> type) { + Optional<String> value = baseConfiguration.getOptionalValue(key, String.class); + if(value.isPresent() && matcher.test(key, value.get())) { + return baseConfiguration.getOptionalValue(key, type); } - return val; + return Optional.empty(); } @Override - public Map<String, String> getProperties() { - Map<String, String> result = new HashMap<>(); - for(Map.Entry<String,String> en:baseConfiguration.getProperties().entrySet()){ - if(matcher.test(en.getKey(), en.getValue())){ - result.put(en.getKey(), en.getValue()); + public Iterable<String> getPropertyNames() { + Set<String> result = new HashSet<>(); + for(String name:baseConfiguration.getPropertyNames()){ + if(matcher.test(name, null)){ + result.add(name); } } return result; } @Override - public Configuration with(ConfigOperator operator) { - return null; - } - - @Override - public <T> T query(ConfigQuery<T> query) { - return query.query(this); - } - - @Override - public ConfigurationContext getContext() { - return baseConfiguration.getContext(); + public Iterable<ConfigSource> getConfigSources() { + return this.baseConfiguration.getConfigSources(); } @Override http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java index dd2547f..ec48b2f 100644 --- a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java +++ b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java @@ -18,110 +18,66 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.*; import java.util.logging.Logger; /** * Configuration that filters part of the entries defined by a filter predicate. */ -class MappedConfiguration implements Configuration { +class MappedConfiguration implements Config { private static final Logger LOG = Logger.getLogger(MappedConfiguration.class.getName()); - private final Configuration baseConfiguration; + private final Config baseConfiguration; private final KeyMapper keyMapper; private final String mapType; - MappedConfiguration(Configuration baseConfiguration, KeyMapper keyMapper, String mapType) { + MappedConfiguration(Config baseConfiguration, KeyMapper keyMapper, String mapType) { this.baseConfiguration = Objects.requireNonNull(baseConfiguration); this.keyMapper = Objects.requireNonNull(keyMapper); this.mapType = mapType!=null?mapType:this.keyMapper.toString(); } @Override - public String get(String key) { - return get(key, String.class); - } - - @Override - public String getOrDefault(String key, String defaultValue) { - Objects.requireNonNull(key, "Key must be given"); - Objects.requireNonNull(defaultValue, "DefaultValue must be given."); - String val = get(key); - - if(val==null){ - return defaultValue; - } - return val; - } - - @Override - public <T> T getOrDefault(String key, Class<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; + public <T> T getValue(String key, Class<T> type) { + String targetKey = keyMapper.mapKey(key); + if (targetKey != null) { + return baseConfiguration.getValue(targetKey, type); } - return val; - } + LOG.finest("Configuration property hidden by KeyMapper, key="+key+", mapper="+keyMapper+", config="+this); + return null; - @Override - public <T> T get(String key, Class<T> type) { - return (T)get(key, TypeLiteral.of(type)); } @Override - public <T> T get(String key, TypeLiteral<T> type) { + public <T> Optional<T> getOptionalValue(String key, Class<T> type) { String targetKey = keyMapper.mapKey(key); if (targetKey != null) { - return baseConfiguration.get(targetKey, type); + return baseConfiguration.getOptionalValue(targetKey, type); } LOG.finest("Configuration property hidden by KeyMapper, key="+key+", mapper="+keyMapper+", config="+this); - return null; + return Optional.empty(); } - @Override - public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) { - T val = get(key, type); - if(val==null){ - return defaultValue; - } - return val; - } @Override - public Map<String, String> getProperties() { - Map<String, String> baseProps = baseConfiguration.getProperties(); - Map<String, String> props = new HashMap<>(baseProps.size()); - for(Map.Entry<String,String> en:baseProps.entrySet()){ - String targetKey = keyMapper.mapKey(en.getKey()); + public Iterable<String> getPropertyNames() { + Iterable<String> propertyNames = baseConfiguration.getPropertyNames(); + Set<String> result = new HashSet<>(); + for(String key:propertyNames){ + String targetKey = keyMapper.mapKey(key); if (targetKey != null) { - props.put(targetKey, en.getValue()); + result.add(targetKey); } } - return props; - } - - @Override - public Configuration with(ConfigOperator operator) { - return operator.operate(this); - } - - @Override - public <T> T query(ConfigQuery<T> query) { - return query.query(this); + return result; } @Override - public ConfigurationContext getContext() { - return baseConfiguration.getContext(); + public Iterable<ConfigSource> getConfigSources() { + return baseConfiguration.getConfigSources(); } @Override http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java ---------------------------------------------------------------------- diff --git a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java index 16cabeb..bb27ccd 100644 --- a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java +++ b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java @@ -18,21 +18,15 @@ */ package org.apache.tamaya.functions; -import org.apache.tamaya.ConfigOperator; -import org.apache.tamaya.ConfigQuery; -import org.apache.tamaya.Configuration; -import org.apache.tamaya.TypeLiteral; -import org.apache.tamaya.spi.ConfigurationContext; +import org.apache.tamaya.base.DefaultConfigBuilder; +import org.apache.tamaya.base.configsource.SimpleConfigSource; import org.apache.tamaya.spisupport.DefaultConfiguration; -import org.apache.tamaya.core.internal.CoreConfigurationBuilder; -import org.apache.tamaya.spisupport.propertysource.SimplePropertySource; import org.assertj.core.api.ThrowableAssert; import org.junit.Test; import org.mockito.Mockito; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import javax.config.Config; +import java.util.*; import static java.util.Arrays.asList; import static java.util.Collections.singletonMap; @@ -40,53 +34,43 @@ import static org.apache.tamaya.functions.MethodNotMockedAnswer.NOT_MOCKED_ANSWE import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.within; +import static org.junit.Assert.*; import static org.mockito.Mockito.*; public class CombinedConfigurationTest { - private Configuration configWithA1; - private Configuration configWithA2; - private Configuration configWithB; - private Configuration configWithC; - private Configuration configWithoutEntries; + private Config configWithA1; + private Config configWithA2; + private Config configWithB; + private Config configWithC; + private Config configWithoutEntries; { - SimplePropertySource sourceWithKeyA1 = new SimplePropertySource("A", singletonMap("a", "a1")); - SimplePropertySource sourceWithKeyA2 = new SimplePropertySource("A", singletonMap("a", "a2")); - SimplePropertySource sourceWithKeyB = new SimplePropertySource("B", singletonMap("b", "b")); - SimplePropertySource sourceWithKeyC = new SimplePropertySource("C", singletonMap("c", "c")); - SimplePropertySource sourceWithoutKeys = new SimplePropertySource("NONE", Collections.<String, String>emptyMap()); - - Configuration ccWithA1 = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyA1) - .build(); - Configuration ccWithA2 = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyA2) - .build(); - Configuration ccWithB = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyB) - .build(); - Configuration ccWithC = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyC) - .build(); - Configuration ccWithoutEntries = new CoreConfigurationBuilder().addPropertySources(sourceWithoutKeys) - .build(); - - configWithA1 = new DefaultConfiguration(ccWithA1.getContext()); - configWithA2 = new DefaultConfiguration(ccWithA2.getContext()); - configWithB = new DefaultConfiguration(ccWithB.getContext()); - configWithC = new DefaultConfiguration(ccWithC.getContext()); - configWithoutEntries = new DefaultConfiguration(ccWithoutEntries.getContext()); + SimpleConfigSource sourceWithKeyA1 = new SimpleConfigSource("A", singletonMap("a", "a1")); + SimpleConfigSource sourceWithKeyA2 = new SimpleConfigSource("A", singletonMap("a", "a2")); + SimpleConfigSource sourceWithKeyB = new SimpleConfigSource("B", singletonMap("b", "b")); + SimpleConfigSource sourceWithKeyC = new SimpleConfigSource("C", singletonMap("c", "c")); + SimpleConfigSource sourceWithoutKeys = new SimpleConfigSource("NONE", Collections.<String, String>emptyMap()); + + configWithA1 = new DefaultConfigBuilder().withSources(sourceWithKeyA1).build(); + configWithA2 = new DefaultConfigBuilder().withSources(sourceWithKeyA2).build(); + configWithB = new DefaultConfigBuilder().withSources(sourceWithKeyB).build(); + configWithC = new DefaultConfigBuilder().withSources(sourceWithKeyC).build(); + configWithoutEntries = new DefaultConfigBuilder().withSources(sourceWithoutKeys).build(); } @Test public void createCombinedConfigurationWithNullAsSingleConfiguration() { CombinedConfiguration cc = new CombinedConfiguration("abc", null); - assertThat(cc.get("nil")).isNull(); + assertThat(cc.getValue("nil", String.class)).isNull(); } @Test public void createCombinedConfigurationWithNullNullAsSingleConfiguration() { CombinedConfiguration cc = new CombinedConfiguration("abc", null, null); - assertThat(cc.get("nil")).isNull(); + assertThat(cc.getValue("nil", String.class)).isNull(); } @Test @@ -94,21 +78,21 @@ public class CombinedConfigurationTest { CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithC); - assertThat(cc.get("key")).isNull(); + assertThat(cc.getValue("key", String.class)).isNull(); } @Test public void requestedEntryIsInTheFirstAndThridConfiguration() { CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithA2); - assertThat(cc.get("a")).isEqualTo("a2"); + assertThat(cc.getValue("a", String.class)).isEqualTo("a2"); } @Test public void requestedEntryIsOnlyInOneConfiguration() { CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithC); - assertThat(cc.get("b")).isEqualTo("b"); + assertThat(cc.getValue("b", String.class)).isEqualTo("b"); } /* @@ -116,49 +100,25 @@ public class CombinedConfigurationTest { */ @Test - public void getOrDefaultWithSignatureStringStringThrowsNPEIfKeyIsNull() { + public void getOptionalValueWithSignatureStringStringThrowsNPEIfKeyIsNull() { final CombinedConfiguration cc = mock(CombinedConfiguration.class, CALLS_REAL_METHODS); assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { @Override public void call() throws Throwable { - cc.getOrDefault(null, "d"); + cc.getOptionalValue(null, String.class).orElse("d"); } }).isInstanceOf(NullPointerException.class) .hasMessage("Key must be given."); } @Test - public void getOrDefaultWithSignatureStringStringThrowsNPEIfValueIsNull() { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, CALLS_REAL_METHODS); - - assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { - @Override - public void call() throws Throwable { - cc.getOrDefault("key", (String)null); - } - }).isInstanceOf(NullPointerException.class) - .hasMessage("Value must be given."); - } - - @Test - public void getOrDefaultWithSignatureStringStringReturnsDefaultIfKeyIsUnknown() { - CombinedConfiguration cc = mock(CombinedConfiguration.class); - doReturn(null).when(cc).get("a"); - doCallRealMethod().when(cc).getOrDefault(anyString(), anyString()); - - String result = cc.getOrDefault("a", "tzui"); + public void getOptionalValueWithSignatureStringStringReturnsFoundValueIfKeyIsKnown() { + Config cfg = mock(Config.class); + doReturn(Optional.of("b")).when(cfg).getOptionalValue("a", String.class); - assertThat(result).isEqualTo("tzui"); - } - - @Test - public void getOrDefaultWithSignatureStringStringReturnsFoundValueIfKeyIsKnown() { - CombinedConfiguration cc = mock(CombinedConfiguration.class); - doReturn("b").when(cc).get(Mockito.eq("a")); - doCallRealMethod().when(cc).getOrDefault(anyString(), anyString()); - - String result = cc.getOrDefault("a", "z"); + String result = new CombinedConfiguration("test", cfg) + .getOptionalValue("a", String.class).get(); assertThat(result).isEqualTo("b"); } @@ -168,15 +128,15 @@ public class CombinedConfigurationTest { */ @Test - public void getOrDefaultStringTypeLiteralTThrowsNPEIfKeyIsNull() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class); - doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)), - Mockito.any(Integer.class)); + public void getOptionalValueStringTypeTThrowsNPEIfKeyIsNull() throws Exception { + final Config cfg = mock(Config.class); + doReturn(Optional.of(Integer.valueOf(67))).when(cfg).getOptionalValue("a", Integer.class); assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { @Override public void call() throws Throwable { - cc.getOrDefault(null, TypeLiteral.of(Integer.class), 1); + new CombinedConfiguration("test", cfg) + .getOptionalValue(null, Integer.class).orElse(1); } }).isInstanceOf(NullPointerException.class) .hasMessage("Key must be given."); @@ -184,59 +144,40 @@ public class CombinedConfigurationTest { } @Test - public void getOrDefaultStringTypeLiteralTThrowsNPEIfTypeIsNull() throws Exception { + public void getOptionalValueStringTypeThrowsNPEIfTypeIsNull() throws Exception { final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).getOrDefault(anyString(), eq((TypeLiteral<Integer>)null), - Mockito.any(Integer.class)); + doCallRealMethod().when(cc).getOptionalValue(eq("a"), any(Class.class)); assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { @Override public void call() throws Throwable { - cc.<Integer>getOrDefault("a", (TypeLiteral<Integer>)null, 1); + cc.<Integer>getOptionalValue("a", (Class)null); } }).isInstanceOf(NullPointerException.class) .hasMessage("Type must be given."); } @Test - public void getOrDefaultStringTypeLiteralTThrowsNPEIfDefaultValueIsNull() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)), - Mockito.any(Integer.class)); - - assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { - @Override - public void call() throws Throwable { - cc.getOrDefault("a", TypeLiteral.of(Integer.class), null); - } - }).isInstanceOf(NullPointerException.class) - .hasMessage("Default value must be given."); - } - - @Test - public void getOrDefaultStringTypeLiteralTReturnsDefaultValueIfKeyIsUnknown() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doReturn(null).when(cc).get(eq("a"), eq(TypeLiteral.<Integer>of(Integer.class))); - doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)), - Mockito.any(Integer.class)); - - TypeLiteral<Integer> typeLiteral = TypeLiteral.of(Integer.class); - Integer result = cc.<Integer>getOrDefault("a", typeLiteral, 789); - - assertThat(result).isEqualTo(789); + public void getOptionalValueStringTypeTReturnsEmptyOptionalIfKeyIsUnknown() throws Exception { + final Config cfg = mock(Config.class); + doReturn(null).when(cfg).getOptionalValue(any(), any(Class.class)); + Optional<Integer> val = new CombinedConfiguration("test", cfg) + .getOptionalValue("b", Integer.class); + assertNotNull(val); + assertFalse(val.isPresent()); } @Test - public void getOrDefaultStringTypeLiteralTReturnsFoundValueIfKeyIsKnown() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doReturn(999).when(cc).get(eq("a"), eq(TypeLiteral.<Integer>of(Integer.class))); - doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)), - Mockito.anyInt()); - - Integer result = cc.<Integer>getOrDefault("a", TypeLiteral.<Integer>of(Integer.class), 789); - - assertThat(result).isEqualTo(999); + public void getOptionalValueStringTypeReturnsFoundValueIfKeyIsKnown() throws Exception { + final Config cfg = mock(Config.class); + doReturn(Optional.of(Integer.valueOf(768))).when(cfg).getOptionalValue("a", Integer.class); + + Optional<Integer> val = new CombinedConfiguration("test", cfg) + .getOptionalValue("a", Integer.class); + assertNotNull(val); + assertTrue(val.isPresent()); + assertEquals(Integer.valueOf(768), val.get()); } /* @@ -244,72 +185,38 @@ public class CombinedConfigurationTest { */ @Test - public void getOrDefaultStringClassTThrowsNPEIfKeyIsNull() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class); - doCallRealMethod().when(cc).getOrDefault(anyString(), Mockito.any(Class.class), - Mockito.any(Integer.class)); - + public void getOptionalValueStringClassTThrowsNPEIfKeyIsNull() throws Exception { + final Config cfg = mock(Config.class,NOT_MOCKED_ANSWER); assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { @Override public void call() throws Throwable { - cc.getOrDefault(null, Integer.class, 1); + new CombinedConfiguration("test", cfg).getOptionalValue(null, Integer.class); } }).isInstanceOf(NullPointerException.class) .hasMessage("Key must be given."); } @Test - public void getOrDefaultStringClassTThrowsNPEIfTypeIsNull() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class); - doCallRealMethod().when(cc).getOrDefault(anyString(), Mockito.any(Class.class), Mockito.anyInt()); + public void getOptionalValueStringClassTThrowsNPEIfTypeIsNull() throws Exception { + final Config cfg = mock(Config.class,NOT_MOCKED_ANSWER); assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { @Override public void call() throws Throwable { - cc.getOrDefault("a", (Class<Integer>) null, 1); + new CombinedConfiguration("test", cfg) + .getOptionalValue("a", (Class<Integer>) null); } }).isInstanceOf(NullPointerException.class) .hasMessage("Type must be given."); } @Test - public void getOrDefaultStringClassTThrowsNPEIfDefaultValueIsNull() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class), - Mockito.any(Integer.class)); - - assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { - @Override - public void call() throws Throwable { - cc.getOrDefault("a", Integer.class, null); - } - }).isInstanceOf(NullPointerException.class) - .hasMessage("Default value must be given."); - } - - @Test - public void getOrDefaultStringClassTReturnsDefaultValueIfKeyIsUnknown() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doReturn(null).when(cc).get(eq("a"), any(Class.class)); - doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class), - Mockito.any(Integer.class)); - - TypeLiteral<Integer> typeLiteral = TypeLiteral.of(Integer.class); - Integer result = cc.<Integer>getOrDefault("a", Integer.class, 789); - - assertThat(result).isEqualTo(789); - } - - - @Test - public void getOrDefaultStringClassTReturnsFoundValueIfKeyIsKnown() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doReturn(999).when(cc).get(eq("a"), any(Class.class)); - doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class), - Mockito.anyInt()); - - Integer result = cc.<Integer>getOrDefault("a", Integer.class, 789); - + public void getOptionalValueStringClassTReturnsFoundValueIfKeyIsKnown() throws Exception { + final Config cfg = mock(Config.class); + doReturn(Optional.of(Integer.valueOf(999))).when(cfg).getOptionalValue(eq("a"), any(Class.class)); + doReturn(Optional.of(Integer.valueOf(999))).when(cfg).getOptionalValue(eq("a"), any(Class.class)); + Integer result = new CombinedConfiguration("test", cfg) + .getOptionalValue("a", Integer.class).orElse(789); assertThat(result).isEqualTo(999); } @@ -319,152 +226,79 @@ public class CombinedConfigurationTest { @Test public void getPropertiesReturnsEmptyMapIfAllConfigurationsAreEmpty() throws Exception { - Map<String, String> propsOfA = new HashMap<>(); - Map<String, String> propsOfB = new HashMap<>(); - Map<String, String> propsOfC = new HashMap<>(); - - Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); + Iterable<String> namesOfA = new HashSet<>(); + Iterable<String> namesOfB = new HashSet<>(); + Iterable<String> namesOfC = new HashSet<>(); - doReturn(propsOfA).when(configA).getProperties(); - doReturn(propsOfB).when(configB).getProperties(); - doReturn(propsOfC).when(configC).getProperties(); + Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); - CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - - doReturn(asList(configA, configB, configC)).when(cc).getConfigurations(); - doCallRealMethod().when(cc).getProperties(); - - Map<String, String> result = cc.getProperties(); + doReturn(namesOfA).when(configA).getPropertyNames(); + doReturn(namesOfB).when(configB).getPropertyNames(); + doReturn(namesOfC).when(configC).getPropertyNames(); + CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC); + Iterable<String> result = cc.getPropertyNames(); assertThat(result).isEmpty(); } @Test - public void getPropertiesReturnsLastValueOfManyForAGivenKey() throws Exception { - Map<String, String> propsOfA = new HashMap<String, String>() {{ put("a", "A"); }}; - Map<String, String> propsOfB = new HashMap<String, String>() {{ put("b", "B"); }}; - Map<String, String> propsOfC = new HashMap<String, String>() {{ put("a", "Z"); }}; - - Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - - doReturn(propsOfA).when(configA).getProperties(); - doReturn(propsOfB).when(configB).getProperties(); - doReturn(propsOfC).when(configC).getProperties(); - - CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - - doReturn(asList(configA, configB, configC)).when(cc).getConfigurations(); - doCallRealMethod().when(cc).getProperties(); - - Map<String, String> result = cc.getProperties(); - - assertThat(result).containsEntry("a", "Z") - .doesNotContainEntry("a", "A"); + public void getPropertyValueReturnsLastValueOfManyForAGivenKey() throws Exception { + Set<String> propsOfA = new HashSet<String>() {{ add("a"); }}; + Set<String> propsOfB = new HashSet<String>() {{ add("a"); }}; + Set<String> propsOfC = new HashSet<String>() {{ add("a"); }}; + + Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + + doReturn(Optional.of("A")).when(configA).getOptionalValue(eq("a"), any()); + doReturn(Optional.of("B")).when(configB).getOptionalValue(eq("a"), any()); + doReturn(Optional.of("C")).when(configC).getOptionalValue(eq("a"), any()); + doReturn(Optional.empty()).when(configA).getOptionalValue(eq("foo"), any()); + doReturn(Optional.empty()).when(configB).getOptionalValue(eq("foo"), any()); + doReturn(Optional.empty()).when(configC).getOptionalValue(eq("foo"), any()); + doReturn(propsOfA).when(configA).getPropertyNames(); + doReturn(propsOfB).when(configB).getPropertyNames(); + doReturn(propsOfC).when(configC).getPropertyNames(); + + CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC); + Iterable<String> result = cc.getPropertyNames(); + + assertThat(result).hasSize(1) + .contains("a"); + assertThat(cc.getValue("a", String.class)) + .isEqualTo("C"); + assertThat(cc.getValue("foo", String.class)) + .isNull(); } @Test - public void getPropertiesReturnsAllProperties() throws Exception { - Map<String, String> propsOfA = new HashMap<String, String>() {{ put("a", "A"); }}; - Map<String, String> propsOfB = new HashMap<String, String>() {{ put("b", "B"); }}; - Map<String, String> propsOfC = new HashMap<String, String>() {{ put("c", "C"); }}; - - Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); - Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER); + public void getPropertyNamesReturnsAllProperties() throws Exception { + Set<String> propsOfA = new HashSet<String>() {{ add("a"); }}; + Set<String> propsOfB = new HashSet<String>() {{ add("b"); }}; + Set<String> propsOfC = new HashSet<String>() {{ add("c"); }}; - doReturn(propsOfA).when(configA).getProperties(); - doReturn(propsOfB).when(configB).getProperties(); - doReturn(propsOfC).when(configC).getProperties(); + Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); + Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER); - CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); + doReturn("A").when(configA).getValue("a", String.class); + doReturn("B").when(configB).getValue("b", String.class); + doReturn("C").when(configC).getValue("c", String.class); + doReturn(propsOfA).when(configA).getPropertyNames(); + doReturn(propsOfB).when(configB).getPropertyNames(); + doReturn(propsOfC).when(configC).getPropertyNames(); - doReturn(asList(configA, configB, configC)).when(cc).getConfigurations(); - doCallRealMethod().when(cc).getProperties(); - - Map<String, String> result = cc.getProperties(); + CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC); + Iterable<String> result = cc.getPropertyNames(); assertThat(result).hasSize(3) - .containsEntry("a", "A") - .containsEntry("b", "B") - .containsEntry("c", "C"); - } - - /* - * Tests for with(ConfigOperator) - */ - - @Test - public void withWithIndentityOperatorReturnsEqualConfiguration() throws Exception { - class IdentityOpr implements ConfigOperator { - @Override - public Configuration operate(Configuration config) { - return config; - } - } - - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).with(Mockito.any(ConfigOperator.class)); - - Configuration result = cc.with(new IdentityOpr()); - - assertThat(result).isNotNull() - .isEqualTo(result); - } - - @Test - public void withWithNullAsOperatorParmeterThrowsNPE() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).with(Mockito.any(ConfigOperator.class)); - - assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { - @Override - public void call() throws Throwable { - cc.with(null); - } - }).isInstanceOf(NullPointerException.class) - .hasMessage("Operator must be given."); - } - - /* - * Tests for query(ConfigQuery) - */ - - @Test - public void queryWithNullAsQueryParameterThrowsNPE() throws Exception { - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).query(Mockito.any(ConfigQuery.class)); - - assertThatThrownBy(new ThrowableAssert.ThrowingCallable() { - @Override - public void call() throws Throwable { - cc.query(null); - } - }).isInstanceOf(NullPointerException.class) - .hasMessage("Query must be given."); - } - - @Test - public void queryWithRealQueryReturnsCorrectResult() throws Exception { - class GetZahl implements ConfigQuery<Integer> { - @Override - public Integer query(Configuration config) { - return config.get("zahl", Integer.class); - } - } - - final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER); - doCallRealMethod().when(cc).query(Mockito.any(ConfigQuery.class)); - doReturn(1).when(cc).<Integer>get(eq("zahl"), eq(Integer.class)); - - Integer result = cc.query(new GetZahl()); - - assertThat(result).isEqualTo(1); + .contains("a") + .contains("b") + .contains("c"); } - // ConfigurationContext getContext(); none one three } \ No newline at end of file
