Repository: incubator-tamaya-extensions Updated Branches: refs/heads/configjsr [created] cfb364cd4
Added full JSR support. Signed-off-by: Anatole Tresch <anat...@apache.org> 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/4af5f5f6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/4af5f5f6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/4af5f5f6 Branch: refs/heads/configjsr Commit: 4af5f5f638258b3b8cb07bb5ad7f1f8f9d1cbba8 Parents: ab03433 Author: Anatole Tresch <anat...@apache.org> Authored: Wed Dec 13 22:44:20 2017 +0100 Committer: Anatole Tresch <anat...@apache.org> Committed: Wed Dec 13 22:44:20 2017 +0100 ---------------------------------------------------------------------- modules/resolver/pom.xml | 5 - .../org/apache/tamaya/resolver/Resolver.java | 16 +- .../resolver/internal/ConfigResolver.java | 5 +- .../internal/ExpressionResolutionFilter.java | 13 +- .../resolver/internal/ResolvableConfig.java | 119 ++++++++++++++ .../services/org.apache.tamaya.spi.Filter | 19 +++ .../org.apache.tamaya.spi.PropertyFilter | 19 --- .../tamaya/resolver/ConfigResolutionTest.java | 39 ++--- .../tamaya/resolver/MyTestConfigSource.java | 100 +++++++++++ .../tamaya/resolver/MyTestPropertySource.java | 106 ------------ .../tamaya/resolver/NonResolvableConfig.java | 56 +++++++ .../tamaya/resolver/ResolvableConfigTest.java | 164 +++++++++++++++++++ .../services/javax.config.spi.ConfigSource | 19 +++ .../org.apache.tamaya.spi.PropertySource | 19 --- 14 files changed, 519 insertions(+), 180 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/pom.xml ---------------------------------------------------------------------- diff --git a/modules/resolver/pom.xml b/modules/resolver/pom.xml index 7691c23..2ae6782 100644 --- a/modules/resolver/pom.xml +++ b/modules/resolver/pom.xml @@ -34,11 +34,6 @@ under the License. <dependencies> <dependency> <groupId>org.apache.tamaya</groupId> - <artifactId>tamaya-api</artifactId> - <version>${tamaya-apicore.version}</version> - </dependency> - <dependency> - <groupId>org.apache.tamaya</groupId> <artifactId>tamaya-core</artifactId> <version>${tamaya-apicore.version}</version> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java index c2bc908..955183a 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/Resolver.java @@ -18,11 +18,12 @@ */ package org.apache.tamaya.resolver; -import org.apache.tamaya.ConfigException; +import org.apache.tamaya.resolver.internal.ResolvableConfig; import org.apache.tamaya.resolver.spi.ExpressionEvaluator; import org.apache.tamaya.resolver.spi.ExpressionResolver; import org.apache.tamaya.spi.ServiceContextManager; +import javax.config.Config; import java.util.Collection; /** @@ -48,7 +49,7 @@ public final class Resolver { private static ExpressionEvaluator evaluator() { ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext().getService(ExpressionEvaluator.class); if(evaluator==null){ - throw new ConfigException("No ExpressionEvaluator registered."); + throw new IllegalStateException("No ExpressionEvaluator registered."); } return evaluator; } @@ -80,4 +81,15 @@ public final class Resolver { public static Collection<ExpressionResolver> getResolvers(){ return evaluator().getResolvers(); } + + + /** + * Render the given Config instance into a resolvable instance. + * @param config the configuration to be rendered to be resolvable. + * @return the resolvable instance (wrapped or the same as passed), never null. + * @see ResolvableConfig + */ + public static Config makeResolvable(Config config){ + return ResolvableConfig.from(config); + } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java index 4708a39..22cee86 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ConfigResolver.java @@ -18,10 +18,10 @@ */ package org.apache.tamaya.resolver.internal; -import org.apache.tamaya.ConfigurationProvider; import org.apache.tamaya.resolver.spi.ExpressionResolver; import javax.annotation.Priority; +import javax.config.ConfigProvider; /** * Property resolver implementation that interprets the resolver expression as a reference to another configuration @@ -37,7 +37,8 @@ public final class ConfigResolver implements ExpressionResolver{ @Override public String evaluate(String expression){ - return ConfigurationProvider.getConfiguration().get(expression); + return ConfigProvider.getConfig().getOptionalValue(expression, String.class) + .orElse(expression); } } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java index e7d9ff6..75e4624 100644 --- a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ExpressionResolutionFilter.java @@ -18,11 +18,9 @@ */ package org.apache.tamaya.resolver.internal; -import org.apache.tamaya.ConfigException; import org.apache.tamaya.resolver.spi.ExpressionEvaluator; -import org.apache.tamaya.spi.FilterContext; -import org.apache.tamaya.spi.PropertyFilter; -import org.apache.tamaya.spi.PropertyValue; +import org.apache.tamaya.spi.ConfigValue; +import org.apache.tamaya.spi.Filter; import org.apache.tamaya.spi.ServiceContextManager; import javax.annotation.Priority; @@ -34,14 +32,14 @@ import java.util.logging.Logger; * has the advantage that different resolvers can be active in parallel. */ @Priority(10000) -public class ExpressionResolutionFilter implements PropertyFilter { +public class ExpressionResolutionFilter implements Filter { private static final Logger LOG = Logger.getLogger(ExpressionResolutionFilter.class.getName()); private final ExpressionEvaluator evaluator(){ ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext().getService(ExpressionEvaluator.class); if(evaluator==null){ - throw new ConfigException("No ExpressionEvaluator registered."); + throw new IllegalStateException("No ExpressionEvaluator registered."); } return evaluator; } @@ -80,12 +78,11 @@ public class ExpressionResolutionFilter implements PropertyFilter { * <li><code>\${resolverId:expression}foo${resolverId2:expression2}bar</code> (first expression is escaped).</li> * </ul> * - * @param context the filter context * @param valueToBeFiltered value to be analyzed for expressions * @return the resolved value, or the input in case where no expression was detected. */ @Override - public PropertyValue filterProperty(PropertyValue valueToBeFiltered, FilterContext context){ + public ConfigValue filterProperty(ConfigValue valueToBeFiltered){ LOG.finest("Resolving " + valueToBeFiltered); String newVal = evaluator().evaluateExpression(valueToBeFiltered.getKey(), valueToBeFiltered.getValue(), true); if(newVal!=null){ http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResolvableConfig.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResolvableConfig.java b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResolvableConfig.java new file mode 100644 index 0000000..1abed5b --- /dev/null +++ b/modules/resolver/src/main/java/org/apache/tamaya/resolver/internal/ResolvableConfig.java @@ -0,0 +1,119 @@ +/* + * 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.resolver.internal; + +import org.apache.tamaya.base.DefaultConfig; +import org.apache.tamaya.base.DefaultConfigBuilder; +import org.apache.tamaya.base.convert.ConverterManager; +import org.apache.tamaya.base.filter.FilterManager; +import org.apache.tamaya.spi.ConfigContext; +import org.apache.tamaya.spi.ConfigContextSupplier; +import org.apache.tamaya.spi.ConfigValue; + +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.Objects; +import java.util.Optional; + +/** + * Wrapper that intercepts evaluation of String configuration extending with value resolution capabilities + * as provided by registered instances of type {@link org.apache.tamaya.spi.Filter}. + */ +public final class ResolvableConfig implements Config{ + + /** The original instance. */ + private Config delegate; + private FilterManager filterManager = new FilterManager(); + private ConverterManager converterManager = new ConverterManager(); + + private ResolvableConfig(Config config){ + this.delegate = Objects.requireNonNull(config); + filterManager.addDefaultFilters(); + converterManager.addDiscoveredConverters(); + } + + /** + * Creates a new resolvable configuration instance, based on the given config. This actually performs the following: + * <ol> + * <li>If the instance passed is of type {@link ResolvableConfig}, the instance is passed through.</li> + * <li>If the instance passed is of type {@link DefaultConfig}, the instance is passed through.</li> + * <li>It the instance implements {@link ConfigContextSupplier}, a new {@link DefaultConfig} is + * created and returned, using the returned {@link org.apache.tamaya.spi.ConfigContext}.</li> + * <li>Otherwise a new instance of this class is created, with filtering and conversion added on top, based + * on the discoverable filters and converters only.</li> + * </ol> + * Summarizing this function adds filter resolution functionality to the instance, if needed (Tamaya configuration + * instances support filtering out of the box) and intercepts all calls for applying resolution and, as + * needed, subsequent type conversion. + * + * @param config the config instance, potentially not resolvable. + * @return a resolvable config instance. + */ + public static Config from(Config config){ + if(config instanceof ResolvableConfig){ + return (ResolvableConfig)config; + }else if(config instanceof DefaultConfig){ + return config; + }else if(config instanceof ConfigContextSupplier){ + ConfigContext ctx = ((ConfigContextSupplier)config).getConfigContext(); + return new DefaultConfigBuilder(ctx).build(); + }else{ + return new ResolvableConfig(config); + } + } + + @Override + public <T> T getValue(String propertyName, Class<T> propertyType) { + return getOptionalValue(propertyName, propertyType).orElse(null); + } + + @Override + public <T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType) { + ConfigValue value = ConfigValue.of( + propertyName, delegate.getValue(propertyName, String.class), null); + value = filterManager.filterValue(value); + if(value!=null){ + if(String.class.equals(propertyType)) { + return Optional.ofNullable((T) value.getValue()); + } + return Optional.ofNullable( + (T)converterManager.convertValue(propertyName, value.getValue(), propertyType, this)); + } + return Optional.empty(); + } + + @Override + public Iterable<String> getPropertyNames() { + return delegate.getPropertyNames(); + } + + @Override + public Iterable<ConfigSource> getConfigSources() { + return delegate.getConfigSources(); + } + + @Override + public String toString() { + return "ResolvableConfig{" + + "delegate=" + delegate + + ", filterManager=" + filterManager + + ", converterManager=" + converterManager + + '}'; + } +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.Filter ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.Filter b/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.Filter new file mode 100644 index 0000000..c8788b5 --- /dev/null +++ b/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.Filter @@ -0,0 +1,19 @@ +# +# 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 current 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. +# +org.apache.tamaya.resolver.internal.ExpressionResolutionFilter \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter ---------------------------------------------------------------------- diff --git a/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter b/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter deleted file mode 100644 index c8788b5..0000000 --- a/modules/resolver/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyFilter +++ /dev/null @@ -1,19 +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 current 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. -# -org.apache.tamaya.resolver.internal.ExpressionResolutionFilter \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java index f795ee1..7189e36 100644 --- a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ConfigResolutionTest.java @@ -18,102 +18,103 @@ */ package org.apache.tamaya.resolver; -import org.apache.tamaya.ConfigurationProvider; import org.junit.Test; +import javax.config.ConfigProvider; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * Test class that test resolution of different values as configured within - * {@link org.apache.tamaya.resolver.MyTestPropertySource} and on test resource path. + * {@link MyTestConfigSource} and on test resource path. */ public class ConfigResolutionTest { @Test public void test_Prefix_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Before Text (prefixed)"), "My Java version is " + System.getProperty("java.version")); + assertEquals(ConfigProvider.getConfig().getValue("Before Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version")); } @Test public void test_Midfix_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Before and After Text (prefixed)"), "My Java version is " + System.getProperty("java.version") + "."); + assertEquals(ConfigProvider.getConfig().getValue("Before and After Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version") + "."); } @Test public void test_Prefix_Resolution_BadSyntax1() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will fail1."), "V$java.version"); + assertEquals(ConfigProvider.getConfig().getValue("Will fail1.", String.class), "V$java.version"); } @Test public void test_Prefix_Resolution_BadSyntax2() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will fail2."), "V$java.version}"); + assertEquals(ConfigProvider.getConfig().getValue("Will fail2.", String.class), "V$java.version}"); } @Test public void test_Prefix_Resolution_BadSyntax31() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail3."), "V${java.version"); + assertEquals(ConfigProvider.getConfig().getValue("Will not fail3.", String.class), "V${java.version"); } @Test public void test_Prefix_Resolution_Escaped1() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail1."), "V$\\{java.version"); + assertEquals(ConfigProvider.getConfig().getValue("Will not fail1.", String.class), "V$\\{java.version"); } @Test public void test_Prefix_Resolution_Escaped2() { - assertEquals(ConfigurationProvider.getConfiguration().get("Will not fail2."), "V\\${java.version"); + assertEquals(ConfigProvider.getConfig().getValue("Will not fail2.", String.class), "V\\${java.version"); } @Test public void test_Prefix_Resolution_EnvKeys() { - assertEquals(ConfigurationProvider.getConfiguration().get("env.keys"), System.getProperty("java.version") + " plus $java.version"); + assertEquals(ConfigProvider.getConfig().getValue("env.keys", String.class), System.getProperty("java.version") + " plus $java.version"); } @Test public void test_Prefix_ExpressionOnly_Resolution() { - assertEquals(ConfigurationProvider.getConfiguration().get("Expression Only"), System.getProperty("java.version")); + assertEquals(ConfigProvider.getConfig().getValue("Expression Only", String.class), System.getProperty("java.version")); } @Test public void testConfig_Refs() { - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref"), "Expression Only -> " + System.getProperty("java.version")); - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref3"), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); - assertEquals(ConfigurationProvider.getConfiguration().get("config-ref2"), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertEquals(ConfigProvider.getConfig().getValue("config-ref", String.class), "Expression Only -> " + System.getProperty("java.version")); + assertEquals(ConfigProvider.getConfig().getValue("config-ref3", String.class), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertEquals(ConfigProvider.getConfig().getValue("config-ref2", String.class), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); } @Test public void testClasspath_Refs() { - String value = ConfigurationProvider.getConfiguration().get("cp-ref"); + String value = ConfigProvider.getConfig().getValue("cp-ref", String.class); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource.txt!")); } @Test public void testResource_Refs() { - String value = ConfigurationProvider.getConfiguration().get("res-ref"); + String value = ConfigProvider.getConfig().getValue("res-ref", String.class); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource.txt!")); } @Test public void testFile_Refs() { - String value = ConfigurationProvider.getConfiguration().get("file-ref"); + String value = ConfigProvider.getConfig().getValue("file-ref", String.class); assertNotNull(value); assertTrue(value.contains("This content comes from Testresource2.txt!")); } @Test public void testURL_Refs() { - String value = ConfigurationProvider.getConfiguration().get("url-ref"); + String value = ConfigProvider.getConfig().getValue("url-ref", String.class); assertNotNull(value); assertTrue(value.contains("doctype html") || "[http://www.google.com]".equals(value)); } @Test public void testEscaping(){ - assertEquals(ConfigurationProvider.getConfiguration().get("escaped"), + assertEquals(ConfigProvider.getConfig().getValue("escaped", String.class), "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + "newlines or \\r returns...YEP!"); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestConfigSource.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestConfigSource.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestConfigSource.java new file mode 100644 index 0000000..0b8f9d5 --- /dev/null +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestConfigSource.java @@ -0,0 +1,100 @@ +/* + * 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.resolver; + +import javax.config.spi.ConfigSource; +import java.io.File; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Anatole on 04.01.2015. + */ +public class MyTestConfigSource implements ConfigSource{ + + private final Map<String,String> properties = new HashMap<>(); + + public MyTestConfigSource(){ + properties.put("Expression Only", "${java.version}"); + properties.put("Expression Only (prefixed)", "${sys:java.version}"); + properties.put("Before Text", "My Java version is ${java.version}"); + properties.put("Before Text (prefixed)", "My Java version is ${sys:java.version}"); + properties.put("Before and After Text", "My Java version is ${java.version}."); + properties.put("Before and After Text (prefixed)", "My Java version is ${sys:java.version}."); + properties.put("Multi-expression", "Java version ${sys:java.version} and line.separator ${line.separator}."); + + properties.put("cp-ref", "${resource:Testresource.txt}"); + properties.put("file-ref", "${file:"+getFileRefAsString()+"}"); + properties.put("res-ref", "${resource:Test?es*ce.txt}"); + properties.put("url-ref", "${url:http://www.google.com}"); + properties.put("config-ref", "Expression Only -> ${conf:Expression Only}"); + properties.put("config-ref2", "Config Ref 2 -> Ref 1: ${conf:config-ref}"); + properties.put("config-ref3", "Config Ref 3 -> Ref 2: ${conf:config-ref2}"); + + properties.put("Will fail1.", "V$java.version"); + properties.put("Will fail2.", "V$java.version}"); + properties.put("Will not fail3.", "V${java.version"); + properties.put("Will not fail1.", "V$\\{java.version"); + properties.put("Will not fail2.", "V\\${java.version"); + + properties.put("env.keys", "${java.version} plus $java.version"); + + properties.put("escaped", "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + + "newlines or \\r returns...YEP!"); + } + + private String getFileRefAsString() { + try { + URL res = getClass().getClassLoader().getResource("Testresource2.txt"); + if(res==null){ + return null; + } + return new File(res.toURI()).getAbsolutePath().replaceAll("\\\\","/"); + } catch (URISyntaxException e) { + return "Failed to evaluate file: Testresource2.txt"; + } + } + + @Override + public int getOrdinal() { + return 0; + } + + @Override + public String getName() { + return "test"; + } + + @Override + public String getValue(String key) { + return properties.get(key); + } + + @Override + public Map<String, String> getProperties() { + Map<String, String> res = new HashMap<>(); + for(Map.Entry<String,String> en:properties.entrySet()){ + res.put(en.getKey(), en.getValue()); + } + return res; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestPropertySource.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestPropertySource.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestPropertySource.java deleted file mode 100644 index eee7fa4..0000000 --- a/modules/resolver/src/test/java/org/apache/tamaya/resolver/MyTestPropertySource.java +++ /dev/null @@ -1,106 +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.resolver; - -import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.PropertyValue; - -import java.io.File; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by Anatole on 04.01.2015. - */ -public class MyTestPropertySource implements PropertySource{ - - private final Map<String,String> properties = new HashMap<>(); - - public MyTestPropertySource(){ - properties.put("Expression Only", "${java.version}"); - properties.put("Expression Only (prefixed)", "${sys:java.version}"); - properties.put("Before Text", "My Java version is ${java.version}"); - properties.put("Before Text (prefixed)", "My Java version is ${sys:java.version}"); - properties.put("Before and After Text", "My Java version is ${java.version}."); - properties.put("Before and After Text (prefixed)", "My Java version is ${sys:java.version}."); - properties.put("Multi-expression", "Java version ${sys:java.version} and line.separator ${line.separator}."); - - properties.put("cp-ref", "${resource:Testresource.txt}"); - properties.put("file-ref", "${file:"+getFileRefAsString()+"}"); - properties.put("res-ref", "${resource:Test?es*ce.txt}"); - properties.put("url-ref", "${url:http://www.google.com}"); - properties.put("config-ref", "Expression Only -> ${conf:Expression Only}"); - properties.put("config-ref2", "Config Ref 2 -> Ref 1: ${conf:config-ref}"); - properties.put("config-ref3", "Config Ref 3 -> Ref 2: ${conf:config-ref2}"); - - properties.put("Will fail1.", "V$java.version"); - properties.put("Will fail2.", "V$java.version}"); - properties.put("Will not fail3.", "V${java.version"); - properties.put("Will not fail1.", "V$\\{java.version"); - properties.put("Will not fail2.", "V\\${java.version"); - - properties.put("env.keys", "${java.version} plus $java.version"); - - properties.put("escaped", "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + - "newlines or \\r returns...YEP!"); - } - - private String getFileRefAsString() { - try { - URL res = getClass().getClassLoader().getResource("Testresource2.txt"); - if(res==null){ - return null; - } - return new File(res.toURI()).getAbsolutePath().replaceAll("\\\\","/"); - } catch (URISyntaxException e) { - return "Failed to evaluate file: Testresource2.txt"; - } - } - - @Override - public int getOrdinal() { - return 0; - } - - @Override - public String getName() { - return "test"; - } - - @Override - public PropertyValue get(String key) { - return PropertyValue.of(key, properties.get(key), getName()); - } - - @Override - public Map<String, PropertyValue> getProperties() { - Map<String, PropertyValue> res = new HashMap<>(); - for(Map.Entry<String,String> en:properties.entrySet()){ - res.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), "test")); - } - return res; - } - - @Override - public boolean isScannable() { - return true; - } -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/java/org/apache/tamaya/resolver/NonResolvableConfig.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/NonResolvableConfig.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/NonResolvableConfig.java new file mode 100644 index 0000000..33429ca --- /dev/null +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/NonResolvableConfig.java @@ -0,0 +1,56 @@ +/* + * 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.resolver; + +import javax.config.Config; +import javax.config.spi.ConfigSource; +import java.util.Arrays; +import java.util.Optional; + +/** + * Implements s simple config just based on the {@link MyTestConfigSource}, without any + * resolution logic. + */ +public class NonResolvableConfig implements Config{ + + private MyTestConfigSource configDelegate = new MyTestConfigSource(); + + @Override + public <T> T getValue(String propertyName, Class<T> propertyType) { + if(propertyType.equals(String.class)) { + return (T)configDelegate.getValue(propertyName); + } + return null; + } + + @Override + public <T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType) { + return Optional.ofNullable(getValue(propertyName, propertyType)); + } + + @Override + public Iterable<String> getPropertyNames() { + return configDelegate.getPropertyNames(); + } + + @Override + public Iterable<ConfigSource> getConfigSources() { + return Arrays.asList(new ConfigSource[]{configDelegate}); + } +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolvableConfigTest.java ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolvableConfigTest.java b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolvableConfigTest.java new file mode 100644 index 0000000..72199fb --- /dev/null +++ b/modules/resolver/src/test/java/org/apache/tamaya/resolver/ResolvableConfigTest.java @@ -0,0 +1,164 @@ +/* + * 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.resolver; + +import org.junit.Test; + +import javax.config.Config; +import javax.config.ConfigProvider; + +import static org.junit.Assert.*; + +/** + * Test class that test resolution of different values as configured within + * {@link MyTestConfigSource} after applying {@link Resolver#makeResolvable(Config)} to a + * non resolvable instance. + */ +public class ResolvableConfigTest { + + private NonResolvableConfig nonResolvableConfig = new NonResolvableConfig(); + private Config resolvableConfig = Resolver.makeResolvable(nonResolvableConfig); + + @Test + public void test_Prefix_Resolution() { + assertNotSame(nonResolvableConfig.getValue("Before Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version")); + assertEquals(resolvableConfig.getValue("Before Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version")); + } + + @Test + public void test_Midfix_Resolution() { + assertNotSame(nonResolvableConfig.getValue("Before and After Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version") + "."); + assertEquals(resolvableConfig.getValue("Before and After Text (prefixed)", String.class), "My Java version is " + System.getProperty("java.version") + "."); + } + + @Test + public void test_Prefix_Resolution_BadSyntax1() { + assertEquals(nonResolvableConfig.getValue("Will fail1.", String.class), "V$java.version"); + assertEquals(resolvableConfig.getValue("Will fail1.", String.class), "V$java.version"); + } + + @Test + public void test_Prefix_Resolution_BadSyntax2() { + assertEquals(resolvableConfig.getValue("Will fail2.", String.class), "V$java.version}"); + assertEquals(nonResolvableConfig.getValue("Will fail2.", String.class), "V$java.version}"); + } + + @Test + public void test_Prefix_Resolution_BadSyntax31() { + assertEquals(resolvableConfig.getValue("Will not fail3.", String.class), "V${java.version"); + assertEquals(nonResolvableConfig.getValue("Will not fail3.", String.class), "V${java.version"); + } + + @Test + public void test_Prefix_Resolution_Escaped1() { + assertEquals(resolvableConfig.getValue("Will not fail1.", String.class), "V$\\{java.version"); + assertEquals(nonResolvableConfig.getValue("Will not fail1.", String.class), "V$\\{java.version"); + } + + @Test + public void test_Prefix_Resolution_Escaped2() { + assertEquals(resolvableConfig.getValue("Will not fail2.", String.class), "V\\${java.version"); + assertEquals(nonResolvableConfig.getValue("Will not fail2.", String.class), "V\\${java.version"); + } + + @Test + public void test_Prefix_Resolution_EnvKeys() { + assertEquals(resolvableConfig.getValue("env.keys", String.class), System.getProperty("java.version") + " plus $java.version"); + assertNotSame(nonResolvableConfig.getValue("env.keys", String.class), System.getProperty("java.version") + " plus $java.version"); + } + + @Test + public void test_Prefix_ExpressionOnly_Resolution() { + assertEquals(resolvableConfig.getValue("Expression Only", String.class), System.getProperty("java.version")); + assertNotSame(nonResolvableConfig.getValue("Expression Only", String.class), System.getProperty("java.version")); + } + + @Test + public void testConfig_Refs() { + assertEquals(resolvableConfig.getValue("config-ref", String.class), "Expression Only -> " + System.getProperty("java.version")); + assertEquals(resolvableConfig.getValue("config-ref3", String.class), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertEquals(resolvableConfig.getValue("config-ref2", String.class), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + + assertNotSame(nonResolvableConfig.getValue("config-ref", String.class), "Expression Only -> " + System.getProperty("java.version")); + assertNotSame(nonResolvableConfig.getValue("config-ref3", String.class), "Config Ref 3 -> Ref 2: Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + assertNotSame(nonResolvableConfig.getValue("config-ref2", String.class), "Config Ref 2 -> Ref 1: Expression Only -> " + System.getProperty("java.version")); + } + + @Test + public void testClasspath_Refs() { + String value = resolvableConfig.getValue("cp-ref", String.class); + assertNotNull(value); + assertTrue(value.contains("This content comes from Testresource.txt!")); + value = nonResolvableConfig.getValue("cp-ref", String.class); + assertNotNull(value); + assertEquals("${resource:Testresource.txt}", value); + } + + @Test + public void testResource_Refs() { + String value = resolvableConfig.getValue("res-ref", String.class); + assertNotNull(value); + assertTrue(value.contains("This content comes from Testresource.txt!")); + value = nonResolvableConfig.getValue("res-ref", String.class); + assertNotNull(value); + assertEquals("${resource:Test?es*ce.txt}", value); + } + + @Test + public void testFile_Refs() { + String value = resolvableConfig.getValue("file-ref", String.class); + assertNotNull(value); + assertTrue(value.contains("This content comes from Testresource2.txt!")); + value = nonResolvableConfig.getValue("file-ref", String.class); + assertNotNull(value); + assertTrue(value.contains("Testresource2.txt}")); + assertTrue(value.contains("${file:")); + } + + @Test + public void testURL_Refs() { + String value = resolvableConfig.getValue("url-ref", String.class); + assertNotNull(value); + assertTrue(value.contains("doctype html") || "[http://www.google.com]".equals(value)); + value = nonResolvableConfig.getValue("url-ref", String.class); + assertNotNull(value); + assertEquals("${url:http://www.google.com}", value); + } + + @Test + public void testEscaping(){ + assertEquals(resolvableConfig.getValue("escaped", String.class), + "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + + "newlines or \\r returns...YEP!"); + assertEquals(nonResolvableConfig.getValue("escaped", String.class), + "Config Ref 3 -> Ref 2: \\${conf:config-ref2 will not be evaluated and will not contain\\t tabs \\n " + + "newlines or \\r returns...YEP!"); + } + + @Test + public void testGetPropertyNames(){ + assertEquals(resolvableConfig.getPropertyNames(), nonResolvableConfig.getPropertyNames()); + } + + @Test + public void testGetConfigSources(){ + assertEquals(resolvableConfig.getConfigSources(), nonResolvableConfig.getConfigSources()); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/resources/META-INF/services/javax.config.spi.ConfigSource ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/resources/META-INF/services/javax.config.spi.ConfigSource b/modules/resolver/src/test/resources/META-INF/services/javax.config.spi.ConfigSource new file mode 100644 index 0000000..4e2300f --- /dev/null +++ b/modules/resolver/src/test/resources/META-INF/services/javax.config.spi.ConfigSource @@ -0,0 +1,19 @@ +# +# 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 current 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. +# +org.apache.tamaya.resolver.MyTestConfigSource \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/4af5f5f6/modules/resolver/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource ---------------------------------------------------------------------- diff --git a/modules/resolver/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource b/modules/resolver/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource deleted file mode 100644 index 088aca9..0000000 --- a/modules/resolver/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource +++ /dev/null @@ -1,19 +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 current 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. -# -org.apache.tamaya.resolver.MyTestPropertySource \ No newline at end of file