You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by pl...@apache.org on 2016/09/25 21:24:37 UTC

[49/50] [abbrv] incubator-tamaya-sandbox git commit: Moved the builder to the directory builder

Moved the builder to the directory builder


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

Branch: refs/heads/master
Commit: f45a5bb5bc1f2bb439980fda4f0da7fae70c19d4
Parents: 09ab45b
Author: Oliver B. Fischer <pl...@apache.org>
Authored: Sun Sep 25 23:20:22 2016 +0200
Committer: Oliver B. Fischer <pl...@apache.org>
Committed: Sun Sep 25 23:20:22 2016 +0200

----------------------------------------------------------------------
 builder/pom.xml                                 | 104 +++
 .../tamaya/builder/ConfigurationBuilder.java    | 605 +++++++++++++
 .../ProgrammaticConfigurationContext.java       | 388 ++++++++
 .../tamaya/builder/PropertySourceBuilder.java   | 118 +++
 .../tamaya/builder/SimplePropertySource.java    |  86 ++
 .../org/apache/tamaya/builder/package-info.java |  28 +
 .../builder/ConfigurationBuilderTest.java       | 907 +++++++++++++++++++
 .../builder/TestANonSPIPropertyFilter.java      |  35 +
 .../builder/TestBNonSPIPropertyFilter.java      |  35 +
 .../tamaya/builder/TestPropertyFilter.java      |  35 +
 .../tamaya/builder/TestPropertySource.java      |  59 ++
 .../builder/TestPropertySourceProvider.java     |  91 ++
 .../builder/TestPropertySourceProviderB.java    |  91 ++
 .../builder/util/mockito/NotMockedAnswer.java   |  57 ++
 .../tamaya/builder/util/types/CustomTypeA.java  |  34 +
 .../tamaya/builder/util/types/CustomTypeB.java  |  39 +
 .../tamaya/builder/util/types/CustomTypeC.java  |  36 +
 .../types/CustomTypeCPropertyConverter.java     |  29 +
 .../org.apache.tamaya.spi.PropertyConverter     |  19 +
 .../org.apache.tamaya.spi.PropertyFilter        |  19 +
 .../org.apache.tamaya.spi.PropertySource        |  19 +
 ...org.apache.tamaya.spi.PropertySourceProvider |  19 +
 .../test/resources/configfiles/json/first.json  |   4 +
 .../test/resources/configfiles/json/second.json |   4 +
 .../test/resources/configfiles/json/simple.json |   4 +
 .../test/resources/configfiles/json/third.json  |   4 +
 .../test/resources/configfiles/other/simple.oml |  19 +
 pom.xml                                         | 104 ---
 .../tamaya/builder/ConfigurationBuilder.java    | 605 -------------
 .../ProgrammaticConfigurationContext.java       | 388 --------
 .../tamaya/builder/PropertySourceBuilder.java   | 118 ---
 .../tamaya/builder/SimplePropertySource.java    |  86 --
 .../org/apache/tamaya/builder/package-info.java |  28 -
 .../builder/ConfigurationBuilderTest.java       | 907 -------------------
 .../builder/TestANonSPIPropertyFilter.java      |  35 -
 .../builder/TestBNonSPIPropertyFilter.java      |  35 -
 .../tamaya/builder/TestPropertyFilter.java      |  35 -
 .../tamaya/builder/TestPropertySource.java      |  59 --
 .../builder/TestPropertySourceProvider.java     |  91 --
 .../builder/TestPropertySourceProviderB.java    |  91 --
 .../builder/util/mockito/NotMockedAnswer.java   |  57 --
 .../tamaya/builder/util/types/CustomTypeA.java  |  34 -
 .../tamaya/builder/util/types/CustomTypeB.java  |  39 -
 .../tamaya/builder/util/types/CustomTypeC.java  |  36 -
 .../types/CustomTypeCPropertyConverter.java     |  29 -
 .../org.apache.tamaya.spi.PropertyConverter     |  19 -
 .../org.apache.tamaya.spi.PropertyFilter        |  19 -
 .../org.apache.tamaya.spi.PropertySource        |  19 -
 ...org.apache.tamaya.spi.PropertySourceProvider |  19 -
 src/test/resources/configfiles/json/first.json  |   4 -
 src/test/resources/configfiles/json/second.json |   4 -
 src/test/resources/configfiles/json/simple.json |   4 -
 src/test/resources/configfiles/json/third.json  |   4 -
 src/test/resources/configfiles/other/simple.oml |  19 -
 54 files changed, 2888 insertions(+), 2888 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/pom.xml
----------------------------------------------------------------------
diff --git a/builder/pom.xml b/builder/pom.xml
new file mode 100644
index 0000000..96f6244
--- /dev/null
+++ b/builder/pom.xml
@@ -0,0 +1,104 @@
+<?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.
+-->
+<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-extensions</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>tamaya-builder</artifactId>
+    <name>Apache Tamaya Modules - Builder</name>
+    <packaging>jar</packaging> <!-- bundle -->
+
+    <inceptionYear>2015</inceptionYear>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-formats</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-spisupport</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-json</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>java-hamcrest</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</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.builder
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build -->
+    
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java b/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java
new file mode 100644
index 0000000..afdc121
--- /dev/null
+++ b/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java
@@ -0,0 +1,605 @@
+/*
+ * 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.builder;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.FlattenedDefaultPropertySource;
+import org.apache.tamaya.spi.ConfigurationContext;
+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 org.apache.tamaya.spisupport.DefaultConfiguration;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Objects;
+
+import static java.lang.String.format;
+
+/**
+ * <p>Builder class used for building a configuration manually without relying
+ * only on the Service Provider Interface API.</p>
+ *
+ * <p><strong>Features of the builder</strong></p>
+ *
+ * <ol>
+ *   <li>Adding of property converters manually</li>
+ *   <li>Adding of property sources directly</li>
+ *   <li>Adding of property sources via URL</li>
+ *   <li>Adding of property source providers directly</li>
+ *   <li>Enabling and disabling of via SPI mechanism provided resources as converters,
+ *       property sources, etc.</li>
+ * </ol>
+ *
+ * <p><strong>Example</strong></p>
+ *
+ * <pre>{@code ConfigurationBuilder builder = new ConfigurationBuilder();
+ * builder.disableProvidedPropertySources()           // Do not load provided property
+ *        .disableProvidedPropertySourceProviders()   // sources and providers automatically
+ *        .addPropertySource("file:/etc/conf.properties"); // Load properties from conf.properties
+ *
+ * Configuration config = builder.build();
+ * }</pre>
+ *
+ * <p><strong>Support for configuration formats</strong></p>
+ *
+ * The configuration builder allows you to put property resources
+ * via a URL, as shown in the code example above, without implementing
+ * a {@link org.apache.tamaya.spi.PropertySource PropertySource} or providing an
+ * instance of a {@link org.apache.tamaya.spi.PropertySource PropertySource}.
+ * If a property resource in
+ * a specific format can be added to configuration builder or not depends
+ * on the available implementations of
+ * {@link org.apache.tamaya.format.ConfigurationFormat} in the classpath.
+ * Which formats are available can be checked via
+ * {@link org.apache.tamaya.format.ConfigurationFormats#getFormats()}.
+ */
+public class ConfigurationBuilder {
+    /** Builder used to create new ConfigurationContext instances. */
+    private final ProgrammaticConfigurationContext.Builder contextBuilder = new ProgrammaticConfigurationContext.Builder();
+
+    /**
+     * Flag if the config has already been built.
+     * Configuration can be built only once
+     */
+    private boolean built;
+
+    /**
+     * Flag if all existing property converter service providers
+     * should be loaded if the configuration is build.
+     */
+    private boolean loadProvidedPropertyConverters = true;
+
+    /**
+     * Flag if all existing property source service providers
+     * will be loaded if the configuration is build.
+     */
+    private boolean loadProvidedPropertySources = false;
+    private boolean loadProvidedPropertySourceProviders = false;
+
+    private boolean isLoadProvidedPropertyFilters = false;
+
+    /**
+     * Creates a new builder instance.
+     */
+    public ConfigurationBuilder() {
+    }
+
+    /**
+     * Allows to set configuration context during unit tests.
+     */
+    ConfigurationBuilder setConfigurationContext(ConfigurationContext configurationContext) {
+        //noinspection deprecation
+        contextBuilder.setConfigurationContext(configurationContext);
+        return this;
+    }
+
+    /**
+     * Adds one resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     * <pre>{@code URL resource = new URL("file:/etc/service/config.json");
+     *
+     * builder.addPropertySources(resource);}
+     * </pre>
+     *
+     * @param url resource with properties for the the configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public ConfigurationBuilder addPropertySource(URL url) {
+        try {
+            ConfigurationData data = getConfigurationDataFromURL(url);
+
+            FlattenedDefaultPropertySource propertySource = new FlattenedDefaultPropertySource(data);
+            addPropertySources(propertySource);
+        } catch (IOException e) {
+            throw new ConfigException("Failed to read " + url.toString(), e);
+        }
+        return this;
+    }
+
+    protected ConfigurationData getConfigurationDataFromURL(URL url) throws IOException {
+        ConfigurationData data = ConfigurationFormats.readConfigurationData(url);
+
+        if (null == data) {
+            String mesg = format("No configuration format found which is able " +
+                                 "to read properties from %s.", url.toString());
+
+            throw new ConfigException(mesg);
+        }
+
+        return data;
+    }
+
+    /**
+     * Adds one or more resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     *<pre>{@code URL first = new URL("file:/etc/service/config.json");
+     * URL second = new URL("file:/etc/defaults/values.properties");
+     *
+     * builder.addPropertySources(first, second);}
+     *</pre>
+     *
+     * @param urls list of resources with properties for the configuration to be
+     *             build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public ConfigurationBuilder addPropertySources(URL... urls) {
+        for(URL url:urls){
+            if(url!=null){
+                addPropertySource(url);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Adds one or more resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     *<pre>{@code URL first = new URL("file:/etc/service/config.json");
+     * URL second = new URL("file:/etc/defaults/values.properties");
+     *
+     * builder.addPropertySources(first, second);}
+     *</pre>
+     *
+     * @param urls list of resources with properties for the configuration to be
+     *             build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public ConfigurationBuilder addPropertySources(Collection<URL> urls) {
+        for(URL url:urls) {
+            if (url != null) {
+                addPropertySource(url);
+            }
+        }
+        return this;
+    }
+
+
+    /**
+     * Adds one or more resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     *<pre>{@code builder.addPropertySources("file:/etc/service/config.json",
+     *                            "file:/etc/defaults/values.properties");}
+     *</pre>
+     *
+     * @param urls list of resources with properties for the configuration to be
+     *             build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public ConfigurationBuilder addPropertySources(String... urls) {
+        for(String url:urls) {
+            if (url != null) {
+                try{
+                    addPropertySource(new URL(url));
+                } catch(Exception e){
+                    throw new ConfigException("Invalid URL: " + url);
+                }
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Adds one or more property source instances to the configuration to be build.
+     *
+     *<pre>{@code PropertySource first = new CustomPropertySource();
+     * PropertySource second = new YetAnotherPropertySource();
+     *
+     * builder.addPropertySources(first, second)};
+     *</pre>
+     *
+     * @param sources list of property source instances with properties for the
+     *                configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertySource
+     */
+    public ConfigurationBuilder addPropertySources(PropertySource... sources){
+        checkBuilderState();
+
+        contextBuilder.addPropertySources(Objects.requireNonNull(sources));
+        return this;
+    }
+
+    private void checkBuilderState() {
+        if (built) {
+            throw new IllegalStateException("Configuration has already been build.");
+        }
+    }
+
+    /**
+     * Adds one or more property source provider instances to the configuration to be build.
+     *
+     * <pre>{@code PropertySourceProvider jc = new JavaConfigurationProvider();
+     *
+     * builder.addPropertySources(jc)};
+     * </pre>
+     *
+     * @param providers list of property source provider instances each providing a set
+     *                  of property source instances for the configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertySourceProvider
+     */
+    public ConfigurationBuilder addPropertySourceProviders(PropertySourceProvider... providers){
+        contextBuilder.addPropertySourceProviders(providers);
+        return this;
+    }
+
+    /**
+     * 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 #disableProvidedPropertyFilters()
+     * @see #enabledProvidedPropertyFilters()
+     */
+    public ConfigurationBuilder addPropertyFilters(PropertyFilter... filters){
+        Objects.requireNonNull(filters);
+
+        contextBuilder.addPropertyFilters(filters);
+        return this;
+    }
+
+
+    /**
+     * @param propertyValueCombinationPolicy combination policy to use for this builder. 
+     * @return the builder instance currently in use.
+     */
+    public ConfigurationBuilder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy propertyValueCombinationPolicy){
+        contextBuilder.setPropertyValueCombinationPolicy(propertyValueCombinationPolicy);
+        return this;
+    }
+
+    /**
+     * 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.addPropertyConverter(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.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyConverter
+     * @see #enableProvidedPropertyConverters()
+     * @see #disableProvidedPropertyConverters()
+     */
+    public <T> ConfigurationBuilder addPropertyConverter(Class<T> type, PropertyConverter<T> converter) {
+        Objects.requireNonNull(type);
+        Objects.requireNonNull(converter);
+        return addPropertyConverter(TypeLiteral.of(type), (PropertyConverter<Object>)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.
+     * @return the builder instance currently used
+     */
+    public <T> ConfigurationBuilder addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter){
+        Objects.requireNonNull(type);
+        Objects.requireNonNull(propertyConverter);
+        contextBuilder.addPropertyConverter(type, propertyConverter);
+        return this;
+    }
+
+    /**
+     * Checks if the automatic loading of all {@link org.apache.tamaya.spi.PropertyConverter
+     * PropertyConverter} service providers is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     *
+     * @see #enableProvidedPropertyConverters()
+     * @see #disableProvidedPropertyConverters()
+     * @see #addPropertyConverter(Class, org.apache.tamaya.spi.PropertyConverter)
+     * @see #addPropertyConverter(org.apache.tamaya.TypeLiteral, org.apache.tamaya.spi.PropertyConverter)
+     */
+    public boolean isPropertyConverterLoadingEnabled() {
+        return loadProvidedPropertyConverters;
+    }
+
+    /**
+     * Enables the loading of all {@link org.apache.tamaya.spi.PropertyConverter}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyConverter
+     * @see #disableProvidedPropertyConverters()
+     * @see #enableProvidedPropertyConverters()
+     */
+    public ConfigurationBuilder enableProvidedPropertyConverters() {
+        checkBuilderState();
+
+        loadProvidedPropertyConverters = true;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of all {@link org.apache.tamaya.spi.PropertyConverter}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyConverter
+     * @see #enableProvidedPropertyConverters()
+     * @see #addPropertyConverter(Class, org.apache.tamaya.spi.PropertyConverter)
+     */
+    public ConfigurationBuilder disableProvidedPropertyConverters() {
+        checkBuilderState();
+
+        loadProvidedPropertyConverters = false;
+
+        return this;
+    }
+
+
+    /**
+     * Enables the automatic loading of all {@link org.apache.tamaya.spi.PropertySource}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertySource
+     * @see #disableProvidedPropertySources()
+     */
+    public ConfigurationBuilder enableProvidedPropertySources() {
+        checkBuilderState();
+
+        loadProvidedPropertySources = true;
+
+        return this;
+    }
+
+    /**
+     * Checks if the automatic loading of all {@link org.apache.tamaya.spi.PropertySource
+     * PropertySource} service providers is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertySourcesLoadingEnabled() {
+        return loadProvidedPropertySources;
+    }
+
+
+    /**
+     * Checks if the automatic loading of all {@link org.apache.tamaya.spi.PropertyFilter
+     * PropertyFilter} service providers is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertyFilterLoadingEnabled() {
+        return isLoadProvidedPropertyFilters;
+    }
+
+    /**
+     * Enables the automatic loading of all {@link org.apache.tamaya.spi.PropertyFilter}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertyFilter
+     * @see #disableProvidedPropertyFilters()
+     * @see #addPropertyFilters(org.apache.tamaya.spi.PropertyFilter...)
+     */
+    public ConfigurationBuilder enabledProvidedPropertyFilters() {
+        checkBuilderState();
+
+        isLoadProvidedPropertyFilters = true;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of all {@link org.apache.tamaya.spi.PropertyFilter}
+     * service providers.
+     *
+     * @see org.apache.tamaya.spi.PropertyFilter
+     * @see #enabledProvidedPropertyFilters()
+     * @see #addPropertyFilters(org.apache.tamaya.spi.PropertyFilter...)
+     *
+     * @return the builder instance currently used
+     */
+    public ConfigurationBuilder disableProvidedPropertyFilters() {
+        checkBuilderState();
+
+        isLoadProvidedPropertyFilters = false;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of all {@link org.apache.tamaya.spi.PropertySource}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertySource
+     * @see #enableProvidedPropertySources()
+     */
+    public ConfigurationBuilder disableProvidedPropertySources() {
+        checkBuilderState();
+
+        loadProvidedPropertySources = false;
+
+        return this;
+    }
+
+    /**
+     * Enables the automatic loading of {@link org.apache.tamaya.spi.PropertySourceProvider
+     * property source providers} provided via the SPI API.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.spi.PropertySourceProvider
+     */
+    public ConfigurationBuilder enableProvidedPropertySourceProviders() {
+        checkBuilderState();
+
+        loadProvidedPropertySourceProviders = true;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of {@link org.apache.tamaya.spi.PropertySourceProvider
+     * property source providers} provided via the SPI API.
+     *
+     * @return the builder instance currently used
+     */
+    public ConfigurationBuilder disableProvidedPropertySourceProviders() {
+        checkBuilderState();
+
+        loadProvidedPropertySourceProviders = false;
+
+        return this;
+    }
+
+    /**
+     * Checks if the automatic loading of {@link org.apache.tamaya.spi.PropertySourceProvider
+     * PropertySourceProviders} is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertySourceProvidersLoadingEnabled() {
+        return loadProvidedPropertySourceProviders;
+    }
+
+    //X TODO think on a functionality/API for using the default PropertyConverters and use the configured ones here
+    //X TODO as overrides used first.
+
+
+    /**
+     * Builds a new configuration based on the configuration of this builder instance.
+     *
+     * @return a new {@link org.apache.tamaya.Configuration configuration instance},
+     *         never {@code null}.
+     */
+    public Configuration build() {
+        checkBuilderState();
+
+        built = true;
+
+        contextBuilder.loadProvidedPropertyConverters(isPropertyConverterLoadingEnabled());
+        contextBuilder.loadProvidedPropertySources(isPropertySourcesLoadingEnabled());
+        contextBuilder.loadProvidedPropertySourceProviders(isPropertySourceProvidersLoadingEnabled());
+        contextBuilder.loadProvidedPropertyFilters(isLoadProvidedPropertyFilters);
+
+        return new DefaultConfiguration(contextBuilder.build());
+    }
+
+    /**
+     * Mapper to map a URL given as string to an URL instance.
+     */
+    private static class StringToURLMapper {
+        public URL apply(String u) {
+            try {
+                return new URL(u);
+            } catch (MalformedURLException e) {
+                throw new ConfigException(u + " is not a valid URL", e);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java
----------------------------------------------------------------------
diff --git a/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java b/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java
new file mode 100644
index 0000000..68e770d
--- /dev/null
+++ b/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java
@@ -0,0 +1,388 @@
+/*
+ * 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.builder;
+
+
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+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 org.apache.tamaya.spi.ServiceContextManager;
+import org.apache.tamaya.spisupport.PriorityServiceComparator;
+import org.apache.tamaya.spisupport.PropertyConverterManager;
+import org.apache.tamaya.spisupport.PropertySourceComparator;
+
+import javax.annotation.Priority;
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of the {@link org.apache.tamaya.spi.ConfigurationContext}
+ * used by the {@link org.apache.tamaya.builder.ConfigurationBuilder}
+ * internally.
+ */
+class ProgrammaticConfigurationContext implements ConfigurationContext {
+
+    private static final Comparator<PropertySource> PS_COMPARATOR = new PropertySourceComparator();
+    private static final Comparator<Object> COMP_COMPARATOR = new PriorityServiceComparator();
+    /**
+     * The logger used.
+     */
+    private final static Logger LOG = Logger.getLogger(ProgrammaticConfigurationContext.class.getName());
+    /**
+     * Cubcomponent handling {@link org.apache.tamaya.spi.PropertyConverter} instances.
+     */
+    private PropertyConverterManager propertyConverterManager = new PropertyConverterManager();
+
+    /**
+     * The current unmodifiable list of loaded {@link org.apache.tamaya.spi.PropertySource} instances.
+     */
+    private List<PropertySource> immutablePropertySources = new ArrayList<>();
+
+    /**
+     * The current unmodifiable list of loaded {@link org.apache.tamaya.spi.PropertyFilter} instances.
+     */
+    private List<PropertyFilter> immutablePropertyFilters = new ArrayList<>();
+
+    /**
+     * The overriding policy used when combining PropertySources registered to evalute the final configuration
+     * values.
+     */
+    private PropertyValueCombinationPolicy propertyValueCombinationPolicy;
+
+    /**
+     * Lock for internal synchronization.
+     */
+    private final ReadWriteLock propertySourceLock = new ReentrantReadWriteLock();
+
+
+    /**
+     * The first time the Configuration system gets invoked we do initialize
+     * all our {@link org.apache.tamaya.spi.PropertySource}s and
+     * {@link org.apache.tamaya.spi.PropertyFilter}s which are known at startup.
+     */
+    @SuppressWarnings("unchecked")
+    public ProgrammaticConfigurationContext(Builder builder) {
+        propertyConverterManager = new PropertyConverterManager(builder.loadProvidedPropertyConverters);
+
+        List<PropertySource> sources = getAllPropertySources(builder);
+        Collections.sort(sources, PS_COMPARATOR);
+        immutablePropertySources = Collections.unmodifiableList(sources);
+
+
+        List<PropertyFilter> filters = getPropertyFilters(builder);
+        Collections.sort(filters, COMP_COMPARATOR);
+        immutablePropertyFilters = Collections.unmodifiableList(filters);
+
+
+        propertyValueCombinationPolicy = builder.propertyValueCombinationPolicy;
+        for(Map.Entry<TypeLiteral<?>, List<PropertyConverter<?>>> en: builder.propertyConverters.entrySet()){
+            if(en!=null){
+                for(PropertyConverter pv:en.getValue()) {
+                    propertyConverterManager.register(en.getKey(), pv);
+                }
+            }
+        }
+
+        LOG.info("Using " + immutablePropertySources.size() + " property sources: " + immutablePropertySources);
+        LOG.info("Using " + immutablePropertyFilters.size() + " property filters: " + immutablePropertyFilters);
+        LOG.info("Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy);
+    }
+
+    private List<PropertyFilter> getPropertyFilters(Builder builder) {
+        List<PropertyFilter> provided = new ArrayList<>();
+        if(builder.loadProvidedPropertyFilters) {
+            provided.addAll(ServiceContextManager.getServiceContext().getServices(PropertyFilter.class));
+        }
+        for(PropertyFilter pf:builder.propertyFilters) {
+            if (pf != null) {
+                provided.add(pf);
+            }
+        }
+        return provided;
+    }
+
+    private List<PropertySource> getAllPropertySources(Builder builder) {
+        List<PropertySource> provided = new ArrayList<>();
+        if(builder.loadProvidedPropertySources) {
+            provided.addAll(ServiceContextManager.getServiceContext().getServices(PropertySource.class));
+        }
+        for(PropertySource ps:builder.propertySources){
+            if(ps!=null){
+                provided.add(ps);
+            }
+        }
+        if (builder.loadProvidedPropertySourceProviders) {
+            List<PropertySourceProvider> providers = ServiceContextManager.getServiceContext()
+                                                                  .getServices(PropertySourceProvider.class);
+            for (PropertySourceProvider provider : providers) {
+                for(PropertySource ps:provider.getPropertySources()) {
+                    if(ps!=null) {
+                        provided.addAll(provider.getPropertySources());
+                    }
+                }
+            }
+        }
+        return provided;
+    }
+
+    public void addPropertySources(PropertySource... propertySourcesToAdd) {
+        Lock writeLock = propertySourceLock.writeLock();
+        try {
+            writeLock.lock();
+            List<PropertySource> provided = new ArrayList<>();
+            for(PropertySource ps:propertySourcesToAdd){
+                if(ps!=null){
+                    provided.add(ps);
+                }
+            }
+            this.immutablePropertySources = Collections.unmodifiableList(provided);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    /**
+     * Order property source reversely, the most important come first.
+     *
+     * @param source1 the first PropertySource
+     * @param source2 the second PropertySource
+     * @return the comparison result.
+     */
+    private int comparePropertySources(PropertySource source1, PropertySource source2) {
+
+        //X TODO this method duplicates org.apache.tamaya.core.internal.DefaultConfigurationContext.PropertySourceComparator.comparePropertySources()
+        //X maybe we should extract the Comperator in an own class for real code-reuse (copy paste == bad code reuse)
+
+        if (source1.getOrdinal() < source2.getOrdinal()) {
+            return -1;
+        } else if (source1.getOrdinal() > source2.getOrdinal()) {
+            return 1;
+        } else {
+            return source1.getClass().getName().compareTo(source2.getClass().getName());
+        }
+    }
+
+    /**
+     * Compare 2 filters for ordering the filter chain.
+     *
+     * @param filter1 the first filter
+     * @param filter2 the second filter
+     * @return the comparison result
+     */
+    private int comparePropertyFilters(PropertyFilter filter1, PropertyFilter filter2) {
+
+        //X TODO this method duplicates org.apache.tamaya.core.internal.DefaultConfigurationContext.PropertySourceComparator.comparePropertyFilters()
+        //X maybe we should extract the Comperator in an own class for real code-reuse (copy paste == bad code reuse)
+
+        Priority prio1 = filter1.getClass().getAnnotation(Priority.class);
+        Priority prio2 = filter2.getClass().getAnnotation(Priority.class);
+        int ord1 = prio1 != null ? prio1.value() : 0;
+        int ord2 = prio2 != null ? prio2.value() : 0;
+
+        if (ord1 < ord2) {
+            return -1;
+        } else if (ord1 > ord2) {
+            return 1;
+        } else {
+            return filter1.getClass().getName().compareTo(filter2.getClass().getName());
+        }
+    }
+
+    @Override
+    public List<PropertySource> getPropertySources() {
+        return immutablePropertySources;
+    }
+
+    public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
+        propertyConverterManager.register(typeToConvert, propertyConverter);
+        LOG.info("Added PropertyConverter: " + propertyConverter.getClass().getName());
+    }
+
+    @Override
+    public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
+        return propertyConverterManager.getPropertyConverters();
+    }
+
+    @Override
+    public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) {
+        return propertyConverterManager.getPropertyConverters(targetType);
+    }
+
+    @Override
+    public List<PropertyFilter> getPropertyFilters() {
+        return immutablePropertyFilters;
+    }
+
+    @Override
+    public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
+        return propertyValueCombinationPolicy;
+    }
+
+
+    @Override
+    public ConfigurationContextBuilder toBuilder() {
+        // @todo Check if it could be useful to support this method, Oliver B. Fischer
+        throw new RuntimeException("This method is currently not supported.");
+    }
+
+    /**
+     * The Builder for {@link ProgrammaticConfigurationContext}
+     */
+    public final static class Builder {
+        /**
+         * The current unmodifiable list of loaded {@link org.apache.tamaya.spi.PropertySource} instances.
+         */
+        private final List<PropertySource> propertySources = new ArrayList<>();
+
+        /**
+         * The current unmodifiable list of loaded {@link org.apache.tamaya.spi.PropertyFilter} instances.
+         */
+        private final List<PropertyFilter> propertyFilters = new ArrayList<>();
+
+        private final Map<TypeLiteral<?>, List<PropertyConverter<?>>> propertyConverters = new HashMap<>();
+
+        /**
+         * The overriding policy used when combining PropertySources registered to evalute the final configuration
+         * values.
+         */
+        private PropertyValueCombinationPolicy propertyValueCombinationPolicy =
+                PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR;
+
+        private boolean loadProvidedPropertyConverters;
+        private boolean loadProvidedPropertySources;
+        private boolean loadProvidedPropertySourceProviders;
+        private boolean loadProvidedPropertyFilters;
+
+        public Builder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy) {
+            this.propertyValueCombinationPolicy = Objects.requireNonNull(policy);
+            return this;
+        }
+
+        public Builder addPropertySources(PropertySource... propertySources) {
+            for (PropertySource ps : propertySources) {
+                if (ps != null) {
+                    this.propertySources.add(ps);
+                }
+            }
+            return this;
+        }
+
+        public Builder addPropertySources(Collection<PropertySource> propertySources) {
+            for (PropertySource ps : propertySources) {
+                if (ps != null) {
+                    this.propertySources.add(ps);
+                }
+            }
+            return this;
+        }
+
+        public Builder addPropertySourceProviders(PropertySourceProvider... propertySourceProviders) {
+            for (PropertySourceProvider ps : propertySourceProviders) {
+                if (ps != null) {
+                    this.propertySources.addAll(ps.getPropertySources());
+                }
+            }
+            return this;
+        }
+
+        public Builder addPropertySourceProviders(Collection<PropertySourceProvider> propertySourceProviders) {
+            for (PropertySourceProvider ps : propertySourceProviders) {
+                if (ps != null) {
+                    this.propertySources.addAll(ps.getPropertySources());
+                }
+            }
+            return this;
+        }
+
+        public Builder addPropertyFilters(PropertyFilter... propertyFIlter) {
+            for (PropertyFilter pf : propertyFIlter) {
+                if (pf != null) {
+                    this.propertyFilters.add(pf);
+                }
+            }
+            return this;
+        }
+
+        public Builder addPropertyFilters(Collection<PropertyFilter> propertyFIlter) {
+            for (PropertyFilter pf : propertyFIlter) {
+                if (pf != null) {
+                    this.propertyFilters.add(pf);
+                }
+            }
+            return this;
+        }
+
+        /**
+         * Should be never used.
+         */
+        @Deprecated
+        public Builder setConfigurationContext(ConfigurationContext configurationContext) {
+            this.addPropertySources(configurationContext.getPropertySources());
+            this.addPropertyFilters(configurationContext.getPropertyFilters());
+            this.propertyValueCombinationPolicy = Objects.requireNonNull(
+                    configurationContext.getPropertyValueCombinationPolicy());
+            return this;
+        }
+
+        //X TODO think on a functonality/API for using the default PropertyConverters and use the configured ones here
+        //X TODO as overrides used first.
+
+        public <T> Builder addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter) {
+            if(!propertyConverters.containsKey(type)){
+                List<PropertyConverter<?>> convList = new ArrayList<>();
+                convList.add(propertyConverter);
+                propertyConverters.put(type, convList);
+            }
+            return this;
+        }
+
+        public ConfigurationContext build() {
+            return new ProgrammaticConfigurationContext(this);
+        }
+
+
+        public void loadProvidedPropertyConverters(boolean state) {
+            loadProvidedPropertyConverters = state;
+        }
+
+        public void loadProvidedPropertySources(boolean state) {
+            loadProvidedPropertySources = state;
+        }
+
+        public void loadProvidedPropertySourceProviders(boolean state) {
+            loadProvidedPropertySourceProviders = state;
+        }
+
+        public void loadProvidedPropertyFilters(boolean state) {
+            loadProvidedPropertyFilters = state;
+        }
+
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java
----------------------------------------------------------------------
diff --git a/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java b/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java
new file mode 100644
index 0000000..481a80c
--- /dev/null
+++ b/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.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.builder;
+
+import org.apache.tamaya.spi.PropertySource;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Simple builder for building a {@link org.apache.tamaya.spi.PropertySource}.
+ */
+public final class PropertySourceBuilder {
+    /** The ordinal to be used. */
+    private int ordinal;
+    /** The name to be used. */
+    private final String name;
+    /** The properties. */
+    private final Map<String,String> properties = new HashMap<>();
+
+    /** private constructor. */
+    private PropertySourceBuilder(String name){
+        this.name = Objects.requireNonNull(name);
+    }
+
+    /**
+     * Gets a new instance of a builder.
+     * @param name The name of the property source, not null.
+     * @return a new instance.
+     */
+    public static PropertySourceBuilder of(String name){
+        return new PropertySourceBuilder(name);
+    }
+
+    /**
+     * Gets a new instance of a builder.
+     * @param name The name of the property source, not null.
+     * @return a new instance.
+     */
+    public static PropertySourceBuilder from(String name){
+        return new PropertySourceBuilder(name);
+    }
+
+    /**
+     * Sets a new property key/value.
+     * @param key the property key, not null.
+     * @param value the property value, not null.
+     * @return the bulder for chaining.
+     */
+    public PropertySourceBuilder put(String key, String value){
+        this.properties.put(key, value);
+        return this;
+    }
+
+    /**
+     * Put all the given key, values.
+     * @param values the new key/values, not null.
+     * @return the bulder for chaining.
+     */
+    public PropertySourceBuilder putAll(Map<String, String> values){
+        this.properties.putAll(values);
+        return this;
+    }
+
+    /**
+     * Sets the ordinal to be used explicitly (instead evaluating it using {@code tamaya.ordinal}.
+     * @param ordinal the explicit ordinal to be used.
+     * @return the bulder for chaining.
+     */
+    public PropertySourceBuilder withOrdinal(int ordinal){
+        this.ordinal = ordinal;
+        return this;
+    }
+
+    /**
+     * Puts all values from the given property source.
+     * @param propertySource the property source, not null.
+     * @return the bulder for chaining.
+     */
+    public PropertySourceBuilder putAll(PropertySource propertySource){
+        this.properties.putAll(propertySource.getProperties());
+        return this;
+    }
+
+    /**
+     * Creates a new immutable {@link org.apache.tamaya.spi.PropertySource} instance.
+     * @return a new immutable {@link org.apache.tamaya.spi.PropertySource} instance, never null.
+     */
+    public PropertySource build(){
+        return new SimplePropertySource(name, properties);
+    }
+
+    @Override
+    public String toString() {
+        return "PropertySourceBuilder{" +
+                "ordinal=" + ordinal +
+                ", name='" + name + '\'' +
+                ", properties=" + properties +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java
----------------------------------------------------------------------
diff --git a/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java b/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java
new file mode 100644
index 0000000..085bd9a
--- /dev/null
+++ b/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java
@@ -0,0 +1,86 @@
+/*
+ * 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.builder;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+* Simple property source implementation using a map.
+*/
+public class SimplePropertySource implements PropertySource {
+    /** The properties. */
+    private final Map<String, String> properties;
+    /** The source's name. */
+    private final String name;
+
+    public SimplePropertySource(String name, Map<String, String> properties){
+        this.properties = new HashMap<>(properties);
+        this.name = Objects.requireNonNull(name);
+    }
+
+    @Override
+    public int getOrdinal(){
+        PropertyValue configuredOrdinal = get(TAMAYA_ORDINAL);
+        if(configuredOrdinal!=null){
+            try{
+                return Integer.parseInt(configuredOrdinal.getValue());
+            } catch(Exception e){
+                Logger.getLogger(getClass().getName()).log(Level.WARNING,
+                        "Configured Ordinal is not an int number: " + configuredOrdinal, e);
+            }
+        }
+        return getDefaultOrdinal();
+    }
+
+    public int getDefaultOrdinal(){
+        return 0;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return this.properties;
+    }
+
+    @Override
+    public boolean isScannable() {
+        return false;
+    }
+
+    @Override
+    public String toString(){
+        return "SimplePropertySource(name="+name+", numProps="+properties.size()+")";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/f45a5bb5/builder/src/main/java/org/apache/tamaya/builder/package-info.java
----------------------------------------------------------------------
diff --git a/builder/src/main/java/org/apache/tamaya/builder/package-info.java b/builder/src/main/java/org/apache/tamaya/builder/package-info.java
new file mode 100644
index 0000000..24c86a9
--- /dev/null
+++ b/builder/src/main/java/org/apache/tamaya/builder/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+/**
+ * This package provides
+ * {@link org.apache.tamaya.builder.ConfigurationBuilder a configuration
+ * builder} that allows to build a configuration manually without
+ * using exclusively on the Service Provider Interface API of Tamaya.
+ *
+ * @see org.apache.tamaya.builder.ConfigurationBuilder
+ * @see org.apache.tamaya.Configuration
+ */
+package org.apache.tamaya.builder;
\ No newline at end of file