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/03/24 21:53:48 UTC

[2/2] incubator-tamaya-sandbox git commit: TAMAYA-260: Implemented Microprofile.io Config API, added basic tests.

TAMAYA-260: Implemented Microprofile.io Config API, added basic tests.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/commit/2852c48e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/2852c48e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/2852c48e

Branch: refs/heads/master
Commit: 2852c48e11e932d7b42ed3a09f71a8c792990bb1
Parents: 7efb64e
Author: anatole <an...@apache.org>
Authored: Fri Mar 24 22:53:34 2017 +0100
Committer: anatole <an...@apache.org>
Committed: Fri Mar 24 22:53:34 2017 +0100

----------------------------------------------------------------------
 .../microprofile/MicroprofileAdapter.java       | 182 +++++++++++++++++++
 .../tamaya/microprofile/MicroprofileConfig.java |  82 +++++++++
 .../microprofile/MicroprofileConfigBuilder.java |  84 +++++++++
 .../MicroprofileConfigProviderResolver.java     |  73 ++++++++
 .../microprofile/MicroprofileConfigSource.java  |  78 ++++++++
 .../MicroprofileConfigSourceProvider.java       |  64 +++++++
 .../microprofile/MicroprofileConverter.java     |  50 +++++
 .../microprofile/TamayaConfiguration.java       |  96 ++++++++++
 .../microprofile/TamayaPropertyConverter.java   |  48 +++++
 .../microprofile/TamayaPropertySource.java      |  76 ++++++++
 .../TamayaPropertySourceProvider.java           |  56 ++++++
 .../org/eclipse/microprofile/config/Config.java | 126 +++++++++++++
 .../microprofile/config/ConfigProvider.java     | 102 +++++++++++
 .../config/inject/ConfigProperty.java           | 112 ++++++++++++
 .../config/inject/package-info.java             |  40 ++++
 .../microprofile/config/package-info.java       |  75 ++++++++
 .../microprofile/config/spi/ConfigBuilder.java  |  83 +++++++++
 .../config/spi/ConfigProviderResolver.java      | 164 +++++++++++++++++
 .../microprofile/config/spi/ConfigSource.java   | 107 +++++++++++
 .../config/spi/ConfigSourceProvider.java        |  58 ++++++
 .../microprofile/config/spi/Converter.java      |  77 ++++++++
 .../microprofile/config/spi/package-info.java   |  30 +++
 ...croprofile.config.spi.ConfigProviderResolver |  20 ++
 .../MicroprofileConfigProviderTest.java         |  63 +++++++
 .../microprofile/MicroprofileConfigTest.java    |  89 +++++++++
 25 files changed, 2035 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileAdapter.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileAdapter.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileAdapter.java
new file mode 100644
index 0000000..29f563c
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileAdapter.java
@@ -0,0 +1,182 @@
+/*
+ * 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.microprofile;
+
+
+import org.apache.tamaya.*;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.spi.ConfigBuilder;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.Converter;
+
+import java.util.*;
+
+/**
+ * Utility class for adapting microprofile artifacts into Tamaya artifacts and vice versa.
+ */
+public final class MicroprofileAdapter{
+
+    /**
+     * Singleton constructor.
+     */
+    private MicroprofileAdapter(){}
+
+    /**
+     * Converts a Tamaya {@link Configuration} into a Microprofile.io {@Config}.
+     * @param config the Tamaya {@link Configuration} instance, not null.
+     * @return the corresponding Microprofile.io {@Config} instance, never null.
+     */
+    public static Config toConfig(Configuration config){
+        if(config instanceof TamayaConfiguration){
+            return ((TamayaConfiguration)config).getConfig();
+        }
+        return new MicroprofileConfig(config);
+    }
+
+    /**
+     * Converts a Microprofile {@link Config}s into Tamaya {@Configuration}s.
+     * @param config the Microprofile {@link Config} instance, not null.
+     * @return the corresponding Tamaya {@Configuration} instance, never null.
+     */
+    public static Configuration toConfiguration(Config config){
+        if(config instanceof MicroprofileConfig){
+            return ((MicroprofileConfig)config).getConfiguration();
+        }
+        return new TamayaConfiguration(config);
+    }
+
+    /**
+     * Converts a Tamaya {@link PropertySource}s into a Microprofile.io {@ConfigSource}.
+     * @param propertySources the Tamaya {@link PropertySource} instances, not null.
+     * @return the corresponding Microprofile.io {@ConfigSource} instance, never null.
+     */
+    public static List<ConfigSource> toConfigSources(Iterable<PropertySource> propertySources) {
+        List<ConfigSource> configSources = new ArrayList<>();
+        for(PropertySource ps:propertySources){
+            configSources.add(toConfigSource(ps));
+        }
+        return configSources;
+    }
+
+    /**
+     * Converts a Microprofile {@link ConfigSource}s into Tamaya {@PropertySource}s.
+     * @param configSources the Microprofile {@link ConfigSource} instances, not null.
+     * @return the corresponding Tamaya {@PropertySource} instances, never null.
+     */
+    public static List<PropertySource> toPropertySources(Iterable<ConfigSource> configSources) {
+        List<PropertySource> propertySources = new ArrayList<>();
+        for(ConfigSource cs:configSources){
+            propertySources.add(toPropertySource(cs));
+        }
+        return propertySources;
+    }
+
+    /**
+     * Converts a Tamaya {@link PropertySource} into a Microprofile.io {@ConfigSource}.
+     * @param propertySource the Tamaya {@link PropertySource} instance, not null.
+     * @return the corresponding Microprofile.io {@ConfigSource} instance, never null.
+     */
+    public static ConfigSource toConfigSource(PropertySource propertySource) {
+        if(propertySource instanceof TamayaPropertySource){
+            return ((TamayaPropertySource)propertySource).getConfigSource();
+        }
+        return new MicroprofileConfigSource(propertySource);
+    }
+
+    /**
+     * Converts a Microprofile {@link ConfigSource} into a Tamaya {@PropertySource}.
+     * @param configSource the Microprofile {@link ConfigSource} instance, not null.
+     * @return the corresponding Tamaya {@PropertySource} instance, never null.
+     */
+    public static PropertySource toPropertySource(ConfigSource configSource) {
+        if(configSource instanceof MicroprofileConfigSource){
+            return ((MicroprofileConfigSource)configSource).getPropertySource();
+        }
+        return new TamayaPropertySource(configSource);
+    }
+
+    /**
+     * Converts a Microprofile {@link Converter} into a Tamaya {@PropertyConverter}.
+     * @param converter the Microprofile {@link Converter} instance, not null.
+     * @return the corresponding Tamaya {@PropertyConverter} instance, never null.
+     */
+    public static <T> PropertyConverter<T> toPropertyConverter(Converter<T> converter) {
+        if(converter instanceof MicroprofileConverter){
+            return ((MicroprofileConverter)converter).getPropertyConverter();
+        }
+        return new TamayaPropertyConverter(converter);
+    }
+
+    /**
+     * Converts a Tamaya {@link PropertyConverter} into a Microprofile.io {@Converter}.
+     * @param converter the Tamaya {@link PropertyConverter} instance, not null.
+     * @return the corresponding Microprofile.io {@Converter} instance, never null.
+     */
+    public static <T> Converter<T> toConverter(PropertyConverter<T> converter) {
+        if(converter instanceof TamayaPropertyConverter){
+            return ((TamayaPropertyConverter)converter).getConverter();
+        }
+        return new MicroprofileConverter(converter);
+    }
+
+    /**
+     * Converts a Tamaya {@link ConfigurationContextBuilder} into a Microprofile.io {@ConfigBuilder}.
+     * @param builder the Tamaya {@link ConfigurationContextBuilder} instance, not null.
+     * @return the corresponding Microprofile.io {@ConfigBuilder} instance, never null.
+     */
+    public static ConfigBuilder toConfigBuilder(ConfigurationContextBuilder builder) {
+        return new MicroprofileConfigBuilder(builder);
+    }
+
+    /**
+     * Converts the given Tamaya key, value map into a corresponding String based map, hereby
+     * omitting all meta-entries.
+     * @param properties the Tamaya key, value map, not null.
+     * @return the corresponding String based map, never null.
+     */
+    public static Map<String, String> toStringMap(Map<String, PropertyValue> properties) {
+        Map<String, String> valueMap = new HashMap<>(properties.size());
+        for(Map.Entry<String,PropertyValue> en:properties.entrySet()){
+            if(en.getValue().getValue()!=null) {
+                valueMap.put(en.getKey(), en.getValue().getValue());
+            }
+        }
+        return valueMap;
+    }
+
+    /**
+     * Converts the given String based key, value map into a corresponding String,PropertyValue
+     * based map.
+     * @param properties the String based key, value map, not null.
+     * @param source the source of the entries, not null.
+     * @return the corresponding String,PropertyValue based map, never null.
+     */
+    public static Map<String, PropertyValue> toPropertyValueMap(Map<String, String> properties, String source) {
+        Map<String, PropertyValue> valueMap = new HashMap<>(properties.size());
+        for(Map.Entry<String,String> en:properties.entrySet()){
+            valueMap.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), source));
+        }
+        return valueMap;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
new file mode 100644
index 0000000..fa8d7b0
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfig.java
@@ -0,0 +1,82 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.spi.PropertySource;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+
+import java.util.*;
+
+/**
+ * Microprofile {@link ConfigSource} implementation that wraps a {@link PropertySource} instance.
+ */
+final class MicroprofileConfig implements Config {
+
+    private Configuration delegate;
+
+    MicroprofileConfig(Configuration delegate){
+        this.delegate = Objects.requireNonNull(delegate);
+    }
+
+    public Configuration getConfiguration(){
+        return this.delegate;
+    }
+
+
+    @Override
+    public <T> T getValue(String propertyName, Class<T> propertyType) {
+        T value = null;
+        try{
+            value = delegate.get(propertyName, propertyType);
+        }catch(ConfigException e){
+            if(e.toString().contains("Unparseable")){
+                throw new IllegalArgumentException("Invalid type: " + propertyType.getName());
+            }
+        }
+        if(value == null){
+            throw new NoSuchElementException("No such config property: " + propertyName);
+        }
+        return value;
+    }
+
+    @Override
+    public <T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType) {
+        return Optional.ofNullable(delegate.get(propertyName, propertyType));
+    }
+
+    @Override
+    public Iterable<String> getPropertyNames() {
+        return delegate.getProperties().keySet();
+    }
+
+    @Override
+    public Iterable<ConfigSource> getConfigSources() {
+        return MicroprofileAdapter.toConfigSources(delegate.getContext().getPropertySources());
+    }
+
+    @Override
+    public String toString() {
+        return "MicroprofileConfig{" +
+                "delegate=" + delegate +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigBuilder.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigBuilder.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigBuilder.java
new file mode 100644
index 0000000..fa46fea
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigBuilder.java
@@ -0,0 +1,84 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.spi.ConfigBuilder;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.Converter;
+
+import java.util.Objects;
+
+/**
+ * Created by atsticks on 23.03.17.
+ */
+final class MicroprofileConfigBuilder implements ConfigBuilder{
+
+    private ConfigurationContextBuilder contextBuilder;
+
+    MicroprofileConfigBuilder(ConfigurationContextBuilder contextBuilder){
+        this.contextBuilder = Objects.requireNonNull(contextBuilder);
+    }
+
+    public ConfigurationContextBuilder getConfigurationContextBuilder(){
+        return contextBuilder;
+    }
+
+    @Override
+    public ConfigBuilder addDefaultSources() {
+        contextBuilder.addDefaultPropertySources();
+        return this;
+    }
+
+    @Override
+    public ConfigBuilder forClassLoader(ClassLoader loader) {
+        return null;
+    }
+
+    @Override
+    public ConfigBuilder withSources(ConfigSource... sources) {
+        for(ConfigSource source:sources){
+            contextBuilder.addPropertySources(MicroprofileAdapter.toPropertySource(source));
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigBuilder withConverters(Converter<?>... converters) {
+        for(Converter<?> converter:converters){
+            TypeLiteral lit = TypeLiteral.of(converter.getClass());
+            TypeLiteral target = TypeLiteral.of(lit.getType());
+            contextBuilder.removePropertyConverters(target);
+            contextBuilder.addPropertyConverters(
+                    target,
+                    MicroprofileAdapter.toPropertyConverter(converter));
+        }
+        return this;
+    }
+
+    @Override
+    public Config build() {
+        return MicroprofileAdapter.toConfig(ConfigurationProvider.createConfiguration(
+                contextBuilder.build()
+        ));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigProviderResolver.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigProviderResolver.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigProviderResolver.java
new file mode 100644
index 0000000..f1d336e
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigProviderResolver.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.microprofile;
+
+import org.apache.tamaya.ConfigurationProvider;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.spi.ConfigBuilder;
+import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by atsticks on 23.03.17.
+ */
+public class MicroprofileConfigProviderResolver extends ConfigProviderResolver {
+
+    private Map<ClassLoader, Config> configs = new ConcurrentHashMap<>();
+
+    @Override
+    public Config getConfig() {
+        return getConfig(Thread.currentThread().getContextClassLoader());
+    }
+
+    @Override
+    public Config getConfig(ClassLoader loader) {
+        Config config = this.configs.get(loader);
+        if(config==null){
+            config = MicroprofileAdapter.toConfig(ConfigurationProvider.getConfiguration());
+            this.configs.put(loader, config);
+        }
+        return config;
+    }
+
+    @Override
+    public ConfigBuilder getBuilder() {
+        return new MicroprofileConfigBuilder(ConfigurationProvider.getConfigurationContextBuilder());
+    }
+
+    @Override
+    public void registerConfig(Config config, ClassLoader classLoader) {
+        if(configs.containsKey(classLoader)){
+            throw new IllegalArgumentException("Alreadsy a config registered with classloader: " + classLoader);
+        }
+        this.configs.put(classLoader, config);
+    }
+
+    @Override
+    public void releaseConfig(Config config) {
+        for(Map.Entry<ClassLoader, Config> en: this.configs.entrySet()){
+            if(en.getValue().equals(config)){
+                this.configs.remove(en.getKey());
+                return;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSource.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSource.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSource.java
new file mode 100644
index 0000000..fbb02b4
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSource.java
@@ -0,0 +1,78 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Microprofile {@link ConfigSource} implementation that wraps a {@link PropertySource} instance.
+ */
+final class MicroprofileConfigSource implements ConfigSource{
+
+    private PropertySource delegate;
+
+    MicroprofileConfigSource(PropertySource propertySource){
+        this.delegate = Objects.requireNonNull(propertySource);
+    }
+
+    public PropertySource getPropertySource(){
+        return this.delegate;
+    }
+
+    @Override
+    public int getOrdinal() {
+        return delegate.getOrdinal();
+    }
+
+    @Override
+    public String getName() {
+        return delegate.getName();
+    }
+
+    @Override
+    public String getValue(String key) {
+        PropertyValue value = delegate.get(key);
+        if(value!=null){
+            return value.getValue();
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return toMap(delegate.getProperties());
+    }
+
+    private Map<String, String> toMap(Map<String, PropertyValue> properties) {
+        Map<String, String> valueMap = new HashMap<>(properties.size());
+        for(Map.Entry<String,PropertyValue> en:properties.entrySet()){
+            if(en.getValue().getValue()!=null) {
+                valueMap.put(en.getKey(), en.getValue().getValue());
+            }
+        }
+        return valueMap;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSourceProvider.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSourceProvider.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSourceProvider.java
new file mode 100644
index 0000000..c31224f
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConfigSourceProvider.java
@@ -0,0 +1,64 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.apache.tamaya.spi.PropertyValue;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.ConfigSourceProvider;
+
+import java.util.*;
+
+/**
+ * Microprofile {@link ConfigSource} implementation that wraps a {@link PropertySource} instance.
+ */
+final class MicroprofileConfigSourceProvider implements ConfigSourceProvider{
+
+    private PropertySourceProvider delegate;
+
+    MicroprofileConfigSourceProvider(PropertySourceProvider propertySourceProvider){
+        this.delegate = Objects.requireNonNull(propertySourceProvider);
+    }
+
+    public PropertySourceProvider getPropertySourceProvider(){
+        return this.delegate;
+    }
+
+
+    private Map<String, String> toMap(Map<String, PropertyValue> properties) {
+        Map<String, String> valueMap = new HashMap<>(properties.size());
+        for(Map.Entry<String,PropertyValue> en:properties.entrySet()){
+            if(en.getValue().getValue()!=null) {
+                valueMap.put(en.getKey(), en.getValue().getValue());
+            }
+        }
+        return valueMap;
+    }
+
+    @Override
+    public Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader) {
+        if(delegate instanceof TamayaPropertySourceProvider){
+            return ((TamayaPropertySourceProvider)delegate).getConfigSourceProvider()
+                    .getConfigSources(forClassLoader);
+        }else {
+            return MicroprofileAdapter.toConfigSources(delegate.getPropertySources());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConverter.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConverter.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConverter.java
new file mode 100644
index 0000000..2ee42b7
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/MicroprofileConverter.java
@@ -0,0 +1,50 @@
+/*
+ * 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.microprofile;
+
+
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.spi.ConversionContext;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.Converter;
+
+import java.util.Objects;
+
+/**
+ * Property source implementation that wraps a Microprofile {@link ConfigSource} instance.
+ */
+final class MicroprofileConverter<T> implements Converter<T> {
+
+    private PropertyConverter<T> delegate;
+
+    MicroprofileConverter(PropertyConverter<T> delegate){
+        this.delegate = Objects.requireNonNull(delegate);
+    }
+
+    public PropertyConverter<T> getPropertyConverter(){
+        return this.delegate;
+    }
+
+    @Override
+    public T convert(String value) {
+        return delegate.convert(value, new ConversionContext.Builder("microprofile:no-key", TypeLiteral.of(
+                TypeLiteral.of(getClass()).getType())).build());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
new file mode 100644
index 0000000..8fb87cf
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaConfiguration.java
@@ -0,0 +1,96 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.ConfigOperator;
+import org.apache.tamaya.ConfigQuery;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.eclipse.microprofile.config.Config;
+
+import java.util.*;
+
+/**
+ * Created by atsticks on 23.03.17.
+ */
+class TamayaConfiguration implements Configuration{
+
+    private Config delegate;
+
+    TamayaConfiguration(Config config){
+        this.delegate = Objects.requireNonNull(config);
+    }
+
+    public Config getConfig(){
+        return delegate;
+    }
+
+    @Override
+    public String get(String key) {
+        return this.delegate.getOptionalValue(key, String.class).orElse(null);
+    }
+
+    @Override
+    public String getOrDefault(String key, String defaultValue) {
+        return this.delegate.getOptionalValue(key, String.class).orElse(defaultValue);
+    }
+
+    @Override
+    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
+        return this.delegate.getOptionalValue(key, type).orElse(defaultValue);
+    }
+
+    @Override
+    public <T> T get(String key, Class<T> type) {
+        return this.delegate.getOptionalValue(key, type).orElseThrow(
+                () -> new NoSuchElementException("Missing key: " + key));
+    }
+
+    @Override
+    public <T> T get(String key, TypeLiteral<T> type) {
+        return this.delegate.getOptionalValue(key, type.getRawType()).orElseThrow(
+                () -> new NoSuchElementException("Missing key: " + key));
+    }
+
+    @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 operator.operate(this);
+    }
+
+    @Override
+    public <T> T query(ConfigQuery<T> query) {
+        return query.query(this);
+    }
+
+    @Override
+    public ConfigurationContext getContext() {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertyConverter.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertyConverter.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertyConverter.java
new file mode 100644
index 0000000..6a33ffb
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertyConverter.java
@@ -0,0 +1,48 @@
+/*
+ * 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.microprofile;
+
+
+import org.apache.tamaya.spi.ConversionContext;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.Converter;
+
+import java.util.Objects;
+
+/**
+ * Property source implementation that wraps a Microprofile {@link ConfigSource} instance.
+ */
+final class TamayaPropertyConverter<T> implements PropertyConverter<T> {
+
+    private Converter<T> delegate;
+
+    TamayaPropertyConverter(Converter<T> delegate){
+        this.delegate = Objects.requireNonNull(delegate);
+    }
+
+    public Converter<T> getConverter(){
+        return this.delegate;
+    }
+
+    @Override
+    public T convert(String value, ConversionContext context) {
+        return delegate.convert(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySource.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySource.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySource.java
new file mode 100644
index 0000000..d67db23
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySource.java
@@ -0,0 +1,76 @@
+/*
+ * 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.microprofile;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Property source implementation that wraps a Microprofile {@link ConfigSource} instance.
+ */
+final class TamayaPropertySource implements PropertySource{
+
+    private ConfigSource delegate;
+
+    TamayaPropertySource(ConfigSource configSource){
+        this.delegate = Objects.requireNonNull(configSource);
+    }
+
+    public ConfigSource getConfigSource(){
+        return this.delegate;
+    }
+
+    @Override
+    public int getOrdinal() {
+        return delegate.getOrdinal();
+    }
+
+    @Override
+    public String getName() {
+        return delegate.getName();
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        return PropertyValue.of(key, delegate.getValue(key),getName());
+    }
+
+    @Override
+    public Map<String, PropertyValue> getProperties() {
+        return toValueMap(delegate.getProperties());
+    }
+
+    private Map<String, PropertyValue> toValueMap(Map<String, String> properties) {
+        Map<String, PropertyValue> valueMap = new HashMap<>(properties.size());
+        for(Map.Entry<String,String> en:properties.entrySet()){
+            valueMap.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), getName()));
+        }
+        return valueMap;
+    }
+
+    @Override
+    public boolean isScannable() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySourceProvider.java b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySourceProvider.java
new file mode 100644
index 0000000..8e910bb
--- /dev/null
+++ b/microprofile/src/main/java/org/apache/tamaya/microprofile/TamayaPropertySourceProvider.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.microprofile;
+
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.eclipse.microprofile.config.spi.ConfigSource;
+import org.eclipse.microprofile.config.spi.ConfigSourceProvider;
+
+import java.util.*;
+
+/**
+ * Microprofile {@link ConfigSource} implementation that wraps a {@link PropertySource} instance.
+ */
+final class TamayaPropertySourceProvider implements PropertySourceProvider{
+
+    private ConfigSourceProvider delegate;
+
+    TamayaPropertySourceProvider(ConfigSourceProvider configSourceProvider){
+        this.delegate = Objects.requireNonNull(configSourceProvider);
+    }
+
+    public ConfigSourceProvider getConfigSourceProvider(){
+        return this.delegate;
+    }
+
+
+    @Override
+    public Collection<PropertySource> getPropertySources() {
+        if(delegate instanceof MicroprofileConfigSourceProvider){
+            return ((MicroprofileConfigSourceProvider)delegate).getPropertySourceProvider()
+                    .getPropertySources();
+        }else {
+            return MicroprofileAdapter.toPropertySources(
+                    delegate.getConfigSources(Thread.currentThread().getContextClassLoader()));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/Config.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/Config.java b/microprofile/src/main/java/org/eclipse/microprofile/config/Config.java
new file mode 100644
index 0000000..6a888dd
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/Config.java
@@ -0,0 +1,126 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2011-12-28 - Mark Struberg & Gerhard Petracek
+ *      Initially authored in Apache DeltaSpike as ConfigResolver fb0131106481f0b9a8fd
+ *   2015-04-30 - Ron Smeral
+ *      Typesafe Config authored in Apache DeltaSpike 25b2b8cc0c955a28743f
+ *   2016-07-14 - Mark Struberg
+ *      Extracted the Config part out of Apache DeltaSpike and proposed as Microprofile-Config
+ *   2016-11-14 - Emily Jiang / IBM Corp
+ *      Experiments with separate methods per type, JavaDoc, method renaming
+ *
+ *******************************************************************************/
+
+package org.eclipse.microprofile.config;
+
+import java.util.Optional;
+
+import org.eclipse.microprofile.config.spi.ConfigSource;
+
+/**
+ * <p>
+ * Resolves the property value by searching through all configured
+ * {@link ConfigSource ConfigSources}. If the same property is specified in multiple
+ * {@link ConfigSource ConfigSources}, the value in the {@link ConfigSource} with the highest
+ * ordinal will be used.
+ * <p>If multiple {@link ConfigSource ConfigSources} are specified with
+ * the same ordinal, the {@link ConfigSource#getName()} will be used for sorting.
+ * 
+ * <h3>Usage</h3>
+ *
+ * For accessing the config you can use the {@link ConfigProvider}:
+ *
+ * <pre>
+ * public void doSomething(
+ *   Config cfg = ConfigProvider.getConfig();
+ *   String archiveUrl = cfg.getString("my.project.archive.endpoint", String.class);
+ *   Integer archivePort = cfg.getValue("my.project.archive.port", Integer.class);
+ * </pre>
+ *
+ * <p>It is also possible to inject the Config if a DI container is available:
+ *
+ * <pre>
+ * public class MyService {
+ *     &#064;Inject
+ *     private Config config;
+ * }
+ * </pre>
+ *
+ * <p>See {@link #getValue(String, Class)} and {@link #getOptionalValue(String, Class)} for accessing a configured value.
+ *
+ * <p>Configured values can also be accessed via injection.
+ * See {@link org.eclipse.microprofile.config.inject.ConfigProperty} for more information.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:gpetracek@apache.org">Gerhard Petracek</a>
+ * @author <a href="mailto:rsmeral@apache.org">Ron Smeral</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ * @author <a href="mailto:gunnar@hibernate.org">Gunnar Morling</a>
+ *
+ */
+public interface Config {
+
+    /**
+     * Return the resolved property value with the specified type for the
+     * specified property name from the underlying {@link ConfigSource ConfigSources}.
+     *
+     * If this method gets used very often then consider to locally store the configured value.
+     *
+     * @param <T>
+     *             the property type
+     * @param propertyName
+     *             The configuration propertyName.
+     * @param propertyType
+     *             The type into which the resolve property value should get converted
+     * @return the resolved property value as an Optional adapt the requested type.
+     * @throws IllegalArgumentException if the property cannot be converted to the specified type.
+     * @throws java.util.NoSuchElementException if the property isn't present in the configuration.
+     */
+    <T> T getValue(String propertyName, Class<T> propertyType);
+
+    /**
+     * Return the resolved property value with the specified type for the
+     * specified property name from the underlying {@link ConfigSource ConfigSources}.
+     *
+     * An empty string representation is interpreted as not-existing configuration.
+     *
+     * If this method is used very often then consider to locally store the configured value.
+     *
+     * @param <T>
+     *             the property type
+     * @param propertyName
+     *             The configuration propertyName.
+     * @param propertyType
+     *             The type into which the resolve property value should be converted
+     * @return the resolved property value as an Optional adapt the requested type.
+     *
+     * @throws IllegalArgumentException if the property cannot be converted to the specified type.
+     */
+    <T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType);
+
+    /**
+     * Return a collection adapt property names.
+     * @return the names adapt all configured keys adapt the underlying configuration.
+     */
+    Iterable<String> getPropertyNames();
+
+    /**
+     * @return all currently registered {@link ConfigSource configsources} sorted with descending ordinal and ConfigSource name
+     */
+    Iterable<ConfigSource> getConfigSources();
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/ConfigProvider.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/ConfigProvider.java b/microprofile/src/main/java/org/eclipse/microprofile/config/ConfigProvider.java
new file mode 100644
index 0000000..9a6eb8f
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/ConfigProvider.java
@@ -0,0 +1,102 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2016-07-14 - Mark Struberg
+ *      Initial revision            cf41cf130bcaf5447ff8
+ *   2016-07-20 - Romain Manni-Bucau
+ *      Initial ConfigBuilder PR    0945b23cbf9dadb75fb9
+ *   2016-11-14 - Emily Jiang / IBM Corp
+ *      SPI reworked into own ConfigProviderResolver
+ *   2016-12-02 - Viktor Klang
+ *      removed ConfigFilter and security related functionality.
+ *
+ *******************************************************************************/
+
+package org.eclipse.microprofile.config;
+
+import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
+
+/**
+ * <p>
+ * This is the central class to access a {@link Config}.
+ * A {@link Config} provides access to application Configuration.
+ * That might be auto-discovered {@code Config} or even manually created one.
+ *
+ * <p>
+ * The default usage is to use {@link #getConfig()} to automatically pick up the
+ * 'Configuration' for the Thread Context ClassLoader (See
+ * {@link Thread#getContextClassLoader()}).
+ *
+ * <p>
+ * A 'Configuration' consists adapt the information collected from the registered {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources}.
+ * These {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources} get sorted according to
+ * their <em>ordinal</em> defined via {@link org.eclipse.microprofile.config.spi.ConfigSource#getOrdinal()}.
+ * Thus it is possible to overwrite configuration by providing in a ConfigSource with higher importance from outside.
+ *
+ * <p>
+ * It is also possible to register custom {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources} to flexibly
+ * extend the configuration mechanism. An example would be to pick up
+ * configuration values from a database table.
+ *
+ * Example usage:
+ *
+ * <pre>
+ * String restUrl = ConfigProvider.getConfig().getValue(&quot;myproject.some.remote.service.url&quot;, String.class);
+ * Integer port = ConfigProvider.getConfig().getValue(&quot;myproject.some.remote.service.port&quot;, Integer.class);
+ * </pre>
+ *
+ * For more advanced use cases like e.g. registering a manually created {@link Config} please see
+ * {@link ConfigProviderResolver#registerConfig(Config, ClassLoader)} and {@link ConfigProviderResolver#getBuilder()}.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:rmannibucau@apache.org">Romain Manni-Bucau</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ * @author <a href="mailto:viktor.klang@gmail.com">Viktor Klang</a>
+ */
+public final class ConfigProvider {
+    private static final ConfigProviderResolver INSTANCE = ConfigProviderResolver.instance();
+
+    private ConfigProvider() {
+    }
+
+    /**
+     * Provide a {@link Config} based on all {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources} adapt the
+     * current Thread Context ClassLoader (TCCL)
+     * The {@link Config} will be stored for future retrieval.
+     * <p>
+     * There is exactly a single Config instance per ClassLoader
+     *
+     * @return the config object for the thread context classloader
+     */
+    public static Config getConfig() {
+        return INSTANCE.getConfig();
+    }
+
+    /**
+     * Provide a {@link Config} based on all {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources} adapt the
+     * specified ClassLoader
+     *
+     * <p>
+     * There is exactly a single Config instance per ClassLoader
+     *
+     * @param cl the specified classloader
+     * @return the config for the specified classloader
+     */
+    public static Config getConfig(ClassLoader cl) {
+        return INSTANCE.getConfig(cl);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/inject/ConfigProperty.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/inject/ConfigProperty.java b/microprofile/src/main/java/org/eclipse/microprofile/config/inject/ConfigProperty.java
new file mode 100644
index 0000000..9d60ed0
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/inject/ConfigProperty.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2016-2017 Payara Services Ltd., IBM Corp. and others
+ *
+ * Licensed 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.eclipse.microprofile.config.inject;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+
+/**
+ * Binds the injection point with a configured value.
+ * Can be used to annotate injection points adapt type {@code TYPE}, {@code Optional<TYPE>} or {@code javax.inject.Provider<TYPE>},
+ * where {@code TYPE} can be {@code String} and all types which have appropriate converters. 
+ *
+ * <h2>Examples</h2>
+ *
+ * <h3>Injecting Native Values</h3>
+ *
+ * The first sample injects the configured value adapt the {@code my.long.property} property.
+ * The injected value does not change even if the underline
+ * property value changes in the {@link org.eclipse.microprofile.config.Config}.
+ * If no configured value exists for this property and no {@link #defaultValue()} is provided,
+ * a {@code DeplymentException} will be thrown during startup.
+ *
+ * <p>Injecting a native value is recommended for a property that does not change at runtime or used by a bean with RequestScoped.
+ * <p>A further recommendation is to use the built in {@code META-INF/microprofile-config.properties} file mechanism
+ * to provide default values inside an Application.
+ * <pre>
+ * &#064;Inject
+ * &#064;ConfigProperty(name="my.long.property", defaultValue="123")
+ * private Long injectedLongValue;
+ * </pre>
+ *
+ * <h3>Injecting Optional Values</h3>
+ *
+ * The following code injects an Optional value adapt my.long.property property.
+ * Countrary to natively injecting the configured value this will not lead to a DeploymentException if the configured value is missing.
+ * <pre>
+ * &#064;Inject
+ * &#064;ConfigProperty(name = "my.optional.int.property")
+ * private Optional&lt;Integer&gt; intConfigValue;
+ * </pre>
+ *
+ * <h3>Injecting Dynamic Values</h3>
+ *
+ * The next sample injects a Provider for the value adapt my.long.property property to resolve the property dynamically.
+ * Each invocation to {@code Provider#get()} will resolve the latest value from underlying {@link org.eclipse.microprofile.config.Config} again.
+ * The existence adapt configured values will get checked during startup.
+ * Instances adapt {@code Provider<T>} are guaranteed to be Serializable.
+ * <pre>
+ * &#064;Inject
+ * &#064;ConfigProperty(name = "my.long.property" defaultValue="123")
+ * private Provider&lt;Long&gt; longConfigValue;
+ * </pre>
+ *
+ * <p>If {@code ConfigProperty} is used with a type where no {@link org.eclipse.microprofile.config.spi.Converter} exists,
+ * a deployment error is thrown.
+ *
+ * @author Ondrej Mihalyi
+ * @author Emily Jiang
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ */
+@Qualifier
+@Retention(RUNTIME)
+@Target({METHOD, FIELD, PARAMETER, TYPE})
+public @interface ConfigProperty {
+    /**
+     * The key adapt the config property used to look up the configuration value.
+     * If it is not specified, it will be derived automatically as {@code <class_name>.<injetion_point_name>},
+     * where {@code injection_point_name} is the field name or parameter name,
+     * {@code class_name} is the fully qualified name adapt the class being injected to with the first letter decaptialised.
+     * If one adapt the {@code class_name} or {@code injection_point_name} cannot be determined, the value has to be provided.
+     * 
+     * @return Name (key) adapt the config property to inject
+     */
+    @Nonbinding
+    String name() default "";
+
+    /**
+     * <p>The default value if the configured property value does not exist.
+     *
+     * <p>If the target Type is not String a proper {@link org.eclipse.microprofile.config.spi.Converter} will get applied.
+     * That means that any default value string should follow the formatting rules adapt the registered Converters.
+     *
+     * <p>If
+     * @return the default value as a string
+     */
+    @Nonbinding
+    String defaultValue() default "";
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/inject/package-info.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/inject/package-info.java b/microprofile/src/main/java/org/eclipse/microprofile/config/inject/package-info.java
new file mode 100644
index 0000000..e556eb2
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/inject/package-info.java
@@ -0,0 +1,40 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016-2017 Mark Struberg. and others
+ *
+ * Licensed 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.
+ *
+ *******************************************************************************/
+
+/**
+ * <p>CDI Support for Microprofile Config
+ *
+ * <p>Microprofile Config also supports injection via a JSR-330 DI container:
+ * <pre>
+ *  &#064;Inject
+ *  &#064;ConfigProperty(name="myproject.some.endpoint.url");
+ *  private String restUrl;
+ * </pre>
+ *
+ * <p>The following types can be injected:
+ * <ul>
+ *     <li><code>T</code> where T is a Type where a {@link org.eclipse.microprofile.config.spi.Converter} exists.</li>
+ *     <li><code>Optional&lt;T&gt;</code> where T is a Type where a {@link org.eclipse.microprofile.config.spi.Converter} exists.</li>
+ *     <li><code>Provider&lt;T&gt;</code> where T is a Type where a {@link org.eclipse.microprofile.config.spi.Converter} exists.</li>
+ * </ul>
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @version 1.0
+ */
+package org.eclipse.microprofile.config.inject;
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/package-info.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/package-info.java b/microprofile/src/main/java/org/eclipse/microprofile/config/package-info.java
new file mode 100644
index 0000000..6f4378d
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/package-info.java
@@ -0,0 +1,75 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ *******************************************************************************/
+
+/**
+ * <p>Configuration for Java Microprofile
+ *
+ * <h2>Rational</h2>
+ *
+ * <p>For many project artifacts (e.g. WAR, EAR) it should be possible to build them only once
+ * and then install them at different customers, stages, etc.
+ * They need to target those different execution environments without the necessity adapt any repackaging.
+ * In other words: depending on the situation they need different configuration.
+ *
+ * <p>This is easily achievable by having a set adapt default configuration values inside the project artifact.
+ * But be able to overwrite those default values from external.
+ *
+ * <h2>How it works</h2>
+ *
+ * <p>A 'Configuration' consists adapt the information collected from the registered
+ * {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources}.
+ * These {@code ConfigSources} get sorted according to their <i>ordinal</i>.
+ * That way it is possible to overwrite configuration with lower importance from outside.
+ *
+ * <p>By default there are 3 ConfigSources:
+ *
+ * <ul>
+ * <li>{@code System.getenv()} (ordinal=400)</li>
+ * <li>{@code System.getProperties()} (ordinal=300)</li>
+ * <li>all {@code META-INF/microprofile-config.properties} files on the ClassPath.
+ *  (ordinal=100, separately configurable via a config_ordinal property inside each file)</li>
+ * </ul>
+ *
+ * <p>That means that one can put the default configuration in a {@code META-INF/microprofile-config.properties} anywhere on the classpath.
+ * and the Operations team can later simply e.g set a system property to change this default configuration.
+ *
+ * <p>It is adapt course also possible to register own {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources}.
+ * A {@code ConfigSource} could e.g. read configuration values from a database table, a remote server, etc
+ *
+ *  <h2>Accessing and Using the Configuration</h2>
+ *
+ *  <p> The configuration adapt an application is represented by an instance adapt {@link org.eclipse.microprofile.config.Config}.
+ *  The {@link org.eclipse.microprofile.config.Config} can be accessed via the {@link org.eclipse.microprofile.config.ConfigProvider}.
+ *
+ *  <pre>
+ *  Config config = ConfigProvider#getConfig();
+ *  String restUrl = config.getValue("myproject.some.endpoint.url", String.class);
+ *  </pre>
+ *
+ *  <p> Of course we also support injection via a JSR-330 DI container:
+ *  <pre>
+ *  &#064;Inject
+ *  &#064;ConfigProperty(name="myproject.some.endpoint.url");
+ *  private String restUrl;
+ *  </pre>
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @version 1.0
+ */
+package org.eclipse.microprofile.config;
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigBuilder.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigBuilder.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigBuilder.java
new file mode 100644
index 0000000..00e8b5a
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigBuilder.java
@@ -0,0 +1,83 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016-2017 Romain Manni-Bucau and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2016-07-20 - Romain Manni-Bucau
+ *      Initial ConfigBuilder PR    0945b23cbf9dadb75fb9
+ *   2016-07-17 - Mark Struberg
+ *      Merged and JavaDoc          c8525998a43fe798f367
+ *   2016-11-14 - Emily Jiang / IBM
+ *      API improvements + JavaDoc  f53258b8eca1253fee52
+ *
+ *******************************************************************************/
+package org.eclipse.microprofile.config.spi;
+
+import org.eclipse.microprofile.config.Config;
+
+/**
+ * Builder for manually creating an instance adapt a {@code Config}.
+ *
+ * @see ConfigProviderResolver#getBuilder()
+ *
+ * @author <a href="mailto:rmannibucau@apache.org">Romain Manni-Bucau</a>
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ */
+public interface ConfigBuilder {
+    /**
+     * Add the default config sources appearing on the builder's classpath
+     * including:
+     * <ol>
+     * <li>System properties</li>
+     * <li>Environment properties</li>
+     * <li>/META-INF/microprofile-config.properties</li>
+     * </ol>
+     *
+     * @return the ConfigBuilder with the default config sources
+     */
+    ConfigBuilder addDefaultSources();
+
+    /**
+     * Return the ConfigBuilder for a given classloader
+     *
+     * @param loader the specified classloader
+     * @return the ConfigureBuilder for the given classloader
+     */
+    ConfigBuilder forClassLoader(ClassLoader loader);
+
+    /**
+     * Add the specified {@link ConfigSource}.
+     *
+     * @param sources the config sources
+     * @return the ConfigBuilder with the configured sources
+     */
+    ConfigBuilder withSources(ConfigSource... sources);
+
+    /**
+     * Add the specified {@link Converter}
+     *
+     * @param converters the converters
+     * @return the ConfigBuilder with the added converters
+     */
+    ConfigBuilder withConverters(Converter<?>... converters);
+
+    /**
+     * Build the {@link Config} object.
+     *
+     * @return the Config object
+     */
+    Config build();
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigProviderResolver.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigProviderResolver.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigProviderResolver.java
new file mode 100644
index 0000000..1c0ab34
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigProviderResolver.java
@@ -0,0 +1,164 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.eclipse.microprofile.config.spi;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ServiceLoader;
+
+import org.eclipse.microprofile.config.Config;
+
+/**
+ * This class is not intended to be used by end-users but for
+ * portable container integration purpose only.
+ *
+ * Service provider for ConfigProviderResolver. The implementation registers
+ * itself via the {@link java.util.ServiceLoader} mechanism.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:rmannibucau@apache.org">Romain Manni-Bucau</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ */
+public abstract class ConfigProviderResolver {
+    protected ConfigProviderResolver() {
+    }
+
+    private static volatile ConfigProviderResolver instance = null;
+
+    /**
+     * @see org.eclipse.microprofile.config.ConfigProvider#getConfig()
+     * @return config the config object for the Thread Context Classloader
+     */
+    public abstract Config getConfig();
+
+    /**
+     * @see org.eclipse.microprofile.config.ConfigProvider#getConfig(ClassLoader)
+     * @param loader the classloader
+     * @return config the config object for the specified classloader
+     */
+    public abstract Config getConfig(ClassLoader loader);
+
+    /**
+     * Create a fresh {@link ConfigBuilder} instance. This ConfigBuilder will
+     * initially contain no {@link ConfigSource} but with default {@link Converter Converters} 
+     * The other {@link ConfigSource} and {@link Converter Converters} will have to be added manually.
+     *
+     * The ConfigProvider will not manage the Config instance internally
+     * @return the configbuilder with the default converters
+     */
+    public abstract ConfigBuilder getBuilder();
+
+    /**
+     * Register a given {@link Config} within the Application (or Module) identified by the given ClassLoader.
+     * If the ClassLoader is {@code null} then the current Application will be used.
+     *
+     * @param config
+     *          which should get registered
+     * @param classLoader
+     *          which identifies the Application or Module the given Config should get associated with.
+     *
+     * @throws IllegalStateException
+     *          if there is already a Config registered within the Application.
+     *          A user could explicitly use {@link #releaseConfig(Config)} for this case.
+     */
+    public abstract void registerConfig(Config config, ClassLoader classLoader);
+
+    /**
+     * A {@link Config} normally gets released if the Application it is associated with gets destroyed.
+     * Invoke this method if you like to destroy the Config prematurely.
+     *
+     * If the given Config is associated within an Application then it will be unregistered.
+     * @param config the config to be released
+     */
+    public abstract void releaseConfig(Config config);
+
+    /**
+     * Creates a ConfigProviderResolver object
+     * Only used internally from within {@link org.eclipse.microprofile.config.ConfigProvider}
+     * @return ConfigProviderResolver an instance adapt ConfigProviderResolver
+     */
+    public static ConfigProviderResolver instance() {
+        if (instance == null) {
+            synchronized (ConfigProviderResolver.class) {
+                if (instance != null) {
+                    return instance;
+                }
+
+                ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+                    @Override
+                    public ClassLoader run() {
+                        return Thread.currentThread().getContextClassLoader();
+                    }
+                });
+                if (cl == null) {
+                    cl = ConfigProviderResolver.class.getClassLoader();
+                }
+
+                ConfigProviderResolver newInstance = loadSpi(cl);
+
+                if (newInstance == null) {
+                    throw new IllegalStateException(
+                                    "No ConfigProviderResolver implementation found!");
+                }
+
+                instance = newInstance;
+            }
+        }
+
+        return instance;
+    }
+
+
+    private static ConfigProviderResolver loadSpi(ClassLoader cl) {
+        if (cl == null) {
+            return null;
+        }
+
+        // start from the root CL and go back down to the TCCL
+        ConfigProviderResolver instance = loadSpi(cl.getParent());
+
+        if (instance == null) {
+            ServiceLoader<ConfigProviderResolver> sl = ServiceLoader.load(
+                            ConfigProviderResolver.class, cl);
+            for (ConfigProviderResolver spi : sl) {
+                if (instance != null) {
+                    throw new IllegalStateException(
+                                    "Multiple ConfigResolverProvider implementations found: "
+                                                    + spi.getClass().getName() + " and "
+                                                    + instance.getClass().getName());
+                } 
+                else {
+                    instance = spi;
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * Set the instance. It is used by OSGi environment while service loader
+     * pattern is not supported.
+     *
+     * @param resolver
+     *            set the instance.
+     */
+    public static void setInstance(ConfigProviderResolver resolver) {
+        instance = resolver;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSource.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSource.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSource.java
new file mode 100644
index 0000000..5d5fb41
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSource.java
@@ -0,0 +1,107 @@
+/*
+ ******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2009       - Mark Struberg
+ *      Ordinal solution in Apache OpenWebBeans
+ *   2011-12-28 - Mark Struberg & Gerhard Petracek
+ *      Contributed to Apache DeltaSpike fb0131106481f0b9a8fd
+ *   2016-07-14 - Mark Struberg
+ *      Extracted the Config part out of DeltaSpike and proposed as Microprofile-Config cf41cf130bcaf5447ff8
+ *   2016-11-14 - Emily Jiang / IBM Corp
+ *      Methods renamed, JavaDoc and cleanup
+ *
+ *******************************************************************************/
+package org.eclipse.microprofile.config.spi;
+
+import java.util.Map;
+
+/**
+ * <p>Implement this interfaces to provide a ConfigSource.
+ * A ConfigSource provides configuration values from a specific place, like JNDI configuration, a properties file, etc.
+ * A ConfigSource is always read-only, any potential updates adapt the configured values must be handled directly inside each ConfigSource.
+ *
+ * <p>
+ * The default config sources always available by default are:
+ * <ol>
+ * <li>System properties (ordinal=400)</li>
+ * <li>Environment properties (ordinal=300)</li>
+ * <li>/META-INF/microprofile-config.properties (ordinal=100)</li>
+ * </ol>
+ * 
+ * <p>Custom ConfigSource will get picked up via the {@link java.util.ServiceLoader} mechanism and and can be registered by
+ * providing a file
+ * <pre>
+ *     META-INF/services/javax.config.spi.ConfigSource
+ * </pre>
+ * which contains the fully qualified {@code ConfigSource} implementation class name as content.
+ *
+ * <p>Adding a dynamic amount adapt custom config sources can be done programmatically via
+ * {@link org.eclipse.microprofile.config.spi.ConfigSourceProvider}.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:gpetracek@apache.org">Gerhard Petracek</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ *
+ */
+public interface ConfigSource {
+    /**
+     * Return the properties in this config source
+     * @return the map containing the properties in this config source
+     */
+    Map<String, String> getProperties();
+
+    /**
+     * Return the ordinal for this config source. If a property is specified in multiple config sources, the value
+     * in the config source with the highest ordinal takes precedence.
+     * For the config sources with the same ordinal value, the config source names will
+     * be used for sorting according to string sorting criteria.
+     * Note that this property only gets evaluated during ConfigSource discovery.
+     *
+     * The ordinal for the default config sources:
+     * <ol>
+     *  <li>System properties (ordinal=400)</li>
+     *  <li>Environment properties (ordinal=300)</li>
+     *  <li>/META-INF/microprofile-config.properties (ordinal=100)</li>
+     * </ol>
+     *
+     *
+     * Any ConfigSource part adapt an application will typically use an ordinal between 0 and 200.
+     * ConfigSource provided by the container or 'environment' typically use an ordinal higher than 200.
+     * A framework which intends have values overwritten by the application will use ordinals between 0 and 100.
+     * The property "config_ordinal" can be specified to override the default value.
+     * 
+     * @return the ordinal value
+     */
+    default int getOrdinal() {
+        return 100;
+    }
+
+    /**
+     * Return the value for the specified property in this config source.
+     * @param propertyName the property name
+     * @return the property value
+     */
+    String getValue(String propertyName);
+
+    /**
+     * The name adapt the config might be used for logging or analysis adapt configured values.
+     *
+     * @return the 'name' adapt the configuration source, e.g. 'property-file mylocation/myproperty.properties'
+     */
+    String getName();
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSourceProvider.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSourceProvider.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSourceProvider.java
new file mode 100644
index 0000000..be1fc59
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/ConfigSourceProvider.java
@@ -0,0 +1,58 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2011-12-28 - Mark Struberg & Gerhard Petracek
+ *      Initially authored in Apache DeltaSpike fb0131106481f0b9a8fd
+ *   2016-07-14 - Mark Struberg
+ *      Extracted the Config part out of Apache DeltaSpike and proposed as Microprofile-Config
+ *   2016-11-14 - Emily Jiang / IBM Corp
+ *      Methods renamed, JavaDoc and cleanup
+ *
+ *******************************************************************************/
+
+package org.eclipse.microprofile.config.spi;
+
+/**
+ * <p>Implement this interfaces to provide multiple ConfigSources.
+ * This is e.g. needed if there are multiple property files adapt a given name on the classpath
+ * but they are not all known at compile time.
+ *
+ * <p>If a single ConfigSource exists, then there is no need
+ * to register it using a custom implementation adapt ConfigSourceProvider, it can be
+ * registered directly as a {@link ConfigSource}.
+ *
+ * <p>A ConfigSourceProvider will get picked up via the
+ * {@link java.util.ServiceLoader} mechanism and can be registered by providing a
+ * {@code META-INF/services/javax.config.spi.ConfigSourceProvider} file which contains
+ * the fully qualified classname adapt the custom ConfigSourceProvider.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:gpetracek@apache.org">Gerhard Petracek</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ *
+ */
+public interface ConfigSourceProvider {
+
+    /**
+     * Return the collection adapt {@link ConfigSource}s.
+     * For each e.g. property file, we return a single ConfigSource or an empty list if no ConfigSource exists.
+     *
+     * @param forClassLoader the classloader which should be used if any is needed
+     * @return the {@link ConfigSource ConfigSources} to register within the {@link org.eclipse.microprofile.config.Config}.
+     */
+    Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/Converter.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/Converter.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/Converter.java
new file mode 100644
index 0000000..dc81a49
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/Converter.java
@@ -0,0 +1,77 @@
+/*
+ ********************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ * Contributors:
+ *   2015-04-30 - Ron Smeral
+ *      Initially authored in Apache DeltaSpike 25b2b8cc0c955a28743f
+ *   2016-07-14 - Mark Struberg
+ *      JavaDoc + priority
+ *   2016-12-01 - Emily Jiang / IBM Corp
+ *      Marking as FunctionalInterface + JavaDoc + additional types
+ *
+ *******************************************************************************/
+
+package org.eclipse.microprofile.config.spi;
+
+/**
+ * <p>Interface for converting configured values from String to any Java type.
+ **
+ * <p>Converters for the following types are provided by default:
+ * <ul>
+ *     <li>{@code Boolean}, values for {@code true}: (case insensitive)
+ *     &quot;true&quot;, &quot;yes&quot;, &quot;Y&quot;, &quot;on&quot;, &quot;1&quot;</li>
+ *     <li>{@code Integer}</li>
+ *     <li>{@code Long}</li>
+ *     <li>{@code Float}, a dot '.' is used to separate the fractional digits</li>
+ *     <li>{@code Double}, a dot '.' is used to separate the fractional digits</li>
+ *     <li>{@code java.time.Duration} as defined in {@link java.time.Duration#parse(CharSequence)}</li>
+ *     <li>{@code java.time.LocalDateTime} as defined in {@link java.time.LocalDateTime#parse(CharSequence)}</li>
+ *     <li>{@code java.time.LocalDate} as defined in {@link java.time.LocalDate#parse(CharSequence)}</li>
+ *     <li>{@code java.time.LocalTime} as defined in {@link java.time.LocalTime#parse(CharSequence)}</li>
+ *     <li>{@code OffsetDateTime} as defined in {@link java.time.OffsetDateTime#parse(CharSequence)}</li>
+ *     <li>{@code OffsetTime} as defined in {@link java.time.OffsetTime#parse(CharSequence)}</li>
+ *     <li>{@code Date} in various ISO-8601 formats.
+ *          'yyyy-MM-dd', 'yyyy-MM-ddThh:mm:ss' (timezone from current Locale), 'yyyy-MM-ddThh:mm:ssZ',
+ *          'yyyy-MM-ddThh:mm:ss�hh:mm' (time zone designator)
+ *          missing information is set to 0.</li>
+ *     <li>{@code Instant}</li>
+ *
+ * </ul>
+ *
+ * <p>Custom Converters will get picked up via the {@link java.util.ServiceLoader} mechanism and and can be registered by
+ * providing a file<br>
+ * <code>META-INF/services/org.eclipse.microprofile.config.spi.Converter</code><br>
+ * which contains the fully qualified {@code Converter} implementation class name as content.
+ *
+ * <p>A Converter can specify a {@link javax.annotation.Priority}.
+ * If no priority is explicitly assigned, the value adapt 100 is assumed.
+ * If multiple Converters are registered for the same type, the one with the highest priority will be used.
+ *
+ * @author <a href="mailto:rsmeral@apache.org">Ron Smeral</a>
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @author <a href="mailto:emijiang@uk.ibm.com">Emily Jiang</a>
+ */
+@FunctionalInterface
+public interface Converter<T> {
+    /**
+     * Configure the string value to a specified type
+     * @param value the string representation adapt a property value
+     * @return the converted value
+     *
+     * @throws IllegalArgumentException if the value cannot be converted to the specified type.
+     */
+    T convert(String value);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/2852c48e/microprofile/src/main/java/org/eclipse/microprofile/config/spi/package-info.java
----------------------------------------------------------------------
diff --git a/microprofile/src/main/java/org/eclipse/microprofile/config/spi/package-info.java b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/package-info.java
new file mode 100644
index 0000000..0d0081a
--- /dev/null
+++ b/microprofile/src/main/java/org/eclipse/microprofile/config/spi/package-info.java
@@ -0,0 +1,30 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2016 IBM Corp. and others
+ *
+ * Licensed 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.
+ *
+ *******************************************************************************/
+
+/**
+ * <p>This package contains classes which are used to extens the standard functionality in a portable way.
+ * <p>A user can provide own {@link org.eclipse.microprofile.config.spi.ConfigSource ConfigSources} and
+ * {@link org.eclipse.microprofile.config.spi.Converter Converters} to extend the information available in the Config.
+ *
+ * <p>The package also contains the class {@link org.eclipse.microprofile.config.spi.ConfigProviderResolver}
+ * which is used to pick up the actual implementation.
+ *
+ * @author <a href="mailto:struberg@apache.org">Mark Struberg</a>
+ * @version 1.0
+ */
+package org.eclipse.microprofile.config.spi;