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/11/01 23:47:25 UTC

[3/5] incubator-tamaya-sandbox git commit: Added missing files, synched Workspace.

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/etcd/src/test/java/org/apache/tamaya/etcd/EtcdPropertySourceTest.java
----------------------------------------------------------------------
diff --git a/etcd/src/test/java/org/apache/tamaya/etcd/EtcdPropertySourceTest.java b/etcd/src/test/java/org/apache/tamaya/etcd/EtcdPropertySourceTest.java
new file mode 100644
index 0000000..898a963
--- /dev/null
+++ b/etcd/src/test/java/org/apache/tamaya/etcd/EtcdPropertySourceTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.etcd;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by atsticks on 07.01.16.
+ */
+public class EtcdPropertySourceTest {
+
+    private final EtcdPropertySource propertySource = new EtcdPropertySource();
+
+    @BeforeClass
+    public static void setup(){
+        System.setProperty("etcd.server.urls", "http://8.8.8.8:4001,http://192.168.99.105:4001");
+    }
+
+    @Test
+    public void testGetOrdinal() throws Exception {
+        assertEquals(propertySource.getOrdinal(), 1000);
+    }
+
+    @Test
+    public void testGetDefaultOrdinal() throws Exception {
+        assertEquals(propertySource.getDefaultOrdinal(), 1000);
+    }
+
+    @Test
+    public void testGetName() throws Exception {
+        assertEquals("etcd", propertySource.getName());
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        Map<String,String> props = propertySource.getProperties();
+        for(Map.Entry<String,String> en:props.entrySet()){
+            assertNotNull("Key not found: " + en.getKey(), propertySource.get(en.getKey()));
+        }
+    }
+
+    @Test
+    public void testGetProperties() throws Exception {
+        Map<String,String> props = propertySource.getProperties();
+        assertNotNull(props);
+    }
+
+    @Test
+    public void testIsScannable() throws Exception {
+        assertTrue(propertySource.isScannable());
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/jodatime/src/main/java/org/apache/tamaya/jodatime/DurationConverter.java
----------------------------------------------------------------------
diff --git a/jodatime/src/main/java/org/apache/tamaya/jodatime/DurationConverter.java b/jodatime/src/main/java/org/apache/tamaya/jodatime/DurationConverter.java
new file mode 100644
index 0000000..36d6fe9
--- /dev/null
+++ b/jodatime/src/main/java/org/apache/tamaya/jodatime/DurationConverter.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.jodatime;
+
+import org.apache.tamaya.spi.ConversionContext;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.joda.time.Duration;
+import org.joda.time.Period;
+
+import java.util.Objects;
+
+/**
+ * <p>A {@link PropertyConverter} for converting a string representation of a
+ * given duration into a {@link Duration} instance.</p>
+ *
+ * <p>This converter supports the following string representations of a
+ * duration:</p>
+ *
+ *   <ol>
+ *     <li>ISO8601 format ({@code PTa.bS}). For example, "PT72.345S" represents 1 minute,
+ *     12 seconds and 345 milliseconds.</li>
+ *     <li>All the period formats as defined in {@link PeriodConverter}.</li>
+ *   </ol>
+ */
+public class DurationConverter implements PropertyConverter<Duration> {
+
+    private PeriodConverter periodConverter = new PeriodConverter();
+
+    @Override
+    public Duration convert(String value, ConversionContext context) {
+        String trimmed = Objects.requireNonNull(value).trim();
+        addSupportedFormats(context);
+        try {
+            return Duration.parse(value);
+        }catch(Exception e){
+            Period period = null;
+            if(value.startsWith("P")){
+                period = periodConverter.convert("P0Y0M0W"+value.substring(1), null);
+            }
+            if(period == null){
+                period = periodConverter.convert("P0000-00-"+value, null);
+            }
+            if(period != null){
+                return period.toStandardDuration();
+            }
+        }
+        return null;
+    }
+
+    private void addSupportedFormats(ConversionContext context) {
+        context.addSupportedFormats(getClass(), "PTa.bS");
+        context.addSupportedFormats(getClass(), "PdDThHmMsS");
+        context.addSupportedFormats(getClass(), "ddThh:mm:ss");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterIT.java
----------------------------------------------------------------------
diff --git a/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterIT.java b/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterIT.java
new file mode 100644
index 0000000..41288a8
--- /dev/null
+++ b/jodatime/src/test/java/org/apache/tamaya/jodatime/DurationConverterIT.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jodatime;
+
+
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.ServiceContextManager;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.notNullValue;
+
+public class DurationConverterIT {
+    @Test
+    public void durationperiodConverterCanBeFoundAsServiceProvider() {
+        List<PropertyConverter> formats = ServiceContextManager.getServiceContext()
+                                                               .getServices(PropertyConverter.class);
+
+        PropertyConverter<?> converter = null;
+
+        for (PropertyConverter format : formats) {
+            if (format instanceof DurationConverter) {
+                converter = format;
+                break;
+            }
+        }
+
+        assertThat("Converter not found via service context.", converter, notNullValue());
+        assertThat(converter, instanceOf(DurationConverter.class));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/pom.xml
----------------------------------------------------------------------
diff --git a/management/pom.xml b/management/pom.xml
new file mode 100644
index 0000000..5af0cf2
--- /dev/null
+++ b/management/pom.xml
@@ -0,0 +1,81 @@
+<!-- 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy current the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.tamaya.ext</groupId>
+        <artifactId>tamaya-sandbox</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <artifactId>tamaya-management</artifactId>
+    <name>Apache Tamaya Modules - JMX Support</name>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <jdkVersion>1.7</jdkVersion>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-functions</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-core</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>java-hamcrest</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.tamaya.management
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/java/org/apache/tamaya/management/ConfigManagementSupport.java
----------------------------------------------------------------------
diff --git a/management/src/main/java/org/apache/tamaya/management/ConfigManagementSupport.java b/management/src/main/java/org/apache/tamaya/management/ConfigManagementSupport.java
new file mode 100644
index 0000000..64fa062
--- /dev/null
+++ b/management/src/main/java/org/apache/tamaya/management/ConfigManagementSupport.java
@@ -0,0 +1,128 @@
+/*
+ * 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.management;
+
+
+import org.apache.tamaya.spi.ServiceContextManager;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Accessor singleton for the JMX configuration support module.
+ */
+public class ConfigManagementSupport {
+
+    /** The logger used. */
+    private final static Logger LOG = Logger.getLogger(ConfigManagementSupport.class.getName());
+
+    /**
+     * Private singleton constructor.
+     */
+    private ConfigManagementSupport(){}
+
+    /**
+     * Creates a new instance of a {@link ManagedConfigMBean} instance. This method uses the
+     * current {@link ServiceContextManager} to resolve the implementation to be used.
+     * @return a new ManagedConfigMBean instance, or null
+     * @throws org.apache.tamaya.ConfigException if there are multiple service implementations with the
+     *          maximum priority.
+     */
+    private static ManagedConfigMBean createMBean(){
+        return ServiceContextManager.getServiceContext()
+                .getService(ManagedConfigMBean.class);
+    }
+
+    /**
+     * Registers a new instance of {@link ManagedConfigMBean} mbean for accessing config documentation into the local platform
+     * mbean server.
+     * @return the registered ObjectName, or null, if no bean could be created.
+     */
+    public static ObjectName registerMBean() {
+        return registerMBean(null);
+    }
+
+    /**
+     * Registers the {@link ManagedConfigMBean} mbean for accessing config documentation into the local platform
+     * mbean server.
+     * @param context An optional context parameter to be added to the object name.
+     * @return the registered ObjectName, or null, if no bean could be created.
+     */
+    public static ObjectName registerMBean(String context) {
+        try{
+            ManagedConfigMBean configMbean = createMBean();
+            if(configMbean==null){
+                return null;
+            }
+            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            ObjectName on = context==null?new ObjectName("org.apache.tamaya.managemet:type=ManagedConfigMBean"):
+                    new ObjectName("org.apache.tamaya.management:type=ManagedConfigMBean,context="+context);
+            try{
+                mbs.getMBeanInfo(on);
+                LOG.info("Cannot register mbean " + on + ": already existing.");
+                return on;
+            } catch(InstanceNotFoundException e) {
+                LOG.info("Registering mbean " + on + "...");
+                mbs.registerMBean(configMbean, on);
+                return on;
+            }
+        } catch(Exception e){
+            LOG.log(Level.WARNING, "Failed to register ManagedConfigMBean.", e);
+        }
+        return null;
+    }
+
+    /**
+     * Unregisters a new instance of {@link ManagedConfigMBean} mbean for accessing config documentation
+     * into the local platform mbean server.
+     * @return the unregistered ObjectName, or null, if no bean could be found.
+     */
+    public static ObjectName unregisterMBean() {
+        return unregisterMBean(null);
+    }
+
+    /**
+     * Unegisters the {@link ManagedConfigMBean} mbean for accessing config documentation into the local
+     * platform mbean server.
+     * @param context An optional context parameter to be added to the object name.
+     * @return the unregistered ObjectName, or null, if no bean could be created.
+     */
+    public static ObjectName unregisterMBean(String context) {
+        try{
+            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            ObjectName on = context==null?new ObjectName("org.apache.tamaya.managemet:type=ManagedConfigMBean"):
+                    new ObjectName("org.apache.tamaya.management:type=ManagedConfigMBean,context="+context);
+            try{
+                mbs.unregisterMBean(on);
+                LOG.info("Unregistered mbean " + on + ".");
+                return on;
+            } catch(InstanceNotFoundException e) {
+                LOG.log(Level.INFO, "Unregistering mbean " + on + " failed.", e);
+            }
+        } catch(Exception e){
+            LOG.log(Level.WARNING, "Failed to unregister ManagedConfigMBean.", e);
+        }
+        return null;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/java/org/apache/tamaya/management/ManagedConfig.java
----------------------------------------------------------------------
diff --git a/management/src/main/java/org/apache/tamaya/management/ManagedConfig.java b/management/src/main/java/org/apache/tamaya/management/ManagedConfig.java
new file mode 100644
index 0000000..dab3457
--- /dev/null
+++ b/management/src/main/java/org/apache/tamaya/management/ManagedConfig.java
@@ -0,0 +1,110 @@
+/*
+ * 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.management;
+
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.functions.ConfigurationFunctions;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Default implementation of the {@link ManagedConfigMBean} interface. Each bean binds to the
+ * current Configuration instance on creation.
+ */
+public class ManagedConfig implements ManagedConfigMBean {
+
+    /**
+     * Classloader that was active when this instance was created.
+     */
+    private ClassLoader classLoader;
+
+    /**
+     * Constructor, which binds this instance to the current TCCL. In the rare cases where
+     * the TCCL is null, this class's classloader is used.
+     */
+    public ManagedConfig() {
+        this.classLoader = Thread.currentThread().getContextClassLoader();
+        if (this.classLoader == null) {
+            this.classLoader = ManagedConfigMBean.class.getClassLoader();
+        }
+    }
+
+    @Override
+    public String getJsonConfigurationInfo() {
+        return getConfigurationInternal().query(ConfigurationFunctions.jsonInfo());
+    }
+
+    @Override
+    public String getXmlConfigurationInfo() {
+        return getConfigurationInternal().query(ConfigurationFunctions.xmlInfo());
+    }
+
+    @Override
+    public Map<String, String> getConfiguration() {
+        return getConfigurationInternal().getProperties();
+    }
+
+    @Override
+    public Map<String, String> getSection(String area, boolean recursive) {
+        return getConfigurationInternal().with(ConfigurationFunctions.section(area, recursive)).getProperties();
+    }
+
+    @Override
+    public Set<String> getSections() {
+        return getConfigurationInternal().query(ConfigurationFunctions.sections());
+    }
+
+    @Override
+    public Set<String> getTransitiveSections() {
+        return getConfigurationInternal().query(ConfigurationFunctions.transitiveSections());
+    }
+
+    @Override
+    public boolean isAreaExisting(String area) {
+        return !getConfigurationInternal().with(
+                ConfigurationFunctions.section(area)).getProperties().isEmpty();
+    }
+
+    @Override
+    public boolean isAreaEmpty(String area) {
+        return getSection(area, true).isEmpty();
+    }
+
+
+    /**
+     * Evaluate the current configuration. By default this class is temporarely setting the
+     * TCCL to the instance active on bean creation and then calls {@link ConfigurationProvider#getConfiguration()}.
+     *
+     * @return the configuration instance to be used.
+     */
+    protected Configuration getConfigurationInternal() {
+        ClassLoader currentCL = Thread.currentThread().getContextClassLoader();
+        try{
+            Thread.currentThread().setContextClassLoader(this.classLoader);
+            return ConfigurationProvider.getConfiguration();
+        } finally{
+            Thread.currentThread().setContextClassLoader(currentCL);
+        }
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/java/org/apache/tamaya/management/ManagedConfigMBean.java
----------------------------------------------------------------------
diff --git a/management/src/main/java/org/apache/tamaya/management/ManagedConfigMBean.java b/management/src/main/java/org/apache/tamaya/management/ManagedConfigMBean.java
new file mode 100644
index 0000000..7fa1eef
--- /dev/null
+++ b/management/src/main/java/org/apache/tamaya/management/ManagedConfigMBean.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.management;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Managed bean interface for accessing environment data.
+ */
+public interface ManagedConfigMBean {
+
+    /**
+     * Get a general description of the configuration (context) in place, in JSON format:
+     * <pre>
+     * Configuration: {
+     *   "class": "org.apache.tamaya.core.internal.DefaultConfiguration",
+     *   "timestamp": 1440426409388,
+     *   "data": {
+     *     "ALLUSERSPROFILE": "C:\ProgramData",
+     *     "APPDATA": "C:\Users\Anatole\AppData\Roaming",
+     *     "COMPUTERNAME": "DEVBOX-WIN",
+     *     "ComSpec": "C:\Windows\system32\cmd.exe",
+     *     "CommonProgramFiles": "C:\Program Files\Common Files",
+     *     "CommonProgramFiles(x86)": "C:\Program Files (x86)\Common Files",
+     *     "CommonProgramW6432": "C:\Program Files\Common Files",
+     *     "FP_NO_HOST_CHECK": "NO",
+     *     "HOMEDRIVE": "C:",
+     *     // ...
+     *   }
+     * }
+     * </pre>
+     *
+     * @return a JSON formatted meta-information.
+     */
+    String getJsonConfigurationInfo();
+
+    /**
+     * Get a general description of the configuration (context) in place, in JSON format:
+     * <pre>
+     *     ConfigurationContext[gqContextClassName] {
+     *         version = 2345-34334-2333-3434,
+     *         config {
+     *             key = "value",
+     *             key2 = "value2"
+     *             ...
+     *         },
+     *         filters = [...],
+     *         converters{...},
+     *         property-sources{...}
+     *     }
+     * </pre>
+     *
+     * @return a JSON formatted meta-information.
+     */
+    String getXmlConfigurationInfo();
+
+    /**
+     * Accesses a configuration current a given type as Map.
+     *
+     * @return the current configuration map.
+     * @throws org.apache.tamaya.ConfigException If the configuration is not available.
+     */
+    Map<String, String> getConfiguration();
+
+    /**
+     * Accesses a configuration values for current a given config section as Map.
+     * @param area the target section key, not null.
+     * @param recursive if set to false only direct child keys of the given section are returned.
+     * @return the key/values found, including the recursive child values.
+     * @throws org.apache.tamaya.ConfigException If the configuration is not yet loaded.
+     */
+    Map<String, String> getSection(String area, boolean recursive);
+
+    /**
+     * Access the defined sections for a given configuration.
+     * @return the sections defined (only returning the sections that contain properties).
+     * @throws org.apache.tamaya.ConfigException If the configuration is not yet loaded
+     */
+    Set<String> getSections();
+
+    /**
+     * Access the transitive sections for the current configuration.
+     * @return the transitive sections defined.
+     * @throws org.apache.tamaya.ConfigException If the configuration is not yet loaded
+     */
+    Set<String> getTransitiveSections();
+
+    /**
+     * Allows to determine if an section is existing.
+     * @param area the target section key, not null.
+     * @return true, if such an section exists (the section may be empty).
+     */
+    boolean isAreaExisting(String area);
+
+    /**
+     * Allows to determine if an section is empty.
+     * @param area the target section key, not null.
+     * @return true, if such an section exists and is not empty.
+     */
+    boolean isAreaEmpty(String area);
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/management/src/main/resources/META-INF/beans.xml b/management/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..adee378
--- /dev/null
+++ b/management/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy current the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">
+
+</beans>
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/resources/META-INF/javaconfiguration.properties
----------------------------------------------------------------------
diff --git a/management/src/main/resources/META-INF/javaconfiguration.properties b/management/src/main/resources/META-INF/javaconfiguration.properties
new file mode 100644
index 0000000..333ba9c
--- /dev/null
+++ b/management/src/main/resources/META-INF/javaconfiguration.properties
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy current the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z=alphabet

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/main/resources/META-INF/services/org.apache.tamaya.management.ManagedConfigMBean
----------------------------------------------------------------------
diff --git a/management/src/main/resources/META-INF/services/org.apache.tamaya.management.ManagedConfigMBean b/management/src/main/resources/META-INF/services/org.apache.tamaya.management.ManagedConfigMBean
new file mode 100644
index 0000000..4ba72b6
--- /dev/null
+++ b/management/src/main/resources/META-INF/services/org.apache.tamaya.management.ManagedConfigMBean
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy current the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.tamaya.management.ManagedConfig
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/test/java/org/apache/tamaya/management/internal/ManagedConfigTest.java
----------------------------------------------------------------------
diff --git a/management/src/test/java/org/apache/tamaya/management/internal/ManagedConfigTest.java b/management/src/test/java/org/apache/tamaya/management/internal/ManagedConfigTest.java
new file mode 100644
index 0000000..90ad0bf
--- /dev/null
+++ b/management/src/test/java/org/apache/tamaya/management/internal/ManagedConfigTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.management.internal;
+
+import org.apache.tamaya.management.ConfigManagementSupport;
+import org.apache.tamaya.management.ManagedConfig;
+import org.apache.tamaya.management.ManagedConfigMBean;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by Anatole on 20.08.2015.
+ */
+public class ManagedConfigTest {
+
+    private final ManagedConfigMBean bean = new ManagedConfig();
+
+    @org.junit.Test
+    public void testGetJsonConfigurationInfo() throws Exception {
+        String info = bean.getJsonConfigurationInfo();
+        assertNotNull(info);
+        assertTrue(info.contains("java.version"));
+        System.out.println(bean.getJsonConfigurationInfo());
+    }
+
+    @org.junit.Test
+    public void testGetXmlConfigurationInfo() throws Exception {
+        String info = bean.getXmlConfigurationInfo();
+        assertNotNull(info);
+        assertTrue(info.contains("java.version"));
+        assertTrue(info.contains("<configuration>"));
+        System.out.println(bean.getXmlConfigurationInfo());
+    }
+
+    @org.junit.Test
+    public void testGetConfiguration() throws Exception {
+        Map<String,String> config = bean.getConfiguration();
+        assertNotNull(config);
+        for(Map.Entry<Object, Object> en:System.getProperties().entrySet()){
+            assertEquals(config.get(en.getKey()),en.getValue());
+        }
+    }
+
+    @org.junit.Test
+    public void testGetConfigurationArea() throws Exception {
+        Map<String,String> cfg = bean.getSection("java", false);
+        for(Map.Entry<String,String> en:cfg.entrySet()){
+            assertEquals(System.getProperty(en.getKey()), en.getValue());
+        }
+    }
+
+    @org.junit.Test
+    public void testGetAreas() throws Exception {
+        Set<String> sections = (bean.getSections());
+        assertNotNull(sections);
+        assertTrue(sections.contains("java"));
+        assertTrue(sections.contains("file"));
+    }
+
+    @org.junit.Test
+    public void testGetTransitiveAreas() throws Exception {
+        Set<String> sections = (bean.getTransitiveSections());
+        Set<String> sectionsNT = (bean.getSections());
+        assertNotNull(sections);
+        assertTrue(sections.contains("java"));
+        assertTrue(sections.contains("sun"));
+        assertTrue(sections.contains("sun.os"));
+        assertTrue(sectionsNT.size()<sections.size());
+    }
+
+    @org.junit.Test
+    public void testIsAreaExisting() throws Exception {
+        assertTrue(bean.isAreaExisting("java"));
+        assertFalse(bean.isAreaExisting("sd.fldsfl.erlwsf"));
+    }
+
+    @org.junit.Test
+    public void testRegisterMBean() throws Exception {
+        ObjectName on = ConfigManagementSupport.registerMBean();
+        ConfigManagementSupport.registerMBean();
+        // Lookup object name
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        assertTrue(mbs.getMBeanInfo(on)!=null);
+    }
+
+    @org.junit.Test
+    public void testRegisterMBean1() throws Exception {
+        ObjectName on1 = ConfigManagementSupport.registerMBean("SubContext1");
+        ConfigManagementSupport.registerMBean("SubContext1");
+        ObjectName on2 = ConfigManagementSupport.registerMBean("SubContext2");
+        // Lookup object name
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        assertTrue(mbs.getMBeanInfo(on1)!=null);
+        assertTrue(mbs.getMBeanInfo(on2)!=null);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/management/src/test/resources/META-INF/beans.xml
----------------------------------------------------------------------
diff --git a/management/src/test/resources/META-INF/beans.xml b/management/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..adee378
--- /dev/null
+++ b/management/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy current the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">
+
+</beans>
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/pom.xml
----------------------------------------------------------------------
diff --git a/metamodel/pom.xml b/metamodel/pom.xml
new file mode 100644
index 0000000..f7f9dd8
--- /dev/null
+++ b/metamodel/pom.xml
@@ -0,0 +1,123 @@
+<!--
+  ~ 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.tamaya.ext</groupId>
+        <artifactId>tamaya-sandbox</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <artifactId>tamaya-metamodel</artifactId>
+    <name>Apache Tamaya Modules - Metamodel</name>
+    <description>This extension module provides functionality to configure the
+        configuration system using meta-configuration.
+    </description>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <jdkVersion>1.7</jdkVersion>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-core</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-injection-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-spisupport</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-events</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-formats</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-json</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.johnzon</groupId>
+            <artifactId>johnzon-core</artifactId>
+            <version>0.9-incubating</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-json_1.0_spec</artifactId>
+            <version>1.0-alpha-1</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>java-hamcrest</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.tamaya.model,
+                            org.apache.tamaya.model.spi
+                        </Export-Package>
+                        <Private-Package>
+                            org.apache.tamaya.model.internal
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/ConfigurationContextBuilder.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/ConfigurationContextBuilder.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/ConfigurationContextBuilder.java
new file mode 100644
index 0000000..a84ab96
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/ConfigurationContextBuilder.java
@@ -0,0 +1,354 @@
+/*
+ * 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.Configuration;
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.PropertyFilter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.apache.tamaya.spi.PropertyValueCombinationPolicy;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Builder to create or change a {@link Configuration}. This build allows to programmatically
+ * assemble any kind of configuration based on {@link PropertySource}s. It also provides
+ * methods to change the overall ordering and add the source processors that are configured as
+ * ServiceLoader services, either directly, or indirectly using the {@link org.apache.tamaya.spi.PropertySourceProvider}
+ * SPI.
+ *
+ * Additionally this builder also implements the SPI that provides the default configuration
+ * as returned by {@link org.apache.tamaya.ConfigurationProvider#getConfiguration()}, since by definition the
+ * default configuration equals to the configuration that is created by calling
+ * <pre>
+ *     ConfigurationContextBuilderFactory factory = ...;
+ *     Configuration config = factory.createBuilder().loadDefaults().build();
+ * </pre>
+ */
+public interface ConfigurationContextBuilder {
+
+    /**
+     * Adds one or more property filter instances to the configuration to be build.
+     *
+     * <pre>{@code PropertyFilter quoteReplacingFilter = new QuoteFilter();
+     * PropertyFilter commaRemovingFilter = new CommaFilter();
+     *
+     * builder.addPropertyFilters(commaRemovingFilter, quoteReplacingFilter)};
+     * </pre>
+     *
+     * @param filters list of property filter instances which should be applied
+     *                to the properties of the configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyFilter
+     * @see #getDefaultPropertyFilters()
+     */
+    ConfigurationContextBuilder addPropertyFilters(PropertyFilter... filters);
+
+    /**
+     * Adds one or more property filter instances to the configuration to be build.
+     *
+     * <pre>{@code PropertyFilter quoteReplacingFilter = new QuoteFilter();
+     * PropertyFilter commaRemovingFilter = new CommaFilter();
+     *
+     * builder.addPropertyFilters(commaRemovingFilter, quoteReplacingFilter)};
+     * </pre>
+     *
+     * @param filters list of property filter instances which should be applied
+     *                to the properties of the configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyFilter
+     * @see #getDefaultPropertyFilters()
+     */
+    ConfigurationContextBuilder addPropertyFilters(Collection<PropertyFilter> filters);
+
+    /**
+     * @param propertyValueCombinationPolicy combination policy to use for this builder.
+     * @return the builder instance currently in use.
+     */
+    ConfigurationContextBuilder setPropertyValueCombinationPolicy(
+            PropertyValueCombinationPolicy propertyValueCombinationPolicy);
+
+    /**
+     * Adds a property converter for the a given type to the configuration to
+     * be build.
+     *
+     * <pre>{@code PropertyConverter<MyType> converter = value -> new MyType(value, 42);
+     *
+     * builder.addPropertyConverters(MyType.class, converter}
+     * </pre>
+     *
+     * @param <T> the type of the configuration
+     * @param type the required target type the converter should be applied to
+     * @param converter the converter to be used to convert the string property
+     *                  to the given target type, not null.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyConverter
+     * @see #getDefaultPropertyConverters()
+     */
+    <T> ConfigurationContextBuilder addPropertyConverter(Class<T> type, PropertyConverter<T>... converter);
+
+    /**
+     * Adds a property converter for the a given type to the configuration to
+     * be build.
+     *
+     * <pre>{@code PropertyConverter<MyType> converter = value -> new MyType(value, 42);
+     *
+     * builder.addPropertyConverters(MyType.class, converter}
+     * </pre>
+     *
+     * @param <T> the type of the configuration
+     * @param type the required target type the converter should be applied to
+     * @param converter the converter to be used to convert the string property
+     *                  to the given target type, not null.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyConverter
+     * @see #getDefaultPropertyConverters()
+     */
+    <T> ConfigurationContextBuilder addPropertyConverter(Class<T> type, Collection<PropertyConverter<T>> converter);
+
+    /**
+     * Adds a propertyConverter of a given type.
+     *
+     * @param <T> the type of the configuration
+     * @param type type literal of this converter.
+     * @param propertyConverter property converter, not null.
+     * @return the builder instance currently used
+     */
+    <T> ConfigurationContextBuilder addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T>... propertyConverter);
+
+    /**
+     * Adds a propertyConverter of a given type.
+     *
+     * @param <T> the type of the configuration
+     * @param type type literal of this converter.
+     * @param propertyConverter property converter, not null.
+     * @return the builder instance currently used
+     */
+    <T> ConfigurationContextBuilder addPropertyConverter(TypeLiteral<T> type, Collection<PropertyConverter<T>> propertyConverter);
+
+    /**
+     * Loads the {@link org.apache.tamaya.spi.PropertyConverter}s provided
+     * via the SPI API returns them for adding all or parts of it using the
+     * builder's add methods.
+     *
+     * @return the collection of default instances, not yet registered
+     * within this builder.
+     *
+     * @see #addPropertyConverter(TypeLiteral, PropertyConverter...)
+     * @see #addPropertyConverter(TypeLiteral, Collection)
+     * @see org.apache.tamaya.spi.PropertyConverter
+     */
+    Map<TypeLiteral<?>, Collection<PropertyConverter<?>>> getDefaultPropertyConverters();
+
+
+    /**
+     * Loads the {@link org.apache.tamaya.spi.PropertySource}s provided
+     * via the SPI API, but does not yet register them into this builder.
+     *
+     * @return the builder instance currently used
+     *
+     * @see #addPropertySources(Collection)
+     * @see #addPropertySources(PropertySource...)
+     * @see org.apache.tamaya.spi.PropertySource
+     */
+    Collection<PropertySource> getDefaultPropertySources();
+
+
+    /**
+     * Loads the {@link org.apache.tamaya.spi.PropertyFilter}s provided via the SPI API,
+     * but does not register them into this instance.
+     *
+     * @return the builder instance currently used
+     *
+     * @see #addPropertyFilters(Collection<PropertyFilter>)
+     * @see org.apache.tamaya.spi.PropertyFilter
+     */
+    Collection<PropertyFilter> getDefaultPropertyFilters();
+
+
+    /**
+     * Loads the {@link org.apache.tamaya.spi.PropertySourceProvider
+     * property source providers} provided via the SPI API and
+     * returns them. No property sources are registered.
+     *
+     * @return the builder instance currently used
+     *
+     * @see #addPropertySources(Collection)
+     * @see org.apache.tamaya.spi.PropertySourceProvider
+     */
+    Collection<PropertySourceProvider> getDefaultPropertySourceProviders();
+
+    /**
+     * This method loads the default configuration, which involves the following
+     * steps:
+     * <ol>
+     *     <li>Loading {@link PropertySource} instances registered with the
+     *     {@link java.util.ServiceLoader}.</li>
+     *     <li>Loading {@link org.apache.tamaya.spi.PropertySourceProvider} instances registered with the
+     *     {@link java.util.ServiceLoader}, extracting the provided processors and add them
+     *     to the list of loaded processors</li>
+     *     <li>Sorting the processors collecting based on {@link PropertySource#getOrdinal()} and the
+     *     fully qualified class name as an additional fallback criteria, when the ordinal
+     *     is the same.</li>
+     *     <li>Putting together a {@link Configuration} instance incorporating this
+     *     chain of processors. Hereby when {@link Configuration#get(String)} is called
+     *     the first processor in the chain is asked for a value. If the processor returns {@code null}
+     *     the processChain is repeated until the end of the chain is reached, or a processor returns
+     *     non non-null value. Hereby each processor can actively decide how and if its parent processors
+     *     will be included for subsequent value evaluation for a given key. In other words a processor
+     *     can either simply provide configuration properties (values) or implement a more active functionality
+     *     such as filtering or value collection.</li>
+     * </ol>
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder loadDefaults();
+
+    /**
+     * Get the current number of processors on the chain.
+     * @return the number of registered processors of this instance.
+     */
+    int getChainSize();
+
+    /**
+     * Increses the priority of the given processor instance, meaning moving the processor one
+     * position ahead in the overall processor chain. This will be done regardless of any
+     * ordinal value. If the procerssor already has maximal significance (is on the head of
+     * processors), this method does not have any effect.
+     * @param processor the target procerssor, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder increasePriority(PropertySource processor);
+
+    /**
+     * Decreses the priority of the given processor instance, meaning moving the processor one
+     * position back in the overall processor chain. This will be done regardless of any
+     * ordinal value. If the procerssor already has minimal significance (is the tail of
+     * processors), this method does not have any effect.
+     * @param processor the target procerssor, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder decreasePriority(PropertySource processor);
+
+    /**
+     * Maximizes the priority of the given processor instance, moving it to the head of the
+     * processor chain. This will be done regardless of any
+     * ordinal value. If the procerssor already has minimal significance (is the tail of
+     * processors), this method does not have any effect.
+     * @param processor the target procerssor, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder highestPriority(PropertySource processor);
+
+    /**
+     * Minimizes the priority of the given property source instance, moving it to the tail of the
+     * property source chain. This will be done regardless of any
+     * ordinal value. If the property source already has minimal significance (is the tail of
+     * processors), this method does not have any effect.
+     * @param propertySource the target property source, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder lowestPriority(PropertySource propertySource);
+
+    /**
+     * Add the property sources to the property source chain using thei provided ordinals
+     * for ordering.
+     * @param propertySources the property sources to add, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder addPropertySources(PropertySource... propertySources);
+
+    /**
+     * Add the property sources to the property source chain.
+     * @param propertySources the property sources to add, not null.
+     * @param index index where the new property sources should be inserted.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder addPropertySources(int index, PropertySource... propertySources);
+
+    /**
+     * Add the property sources to the property source chain using thei provided ordinals
+     * for ordering.
+     * @param propertySources the property sources to add, not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder addPropertySources(Collection<PropertySource> propertySources);
+
+    /**
+     * Add the property sources to the property source chain with highest priority (as new chain head).
+     * @param propertySources the property sources to add, not null.
+     * @param index index where the new property sources should be inserted.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder addPropertySources(int index, Collection<PropertySource> propertySources);
+
+    /**
+     * Removes the given property source from the property source chain.
+     * @param propertySource the property source. not null.
+     * @return the builder for further chaining of logic.
+     */
+    ConfigurationContextBuilder removePropertySource(PropertySource propertySource);
+
+    /**
+     * Access a processor using it's unique property source name. If no such property source
+     * is present, this method has no effect.
+     * @param name the property source name, not null.
+     * @return the builder for further chaining of logic.
+     */
+    PropertySource getPropertySource(String name);
+
+    /**
+     * Get access to the current chain of property sources. This returns an immutable list. Use the
+     * methods of this factory to change the ordering or adding/removing of property sources.
+     * @return the current chain of property sources (immutable list).
+     */
+    List<PropertySource> getPropertySourcesChain();
+
+    /**
+     * Get access to the current property sources with a given type. This returns an immutable list. Use the
+     * methods of this factory to change the ordering or adding/removing of property sources.
+     * @return the current chain of property sources (immutable list).
+     */
+    List<PropertySource> getPropertySources(Class<? extends PropertySource> type);
+
+    /**
+     * Get access to the current chain of property sources. This returns an immutable list. Use the
+     * methods of this factory to change the ordering or adding/removing of property sources.
+     * @return the current chain of property sources as names (immutable list).
+     */
+    List<String> getPropertySourcesNames();
+
+    /**
+     * Builds a new configuration based on the current property sources chain.
+     * @return a new configuration instance, never null.
+     */
+    Configuration build();
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/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
new file mode 100644
index 0000000..ce6d99c
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/Context.java
@@ -0,0 +1,130 @@
+/*
+ * 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 Map<String,Context> CONTEXTS = new ConcurrentHashMap();
+    private final Map<String,String> properties = new ConcurrentHashMap<>();
+
+    public static Context getInstance(){
+        return getInstance("");
+    }
+
+    /**
+     * Access the context with a goven contextId, this allows to manage multiple
+     * contexts, e.g. for different EE application's deployed. If no such context
+     * exists a new one will be created.
+     * @param contextId the contextId, not null.
+     * @return the corresponding context, never null.
+     */
+    public static Context getInstance(String contextId){
+        Context context = CONTEXTS.get(contextId);
+        if(context==null){
+            synchronized (Context.class){
+                context = CONTEXTS.get(contextId);
+                if(context==null){
+                    context = new Context();
+                    CONTEXTS.put(contextId, context);
+                }
+            }
+        }
+        return context;
+    }
+
+    public String getProperty(String key){
+        return getProperty(key, null);
+    }
+
+    public String getProperty(String key, String defaultValue){
+        String value = this.properties.get(key);
+        if(value==null){
+            return defaultValue;
+        }
+        return value;
+    }
+
+    public String setProperty(String key, String value){
+       return this.properties.put(key,value);
+    }
+
+    public void setPropertyIfAbsent(String key, String value){
+        String prev = this.properties.get(key);
+        if(prev==null){
+            this.properties.put(key, prev);
+        }
+    }
+
+    public void setProperties(Map<String,String> properties){
+        this.properties.putAll(properties);
+    }
+
+    public boolean checkProperties(String... keys){
+        for(String key:keys) {
+            if (getProperty(key, null) == null) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean checkProperty(String key, String value){
+        if(value!=null){
+            return value.equals(getProperty(key, null));
+        }
+        return !checkProperties(key);
+    }
+
+    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/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
new file mode 100644
index 0000000..f968a15
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+
+import java.util.Collection;
+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.
+ */
+public final class DefaultRefreshablePropertySourceProvider implements PropertySourceProvider, Refreshable {
+
+    private SourceConfig sourceConfig;
+    private PropertySourceProvider wrapped;
+    private Collection<PropertySource> propertSources;
+
+    public DefaultRefreshablePropertySourceProvider(SourceConfig sourceConfig)
+            throws IllegalAccessException, InstantiationException,
+                    ClassNotFoundException {
+        this.sourceConfig = Objects.requireNonNull(sourceConfig);
+        this.wrapped = Objects.requireNonNull(sourceConfig.create(PropertySourceProvider.class));
+        this.propertSources = Objects.requireNonNull(wrapped.getPropertySources());
+    }
+
+    @Override
+    public Collection<PropertySource> getPropertySources() {
+        return this.propertSources;
+    }
+
+    @Override
+    public ConfigurationContext refresh(ConfigurationContext context) {
+        Collection<PropertySource> newPropertySources =
+                Objects.requireNonNull(wrapped.getPropertySources());
+        ConfigurationContextBuilder builder = context.toBuilder();
+        // remove previous sources
+        builder.removePropertySources(this.propertSources);
+        // add new sources
+        builder.addPropertySources(newPropertySources);
+        return builder.build();
+    }
+
+    @Override
+    public String toString() {
+        return "WrappedPropertySource{" +
+                "sourceConfig=" + sourceConfig +
+                ", wrapped=" + wrapped +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
new file mode 100644
index 0000000..dbf8d1f
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
@@ -0,0 +1,140 @@
+/*
+ * 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.metamodel.spi.PropertySourceFactory;
+import org.apache.tamaya.metamodel.spi.PropertySourceProviderFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.apache.tamaya.spi.ServiceContextManager;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Small manager component to maintain the factories to be referenced by type names.
+ */
+final class FactoryManager {
+
+    private static final Logger LOG = Logger.getLogger(FactoryManager.class.getName());
+    private static final FactoryManager INSTANCE = new FactoryManager();
+
+    private Map<String, PropertySourceFactory> sourceFactories = new HashMap<>();
+    private Map<String, PropertySourceProviderFactory> providerFactories = new HashMap<>();
+
+    private FactoryManager(){
+        for(PropertySourceFactory f: ServiceContextManager.getServiceContext().getServices(PropertySourceFactory.class)){
+            this.sourceFactories.put(f.getType(), f);
+        }
+        for(PropertySourceProviderFactory f: ServiceContextManager.getServiceContext().getServices(PropertySourceProviderFactory.class)){
+            this.providerFactories.put(f.getType(), f);
+        }
+    }
+
+    public static FactoryManager getInstance(){
+        return INSTANCE;
+    }
+
+    public PropertySourceFactory getSourceFactory(String type){
+        PropertySourceFactory fact = this.sourceFactories.get(type);
+        if(fact==null){
+            try{
+                Class<? extends PropertySource> psType = (Class<? extends PropertySource>)Class.forName(type);
+                fact = new ImplicitPropertySourceFactory(psType);
+                this.sourceFactories.put(type, fact);
+                return fact;
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to load PropertySourceFactory: " + type);
+            }
+        }
+        throw new IllegalArgumentException("No such PropertySourceFactory: " + type);
+    }
+
+    public PropertySourceProviderFactory getProviderFactory(String type){
+        PropertySourceProviderFactory fact = this.providerFactories.get(type);
+        if(fact==null){
+            try{
+                Class<? extends PropertySourceProvider> psType = (Class<? extends PropertySourceProvider>)Class.forName(type);
+                fact = new ImplicitPropertySourceProviderFactory(psType);
+                this.providerFactories.put(type, fact);
+                return fact;
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to load PropertySourceProviderFactory: " + type);
+            }
+        }
+        throw new IllegalArgumentException("No such PropertySourceProviderFactory: " + type);
+    }
+
+    @Override
+    public String toString() {
+        return "FactoryManager{" +
+                "providerFactories=" + providerFactories.keySet() +
+                ", sourceFactories=" + sourceFactories.keySet() +
+                '}';
+    }
+
+    private static class ImplicitPropertySourceFactory implements PropertySourceFactory{
+
+        private Class<? extends PropertySource> type;
+
+        ImplicitPropertySourceFactory(Class<? extends PropertySource> type){
+            this.type = Objects.requireNonNull(type);
+        }
+
+        @Override
+        public PropertySource create(String config, Map<String, String> extendedConfig) {
+            try {
+                return this.type.newInstance();
+            } catch (Exception e) {
+                throw new IllegalStateException("Cannot instantiate PropertySource: " + this.type.getName(), e);
+            }
+        }
+
+        @Override
+        public String getType() {
+            return null;
+        }
+    }
+
+    private static class ImplicitPropertySourceProviderFactory implements PropertySourceProviderFactory{
+
+        private Class<? extends PropertySourceProvider> type;
+
+        ImplicitPropertySourceProviderFactory(Class<? extends PropertySourceProvider> type){
+            this.type = Objects.requireNonNull(type);
+        }
+
+        @Override
+        public PropertySourceProvider create(String config, Map<String, String> extendedConfig) {
+            try {
+                return this.type.newInstance();
+            } catch (Exception e) {
+                throw new IllegalStateException("Cannot instantiate PropertySourceProvider: " + this.type.getName(), e);
+            }
+        }
+
+        @Override
+        public String getType() {
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
new file mode 100644
index 0000000..bd0103e
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
@@ -0,0 +1,37 @@
+/*
+ * 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.spi.ConfigurationContext;
+
+/**
+ * Common interface for refreshable items.
+ */
+public interface Refreshable {
+
+    /**
+     * Refreshes the given configuration context, by applying any changes
+     * needed to reflect the change.
+     * @param context the configuration context, not null.
+     * @return the new configuration context. In case no changes are
+     *         needed or the changes could be applied implicitly, the
+     *         instance passed as input should be returned.
+     */
+    ConfigurationContext refresh(ConfigurationContext context);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
new file mode 100644
index 0000000..4987111
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
@@ -0,0 +1,233 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Resolver to resolve/map DSL related source expressions into PropertySources
+ * loadable by a ConfigurationContext. Hereby the ordering of loaded property sources must be
+ * honored if possible by implicitly adapting/Overriding the default ordinal for the sources
+ * added.
+ */
+public class SourceConfig {
+
+    private boolean enabled;
+    private String type;
+    private String name;
+    private Integer ordinal;
+    private long refreshInterval;
+    private Map<String,String> sourceConfiguration = new HashMap<>();
+
+    private SourceConfig(Builder builder) {
+        enabled = builder.enabled;
+        type = builder.type;
+        name = builder.name;
+        refreshInterval = builder.refreshInterval;
+        ordinal = builder.ordinal;
+        sourceConfiguration = builder.sourceConfiguration;
+    }
+
+    /**
+     * New builder builder.
+     *
+     * @param type the type
+     * @return the builder
+     */
+    public static Builder newBuilder(String type) {
+        return new Builder(type);
+    }
+
+    /**
+     * New builder builder using this instance's settings.
+     *
+     * @return the builder
+     */
+    public Builder toBuilder() {
+        Builder builder = new Builder(this.type);
+        builder.enabled = this.enabled;
+        builder.type = this.type;
+        builder.ordinal = this.ordinal;
+        builder.name = this.name;
+        builder.sourceConfiguration = this.sourceConfiguration;
+        return builder;
+    }
+
+    /**
+     * Is enabled boolean.
+     *
+     * @return the boolean
+     */
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    /**
+     * Gets source configuration.
+     *
+     * @return the source configuration
+     */
+    public Map<String, String> getSourceConfiguration() {
+        return sourceConfiguration;
+    }
+
+    /**
+     * Gets type.
+     *
+     * @return the type
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * Gets the current refresh interval, default is 0 meaning the property
+     * source is never refreshed.
+     *
+     * @return the refresh interval
+     */
+    public long getRefreshInterval() {
+        return refreshInterval;
+    }
+
+    /**
+     * Gets name.
+     *
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "PropertySourceConfig{" +
+                "enabled=" + enabled +
+                ", type='" + type + '\'' +
+                ", name='" + name + '\'' +
+                ", ordinal=" + ordinal +
+                ", sourceConfiguration=" + sourceConfiguration +
+                '}';
+    }
+
+
+    public <T> T create(Class<T> type)
+            throws ClassNotFoundException, IllegalAccessException,
+            InstantiationException {
+        return (T)Class.forName(this.getType()).newInstance();
+    }
+
+
+    /**
+     * {@code PropertySourceConfig} builder static inner class.
+     */
+    public static final class Builder {
+        private boolean enabled;
+        private String type;
+        private String name;
+        private Integer ordinal;
+        private long refreshInterval;
+        private Map<String, String> sourceConfiguration;
+
+        private Builder(String type) {
+            this.type = Objects.requireNonNull(type);
+            if(type.trim().isEmpty()){
+                throw new IllegalArgumentException("Type is empty.");
+            }
+        }
+
+        /**
+         * Sets the {@code refreshInterval} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code refreshInterval} to set
+         * @return a reference to this Builder
+         */
+        public Builder withRefreshInterval(long val) {
+            refreshInterval = val;
+            return this;
+        }
+
+        /**
+         * Sets the {@code ordinal} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code ordinal} to set
+         * @return a reference to this Builder
+         */
+        public Builder withOrdinal(Integer val) {
+            ordinal = val;
+            return this;
+        }
+
+        /**
+         * Sets the {@code enabled} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code enabled} to set
+         * @return a reference to this Builder
+         */
+        public Builder withEnabled(boolean val) {
+            enabled = val;
+            return this;
+        }
+
+        /**
+         * Sets the {@code type} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code type} to set
+         * @return a reference to this Builder
+         */
+        public Builder withType(String val) {
+            type = val;
+            return this;
+        }
+
+        /**
+         * Sets the {@code name} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code name} to set
+         * @return a reference to this Builder
+         */
+        public Builder withName(String val) {
+            name = val;
+            return this;
+        }
+
+        /**
+         * Sets the {@code sourceConfiguration} and returns a reference to this Builder so that the methods can be chained together.
+         *
+         * @param val the {@code sourceConfiguration} to set
+         * @return a reference to this Builder
+         */
+        public Builder withSourceConfiguration(Map<String, String> val) {
+            sourceConfiguration = val;
+            return this;
+        }
+
+        /**
+         * Returns a {@code PropertySourceConfig} built from the parameters previously set.
+         *
+         * @return a {@code PropertySourceConfig} built with parameters of this {@code PropertySourceConfig.Builder}
+         */
+        public SourceConfig build() {
+            return new SourceConfig(this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/package-info.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/package-info.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/package-info.java
new file mode 100644
index 0000000..c385da6
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+/**
+ * Tamaya metamodel programmatic API.
+ */
+package org.apache.tamaya.metamodel;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/358828fe/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/PropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/PropertySourceFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/PropertySourceFactory.java
new file mode 100644
index 0000000..49f72f2
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/PropertySourceFactory.java
@@ -0,0 +1,49 @@
+/*
+ * 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.spi;
+
+import org.apache.tamaya.metamodel.internal.SourceConfig;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.util.Map;
+
+
+/**
+ * {@link PropertySource} and {@link SourceConfig} instances that
+ * implement configurable are configured with the according configuration
+ * settings provided in the {@code tamaya-config.xml} meta-configuration.
+ */
+public interface PropertySourceFactory {
+
+    /**
+     * Resolve the given expression (without the key part).
+     * @param config the source configuration text, or null.
+     * @param extendedConfig any further extended configuration, not null, but may be
+     *                       empty.
+     * @return the property source, or null.
+     */
+    PropertySource create(String config, Map<String, String> extendedConfig);
+
+    /**
+     * Get the property source type. The type is used to identify the correct factory instance
+     * to resolve a configured property source.
+     * @return the (unique) type key, never null and not empty.
+     */
+    String getType();
+}