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


Reply via email to