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 2016/12/12 16:13:08 UTC

[5/5] incubator-tamaya-sandbox git commit: Added tests for OSGI support, simplified OSGI support. Implemented base functionality for metamodel support, including first testing.

Added tests for OSGI support, simplified OSGI support.
Implemented base functionality for metamodel support, including first testing.


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/afc19d0e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/tree/afc19d0e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/diff/afc19d0e

Branch: refs/heads/master
Commit: afc19d0e74cde66603dc3d440d6799b917efb815
Parents: f0dfa86
Author: anatole <an...@apache.org>
Authored: Mon Dec 12 17:12:06 2016 +0100
Committer: anatole <an...@apache.org>
Committed: Mon Dec 12 17:12:06 2016 +0100

----------------------------------------------------------------------
 metamodel/pom.xml                               |   7 +
 .../org/apache/tamaya/metamodel/Context.java    | 171 -----
 .../metamodel/FilteredPropertySource.java       | 166 +++++
 .../tamaya/metamodel/MetaConfiguration.java     | 144 ++++
 .../apache/tamaya/metamodel/MetaContext.java    | 330 ++++++++++
 .../apache/tamaya/metamodel/Refreshable.java    |  32 +
 .../metamodel/RefreshablePropertySource.java    | 150 +++++
 .../RefreshablePropertySourceProvider.java      | 106 +++
 .../tamaya/metamodel/dsl/MetaConfiguration.java | 122 ----
 .../metamodel/dsl/TamayaConfigurator.java       | 234 -------
 .../metamodel/dsl/WrappedPropertySource.java    | 127 ----
 .../DSLLoadingConfigurationProviderSpi.java     |  81 ---
 .../NamedDSLPropertySourceProvider.java         |  53 --
 .../ResourceDSLPropertySourceProvider.java      |  82 ---
 .../internal/CombinationPolicyReader.java       |  61 ++
 .../internal/ComponentConfigurator.java         |  87 +++
 .../metamodel/internal/ComponentFactory.java    | 112 ++++
 .../metamodel/internal/ContextReader.java       |  66 ++
 .../DSLLoadingConfigurationProviderSpi.java     | 114 ++++
 ...efaultRefreshablePropertySourceProvider.java |  72 --
 .../metamodel/internal/FactoryManager.java      | 140 ----
 .../internal/PropertyConverterReader.java       |  88 +++
 .../internal/PropertyFilterOrderingReader.java  |  63 ++
 .../internal/PropertyFilterReader.java          |  83 +++
 .../internal/PropertySourceOrderingReader.java  |  64 ++
 .../internal/PropertySourceReader.java          | 103 +++
 .../tamaya/metamodel/internal/Refreshable.java  |  37 --
 .../tamaya/metamodel/internal/SourceConfig.java | 466 ++++++-------
 .../internal/factories/CLIArgumentsFactory.java |  47 ++
 .../factories/EnvPropertiesFactory.java         |  46 ++
 .../factories/FilePropertySourceFactory.java    |  77 +++
 .../ResourcePropertySourceFactory.java          |  64 ++
 .../ResourcePropertySourceProviderFactory.java  | 115 ++++
 .../factories/SysPropertiesFactory.java         |  46 ++
 .../factories/URLPropertySourceFactory.java     | 152 +++++
 .../tamaya/metamodel/spi/ItemFactory.java       |  51 ++
 .../metamodel/spi/ItemFactoryManager.java       | 145 ++++
 .../metamodel/spi/MetaConfigurationReader.java  |   8 +-
 .../metamodel/spi/PropertySourceFactory.java    |  48 --
 .../spi/PropertySourceProviderFactory.java      |  49 --
 ...maya.metamodel.spi.DSLPropertySourceProvider |  20 -
 .../org.apache.tamaya.metamodel.spi.ItemFactory |  26 +
 ...tamaya.metamodel.spi.MetaConfigurationReader |  26 +
 ...g.apache.tamaya.spi.ConfigurationProviderSpi |   3 +-
 .../resources/IntegrationTests/empty-config.xml |  24 +
 metamodel/src/test/resources/tamaya-config.xml  |  73 ++-
 pom.xml                                         | 657 ++++++++++++++++++-
 47 files changed, 3529 insertions(+), 1509 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/pom.xml
----------------------------------------------------------------------
diff --git a/metamodel/pom.xml b/metamodel/pom.xml
index 13c5c47..a103441 100644
--- a/metamodel/pom.xml
+++ b/metamodel/pom.xml
@@ -71,6 +71,13 @@
             <artifactId>tamaya-formats</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-resources</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
         <!--<dependency>-->
             <!--<groupId>org.apache.tamaya.ext</groupId>-->
             <!--<artifactId>tamaya-json</artifactId>-->

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/Context.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/Context.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/Context.java
deleted file mode 100644
index b4b65d2..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/Context.java
+++ /dev/null
@@ -1,171 +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.metamodel;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Class managing the configuration system's shared context. This
- * context is used by the configuration system to evaluate the
- * right properties, e.g. by defining the current stage or labels
- * that apply to the current configuration.
- */
-public final class Context {
-
-    private static final ThreadLocal<Context> THREAD_CONTEXT = new ThreadLocal<Context>(){
-        @Override
-        protected Context initialValue() {
-            return new Context();
-        }
-    };
-
-    private final Map<String,String> properties = new ConcurrentHashMap<>();
-
-    /**
-     * Access the thread-based context. If no such context
-     * exists a new one will be created.
-     * @return the corresponding context, never null.
-     */
-    public static Context getThreadInstance(){
-        return THREAD_CONTEXT.get();
-    }
-
-    /**
-     * Access the current context, which actually is the current context, combined with the thread based
-     * context (overriding).
-     * @return the corresponding context, never null.
-     */
-    public Context getCurrentInstance(){
-        return this.combineWith(THREAD_CONTEXT.get());
-    }
-
-    /**
-     * Combine this context with the other contexts given.
-     * @param contexts the context to merge with this context.
-     * @return the newly created Context.
-     */
-    public Context combineWith(Context... contexts) {
-        Context newContext = new Context();
-        newContext.properties.putAll(getProperties());
-        for(Context ctx:contexts) {
-            newContext.properties.putAll(ctx.getProperties());
-        }
-        return newContext;
-    }
-
-    /**
-     * Access the given context property.
-     * @param key the key, not null
-     * @return the value, or null.
-     */
-    public String getProperty(String key){
-        return getProperty(key, null);
-    }
-
-    /**
-     * Access the given context property.
-     * @param key the key, not the default value.
-     * @param defaultValue the default value to be returned, if no value is defined.
-     * @return the value, default value or null.
-     */
-    public String getProperty(String key, String defaultValue){
-        String value = this.properties.get(key);
-        if(value==null){
-            return defaultValue;
-        }
-        return value;
-    }
-
-    /**
-     * Sets the given context property.
-     * @param key the key, not null.
-     * @param value the value, not null.
-     * @return the porevious value, or null.
-     */
-    public String setProperty(String key, String value){
-       return this.properties.put(key,value);
-    }
-
-    /**
-     * Sets the given property unless there is already a value defined.
-     * @param key the key, not null.
-     * @param value the value, not null.
-     */
-    public void setPropertyIfAbsent(String key, String value){
-        String prev = this.properties.get(key);
-        if(prev==null){
-            this.properties.put(key, prev);
-        }
-    }
-
-    /**
-     * Adds all properties given, overriding any existing properties.
-     * @param properties the properties, not null.
-     */
-    public void setProperties(Map<String,String> properties){
-        this.properties.putAll(properties);
-    }
-
-    /**
-     * Checks if all the given properties are present.
-     * @param keys the keys to check, not null.
-     * @return true, if all the given keys are existing.
-     */
-    public boolean checkProperties(String... keys){
-        for(String key:keys) {
-            if (getProperty(key, null) == null) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Access all the current context properties.
-     * @return the properties, never null.
-     */
-    public Map<String,String> getProperties(){
-        return Collections.unmodifiableMap(this.properties);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof Context)) return false;
-
-        Context context = (Context) o;
-
-        return getProperties().equals(context.getProperties());
-
-    }
-
-    @Override
-    public int hashCode() {
-        return getProperties().hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "Context{" +
-                properties +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/FilteredPropertySource.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/FilteredPropertySource.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/FilteredPropertySource.java
new file mode 100644
index 0000000..b4f95f5
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/FilteredPropertySource.java
@@ -0,0 +1,166 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.spi.FilterContext;
+import org.apache.tamaya.spi.PropertyFilter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+import org.apache.tamaya.spisupport.BasePropertySource;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Property source that allows filtering on property source level. This class is thread-safe, accesses using or
+ * changing the filter list are synchronized.
+ */
+public final class FilteredPropertySource extends BasePropertySource {
+
+    private PropertySource wrapped;
+    private List<PropertyFilter> filters = new ArrayList<>();
+
+    /**
+     * Constructor used privately. Use {@link #of(PropertySource)} for making a {@link PropertySource} filterable.
+     * @param propertySource the property source to be filtered.
+     */
+    private FilteredPropertySource(PropertySource propertySource){
+        this.wrapped = Objects.requireNonNull(propertySource);
+    }
+
+
+    /**
+     * Wraps a given property source.
+     * @param propertySource the property source to be wrapped.
+     * @return a wrapped property source.
+     */
+    public static FilteredPropertySource of(PropertySource propertySource){
+        if(propertySource instanceof FilteredPropertySource){
+            return (FilteredPropertySource)propertySource;
+        }
+        return new FilteredPropertySource(propertySource);
+    }
+
+    @Override
+    public int getOrdinal() {
+        int ordinalSet = super.getOrdinal();
+        if(ordinalSet == 0){
+            return this.wrapped.getOrdinal();
+        }
+        return ordinalSet;
+    }
+
+    @Override
+    public String getName() {
+        return wrapped.getName();
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        PropertyValue value = wrapped.get(key);
+        if(value != null && value.getValue()!=null){
+            if(filters!=null){
+                String filteredValue = value.getValue();
+                for(PropertyFilter pf:filters){
+                    filteredValue = pf.filterProperty(filteredValue, new FilterContext(key, value.getConfigEntries(), true));
+                }
+                if(filteredValue!=null){
+                    return PropertyValue.builder(key, filteredValue, getName())
+                            .setContextData(value.getConfigEntries()).build();
+                }
+            }
+        }
+        return value;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> wrappedProps = wrapped.getProperties();
+        if(!filters.isEmpty()){
+            Map<String, String> result = new HashMap<>();
+            synchronized (filters) {
+                for (String key : wrappedProps.keySet()) {
+                    PropertyValue value = wrapped.get(key);
+                    FilterContext filterContext = new FilterContext(key, value.getConfigEntries(), true);
+                    String filteredValue = value.getValue();
+                    for (PropertyFilter pf : filters) {
+                        filteredValue = pf.filterProperty(filteredValue, filterContext);
+                    }
+                    if (filteredValue != null) {
+                        result.putAll(value.getConfigEntries());
+                        result.put(key, filteredValue);
+                    }
+
+                }
+            }
+            return result;
+        }
+        return wrappedProps;
+    }
+
+    @Override
+    public boolean isScannable() {
+        return wrapped.isScannable();
+    }
+
+    /**
+     * Adds the given filters to this property source.
+     * @param filter the filters, not null.
+     */
+    public void addPropertyFilter(PropertyFilter... filter){
+        synchronized(filters){
+            this.filters.addAll(Arrays.asList(filter));
+        }
+    }
+
+    /**
+     * Removes the given filter, if present.
+     * @param filter the filter to remove, not null.
+     */
+    public void removePropertyFilter(PropertyFilter filter){
+        synchronized(filters){
+            this.filters.remove(filter);
+        }
+    }
+
+    /**
+     * Access the current filters present.
+     * @return a copy of the current filter list.
+     */
+    public List<PropertyFilter> getPropertyFilter(){
+        synchronized (filters){
+            return new ArrayList<>(filters);
+        }
+    }
+
+    @Override
+    public String toString() {
+        synchronized (filters) {
+            return "FilteredPropertySource{" +
+                    "\n wrapped=" + wrapped +
+                    "\n filters=" + this.filters +
+                    "\n base=" + super.toString() +
+                    "\n}";
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaConfiguration.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaConfiguration.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaConfiguration.java
new file mode 100644
index 0000000..601c851
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaConfiguration.java
@@ -0,0 +1,144 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.ServiceContextManager;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Accessor singleton for accessing/loading meta-configuration.
+ */
+public final class MetaConfiguration {
+
+    private static final String CONFIG_RESOURCE = "tamaya-config.xml";
+
+    private static final Logger LOG = Logger.getLogger(MetaConfiguration.class.getName());
+
+    /**
+     * Singleton constructor.
+     */
+    private MetaConfiguration(){}
+
+    /**
+     * Creates a new {@link Configuration} using {@link #createConfiguration(URL)}
+     * and applies it as default configuration using {@link ConfigurationProvider#setConfiguration(Configuration)}.
+     * @return the new configuration instance.
+     */
+    public static void configure(){
+        LOG.info("TAMAYA: Checking for meta-configuration...");
+        URL configFile = getDefaultMetaConfig();
+        if(configFile==null){
+            LOG.warning("TAMAYA: No tamaya-config.xml found, using defaults.");
+        }
+        configure(configFile);
+    }
+
+    /**
+     * Creates a new {@link Configuration} using {@link #createConfiguration(URL)}
+     * and applies it as default configuration using {@link ConfigurationProvider#setConfiguration(Configuration)}.
+     * @param metaConfig URL for loading the {@code tamaya-config.xml} meta-configuration.
+     * @return the new configuration instance.
+     */
+    public static void configure(URL metaConfig){
+        try {
+            // Let readers do their work
+            Configuration config = createConfiguration(metaConfig);
+            ConfigurationProvider.setConfiguration(config);
+        }catch(Exception e){
+            LOG.log(Level.SEVERE, "TAMAYA: Error loading configuration.", e);
+        }
+    }
+
+    private static URL getDefaultMetaConfig() {
+        // 1: check tamaya-config system property
+        String tamayaConfig = System.getProperty("tamaya-config");
+        if(tamayaConfig!=null){
+            File file = new File(tamayaConfig);
+            if(!file.exists() || !file.canRead() || !file.isFile()){
+                LOG.severe("TAMAYA: Not a valid config file: " + tamayaConfig);
+            }else{
+                try {
+                    return file.toURI().toURL();
+                } catch (MalformedURLException e) {
+                    LOG.severe("TAMAYA: Invalid file name: " + tamayaConfig);
+                }
+            }
+        }
+        return MetaConfiguration.class.getClassLoader().getResource(CONFIG_RESOURCE);
+    }
+
+    /**
+     * Performs initialization of a new configuration
+     * context to the {@link MetaConfigurationReader} instances found in the current
+     * {@link org.apache.tamaya.spi.ServiceContext} and returns the corresponding builder
+     * instance.
+     * @param metaConfig URL for loading the {@code tamaya-config.xml} meta-configuration.
+     * @return a new configuration context builder, never null.
+     * @throws ConfigException If the URL cannot be read.
+     */
+    public static ConfigurationContextBuilder createContextBuilder(URL metaConfig){
+        URL configFile = Objects.requireNonNull(metaConfig);
+        LOG.info("TAMAYA: Loading tamaya-config.xml...");
+        Document document = null;
+        try {
+            document = DocumentBuilderFactory.newInstance()
+                    .newDocumentBuilder().parse(configFile.openStream());
+            ConfigurationContextBuilder builder = ConfigurationProvider.getConfigurationContextBuilder();
+            for(MetaConfigurationReader reader: ServiceContextManager.getServiceContext().getServices(
+                    MetaConfigurationReader.class
+            )){
+                LOG.fine("TAMAYA: Executing MetaConfig-Reader: " + reader.getClass().getName()+"...");
+                reader.read(document, builder);
+            }
+            return builder;
+        } catch (SAXException | IOException | ParserConfigurationException e) {
+            throw new ConfigException("Cannot read meta-config deom " + metaConfig, e);
+        }
+    }
+
+    /**
+     * Reads the meta-configuration and delegates initialization of the current configuration
+     * context to the {@link MetaConfigurationReader} instances found in the current
+     * {@link org.apache.tamaya.spi.ServiceContext}.
+     * @param metaConfig URL for loading the {@code tamaya-config.xml} meta-configuration.
+     * @return the new configuration instance.
+     */
+    public static Configuration createConfiguration(URL metaConfig){
+        ConfigurationContext context = createContextBuilder(metaConfig).build();
+        return ConfigurationProvider.createConfiguration(context);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaContext.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaContext.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaContext.java
new file mode 100644
index 0000000..4032c03
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/MetaContext.java
@@ -0,0 +1,330 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.functions.Supplier;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Class managing the configuration system's shared context. This
+ * context is used by the configuration system to evaluate the
+ * right properties, e.g. by defining the current stage or labels
+ * that apply to the current configuration. Hereby context are
+ * <ul>
+ *     <li>identified by unique names</li>
+ *     <li>stackable into a context hierarchy, see {@link #combineWith(MetaContext...)}</li>
+ *     <li>optionally be valid only in some contexts or for a limited time, see {@link #isValid()},
+ *     {@link #getInstance(String, Supplier)}</li>
+ *     <li>providing key/values only valid for a certain time (assigned a TTL), see {@link #setProperty(String, String, int, TimeUnit)},
+ *     {@link #setProperties(Map, long, TimeUnit)}</li>
+ * </ul>
+ * Additionally there is special support for thread related contexts, see {@link #getThreadInstance()}.
+ * Finally there is also one special globally shared context instance, see {@link #getCurrentInstance()}.
+ */
+public final class MetaContext {
+
+    private static final ThreadLocal<MetaContext> THREAD_CONTEXT = new ThreadLocal<MetaContext>(){
+        @Override
+        protected MetaContext initialValue() {
+            return new MetaContext();
+        }
+    };
+
+    private String id;
+
+    private Supplier<Boolean> validSupplier;
+
+    private final Map<String,Value> properties = new ConcurrentHashMap<>();
+
+    private static final Map<String,MetaContext> CONTEXTS = new WeakHashMap<>();
+
+    /**
+     * Access a context by name. Contexts are managed as weak references in this class. If no
+     * such context exists, a new instance is created.
+     * @param contextName the context name, not null.
+     * @return the context instance, never null.
+     */
+    public static MetaContext getInstance(String contextName) {
+        return getInstance(contextName, null);
+    }
+
+    /**
+     * Access a context by name. Contexts are managed as weak references in this class. If no
+     * such valid context exists, a new instance is created, using the given {@code validSupplier}.
+     * @param contextName the context name, not null.
+     * @return the context instance, never null.
+     */
+    public static MetaContext getInstance(String contextName, Supplier<Boolean> validSupplier){
+        synchronized(CONTEXTS){
+            MetaContext ctx = CONTEXTS.get(contextName);
+            if(ctx!=null && ctx.isValid()){
+                return ctx;
+            }
+            ctx = new MetaContext();
+            ctx.id = Objects.requireNonNull(contextName);
+            ctx.validSupplier = validSupplier;
+            CONTEXTS.put(contextName, ctx);
+            return ctx;
+        }
+
+    }
+
+    /**
+     * Access the thread-based context. If no such context
+     * exists a new one will be created.
+     * @return the corresponding context, never null.
+     */
+    public static MetaContext getThreadInstance(){
+        return THREAD_CONTEXT.get();
+    }
+
+    /**
+     * Access the current context, which actually is the current context, combined with the thread based
+     * context (overriding).
+     * @return the corresponding context, never null.
+     */
+    public MetaContext getCurrentInstance(){
+        return this.combineWith(THREAD_CONTEXT.get());
+    }
+
+    /**
+     * Method to evaluate if a context is valid. This basically depends on the
+     * {@code validSupplier}, if any is set. If no supplier is present the context is valid.
+     *
+     * @return true, if this context is valid.
+     */
+    public boolean isValid(){
+        return this.validSupplier == null || validSupplier.get();
+    }
+
+
+    /**
+     * Combine this context with the other contexts given, hereby only contexts are included
+     * which are {@code valid}, see {@link #isValid()}.
+     * @param contexts the context to merge with this context.
+     * @return the newly created Context.
+     */
+    public MetaContext combineWith(MetaContext... contexts) {
+        MetaContext newContext = new MetaContext();
+        newContext.properties.putAll(this.properties);
+        for(MetaContext ctx:contexts) {
+            if(ctx.isValid()) {
+                newContext.properties.putAll(ctx.properties);
+            }
+        }
+        return newContext;
+    }
+
+    /**
+     * Access the given context property.
+     * @param key the key, not null
+     * @return the value, or null.
+     */
+    public String getProperty(String key){
+        return getProperty(key, null);
+    }
+
+    /**
+     * Access the given context property.
+     * @param key the key, not the default value.
+     * @param defaultValue the default value to be returned, if no value is defined, or the
+     *                     stored value's TTL has been reached.
+     * @return the value, default value or null.
+     */
+    public String getProperty(String key, String defaultValue){
+        Value value = this.properties.get(key);
+        if(value==null){
+            return defaultValue;
+        }
+        if(!value.isValid()){
+            this.properties.remove(key);
+            return null;
+        }
+        return value.value;
+    }
+
+    /**
+     * Sets the given context property.
+     * @param key the key, not null.
+     * @param value the value, not null.
+     * @return the porevious value, or null.
+     */
+    public String setProperty(String key, String value){
+       return setProperty(key, value, 0, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Sets the given context property.
+     * @param key the key, not null.
+     * @param value the value, not null.
+     * @param ttl the time to live. Zero or less than zero means, no timeout.
+     * @param unit the target time unit.
+     * @return the porevious value, or null.
+     */
+    public String setProperty(String key, String value, int ttl, TimeUnit unit){
+        Value previous = this.properties.put(key, new Value(key, value, ttl));
+        if(previous!=null && previous.isValid()){
+            return previous.value;
+        }
+        return null;
+    }
+
+    /**
+     * Sets the given property unless there is already a value defined.
+     * @param key the key, not null.
+     * @param value the value, not null.
+     */
+    public void setPropertyIfAbsent(String key, String value){
+        setPropertyIfAbsent(key, value, 0, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Sets the given property unless there is already a value defined.
+     * @param key the key, not null.
+     * @param value the value, not null.
+     * @param ttl the time to live. Zero or less than zero means, no timeout.
+     * @param unit the target time unit.
+     */
+    public void setPropertyIfAbsent(String key, String value, long ttl, TimeUnit unit){
+        Value prev = this.properties.get(key);
+        if(prev==null){
+            this.properties.put(key, new Value(key, value, unit.toMillis(ttl)));
+        }
+    }
+
+    /**
+     * Adds all properties given, overriding any existing properties.
+     * @param properties the properties, not null.
+     */
+    public void setProperties(Map<String,String> properties){
+        setProperties(properties, 0L, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Adds all properties given, overriding any existing properties.
+     * @param properties the properties, not null.
+     * @param ttl the time to live. Zero or less than zero means, no timeout.
+     * @param unit the target time unit.
+     */
+    public void setProperties(Map<String,String> properties, long ttl, TimeUnit unit){
+        for(Map.Entry en:properties.entrySet()) {
+            this.properties.put(
+                    en.getKey().toString(),
+                    new Value(en.getKey().toString(), en.getValue().toString(), unit.toMillis(ttl)));
+        }
+    }
+
+    /**
+     * Checks if all the given properties are present.
+     * @param keys the keys to check, not null.
+     * @return true, if all the given keys are existing.
+     */
+    public boolean checkProperties(String... keys){
+        for(String key:keys) {
+            if (getProperty(key, null) == null) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Access all the current context properties.
+     * @return the properties, never null.
+     */
+    public Map<String,String> getProperties(){
+        Map<String,String> map = new HashMap<>();
+        for(Map.Entry<String,Value> en:properties.entrySet()) {
+            Value val = en.getValue();
+            if(val.isValid()){
+                map.put(en.getKey(), val.value);
+            }else{
+                this.properties.remove(en.getKey());
+            }
+        }
+        return Collections.unmodifiableMap(map);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof MetaContext)) return false;
+
+        MetaContext context = (MetaContext) o;
+
+        return getProperties().equals(context.getProperties());
+
+    }
+
+    @Override
+    public int hashCode() {
+        return getProperties().hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "Context{" +
+                properties +
+                '}';
+    }
+
+    private static final class Value{
+        String key;
+        String value;
+        long validUntil;
+
+        Value(String key, String value, long ttl){
+            this.key = Objects.requireNonNull(key);
+            this.value = Objects.requireNonNull(value);
+            if(ttl>0) {
+                this.validUntil = System.currentTimeMillis() + ttl;
+            }
+        }
+
+        /** Method to check if a value is still valid. */
+        boolean isValid(){
+            return this.validUntil<=0 || this.validUntil>=System.currentTimeMillis();
+        }
+
+        /** Method that invalidates a value. */
+        void invalidate(){
+            this.validUntil = 0;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof Value)) return false;
+            Value value = (Value) o;
+            return Objects.equals(value, value.value);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(value);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/Refreshable.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/Refreshable.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/Refreshable.java
new file mode 100644
index 0000000..dc51554
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/Refreshable.java
@@ -0,0 +1,32 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.spi.ConfigurationContext;
+
+/**
+ * Common interface for refreshable items.
+ */
+public interface Refreshable {
+
+    /**
+     * Refreshes the given instance.
+     */
+    void refresh();
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySource.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySource.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySource.java
new file mode 100644
index 0000000..23ca932
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySource.java
@@ -0,0 +1,150 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.metamodel.internal.ComponentConfigurator;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * Wrapped property source that allows refreshing/reloading a property source. Hereby a property source must
+ * either
+ * <ul>
+ *     <li>have a public parameterless constructor, used for reloading a new instance.</li>
+ *     <li>implement itself {@link Refreshable}.</li>
+ * </ul>
+ */
+public final class RefreshablePropertySource
+        implements PropertySource, Refreshable {
+
+    private static final Logger LOG = Logger.getLogger(RefreshablePropertySource.class.getName());
+    private Map<String,String> metaConfig;
+    private PropertySource wrapped;
+    private AtomicLong nextRefresh = new AtomicLong();
+    private AtomicLong refreshPeriod = new AtomicLong();
+
+    private RefreshablePropertySource(Map<String,String> metaConfig, PropertySource wrapped) {
+        this.metaConfig = Objects.requireNonNull(metaConfig);
+        this.wrapped = Objects.requireNonNull(wrapped);
+    }
+
+    /**
+     * Makes a property source refreshable. If the given property source is already an instance of
+     * RefreshablePropertySource, the property source is returned.
+     * @param metaConfig the configuration parameters to be applied when a new PropertySource is created, not null.
+     * @param propertySource the property source, not null.
+     * @return a new instance, not null.
+     */
+    public static RefreshablePropertySource of(Map<String,String> metaConfig, PropertySource propertySource) {
+        if(propertySource instanceof RefreshablePropertySource){
+            return (RefreshablePropertySource)propertySource;
+        }
+        return new RefreshablePropertySource(metaConfig, propertySource);
+    }
+
+    /**
+     * Makes a property source refreshable. If the given property source is already an instance of
+     * RefreshablePropertySource, the property source is returned.
+     * @param propertySource the property source, not null.
+     * @return a new instance, not null.
+     */
+    public static RefreshablePropertySource of(PropertySource propertySource) {
+        return of(Collections.<String, String>emptyMap(), propertySource);
+    }
+
+    /**
+     * Checks if the property source should autorefresh, if so {@link #refresh()} is called.
+     */
+    private void checkRefresh(){
+        long next = nextRefresh.get();
+        if(next > 0 && next<System.currentTimeMillis()){
+            nextRefresh.set(next + refreshPeriod.get());
+            refresh();
+        }
+    }
+
+    /**
+     * Set the refresh period. This will be immedately applied from now. No explicit
+     * refresh will be triggered now.
+     * @param units
+     * @param timeUnit
+     */
+    public void setRefreshPeriod(long units, TimeUnit timeUnit){
+        this.refreshPeriod.set(timeUnit.toMillis(units));
+        this.nextRefresh.set(System.currentTimeMillis() + this.refreshPeriod.get());
+    }
+
+
+    @Override
+    public void refresh() {
+        try {
+            if(this.wrapped instanceof Refreshable){
+                ((Refreshable) this.wrapped).refresh();
+            }else {
+                this.wrapped = this.wrapped.getClass().newInstance();
+                ComponentConfigurator.configure(this.wrapped, metaConfig);
+            }
+        } catch (Exception e) {
+            LOG.log(Level.WARNING, "Failed to reload/refresh PropertySource: " +
+                    wrapped.getClass().getName(), e);
+        }
+    }
+
+    @Override
+    public int getOrdinal() {
+        return this.wrapped.getOrdinal();
+    }
+
+    @Override
+    public String getName() {
+        return this.wrapped.getName();
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        return this.wrapped.get(key);
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return this.wrapped.getProperties();
+    }
+
+    @Override
+    public boolean isScannable() {
+        return this.wrapped.isScannable();
+    }
+
+    @Override
+    public String toString() {
+        return "RefreshablePropertySource{" +
+                "\n metaConfig=" + metaConfig +
+                "\n wrapped=" + wrapped +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySourceProvider.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySourceProvider.java
new file mode 100644
index 0000000..e71ca56
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/RefreshablePropertySourceProvider.java
@@ -0,0 +1,106 @@
+/*
+ * 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.metamodel;
+
+import org.apache.tamaya.metamodel.internal.ComponentConfigurator;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Wrapped property source provider that allows refreshing/reloading a property source provider. Hereby a provider must
+ * either
+ * <ul>
+ *     <li>have a public parameterless constructor, used for reloading a new instance.</li>
+ *     <li>implement itself {@link Refreshable}.</li>
+ * </ul>
+ */
+public final class RefreshablePropertySourceProvider
+        implements PropertySourceProvider, Refreshable {
+
+    private static final Logger LOG = Logger.getLogger(RefreshablePropertySourceProvider.class.getName());
+    private Map<String,String> metaConfig;
+    private PropertySourceProvider wrapped;
+    private Collection<PropertySource> propertSources;
+
+    private RefreshablePropertySourceProvider(Map<String,String> metaConfig, PropertySourceProvider wrapped) {
+        this.metaConfig = Objects.requireNonNull(metaConfig);
+        this.wrapped = Objects.requireNonNull(wrapped);
+        this.propertSources = Objects.requireNonNull(wrapped.getPropertySources());
+    }
+
+    /**
+     * Makes a property source provider refreshable. If the given property source provider is already an instance of
+     * RefreshablePropertySourceProvider, the property source provider is returned unchanged.
+     * @param metaConfig the configuration parameters to be applied when a new PropertySourceProvider is created, not null.
+     * @param provider the property source provider, not null.
+     * @return a new instance, not null.
+     */
+    public static RefreshablePropertySourceProvider of(Map<String,String> metaConfig, PropertySourceProvider provider) {
+        if(provider instanceof RefreshablePropertySourceProvider){
+            return (RefreshablePropertySourceProvider)provider;
+        }
+        return new RefreshablePropertySourceProvider(metaConfig, provider);
+    }
+
+    /**
+     * Makes a property source refreshable. If the given property source is already an instance of
+     * RefreshablePropertySource, the property source is returned.
+     * @param provider the property source provider, not null.
+     * @return a new instance, not null.
+     */
+    public static RefreshablePropertySourceProvider of(PropertySourceProvider provider) {
+        return of(Collections.<String, String>emptyMap(), provider);
+    }
+
+    @Override
+    public Collection<PropertySource> getPropertySources() {
+        return this.propertSources;
+    }
+
+    @Override
+    public void refresh() {
+        try {
+            if(this.wrapped instanceof Refreshable){
+                ((Refreshable) this.wrapped).refresh();
+            }else {
+                this.wrapped = this.wrapped.getClass().newInstance();
+                ComponentConfigurator.configure(this.wrapped, metaConfig);
+            }
+        } catch (Exception e) {
+            LOG.log(Level.WARNING, "Failed to refresh PropertySourceProvider: " +
+                    wrapped.getClass().getName(), e);
+        }
+        this.propertSources = Objects.requireNonNull(wrapped.getPropertySources());
+    }
+
+    @Override
+    public String toString() {
+        return "RefreshablePropertySourceProvider{" +
+                "\n metaConfig=" + metaConfig +
+                "\n wrapped=" + wrapped +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/MetaConfiguration.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/MetaConfiguration.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/MetaConfiguration.java
deleted file mode 100644
index 2e88c6b..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/MetaConfiguration.java
+++ /dev/null
@@ -1,122 +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.metamodel.dsl;
-//
-//import org.apache.tamaya.Configuration;
-//import org.apache.tamaya.ConfigurationProvider;
-//import org.apache.tamaya.format.ConfigurationData;
-//import org.apache.tamaya.format.ConfigurationFormat;
-//import org.apache.tamaya.format.ConfigurationFormats;
-//import org.apache.tamaya.json.YAMLFormat;
-//import org.apache.tamaya.resource.ConfigResources;
-//import org.apache.tamaya.spi.ConfigurationContextBuilder;
-//
-//import java.io.InputStream;
-//import java.net.URL;
-//import java.util.ArrayList;
-//import java.util.Arrays;
-//import java.util.List;
-//import java.util.logging.Level;
-//import java.util.logging.Logger;
-//
-///**
-// * Meta environment configuration builder and accessor. Normally this class shoulds never be accessed
-// * by client code. But it could be useful for extensions that extend the meta-configuration capabilities
-// * of tamaya having access to the meta-configuration, so they can read their own meta-entries to
-// * setup whatever features they implement.
-// */
-//public final class MetaConfiguration {
-//
-//    private static final Logger LOGGER = Logger.getLogger(MetaConfiguration.class.getName());
-//    private static MetaConfiguration INSTANCE = new MetaConfiguration();
-//
-//    private Configuration config;
-//    private String resourceExpression;
-//    private String[] formatNames;
-//
-//    /**
-//     * Initializes the metaconfiguration.
-//     * @param resourceExpression the resource expression that defines the resources to load.
-//     * @param formatNames the format names to be used.
-//     */
-//    private void init(String resourceExpression, String... formatNames){
-//        if(this.config!=null){
-//            LOGGER.warning(">>> Reset of Meta-Configuration resource : " + resourceExpression);
-//            LOGGER.warning(">>> Reset of Meta-Configuration formats  : " + Arrays.toString(formatNames));
-//        }
-//        if(resourceExpression==null){
-//            resourceExpression = "tamaya-config.*";
-//        }
-//        LOGGER.info(">>> Meta-Configuration resource : " + resourceExpression);
-//        ConfigurationFormat[] formats = loadFormats(formatNames);
-//        ConfigurationContextBuilder builder = ConfigurationProvider.getConfigurationContextBuilder();
-//        for(URL url:ConfigResources.getResourceResolver().getResources(resourceExpression)) {
-//            for(ConfigurationFormat format:formats) {
-//                if(format.accepts(url)){
-//                    try(InputStream is = url.openStream()){
-//                        ConfigurationData data = format.readConfiguration(url.toString(), is);
-//                        builder.addPropertySources(PropertySourceBuilder(
-//                                url.toString(), data.getCombinedProperties()));
-//                    }catch(Exception e){
-//                        LOGGER.log(Level.INFO, "Failed to read " + url + " with format " + format, e);
-//                    }
-//                }
-//            }
-//        }
-//        this.config = ConfigurationProvider.createConfiguration(builder.build());
-//        LOGGER.info("Meta-Configuration read: " + this.config.getProperties().size() + " entries.");
-//    }
-//
-//
-//    /**
-//     * Access the system's meta-configuration, initialize if necessary. Normally this class shoulds never be accessed
-//     * by client code. But it could be useful for extensions that extend the meta-configuration capabilities
-//     * of tamaya having access to the meta-configuration, so they can read their own meta-entries to
-//     * setup whatever features they implement.
-//     * @return the meta-configuration instance used for setting up the Tamaya's application configuration
-//     * model.
-//     */
-//    public static Configuration getConfiguration(){
-//        if(INSTANCE.config==null) {
-//            INSTANCE.init(null);
-//        }
-//        return INSTANCE.config;
-//    }
-//
-//    /**
-//     * Access the system's meta-configuration, initialize if necessary. Normally this class shoulds never be accessed
-//     * by client code. But it could be useful for extensions that extend the meta-configuration capabilities
-//     * of tamaya having access to the meta-configuration, so they can read their own meta-entries to
-//     * setup whatever features they implement.
-//     *
-//     * @param resourceExpression the resource expression that defines where the metaconfiguration
-//     *                           files/resources are located.
-//     * @param formatNames        the formats supported, if null all formats found are tried for each resource(=URL).
-//     * @return the meta-configuration instance used for setting up the Tamaya's application configuration
-//     * model.
-//     */
-//    public static Configuration getConfiguration(String resourceExpression,
-//                                                 String... formatNames){
-//        if(INSTANCE.config==null) {
-//            INSTANCE.init(resourceExpression, formatNames);
-//        }
-//        return INSTANCE.config;
-//    }
-//
-//}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/TamayaConfigurator.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/TamayaConfigurator.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/TamayaConfigurator.java
deleted file mode 100644
index c4570d7..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/TamayaConfigurator.java
+++ /dev/null
@@ -1,234 +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.metamodel.dsl;
-//
-//import org.apache.tamaya.Configuration;
-//import org.apache.tamaya.ConfigurationProvider;
-//import org.apache.tamaya.functions.ConfigurationFunctions;
-//import org.apache.tamaya.spi.*;
-//import org.apache.tamaya.metamodel.spi.DSLPropertySourceProvider;
-//
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.Collections;
-//import java.util.Comparator;
-//import java.util.HashMap;
-//import java.util.HashSet;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Set;
-//import java.util.logging.Logger;
-//
-///**
-// * Configuration class setting up the Tamaya runtime model.
-// */
-//public final class TamayaConfigurator {
-//
-//    private static final Logger LOGGER = Logger.getLogger(MetaConfiguration.class.getName());
-//    private static final Comparator<WrappedPropertySource> ORDINAL_COMPARATOR =
-//            new Comparator<WrappedPropertySource>(){
-//                @Override
-//                public int compare(WrappedPropertySource o1, WrappedPropertySource o2) {
-//                    return o1.getOrdinal() - o2.getOrdinal();
-//                }
-//            };
-//
-//    private static final TamayaConfigurator INSTANCE = new TamayaConfigurator();
-//
-//    private ConfigurationContext configurationContext;
-//    private Set<String> formats = new HashSet<>();
-//    private Set<String> suffixes = new HashSet<>();
-//    private Map<String,DSLPropertySourceProvider> dslResolvers = new HashMap<>();
-//
-//
-//    private TamayaConfigurator(){
-//        configure(null);
-//    }
-//
-//    /**
-//     * Get the singleton instance.
-//     * @return the instance, never null.
-//     */
-//    public static TamayaConfigurator getInstance(){
-//        return INSTANCE;
-//    }
-//
-//    /**
-//     * Configures the Tamaya runtime using the metamodel configuration found at the default
-//     * location.
-//     * @see MetaConfiguration
-//     */
-//    public void configure(){
-//        configure(null);
-//    }
-//
-//    /**
-//     * Configures the Tamaya runtime using the given resource location expression and (optionally)
-//     * formats to be used for evaluating the metamodel configuration.
-//     * @param resourceExpression resource expression for resolving the location of the
-//     *                           meta configuration.
-//     * @param formats the format names to be used, optional, but not null.
-//     * @see MetaConfiguration
-//     */
-//    public void configure(String resourceExpression, String... formats){
-//        loadDSLSourceResolvers();
-//        Configuration metaConfig = MetaConfiguration.getConfiguration(resourceExpression, formats);
-//        Configuration profilesConfig = metaConfig.with(
-//                ConfigurationFunctions.section("TAMAYA.PROFILES.", true));
-//        Configuration metaProfile = profilesConfig.with(
-//                ConfigurationFunctions.section("<COMMON>.", true));
-//        System.out.println(metaProfile.getProperties().keySet());
-//        String[] values = metaProfile.getOrDefault("formats","yaml, properties, xml-properties").split(",");
-//        for(String fmt:values){
-//            fmt = fmt.trim();
-//            if(fmt.isEmpty()){
-//                continue;
-//            }
-//            this.formats.add(fmt);
-//        }
-//        values = metaProfile.getOrDefault("suffixes", "yml, yaml, properties, xml").split(",");
-//        for(String sfx:values){
-//            sfx = sfx.trim();
-//            if(sfx.isEmpty()){
-//                continue;
-//            }
-//            this.suffixes.add(sfx);
-//        }
-//        ConfigurationContextBuilder builder = ConfigurationProvider.getConfigurationContextBuilder();
-//        Map<String, PropertySource> loadedPropertySources = loadDefaultPropertySources();
-//        int defaultOrdinal = loadSources(builder, "<COMMON>", metaProfile, loadedPropertySources, 0) + 20;
-//        // Load current profiles
-//        for(String profile:ProfileManager.getInstance().getActiveProfiles()){
-//            metaProfile = profilesConfig.with(
-//                    ConfigurationFunctions.section(profile, true));
-//            defaultOrdinal = loadSources(builder, profile, metaProfile, loadedPropertySources, defaultOrdinal) + 20;
-//        }
-//        //         formats:  yaml, properties, xml-properties
-//        //    - SUFFIX:   yaml, yml, properties, xml
-//        //    - sources:
-//        //      - "named:env-properties"   # provider name, or class name
-//        //      - "named:main-args"
-//        //      - "named:sys-properties"
-//        //      - "resource:classpath:META-INF/config/**/*.SUFFIX"
-//
-//    }
-//
-//    /**
-//     * Loads all default registered property sources and providers.
-//     * @return the default property sources available on the system.
-//     */
-//    private Map<String, PropertySource> loadDefaultPropertySources() {
-//        Map<String, PropertySource> loadedPropertySources = new HashMap<>();
-//        for(PropertySource ps: ServiceContextManager.getServiceContext().getServices(PropertySource.class)){
-//            loadedPropertySources.put(ps.getName(), ps);
-//        }
-//        for(PropertySourceProvider prov: ServiceContextManager.getServiceContext().getServices(PropertySourceProvider.class)){
-//            for(PropertySource ps: prov.getPropertySources()){
-//                loadedPropertySources.put(ps.getName(), ps);
-//            }
-//        }
-//        return loadedPropertySources;
-//    }
-//
-//    private int loadSources(ConfigurationContextBuilder builder, String profileId, Configuration metaProfile, Map<String,
-//            PropertySource> defaultPropertySources, int nextOrdinal) {
-//        String[] values;
-//        List<PropertySource> propertySourcesLoaded = new ArrayList<>();
-//        values = metaProfile.getOrDefault("sources","<default>").split(",");
-//        if(values.length==1 && "<default>".equals(values[0])){
-//            // load default property sources and providers from config as default.
-//            // additional providers may be added depending on the active profile...
-//            LOGGER.info("Using default configuration setup for "+profileId);
-//            nextOrdinal = addAndGetNextOrdinal(builder, defaultPropertySources.values(),
-//                    propertySourcesLoaded, nextOrdinal);
-//        }else {
-//            LOGGER.info("Loading DSL based "+profileId+" configuration context...");
-//            int count = 0;
-//            for (String source : values) {
-//                source = source.trim();
-//                if (source.isEmpty()) {
-//                    continue;
-//                }
-//                String sourceKey = getSourceKey(source);
-//                LOGGER.info("Loading "+profileId+" configuration source: " + source);
-//                // evaluate DSLSourceResolver and resolve PropertySources, register thm into context
-//                // apply newMaxOrdinal...
-//                DSLPropertySourceProvider resolver = dslResolvers.get(sourceKey);
-//                if(resolver==null){
-//                    LOGGER.warning("DSL error: unresolvable source expression: "+ source);
-//                    continue;
-//                }
-//                List<PropertySource> sources = resolver.resolve(source.substring(sourceKey.length()),
-//                        defaultPropertySources);
-//                nextOrdinal = addAndGetNextOrdinal(builder, sources, propertySourcesLoaded, nextOrdinal);
-//            }
-//            LOGGER.info("Loaded "+count+" DSL based "+profileId+" configuration contexts.");
-//        }
-//        return nextOrdinal;
-//    }
-//
-//    private int addAndGetNextOrdinal(ConfigurationContextBuilder builder, Collection<PropertySource> sourcesToAdd,
-//                                     List<PropertySource> allPropertySources, int nextOrdinal) {
-//        allPropertySources.addAll(wrapOrdinals(nextOrdinal, sourcesToAdd));
-//        nextOrdinal = Math.max(calculateHighestOrdinal(allPropertySources)+1, nextOrdinal+1);
-//        builder.addPropertySources(allPropertySources);
-//        return nextOrdinal;
-//    }
-//
-//    private List<WrappedPropertySource> wrapOrdinals(int nextOrdinal, Collection<PropertySource> propertySources) {
-//        List<WrappedPropertySource> result = new ArrayList<>();
-//        for(PropertySource ps: propertySources){
-//            result.add(WrappedPropertySource.of(ps));
-//        }
-//        Collections.sort(result, ORDINAL_COMPARATOR);
-//        for(WrappedPropertySource ps: result){
-//            ps.setOrdinal(nextOrdinal++);
-//        }
-//        Collections.sort(result, ORDINAL_COMPARATOR);
-//        return result;
-//    }
-//
-//    private int calculateHighestOrdinal(Collection<PropertySource> sources) {
-//        int maxOrdinal = 0;
-//        for (PropertySource ps : sources) {
-//            if (ps.getOrdinal() > maxOrdinal) {
-//                maxOrdinal = ps.getOrdinal();
-//            }
-//        }
-//        return maxOrdinal;
-//    }
-//
-//    private String getSourceKey(String source) {
-//        int index = source.indexOf(':');
-//        if(index>0){
-//            return source.substring(0,index);
-//        }
-//        return source;
-//    }
-//
-//    private void loadDSLSourceResolvers() {
-//        // Load the ConfigurationDSLSourceResolvers on the system
-//        for(DSLPropertySourceProvider res:
-//                ServiceContextManager.getServiceContext().getServices(
-//                        DSLPropertySourceProvider.class)){
-//            this.dslResolvers.put(res.getKey(), res);
-//        }
-//    }
-//
-//}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/WrappedPropertySource.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/WrappedPropertySource.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/WrappedPropertySource.java
deleted file mode 100644
index 000406b..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/WrappedPropertySource.java
+++ /dev/null
@@ -1,127 +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.metamodel.dsl;
-
-import org.apache.tamaya.spi.FilterContext;
-import org.apache.tamaya.spi.PropertyFilter;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Wrapped property source that allows dynamically reassigning the property source's
- * ordinal value. This is needed for reordering the property sources to
- * match the DSL configured ordering.
- */
-final class WrappedPropertySource implements PropertySource {
-
-    private Integer ordinalAssigned;
-    private PropertySource wrapped;
-    private List<PropertyFilter> filters;
-
-    private WrappedPropertySource(PropertySource wrapped){
-        this.wrapped = Objects.requireNonNull(wrapped);
-    }
-
-    /**
-     * Wraps a given property source.
-     * @param propertySource the property source to be wrapped.
-     * @return a wrapped property source.
-     */
-    public static WrappedPropertySource of(PropertySource propertySource){
-        if(propertySource instanceof WrappedPropertySource){
-            return (WrappedPropertySource)propertySource;
-        }
-        return new WrappedPropertySource(propertySource);
-    }
-
-    @Override
-    public int getOrdinal() {
-        return ordinalAssigned!=null?ordinalAssigned.intValue():wrapped.getOrdinal();
-    }
-
-    /**
-     * Applies the given ordinal to the instance.
-     * @param ordinal the new ordinal.
-     */
-    public void setOrdinal(int ordinal){
-        this.ordinalAssigned = ordinal;
-    }
-
-    /**
-     * Resetting the ordinal to the one of the wrapped property source.
-     */
-    public void resetOrdinal(){
-        this.ordinalAssigned = null;
-    }
-
-    @Override
-    public String getName() {
-        return wrapped.getName();
-    }
-
-    @Override
-    public PropertyValue get(String key) {
-        PropertyValue value = wrapped.get(key);
-        if(value != null && value.getValue()!=null){
-            if(filters!=null){
-                String filteredValue = value.getValue();
-                for(PropertyFilter pf:filters){
-                    filteredValue = pf.filterProperty(filteredValue, new FilterContext(key, value.getConfigEntries(), true));
-                }
-                if(filteredValue!=null){
-                    return PropertyValue.builder(key, filteredValue, getName())
-                            .setContextData(value.getConfigEntries()).build();
-                }
-            }
-        }
-        return value;
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        Map<String, String> props = wrapped.getProperties();
-        if(filters!=null){
-            String filteredValue = value.getValue();
-            for(PropertyFilter pf:filters){
-                filteredValue = pf.filterProperty(filteredValue, new FilterContext(key, value.getConfigEntries(), true));
-            }
-            if(filteredValue!=null){
-                return PropertyValue.builder(key, filteredValue, getName())
-                        .setContextData(value.getConfigEntries()).build();
-            }
-        }
-    }
-
-    @Override
-    public boolean isScannable() {
-        return wrapped.isScannable();
-    }
-
-    @Override
-    public String toString() {
-        return "WrappedPropertySource{" +
-                "ordinalAssigned=" + ordinalAssigned +
-                ", wrapped=" + wrapped +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/DSLLoadingConfigurationProviderSpi.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/DSLLoadingConfigurationProviderSpi.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/DSLLoadingConfigurationProviderSpi.java
deleted file mode 100644
index e640e3f..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/DSLLoadingConfigurationProviderSpi.java
+++ /dev/null
@@ -1,81 +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.metamodel.dsl.internal;
-
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.metamodel.dsl.TamayaConfigurator;
-import org.apache.tamaya.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.spi.ConfigurationProviderSpi;
-import org.apache.tamaya.spi.ServiceContextManager;
-
-import javax.annotation.Priority;
-
-/**
- * ConfigurationContext that uses {@link TamayaConfigurator} to configure the
- * Tamaya runtime context.
- */
-@Priority(10)
-public class DSLLoadingConfigurationProviderSpi implements ConfigurationProviderSpi{
-
-    private boolean configured;
-
-    private ConfigurationContext context = ConfigurationProvider.getConfigurationContextBuilder().build();
-    private Configuration config = ConfigurationProvider.createConfiguration(context);
-
-
-    @Override
-    public ConfigurationContextBuilder getConfigurationContextBuilder() {
-        return ServiceContextManager.getServiceContext().getService(ConfigurationContextBuilder.class);
-    }
-
-    @Override
-    public void setConfigurationContext(ConfigurationContext context){
-        // TODO think on a SPI or move event part into API...
-        this.config = ConfigurationProvider.createConfiguration(context);
-        this.context = context;
-    }
-
-    @Override
-    public boolean isConfigurationContextSettable() {
-        return true;
-    }
-
-    @Override
-    public Configuration getConfiguration() {
-        checkInitialized();
-        return config;
-    }
-
-    @Override
-    public ConfigurationContext getConfigurationContext() {
-        checkInitialized();
-        return context;
-    }
-
-    private void checkInitialized() {
-        if(!configured){
-            synchronized (context) {
-                TamayaConfigurator.getInstance().configure();
-                configured = true;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/NamedDSLPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/NamedDSLPropertySourceProvider.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/NamedDSLPropertySourceProvider.java
deleted file mode 100644
index 6c50dc1..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/NamedDSLPropertySourceProvider.java
+++ /dev/null
@@ -1,53 +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.metamodel.dsl.internal;
-
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.metamodel.spi.DSLPropertySourceProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-/**
- * DSL provider implementation that allows to use registered {@link PropertySource} instances
- * by matching {@link PropertySource#getName()} with the configured value and overriding the
- * {@link PropertySource#getOrdinal()} method.
- */
-public class NamedDSLPropertySourceProvider implements DSLPropertySourceProvider{
-
-    private static final Logger LOG = Logger.getLogger(NamedDSLPropertySourceProvider.class.getName());
-
-    @Override
-    public List<PropertySource> resolve(String sourceExpression, Map<String, PropertySource> defaultPropertySources) {
-        List<PropertySource> result = new ArrayList<>();
-        PropertySource ps = defaultPropertySources.get(sourceExpression);
-        if(ps==null){
-            LOG.warning("No such property source provider found: " + sourceExpression);
-        }
-        result.add(ps);
-        return result;
-    }
-
-    @Override
-    public String getKey() {
-        return "named:";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/ResourceDSLPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/ResourceDSLPropertySourceProvider.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/ResourceDSLPropertySourceProvider.java
deleted file mode 100644
index f2f2a71..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/dsl/internal/ResourceDSLPropertySourceProvider.java
+++ /dev/null
@@ -1,82 +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.metamodel.dsl.internal;
-
-import org.apache.tamaya.metamodel.dsl.DSLFormatManager;
-import org.apache.tamaya.format.ConfigurationData;
-import org.apache.tamaya.format.ConfigurationFormat;
-import org.apache.tamaya.resource.ConfigResources;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spisupport.MapPropertySource;
-import org.apache.tamaya.metamodel.spi.DSLPropertySourceProvider;
-
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * DSL provider implementation that allows to use registered {@link PropertySource} instances
- * by matching {@link PropertySource#getName()} with the configured value and overriding the
- * {@link PropertySource#getOrdinal()} method.
- */
-public class ResourceDSLPropertySourceProvider implements DSLPropertySourceProvider{
-
-    private static final Logger LOG = Logger.getLogger(ResourceDSLPropertySourceProvider.class.getName());
-
-    @Override
-    public List<PropertySource> resolve(String sourceExpression, Map<String, PropertySource> defaultPropertySources) {
-        List<PropertySource> result = new ArrayList<>();
-        List<URL> resources = new ArrayList<>();
-        if(sourceExpression.contains("SUFFIX")) {
-            for (String suffix : DSLFormatManager.getInstance().getSuffixes()) {
-                Collection<URL> locations = ConfigResources.getResourceResolver().getResources(getClass().getClassLoader(),
-                        sourceExpression.replace("SUFFIX", suffix));
-                loadPropertySources(locations, result);
-            }
-        }else {
-            Collection<URL> locations = ConfigResources.getResourceResolver().getResources(getClass().getClassLoader(),
-                    sourceExpression);
-            loadPropertySources(locations, result);
-        }
-        return result;
-    }
-
-    private void loadPropertySources(Collection<URL> locations, List<PropertySource> result) {
-        for(URL url:locations){
-            for(ConfigurationFormat format: DSLFormatManager.getInstance().getFormats()) {
-                try(InputStream is = url.openStream()){
-                    ConfigurationData data = format.readConfiguration(url.toString(),is);
-                    result.add(new MapPropertySource(url.toString(), data.getCombinedProperties()));
-                }catch(Exception e){
-                    LOG.log(Level.FINEST, "Format failed: " + format.getName() + " for " + url, e);
-                }
-            }
-        }
-    }
-
-    @Override
-    public String getKey() {
-        return "resource:";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/CombinationPolicyReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/CombinationPolicyReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/CombinationPolicyReader.java
new file mode 100644
index 0000000..4c9217d
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/CombinationPolicyReader.java
@@ -0,0 +1,61 @@
+/*
+ * 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.metamodel.internal;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertyValueCombinationPolicy;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.logging.Logger;
+
+
+/**
+ * Metaconfiguration reader that reads the configuration combination policy to be used.
+ */
+public class CombinationPolicyReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(CombinationPolicyReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("combination-policy");
+        if(nodeList.getLength()==0){
+            LOG.finest("No explicit combination policy configured, using default.");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            throw new ConfigException("Only one combination policy can be applied.");
+        }
+        Node node = nodeList.item(0);
+        String type = node.getAttributes().getNamedItem("type").getNodeValue();
+        LOG.finest("Loading combination policy configured: " + type);
+        ItemFactory<PropertyValueCombinationPolicy> policyFactory = ItemFactoryManager.getInstance().getFactory(PropertyValueCombinationPolicy.class, type);
+        PropertyValueCombinationPolicy policy = policyFactory.create(ComponentConfigurator.extractParameters(node));
+        ComponentConfigurator.configure(policy, node);
+        contextBuilder.setPropertyValueCombinationPolicy(policy);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentConfigurator.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentConfigurator.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentConfigurator.java
new file mode 100644
index 0000000..93c50da
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentConfigurator.java
@@ -0,0 +1,87 @@
+/*
+ * 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.metamodel.internal;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.*;
+import java.util.logging.Logger;
+
+/**
+ * Small helper class for loading of configured instances.
+ */
+public final class ComponentConfigurator<T> {
+
+    private static final Logger LOG = Logger.getLogger(ComponentConfigurator.class.getName());
+
+    private ComponentConfigurator(){}
+
+    /**
+     * Configures the given instance with whatever is defined in the current child nodes.
+     * @param instance the instance to be configured, not null.
+     * @param node the node containing any configuration child nodes, not null.
+     */
+    public static void configure(Object instance, Node node) {
+        NodeList entryNodes = node.getChildNodes();
+        Map<String,String> params = new HashMap<>();
+        for(int c=0;c<entryNodes.getLength();c++) {
+            Node filterNode = entryNodes.item(c);
+            if ("param".equals(filterNode.getNodeName())) {
+                String key = filterNode.getAttributes().getNamedItem("name").getNodeValue();
+                String value = filterNode.getTextContent();
+                params.put(key, value);
+            }
+        }
+        configure(instance, params);
+    }
+
+    /**
+     * Configures the given instance with whatever is defined in the current child nodes.
+     * @param instance the instance to be configured, not null.
+     * @param params the node containing any configuration child nodes, not null.
+     */
+    public static void configure(Object instance, Map<String,String> params) {
+        LOG.finest("Configuring instance: " + instance + " with " + params);
+        for(Map.Entry<String,String> en:params.entrySet()){
+            if(!params.isEmpty()){
+                applyParam(instance, en.getKey(), en.getValue());
+            }
+        }
+    }
+
+    private static void applyParam(Object instance, String param, String value) {
+        // TODO apply parameters to instance using reflection ,only if found.
+    }
+
+    public static Map<String, String> extractParameters(Node node) {
+        NodeList entryNodes = node.getChildNodes();
+        Map<String,String> params = new HashMap<>();
+        for(int c=0;c<entryNodes.getLength();c++) {
+            Node filterNode = entryNodes.item(c);
+            if ("param".equals(filterNode.getNodeName())) {
+                String key = filterNode.getAttributes().getNamedItem("name").getNodeValue();
+                String value = filterNode.getTextContent();
+                params.put(key, value);
+            }
+        }
+        return params;
+    }
+
+}