You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2017/12/10 22:03:44 UTC

[21/23] incubator-tamaya git commit: Reimplemented (also simjplified) Tamaya core completely based on latest JSR API. Moved prior Tamaya API into compat module.

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/main/resources/tamaya-banner.txt
----------------------------------------------------------------------
diff --git a/code/api/src/main/resources/tamaya-banner.txt b/code/api/src/main/resources/tamaya-banner.txt
deleted file mode 100644
index b4ceca4..0000000
--- a/code/api/src/main/resources/tamaya-banner.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
- █████╗ ██████╗  █████╗  ██████╗██╗  ██╗███████╗    ████████╗ █████╗ ███╗   ███╗ █████╗ ██╗   ██╗ █████╗
-██╔══██╗██╔══██╗██╔══██╗██╔════╝██║  ██║██╔════╝    ╚══██╔══╝██╔══██╗████╗ ████║██╔══██╗╚██╗ ██╔╝██╔══██╗
-███████║██████╔╝███████║██║     ███████║█████╗         ██║   ███████║██╔████╔██║███████║ ╚████╔╝ ███████║
-██╔══██║██╔═══╝ ██╔══██║██║     ██╔══██║██╔══╝         ██║   ██╔══██║██║╚██╔╝██║██╔══██║  ╚██╔╝  ██╔══██║
-██║  ██║██║     ██║  ██║╚██████╗██║  ██║███████╗       ██║   ██║  ██║██║ ╚═╝ ██║██║  ██║   ██║   ██║  ██║
-╚═╝  ╚═╝╚═╝     ╚═╝  ╚═╝ ╚═════╝╚═╝  ╚═╝╚══════╝       ╚═╝   ╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝
-
-Apache Tamaya Configuration API:  http://tamaya.incubator.apache.org
-
-

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java b/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
deleted file mode 100644
index fa7da0a..0000000
--- a/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
+++ /dev/null
@@ -1,45 +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;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests instantiating {@link ConfigException}.
- */
-public class ConfigExceptionTest {
-
-    @Test
-    public void testCreationMessage(){
-        ConfigException ex = new ConfigException("test");
-        assertNull(ex.getCause());
-        assertEquals(ex.getMessage(), "test");
-    }
-
-    @Test
-    public void testCreationMessageThrowable(){
-        Exception e = new IllegalStateException("blabla");
-        ConfigException ex = new ConfigException("test", e);
-        assertTrue(ex.getCause() == e);
-        assertEquals("test", ex.getMessage());
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/ConfigurationTest.java b/code/api/src/test/java/org/apache/tamaya/ConfigurationTest.java
deleted file mode 100644
index ecbb75c..0000000
--- a/code/api/src/test/java/org/apache/tamaya/ConfigurationTest.java
+++ /dev/null
@@ -1,63 +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;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * Test class that tests the default methods implemented on {@link org.apache.tamaya.Configuration}. The provided
- * {@link org.apache.tamaya.TestConfiguration} is implemeted with maximal use of the default methods.
- */
-public class ConfigurationTest {
-
-    @Test
-    public void testget() throws Exception {
-        assertEquals(Boolean.TRUE, ConfigurationProvider.getConfiguration().get("booleanTrue", Boolean.class));
-        assertEquals(Boolean.FALSE, ConfigurationProvider.getConfiguration().get("booleanFalse", Boolean.class));
-        assertEquals((int)Byte.MAX_VALUE, (int)ConfigurationProvider.getConfiguration().get("byte", Byte.class));
-        assertEquals(Integer.MAX_VALUE, (int)ConfigurationProvider.getConfiguration().get("int", Integer.class));
-        assertEquals(Long.MAX_VALUE, (long)ConfigurationProvider.getConfiguration().get("long", Long.class));
-        assertEquals(Float.MAX_VALUE, (double)ConfigurationProvider.getConfiguration().get("float", Float.class), 0.0d);
-        assertEquals(Double.MAX_VALUE, ConfigurationProvider.getConfiguration().get("double", Double.class), 0.0d);
-    }
-
-    @Test
-    public void testGetBoolean() throws Exception {
-        assertTrue(ConfigurationProvider.getConfiguration().get("booleanTrue", Boolean.class));
-        assertFalse(ConfigurationProvider.getConfiguration().get("booleanFalse", Boolean.class));
-        assertFalse(ConfigurationProvider.getConfiguration().get("foorBar", Boolean.class));
-    }
-
-    @Test
-    public void testGetInteger() throws Exception {
-        assertEquals(Integer.MAX_VALUE,(int) ConfigurationProvider.getConfiguration().get("int", Integer.class));
-    }
-
-    @Test
-    public void testGetLong() throws Exception {
-        assertEquals(Long.MAX_VALUE,(long) ConfigurationProvider.getConfiguration().get("long", Long.class));
-    }
-
-    @Test
-    public void testGetDouble() throws Exception {
-        assertEquals(Double.MAX_VALUE,ConfigurationProvider.getConfiguration().get("double", Double.class), 0.0d);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java b/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
deleted file mode 100644
index f50c1dc..0000000
--- a/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
+++ /dev/null
@@ -1,137 +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;
-
-
-import org.apache.tamaya.spi.ConfigurationContext;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
- */
-public class TestConfiguration implements Configuration{
-
-    private static final Map<String, String> VALUES;
-    static {
-        VALUES = new HashMap<>();
-        VALUES.put("long", String.valueOf(Long.MAX_VALUE));
-        VALUES.put("int", String.valueOf(Integer.MAX_VALUE));
-        VALUES.put("double", String.valueOf(Double.MAX_VALUE));
-        VALUES.put("float", String.valueOf(Float.MAX_VALUE));
-        VALUES.put("short", String.valueOf(Short.MAX_VALUE));
-        VALUES.put("byte", String.valueOf(Byte.MAX_VALUE));
-        VALUES.put("booleanTrue", "true");
-        VALUES.put("booleanFalse", "false");
-        VALUES.put("String", "aStringValue");
-    }
-
-    @Override
-    public String get(String key) {
-        return VALUES.get(key);
-    }
-
-    @Override
-    public String getOrDefault(String key, String defaultValue) {
-        String val = get(key);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @SuppressWarnings("unchecked")
-	@Override
-    public <T> T get(String key, Class<T> type) {
-        if(type.equals(Long.class)){
-            return (T)(Object)Long.MAX_VALUE;
-        }
-        else if(type.equals(Integer.class)){
-            return (T)(Object) Integer.MAX_VALUE;
-        }
-        else if(type.equals(Double.class)){
-            return (T)(Object) Double.MAX_VALUE;
-        }
-        else if(type.equals(Float.class)){
-            return (T)(Object) Float.MAX_VALUE;
-        }
-        else if(type.equals(Short.class)){
-            return (T)(Object) Short.MAX_VALUE;
-        }
-        else if(type.equals(Byte.class)){
-            return (T)(Object) Byte.MAX_VALUE;
-        }
-        else if(type.equals(Boolean.class)){
-            if("booleanTrue".equals(key)) {
-                return (T)Boolean.TRUE;
-            }
-            else{
-                return (T)Boolean.FALSE;
-            }
-        }
-        else if(type.equals(String.class)){
-            return (T)"aStringValue";
-        }
-        throw new ConfigException("No such property: " + key);
-    }
-
-    @Override
-    public <T> T get(String key, TypeLiteral<T> type) {
-        throw new RuntimeException("Method not implemented yet.");
-    }
-
-    @Override
-    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public Configuration with(ConfigOperator operator) {
-        return null;
-    }
-
-    @Override
-    public <T> T query(ConfigQuery<T> query) {
-        throw new RuntimeException("Method not implemented yet.");
-    }
-
-    @Override
-    public ConfigurationContext getContext() {
-        return null;
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        throw new RuntimeException("Method not implemented yet.");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
deleted file mode 100644
index 1ccce31..0000000
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ /dev/null
@@ -1,79 +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;
-
-import javax.annotation.Priority;
-
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.spi.ConfigurationBuilder;
-import org.apache.tamaya.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.spi.ConfigurationProviderSpi;
-
-/**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
- */
-@Priority(-1)
-public class TestConfigurationProvider implements ConfigurationProviderSpi {
-
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
-    }
-
-    @Override
-    public Configuration createConfiguration(ConfigurationContext context) {
-        return config;
-    }
-
-    @Override
-    public ConfigurationContext getConfigurationContext() {
-        return config.getContext();
-    }
-
-    @Override
-    public void setConfigurationContext(ConfigurationContext context) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean isConfigurationContextSettable() {
-        return false;
-    }
-
-    @Override
-    public ConfigurationBuilder getConfigurationBuilder() {
-        return null;
-    }
-
-    @Override
-    public ConfigurationContextBuilder getConfigurationContextBuilder() {
-        return null;
-    }
-
-    @Override
-    public void setConfiguration(Configuration config) {
-    }
-
-    @Override
-    public boolean isConfigurationSettable() {
-        return false;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java b/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java
deleted file mode 100644
index 7435e08..0000000
--- a/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java
+++ /dev/null
@@ -1,90 +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;
-
-import static org.apache.tamaya.TypeLiteral.getGenericInterfaceTypeParameters;
-import static org.apache.tamaya.TypeLiteral.getTypeParameters;
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.junit.Test;
-
-/**
- * Tests for the {@link TypeLiteral} class.
- */
-@SuppressWarnings("serial")
-public class TypeLiteralTest {
-
-	@Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullParameter() {
-       new TypeLiteral<List<String>>(null){};
-    }
-
-    @Test
-    public void test_constrcutor(){
-        TypeLiteral<List<String>> listTypeLiteral = new TypeLiteral<List<String>>(){};
-        assertEquals(List.class, listTypeLiteral.getRawType());
-        assertEquals(String.class, TypeLiteral.getTypeParameters(listTypeLiteral.getType())[0]);
-    }
-
-    @Test
-    public void test_of(){
-        class MyListClass extends ArrayList<String>{}
-        TypeLiteral<MyListClass> listTypeLiteral = TypeLiteral.of(MyListClass.class);
-        assertEquals(MyListClass.class, listTypeLiteral.getRawType());
-        assertEquals(MyListClass.class, listTypeLiteral.getType());
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void ofDoesNotAcceptNullAsParamter() {
-        TypeLiteral.of(null);
-    }
-
-    @Test
-    public void test_getTypeParameter(){
-        TypeLiteral<List<String>> listTypeLiteral = new TypeLiteral<List<String>>(){};
-        assertEquals(List.class, listTypeLiteral.getRawType());
-        assertEquals(String.class, TypeLiteral.getTypeParameters(listTypeLiteral.getType())[0]);
-    }
-
-    @Test
-    public void test_getGenericInterfaceTypeParameter(){
-        class MyListClass extends ArrayList<String> implements List<String>{}
-        assertEquals(String.class, getGenericInterfaceTypeParameters(MyListClass.class, List.class)[0]);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void getGenericInterfaceTypeParametersRequiredNonNullValueForClassParameter() {
-        getGenericInterfaceTypeParameters(null, Iterator.class);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void getGenericInterfaceTypeParametersRequiredNonNullValueForInterfaceParameter() {
-        getGenericInterfaceTypeParameters(String.class, null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void getTypeParametersRequiresNonNullParameter() {
-        getTypeParameters(null);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/ConversionContextTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/ConversionContextTest.java b/code/api/src/test/java/org/apache/tamaya/spi/ConversionContextTest.java
deleted file mode 100644
index 30f5aba..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/ConversionContextTest.java
+++ /dev/null
@@ -1,194 +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.spi;
-
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.junit.Test;
-
-import java.net.InetAddress;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests for {@link ConversionContext}, created by atsticks on 20.08.16.
- */
-public class ConversionContextTest {
-    @Test
-    public void getKey() throws Exception {
-        ConversionContext ctx = new ConversionContext.Builder("getKey", TypeLiteral.of(String.class)).build();
-        assertEquals("getKey", ctx.getKey());
-    }
-
-    @Test
-    public void getTargetType() throws Exception {
-        ConversionContext ctx = new ConversionContext.Builder("getTargetType", TypeLiteral.of(String.class)).build();
-        assertEquals(TypeLiteral.of(String.class), ctx.getTargetType());
-    }
-
-    @Test
-    public void getAnnotatedElement() throws Exception {
-        ConversionContext ctx = new ConversionContext.Builder("getAnnotatedElement", TypeLiteral.of(List.class)).build();
-        assertNull(ctx.getAnnotatedElement());
-    }
-
-    @Test
-    public void testConfiguration() throws Exception {
-        Configuration config = new MyConfiguration();
-        ConversionContext ctx = new ConversionContext.Builder("testConfiguration", TypeLiteral.of(List.class))
-                .setConfiguration(config).build();
-        assertEquals(config, ctx.getConfiguration());
-    }
-
-    @Test
-    public void testSupportedFormats() throws Exception {
-        ConversionContext ctx = new ConversionContext.Builder("getAnnotatedElement", TypeLiteral.of(List.class))
-                .addSupportedFormats(MyConverter.class, "0.0.0.0/nnn").build();
-        assertTrue(ctx.getSupportedFormats().contains("0.0.0.0/nnn (MyConverter)"));
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        ConversionContext ctx = new ConversionContext.Builder("getAnnotatedElement", TypeLiteral.of(List.class))
-                .addSupportedFormats(MyConverter.class, "0.0.0.0/nnn").build();
-        assertEquals("ConversionContext{configuration=null, key='getAnnotatedElement', targetType=TypeLiteral{type=interface java.util.List}, annotatedElement=null, supportedFormats=[0.0.0.0/nnn (MyConverter)]}", ctx.toString());
-    }
-
-    @Test
-    public void getConfigurationContext() throws Exception {
-        ConfigurationContext context = new MyConfigurationContext();
-        ConversionContext ctx = new ConversionContext.Builder("getAnnotatedElement", TypeLiteral.of(List.class))
-                .setConfigurationContext(context).build();
-        assertEquals(context, ctx.getConfigurationContext());
-    }
-
-
-    private static final class MyConverter implements PropertyConverter<InetAddress>{
-        @Override
-        public InetAddress convert(String value, ConversionContext context) {
-            return null;
-        }
-    }
-
-    private static final class MyConfigurationContext implements ConfigurationContext{
-
-        @Override
-        public void addPropertySources(PropertySource... propertySources) {
-
-        }
-
-        @Override
-        public List<PropertySource> getPropertySources() {
-            return null;
-        }
-
-        @Override
-        public PropertySource getPropertySource(String name) {
-            return null;
-        }
-
-        @Override
-        public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
-
-        }
-
-        @Override
-        public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-            return null;
-        }
-
-        @Override
-        public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) {
-            return null;
-        }
-
-        @Override
-        public List<PropertyFilter> getPropertyFilters() {
-            return null;
-        }
-
-        @Override
-        public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
-            return null;
-        }
-
-        @Override
-        public ConfigurationContextBuilder toBuilder() {
-            return null;
-        }
-    }
-
-    private static final class MyConfiguration implements Configuration{
-
-        @Override
-        public String get(String key) {
-            return null;
-        }
-
-        @Override
-        public String getOrDefault(String key, String defaultValue) {
-            return null;
-        }
-
-        @Override
-        public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-            return null;
-        }
-
-        @Override
-        public <T> T get(String key, Class<T> type) {
-            return null;
-        }
-
-        @Override
-        public <T> T get(String key, TypeLiteral<T> type) {
-            return null;
-        }
-
-        @Override
-        public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-            return null;
-        }
-
-        @Override
-        public Map<String, String> getProperties() {
-            return null;
-        }
-
-        @Override
-        public Configuration with(ConfigOperator operator) {
-            return null;
-        }
-
-        @Override
-        public <T> T query(ConfigQuery<T> query) {
-            return null;
-        }
-
-        @Override
-        public ConfigurationContext getContext() {
-            return null;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/FilterContextTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/FilterContextTest.java b/code/api/src/test/java/org/apache/tamaya/spi/FilterContextTest.java
deleted file mode 100644
index d8ff360..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/FilterContextTest.java
+++ /dev/null
@@ -1,158 +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.spi;
-
-import org.apache.tamaya.TypeLiteral;
-import org.junit.Test;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests for {@link FilterContext}.
- */
-public class FilterContextTest {
-
-    @Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullPropertyValueTwoParameterVariant() {
-        new FilterContext(null, new TestConfigContext());
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullConfigurationContextTwoParameterVariant() {
-        new FilterContext(PropertyValue.of("a", "b", "s"), null);
-    }
-
-    @SuppressWarnings("unchecked")
-	@Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullPropertyValueThreeParameterVariant() {
-        new FilterContext(null, Collections.EMPTY_MAP, new TestConfigContext());
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullConfigurationContextThreeParameterVariant() {
-        new FilterContext(PropertyValue.of("a", "b", "s"), Collections.EMPTY_MAP, null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void constructorRequiresNonNullMapForConfigEntriesThreeParameterVariant() {
-        new FilterContext(PropertyValue.of("a", "b", "s"), null, new TestConfigContext());
-    }
-
-    @Test
-    public void getKey() throws Exception {
-        PropertyValue val = PropertyValue.of("getKey", "v", "");
-        FilterContext ctx = new FilterContext(val,
-                new HashMap<String,PropertyValue>(), new TestConfigContext());
-        assertEquals(val, ctx.getProperty());
-    }
-
-    @Test
-    public void isSinglePropertyScoped() throws Exception {
-        PropertyValue val = PropertyValue.of("isSinglePropertyScoped", "v", "");
-        FilterContext ctx = new FilterContext(val, new HashMap<String,PropertyValue>(), new TestConfigContext());
-        assertEquals(false, ctx.isSinglePropertyScoped());
-        ctx = new FilterContext(val, new TestConfigContext());
-        assertEquals(true, ctx.isSinglePropertyScoped());
-    }
-
-    @Test
-    public void getConfigEntries() throws Exception {
-        Map<String,PropertyValue> config = new HashMap<>();
-        for(int i=0;i<10;i++) {
-            config.put("key-"+i, PropertyValue.of("key-"+i, "value-"+i, "test"));
-        }
-        PropertyValue val = PropertyValue.of("getConfigEntries", "v", "");
-        FilterContext ctx = new FilterContext(val, config, new TestConfigContext());
-        assertEquals(config, ctx.getConfigEntries());
-        assertTrue(config != ctx.getConfigEntries());
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        Map<String,PropertyValue> config = new HashMap<>();
-        for(int i=0;i<2;i++) {
-            config.put("key-"+i, PropertyValue.of("key-"+i, "value-"+i, "test"));
-        }
-        PropertyValue val = PropertyValue.of("testToString", "val", "mySource");
-        FilterContext ctx = new FilterContext(val, config, new TestConfigContext());
-        String toString = ctx.toString();
-
-        assertNotNull(toString);
-        assertTrue(toString.contains("FilterContext{value='PropertyValue{key='testToString', value='val', " +
-                                     "source='mySource'}', configEntries=["));
-        assertTrue(toString.contains("key-0"));
-        assertTrue(toString.contains("key-1"));
-        assertTrue(toString.endsWith("}"));
-    }
-
-    private static class TestConfigContext implements ConfigurationContext{
-
-        @Override
-        public void addPropertySources(PropertySource... propertySources) {
-
-        }
-
-        @Override
-        public List<PropertySource> getPropertySources() {
-            return null;
-        }
-
-        @Override
-        public PropertySource getPropertySource(String name) {
-            return null;
-        }
-
-        @Override
-        public <T> void addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter) {
-
-        }
-
-        @Override
-        public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-            return null;
-        }
-
-        @Override
-        public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) {
-            return null;
-        }
-
-        @Override
-        public List<PropertyFilter> getPropertyFilters() {
-            return null;
-        }
-
-        @Override
-        public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
-            return null;
-        }
-
-        @Override
-        public ConfigurationContextBuilder toBuilder() {
-            return null;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueBuilderTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueBuilderTest.java b/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueBuilderTest.java
deleted file mode 100644
index cd187db..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueBuilderTest.java
+++ /dev/null
@@ -1,246 +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.spi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Test;
-
-public class PropertyValueBuilderTest {
-
-    /*
-     * Tests for PropertyValueBuilder(String)
-     */
-
-    @Test(expected = NullPointerException.class)
-    public void constructorWithSingleParameterRequiresNonNullValue() {
-        new PropertyValue(null);
-    }
-
-    /*
-     * Tests for PropertyValueBuilder(String, String)
-     */
-
-    @Test(expected = NullPointerException.class)
-    public void constructorWithTwoParametersRequiresNonNullValueForKey() {
-        new PropertyValueBuilder(null, "s");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void constructorWithTwoParametersRequiresNonNullValueForSource() {
-        new PropertyValueBuilder("a", null);
-    }
-
-    /*
-     * Tests for PropertyValueBuilder(String, String, String)
-     */
-
-    @Test(expected = NullPointerException.class)
-    public void constructorWithThreeParametersRequiresNonNullValueForSource() {
-        new PropertyValueBuilder("a", "b", null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void constructorWithThreeParametersRequiresNonNullValueForKey() {
-        new PropertyValueBuilder(null, "b", "s");
-    }
-
-    /*
-     * Tests for addMetaEntry(String, Object)
-     */
-
-    @Test(expected = NullPointerException.class)
-    public void addMetaEntryRequiresNonNullParameterForKey() {
-        new PropertyValueBuilder("a", "b", "c").addMetaEntry(null, "a");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void addMetaEntryRequiresNonNullParameterForValue() {
-        new PropertyValueBuilder("a", "b", "c").addMetaEntry("a", null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void setKeyRequiresNonNullParameterForKey() {
-        new PropertyValueBuilder("a", "b", "s").setKey(null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void setKeyRequiresNonNullParameterForValue() {
-        new PropertyValueBuilder("a", "b", "s").setValue(null);
-    }
-
-    /*
-     * Tests für addMetaEntries(Map)
-     */
-
-    @Test(expected = NullPointerException.class)
-    public void addMetaEntriesRequiresNonNullParameter() {
-        new PropertyValueBuilder("a", "b", "s").addMetaEntries(null);
-    }
-
-    @Test
-    public void testCreate1(){
-        new PropertyValueBuilder("k");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testCreate1_Null(){
-        new PropertyValueBuilder(null);
-    }
-
-    @Test
-    public void testCreate2(){
-        new PropertyValueBuilder("k", "source");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testCreate2_Null(){
-        new PropertyValueBuilder("k", null);
-    }
-
-    @Test
-    public void testKey() throws Exception {
-        PropertyValueBuilder b = new PropertyValueBuilder("k", "testKey").setValue("v");
-        PropertyValue val = b.build();
-        assertEquals(val.getKey(),"k");
-    }
-
-    @Test
-    public void testSource() throws Exception {
-        PropertyValueBuilder b = new PropertyValueBuilder("k", "testSource").setValue("v");
-        PropertyValue val = b.build();
-        assertEquals(val.getSource(),"testSource");
-    }
-
-    @Test
-    public void testValue() throws Exception {
-        PropertyValueBuilder b = new PropertyValueBuilder("k", "testValue").setValue("v");
-        PropertyValue val = b.build();
-        assertEquals(val.getValue(),"v");
-        assertNull(val.getMetaEntries().get("k"));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testKeyNullValue() throws Exception {
-        new PropertyValueBuilder(null, "testKeyNullValue");
-    }
-
-    @Test
-    public void testSetMetaEntries() throws Exception {
-        Map<String,String> meta = new HashMap<>();
-        meta.put("1","2");
-        meta.put("a", "b");
-        PropertyValue pv = PropertyValue.builder("k", "testGetKey")
-                .setValue("v")
-                .addMetaEntry("k", "v2")
-                .setMetaEntries(meta).build();
-        assertEquals("v", pv.getValue());
-        assertEquals("k", pv.getKey());
-        assertNull("v2", pv.getMetaEntry("k"));
-        assertEquals("testGetKey", pv.getSource());
-        assertEquals("2", pv.getMetaEntry("1"));
-        assertEquals("b", pv.getMetaEntry("a"));
-    }
-
-    @Test
-    public void testGetKey() throws Exception {
-        PropertyValue pv = PropertyValue.builder("k", "testGetKey").setValue("v").build();
-        assertEquals("k", pv.getKey());
-    }
-
-    @Test
-    public void testGetValue1() throws Exception {
-        PropertyValue pv = PropertyValue.of("k", "v", "testGetValue");
-        assertEquals("v", pv.getValue());
-    }
-
-    @Test
-    public void testGetValue2() throws Exception {
-        PropertyValue pv = PropertyValue.builder("k", "testGetValue").setValue("v").build();
-        assertEquals("v", pv.getValue());
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void removeMetaEntryRequiresNonNullParameter() {
-        new PropertyValueBuilder("y").removeMetaEntry(null);
-    }
-
-    @Test
-    public void testRemoveMetaEntry() throws Exception {
-        PropertyValue pv = PropertyValue.builder("k", "testGetKey")
-                .setValue("v")
-                .addMetaEntry("k", "v2")
-                .addMetaEntry("k2", "v22")
-                .removeMetaEntry("k").build();
-        assertEquals("v22", pv.getMetaEntry("k2"));
-        assertNull(pv.getMetaEntry("k"));
-    }
-
-    @Test(expected=NullPointerException.class)
-    public void testSourceNullValue() throws Exception {
-        new PropertyValueBuilder("k", null);
-    }
-
-    @Test
-    public void testGetMetaEntries() throws Exception {
-        Map<String,String> meta = new HashMap<>();
-        meta.put("1","2");
-        meta.put("a", "b");
-        PropertyValue pv = PropertyValue.builder("k", "testGetKey")
-                .setValue("v")
-                .setMetaEntries(meta).build();
-        assertEquals(meta, pv.getMetaEntries());
-    }
-
-    @Test
-    public void testSetContextData() throws Exception {
-        PropertyValueBuilder b = new PropertyValueBuilder("k", "testSetContextData").setValue("v");
-        Map<String,String> context = new HashMap<>();
-        context.put("source", "testSetContextData");
-        context.put("ts", String.valueOf(System.currentTimeMillis()));
-        context.put("y", "yValue");
-        b.setMetaEntries(new HashMap<String, String>());
-        b.setMetaEntries(context);
-        context.remove("y");
-        b.setMetaEntries(context);
-        PropertyValue contextData = b.build();
-        assertEquals(contextData.getMetaEntries().size(), context.size());
-        assertEquals(contextData.getMetaEntry("source"), "testSetContextData");
-        assertNotNull(contextData.getMetaEntry("ts"));
-        assertNull(contextData.getMetaEntry("y"));
-    }
-
-    @Test
-    public void testAddContextData() throws Exception {
-        PropertyValueBuilder b = new PropertyValueBuilder("k", "testAddContextData").setValue("v");
-        b.addMetaEntry("ts", System.currentTimeMillis());
-        b.addMetaEntry("y", "yValue");
-        b.addMetaEntry("y", "y2");
-        PropertyValue contextData = b.build();
-        assertEquals(contextData.getMetaEntries().size(), 2);
-        assertNotNull(contextData.getMetaEntry("ts"));
-        assertEquals(contextData.getMetaEntry("y"), "y2");
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueCombinationPolicyTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueCombinationPolicyTest.java b/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueCombinationPolicyTest.java
deleted file mode 100644
index c7a4698..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueCombinationPolicyTest.java
+++ /dev/null
@@ -1,89 +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.spi;
-
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class PropertyValueCombinationPolicyTest {
-
-    @Test
-    public void defaulPolicyOverridesCurrentValueByTheOneOfTheGivenProperySource() throws Exception {
-        PropertyValueCombinationPolicy policy = PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_POLICY;
-
-        PropertyValue current = PropertyValue.of("a", "AAA", "Test");
-        PropertyValue result = policy.collect(current, "a", new DummyPropertySource());
-
-        assertThat(result.getKey()).isEqualTo("a");
-        assertThat(result.getValue()).isEqualTo("Ami");
-    }
-
-    @Test
-    public void defaulPolicyOverridesKeepsTheCurrentValueIfGivenProperySourceDoesNotHaveIt() throws Exception {
-        PropertyValueCombinationPolicy policy = PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_POLICY;
-
-        PropertyValue current = PropertyValue.of("a", "AAA", "Test");
-        PropertyValue result = policy.collect(current, "a", PropertySource.EMPTY);
-
-        assertThat(result.getKey()).isEqualTo("a");
-        assertThat(result.getValue()).isEqualTo("AAA");
-        assertThat(result).isEqualTo(current);
-    }
-
-
-    static class DummyPropertySource implements PropertySource {
-        @Override
-        public int getOrdinal() {
-            return 10;
-        }
-
-        @Override
-        public String getName() {
-            return "NAME";
-        }
-
-        @Override
-        public PropertyValue get(String key) {
-            return getProperties().get(key);
-        }
-
-        @Override
-        public Map<String, PropertyValue> getProperties() {
-            PropertyValue a = PropertyValue.of("a", "Ami", "Test");
-            PropertyValue b = PropertyValue.of("b", "Big", "Test");
-
-            HashMap<String, PropertyValue> properties = new HashMap<>();
-
-            properties.put(a.getKey(), a);
-            properties.put(b.getKey(), b);
-
-            return properties;
-        }
-
-        @Override
-        public boolean isScannable() {
-            return true;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueTest.java b/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueTest.java
deleted file mode 100644
index f443f60..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/PropertyValueTest.java
+++ /dev/null
@@ -1,250 +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.spi;
-
-import org.junit.Test;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.*;
-
-@SuppressWarnings("unchecked")
-public class PropertyValueTest {
-
-    @Test(expected = NullPointerException.class)
-    public void mapThreeParameterVariantRequiresNonNullValueForConfigParameter() {
-        PropertyValue.map(null, "a", Collections.EMPTY_MAP);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void mapThreeParameterVariantRequiresNonNullValueForSource() {
-        PropertyValue.map(Collections.EMPTY_MAP, null, Collections.EMPTY_MAP);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void mapThreeParameterVariantRequiresNonNullValueForMetaData() {
-        PropertyValue.map(Collections.EMPTY_MAP, "s", null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void ofDoesNotAcceptNullAsKey() throws Exception {
-        PropertyValue.of(null, "b", "source");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void ofDoesNotAcceptNullAsSource() throws Exception {
-        PropertyValue.of("a", "b", null);
-    }
-
-    @Test
-    public void testOf(){
-        assertNotNull(PropertyValue.of("k", "v", "testGetKey"));
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void getMetaEntryRequiresNonNullValueForKey() {
-        PropertyValue.of("a", "b", "s").getMetaEntry(null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testSetMetaEntriesRequiresNonNullParameter() {
-        new PropertyValueBuilder("a").setMetaEntries(null);
-    }
-
-    @Test
-    public void testHashCode(){
-        assertEquals(PropertyValue.of("k", "v", "testGetKey").hashCode(),
-                PropertyValue.of("k", "v", "testGetKey").hashCode());
-        assertNotSame(PropertyValue.of("k", "v", "testGetKey").hashCode(),
-                PropertyValue.of("k1", "v", "testGetKey").hashCode());
-        assertNotSame(PropertyValue.of("k", "v", "testGetKey").hashCode(),
-                PropertyValue.of("k", "v1", "testGetKey").hashCode());
-        assertNotSame(PropertyValue.of("k", "v", "1").hashCode(),
-                PropertyValue.of("k", "v", "2").hashCode());
-    }
-
-    @Test
-    public void testEquals(){
-        assertEquals(PropertyValue.of("k", "v", "testEquals"),
-                PropertyValue.of("k", "v", "testEquals"));
-        assertNotSame(PropertyValue.of("k2", "v", "testEquals"),
-                PropertyValue.of("k", "v", "testEquals"));
-        assertNotSame(PropertyValue.of("k", "v", "testEquals"),
-                PropertyValue.of("k", "v2", "testEquals"));
-        assertNotSame(PropertyValue.of("k", "v", "testEquals"),
-                PropertyValue.of("k", "v", "testEquals2"));
-    }
-
-    @Test
-    public void testBuilder(){
-        assertNotNull(PropertyValue.builder("k", "testGetKey"));
-        assertEquals(PropertyValue.of("k", "v", "testEquals"),
-                PropertyValue.builder("k", "testEquals").setValue("v").build());
-    }
-
-    @Test
-    public void testToBuilder(){
-        assertNotNull(PropertyValue.of("k", "v", "testGetKey").toBuilder());
-        // round-trip
-        PropertyValue val = PropertyValue.of("k", "v", "testGetKey");
-        assertEquals(val,
-                val.toBuilder().build());
-    }
-
-    @Test
-    public void testGetKey() throws Exception {
-        PropertyValue pv = PropertyValue.of("k", "v", "testGetKey");
-        assertEquals("k", pv.getKey());
-    }
-
-    @Test
-    public void testGetValue() throws Exception {
-        PropertyValue pv = PropertyValue.of("k", "v", "testGetValue");
-        assertEquals("v", pv.getValue());
-    }
-
-    @Test
-    public void testGetSource() throws Exception {
-        PropertyValue pv = PropertyValue.of("k", "v", "testGetSource");
-        assertEquals("testGetSource", pv.getSource());
-        pv = PropertyValue.of("k", "v", "testGetSource");
-        assertEquals("testGetSource", pv.getSource());
-    }
-
-    @Test
-    public void testGetMetaEntry() throws Exception {
-        PropertyValue pv = PropertyValue.builder("k", "testGetMetaEntry").setValue("v")
-                .addMetaEntry("k", "v2").build();
-        assertEquals("v", pv.getValue());
-        assertEquals("k", pv.getKey());
-        assertEquals("v2", pv.getMetaEntry("k"));
-        assertEquals("testGetMetaEntry", pv.getSource());
-    }
-
-    @Test
-    public void testGetMetaEntries() throws Exception {
-        PropertyValue pv = PropertyValue.of("k", "v", "testGetMetaEntries");
-        assertNotNull(pv.getMetaEntries());
-        assertTrue(pv.getMetaEntries().isEmpty());
-    }
-
-    @Test
-    public void testMap() throws Exception {
-        Map<String,String> map = new HashMap<>();
-        map.put("a", "1");
-        map.put("b", "2");
-        Map<String,PropertyValue> result = PropertyValue.map(map, "source1");
-        assertNotNull(result);
-        assertEquals(map.size(), result.size());
-
-        for (Map.Entry<String,String>en:map.entrySet()) {
-            PropertyValue val = result.get(en.getKey());
-            assertNotNull(val);
-            assertEquals(val.getKey(), en.getKey());
-            assertEquals(val.getValue(), en.getValue());
-            assertEquals(val.getSource(), "source1");
-            assertTrue(val.getMetaEntries().isEmpty());
-        }
-    }
-
-    @Test
-    public void testMapWithMetadata() throws Exception {
-        Map<String,String> map = new HashMap<>();
-        map.put("a", "1");
-        map.put("b", "2");
-        Map<String,String> meta = new HashMap<>();
-        map.put("m1", "n1");
-        map.put("m2", "n2");
-        Map<String,PropertyValue> result = PropertyValue.map(map, "source1", meta);
-        assertNotNull(result);
-        assertEquals(map.size(), result.size());
-        for(Map.Entry<String,String>en:map.entrySet()){
-            PropertyValue val = result.get(en.getKey());
-            assertNotNull(val);
-            assertEquals(val.getKey(), en.getKey());
-            assertEquals(val.getValue(), en.getValue());
-            assertEquals(val.getSource(), "source1");
-            assertEquals(val.getMetaEntries(), meta);
-        }
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testInstantiateNoKey1() throws Exception {
-        PropertyValue.builder(null, "testGetKey").setValue("v").build();
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testInstantiateNoKey2() throws Exception {
-        PropertyValue.of(null, "v", "testGetKey");
-    }
-
-    @Test
-    public void testInstantiateNoValue1() throws Exception {
-        PropertyValue.builder("k", "testGetKey").build();
-    }
-
-    @Test
-    public void testInstantiateNoValue2() throws Exception {
-        PropertyValue.of("k", null, "testGetKey");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testInstantiateNoSource1() throws Exception {
-        PropertyValue.builder("k", null).setValue("v").build();
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testInstantiateNoSource2() throws Exception {
-        PropertyValue.of("k", "v", null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testGetMetaEntry_Null() throws Exception {
-        PropertyValue.of("k", "v", "src").getMetaEntry(null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void builderMethodThreeParameterVariantRequiresNonNullValueAsKey() {
-        PropertyValue.builder(null, "b", "s");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void builderMethodThreeParameterVariantRequiresNonNullValueAsSource() {
-        PropertyValue.builder("A", "b", null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void builderMethodThreeParameterVariantRequiresNonNullValueAsValue() {
-        PropertyValue.builder("A", null, "s");
-    }
-
-
-    @Test(expected = NullPointerException.class)
-    public void builderMethodTwoParameterVariantRequiresNonNullValueAsSource() {
-        PropertyValue.builder(null, "a");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void builderMethodTwoParameterVariantRequiresNonNullValueAsValue() {
-        PropertyValue.builder("A", null);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextManagerTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextManagerTest.java b/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextManagerTest.java
deleted file mode 100644
index 7379555..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextManagerTest.java
+++ /dev/null
@@ -1,90 +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.spi;
-
-import org.junit.Test;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-/**
- * Additional tests for {@link ServiceContextManager}, created by atsticks on 20.08.16.
- */
-public class ServiceContextManagerTest {
-
-    @Test
-    public void setGetServiceContext() throws Exception {
-        ServiceContext prev = ServiceContextManager.getServiceContext();
-        try {
-            MyServiceContext mine = new MyServiceContext();
-            ServiceContextManager.set(mine);
-            assertTrue(ServiceContextManager.getServiceContext() == mine);
-            ServiceContextManager.set(mine);
-            assertTrue(ServiceContextManager.getServiceContext() == mine);
-        } finally {
-            ServiceContextManager.set(prev);
-            assertTrue(ServiceContextManager.getServiceContext() == prev);
-        }
-
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void setRequiresNonNullParameter() {
-        ServiceContextManager.set(null);
-    }
-
-    private static final class MyServiceContext implements ServiceContext{
-
-        @Override
-        public int ordinal() {
-            return 0;
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceType) {
-            return null;
-        }
-
-        @Override
-        public <T> T create(Class<T> serviceType) {
-            return null;
-        }
-
-        @Override
-        public <T> List<T> getServices(Class<T> serviceType) {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public Enumeration<URL> getResources(String resource, ClassLoader cl) throws IOException {
-            return null;
-        }
-
-        @Override
-        public URL getResource(String resource, ClassLoader cl) {
-            return null;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextTest.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextTest.java b/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextTest.java
deleted file mode 100644
index 301c6ab..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/ServiceContextTest.java
+++ /dev/null
@@ -1,113 +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.spi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.*;
-
-import org.junit.Test;
-
-public class ServiceContextTest {
-
-    private final ServiceContext serviceContext = new ServiceContext(){
-
-        @Override
-        public int ordinal() {
-            return 1;
-        }
-
-        @Override
-        public <T> T getService(Class<T> serviceType) {
-            if(String.class.equals(serviceType)){
-                return serviceType.cast("ServiceContextTest");
-            }
-            return null;
-        }
-
-        @Override
-        public <T> T create(Class<T> serviceType) {
-            return getService(serviceType);
-        }
-
-        @SuppressWarnings("unchecked")
-		@Override
-        public <T> List<T> getServices(Class<T> serviceType) {
-            if(String.class.equals(serviceType)){
-                List<String> list = new ArrayList<>();
-                list.add("ServiceContextTest");
-                return List.class.cast(list);
-            }
-            return Collections.emptyList();
-        }
-
-        @Override
-        public Enumeration<URL> getResources(String resource, ClassLoader cl) throws IOException {
-            return cl.getResources(resource);
-        }
-
-        @Override
-        public URL getResource(String resource, ClassLoader cl) {
-            return cl.getResource(resource);
-        }
-    };
-
-    @Test
-    public void testOrdinal() throws Exception {
-        assertEquals(1, serviceContext.ordinal());
-    }
-
-    @Test
-    public void testgetService() throws Exception {
-        assertEquals("ServiceContextTest", serviceContext.getService(String.class));
-        assertNull(serviceContext.getService(Integer.class));
-    }
-
-    @Test
-    public void testGetService() throws Exception {
-        String service = serviceContext.getService(String.class);
-        assertNotNull(service);
-        assertEquals("ServiceContextTest", service);
-        Integer intService = serviceContext.getService(Integer.class);
-        assertNull(intService);
-    }
-
-    @Test
-    public void testGetServices() throws Exception {
-        Collection<String> services = serviceContext.getServices(String.class);
-        assertNotNull(services);
-        assertFalse(services.isEmpty());
-        assertEquals("ServiceContextTest", services.iterator().next());
-        List<Integer> intServices = serviceContext.getServices(Integer.class);
-        assertNotNull(intServices);
-        assertTrue(intServices.isEmpty());
-    }
-
-    @Test
-    public void testGetInstance() throws Exception {
-        assertNotNull(ServiceContextManager.getServiceContext());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/java/org/apache/tamaya/spi/TestServiceContext.java
----------------------------------------------------------------------
diff --git a/code/api/src/test/java/org/apache/tamaya/spi/TestServiceContext.java b/code/api/src/test/java/org/apache/tamaya/spi/TestServiceContext.java
deleted file mode 100644
index bbc3ee2..0000000
--- a/code/api/src/test/java/org/apache/tamaya/spi/TestServiceContext.java
+++ /dev/null
@@ -1,105 +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.spi;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * This class implements the (default) {@link org.apache.tamaya.spi.ServiceContext} interface and hereby uses the JDK
- * {@link java.util.ServiceLoader} to load the services required.
- */
-public final class TestServiceContext implements ServiceContext {
-    /** List current services loaded, per class. */
-    private final ConcurrentHashMap<Class<?>, List<Object>> servicesLoaded = new ConcurrentHashMap<>();
-
-    private final Map<Class<?>, Object> singletons = new ConcurrentHashMap<>();
-
-    @Override
-    public int ordinal() {
-        return 1;
-    }
-
-    @SuppressWarnings("rawtypes")
-	@Override
-    public <T> T getService(Class<T> serviceType) {
-        T cached = serviceType.cast(singletons.get(serviceType));
-        if(cached==null) {
-            cached = create(serviceType);
-            singletons.put((Class)serviceType, cached);
-        }
-        if (cached == Object.class) {
-            cached = null;
-        }
-        return cached;
-    }
-
-    @SuppressWarnings("unchecked")
-	@Override
-    public <T> T create(Class<T> serviceType) {
-        Collection<T> services = getServices(serviceType);
-        if (services.isEmpty()) {
-            return (T) Object.class; // as marker for 'nothing here'
-        }
-        else{
-            return services.iterator().next();
-        }
-    }
-
-    /**
-     * Loads and registers services.
-     *
-     * @param   <T>          the concrete type.
-     *
-     * @param   serviceType  The service type.
-     * @return  the items found, never {@code null}.
-     */
-    @Override
-    public <T> List<T> getServices(Class<T> serviceType) {
-        try {
-            List<T> services = new ArrayList<>();
-            for (T t : ServiceLoader.load(serviceType)) {
-                services.add(t);
-            }
-            services = Collections.unmodifiableList(services);
-            @SuppressWarnings("unchecked")
-			final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>)services));
-            return previousServices != null ? previousServices : services;
-        } catch (Exception e) {
-            Logger.getLogger(TestServiceContext.class.getName()).log(Level.WARNING,
-                                      "Error loading services current type " + serviceType, e);
-            return Collections.emptyList();
-        }
-    }
-
-    @Override
-    public Enumeration<URL> getResources(String resource, ClassLoader cl) throws IOException {
-        return cl.getResources(resource);
-    }
-
-    @Override
-    public URL getResource(String resource, ClassLoader cl) {
-        return cl.getResource(resource);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationProviderSpi
----------------------------------------------------------------------
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationProviderSpi b/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationProviderSpi
deleted file mode 100644
index b9c5ba5..0000000
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationProviderSpi
+++ /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.TestConfigurationProvider

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
----------------------------------------------------------------------
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext b/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
deleted file mode 100644
index 199956f..0000000
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
+++ /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.spi.TestServiceContext
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/base/src/main/java/org/apache/tamaya/base/FormatUtils.java
----------------------------------------------------------------------
diff --git a/code/base/src/main/java/org/apache/tamaya/base/FormatUtils.java b/code/base/src/main/java/org/apache/tamaya/base/FormatUtils.java
new file mode 100644
index 0000000..82c3c41
--- /dev/null
+++ b/code/base/src/main/java/org/apache/tamaya/base/FormatUtils.java
@@ -0,0 +1,47 @@
+/*
+ * 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.base;
+
+/**
+ * Some helper functions used when creating formatted text out.put.
+ */
+public final class FormatUtils {
+
+    private FormatUtils(){}
+
+    public static void appendFormatted(StringBuilder b, String text, int length) {
+        int padding;
+        if(text.length() <= (length)){
+            b.append(text);
+            padding = length - text.length();
+        }else{
+            b.append(text.substring(0, length-1));
+            padding = 1;
+        }
+        for(int i=0;i<padding;i++){
+            b.append(' ');
+        }
+    }
+
+    public static String removeNewLines(String s) {
+        return s.replace('\n', ' ').replace('\r', ' ');
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/base/src/main/java/org/apache/tamaya/spi/ConfigContextSupplier.java
----------------------------------------------------------------------
diff --git a/code/base/src/main/java/org/apache/tamaya/spi/ConfigContextSupplier.java b/code/base/src/main/java/org/apache/tamaya/spi/ConfigContextSupplier.java
new file mode 100644
index 0000000..0207ebe
--- /dev/null
+++ b/code/base/src/main/java/org/apache/tamaya/spi/ConfigContextSupplier.java
@@ -0,0 +1,47 @@
+/*
+ * 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.spi;
+
+import jdk.nashorn.internal.objects.annotations.Function;
+
+import javax.config.spi.ConfigSource;
+import javax.config.spi.Converter;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Central SPI for programmatically dealing with the setup of the configuration system.
+ * This includes adding and enlisting {@link ConfigSource}s,
+ * managing {@link Converter}s, ConfigFilters, etc.
+ */
+@FunctionalInterface
+public interface ConfigContextSupplier {
+
+    /**
+     * Make an instance of a configuration accessible for use with Apache Tamaya specific extensions.
+     * In most cases it should be sufficient to implement this interfance on your implementation of
+     * {@link javax.config.Config}.
+     *
+     * @return the corresponding configuration context, never null.
+     */
+    ConfigContext getConfigContext();
+
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/9bc56a38/code/base/src/main/java/org/apache/tamaya/spi/ConfigValueCombinationPolicy.java
----------------------------------------------------------------------
diff --git a/code/base/src/main/java/org/apache/tamaya/spi/ConfigValueCombinationPolicy.java b/code/base/src/main/java/org/apache/tamaya/spi/ConfigValueCombinationPolicy.java
new file mode 100644
index 0000000..b94dd9d
--- /dev/null
+++ b/code/base/src/main/java/org/apache/tamaya/spi/ConfigValueCombinationPolicy.java
@@ -0,0 +1,72 @@
+/*
+ * 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.spi;
+
+
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
+
+/**
+ * Policy that determines how the final value of a configuration entry is evaluated. An instances of this
+ * interface can be registered to get control how multiple PropertySources are combined. This is useful in cases
+ * where the default overriding policy as implemented in {@link #DEFAULT_OVERRIDING_POLICY} is not matching
+ * the need of the current application, e.g. then entries containing multiple values should be combined to new
+ * values instead of overridden.
+ */
+public interface ConfigValueCombinationPolicy {
+
+    /**
+     * Default overriding collector, where each existing entry ({@code current} is overridden by a subsequent non-null
+     * entry evaluated by {@code propertySource.get(key)}.
+     */
+    ConfigValueCombinationPolicy DEFAULT_OVERRIDING_POLICY = (currentValue, key, propertySource) -> {
+        String value = propertySource.getValue(key);
+        String meta = propertySource.getValue(key+"[meta]");
+        return value!=null? ConfigValue.builder(key, value).setMetaEntry(meta)
+                .build():currentValue;
+    };
+
+    /**
+     * @deprecated Use {@linkplain #DEFAULT_OVERRIDING_POLICY} instead. Will be removed in 1.0.
+     */
+    @Deprecated
+    ConfigValueCombinationPolicy DEFAULT_OVERRIDING_COLLECTOR = DEFAULT_OVERRIDING_POLICY;
+
+
+        /**
+     * Method that is called for each value evaluated by a PropertySource for the given key. This method is called
+     * either when a single key is accessed, e.g. by calling {@code org.apache.tamaya.Configuration.getXXX}, but also
+     * when the full configuration property map is accessed by calling
+     * {@link Config#getPropertyNames()}}.
+     *
+     * @param currentValue the current value, including metadata entries. If no such key is present the current value
+     *                     is null.
+     *                     The collector should either combine the existing value with value from {@code currentValue}
+     *                     or replace the value in {@code currentValue} with {@code valueRead}, hereby returning the
+     *                     result to be used as new {@code currentValue}.
+     * @param key The current key to be evaluated.
+     * @param propertySource The PropertySource that may return an value for the given key. The PropertySource given
+     *                       may be evaluated for additional meta-data, how the given values are to be combined.
+     *                       Note that the value returned by a PropertySource can be null. In that case
+     *                       {@code currentValue} should be returned in almost all cases.
+     * @return the value to be used for future evaluation, including metadata entries.
+     */
+    ConfigValue collect(ConfigValue currentValue, String key, ConfigSource propertySource);
+
+}