tamaya-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anat...@apache.org
Subject [12/15] incubator-tamaya-extensions git commit: TAMAYA-189: Moved format and injection modules into separate subtrees.
Date Sun, 30 Oct 2016 22:06:34 GMT
TAMAYA-189: Moved format and injection modules into separate subtrees.


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

Branch: refs/heads/master
Commit: fe7cd8f1bb151a1891196e1899470e5f93abf7e9
Parents: c757d32
Author: anatole <anatole@apache.org>
Authored: Sun Oct 30 22:57:31 2016 +0100
Committer: anatole <anatole@apache.org>
Committed: Sun Oct 30 22:57:31 2016 +0100

----------------------------------------------------------------------
 modules/formats/common/pom.xml                  |  88 ++++
 .../BaseFormatPropertySourceProvider.java       | 154 ++++++
 .../apache/tamaya/format/ConfigurationData.java | 206 ++++++++
 .../tamaya/format/ConfigurationDataBuilder.java | 219 ++++++++
 .../tamaya/format/ConfigurationFormat.java      | 103 ++++
 .../tamaya/format/ConfigurationFormats.java     | 187 +++++++
 .../format/FlattenedDefaultPropertySource.java  | 118 +++++
 .../tamaya/format/InputStreamFactory.java       |  89 ++++
 .../format/formats/IniConfigurationFormat.java  |  95 ++++
 .../tamaya/format/formats/PropertiesFormat.java |  71 +++
 .../format/formats/PropertiesXmlFormat.java     |  69 +++
 .../tamaya/format/formats/package-info.java     |  23 +
 .../org/apache/tamaya/format/package-info.java  |  28 ++
 ...org.apache.tamaya.format.ConfigurationFormat |  21 +
 .../tamaya/format/ConfigurationFormatsTest.java |  68 +++
 .../FlattenedDefaultPropertySourceTest.java     |  98 ++++
 .../tamaya/format/InputStreamFactoryTest.java   | 145 ++++++
 .../formats/common/src/test/resources/Test.ini  |  26 +
 .../common/src/test/resources/Test.properties   |  21 +
 modules/formats/json/pom.xml                    | 149 ++++++
 .../java/org/apache/tamaya/json/JSONFormat.java |  85 ++++
 .../apache/tamaya/json/JSONPropertySource.java  | 149 ++++++
 .../org/apache/tamaya/json/JSONVisitor.java     | 119 +++++
 ...org.apache.tamaya.format.ConfigurationFormat |  19 +
 .../json/CommonJSONTestCaseCollection.java      | 190 +++++++
 .../org/apache/tamaya/json/JSONFormatIT.java    |  48 ++
 .../org/apache/tamaya/json/JSONFormatTest.java  |  75 +++
 .../tamaya/json/JSONPropertySourceTest.java     |  56 +++
 .../json/src/test/resources/arquillian.xml      |  30 ++
 .../test/resources/configs/invalid/array.json   |  21 +
 .../resources/configs/invalid/empty-file.json   |  18 +
 .../configs/invalid/only-opening-bracket.json   |  19 +
 .../resources/configs/invalid/with-array.json   |  27 +
 .../test/resources/configs/valid/cyrillic.json  |  22 +
 .../configs/valid/empty-object-config.json      |  20 +
 .../valid/simple-flat-string-only-config.json   |  23 +
 .../simple-nested-string-only-config-1.json     |  27 +
 .../simple-nested-string-only-config-2.json     |  26 +
 .../configs/valid/with-explicit-priority.json   |  25 +
 modules/formats/pom.xml                         | 104 +---
 .../BaseFormatPropertySourceProvider.java       | 154 ------
 .../apache/tamaya/format/ConfigurationData.java | 206 --------
 .../tamaya/format/ConfigurationDataBuilder.java | 219 --------
 .../tamaya/format/ConfigurationFormat.java      | 103 ----
 .../tamaya/format/ConfigurationFormats.java     | 187 -------
 .../format/FlattenedDefaultPropertySource.java  | 118 -----
 .../tamaya/format/InputStreamFactory.java       |  89 ----
 .../format/formats/IniConfigurationFormat.java  |  95 ----
 .../tamaya/format/formats/PropertiesFormat.java |  71 ---
 .../format/formats/PropertiesXmlFormat.java     |  69 ---
 .../tamaya/format/formats/package-info.java     |  23 -
 .../org/apache/tamaya/format/package-info.java  |  28 --
 ...org.apache.tamaya.format.ConfigurationFormat |  21 -
 .../tamaya/format/ConfigurationFormatsTest.java |  68 ---
 .../FlattenedDefaultPropertySourceTest.java     |  98 ----
 .../tamaya/format/InputStreamFactoryTest.java   | 145 ------
 modules/formats/src/test/resources/Test.ini     |  26 -
 .../formats/src/test/resources/Test.properties  |  21 -
 modules/formats/yaml/pom.xml                    | 119 +++++
 .../java/org/apache/tamaya/json/YAMLFormat.java | 156 ++++++
 .../apache/tamaya/json/YAMLPropertySource.java  | 100 ++++
 ...org.apache.tamaya.format.ConfigurationFormat |  19 +
 .../org/apache/tamaya/json/YAMLFormatTest.java  |  73 +++
 .../tamaya/json/YAMLPropertySourceTest.java     |  54 ++
 .../test/resources/configs/valid/contact.yaml   |  46 ++
 .../resources/configs/valid/test-with-prio.yaml |  39 ++
 .../src/test/resources/configs/valid/test.yaml  |  35 ++
 modules/injection-api/pom.xml                   |  81 ---
 .../tamaya/inject/api/BaseDynamicValue.java     | 125 -----
 .../org/apache/tamaya/inject/api/Config.java    |  93 ----
 .../tamaya/inject/api/ConfigAutoInject.java     |  36 --
 .../inject/api/ConfigDefaultSections.java       |  44 --
 .../inject/api/ConfiguredItemSupplier.java      |  41 --
 .../apache/tamaya/inject/api/DynamicValue.java  | 161 ------
 .../tamaya/inject/api/InjectionUtils.java       | 127 -----
 .../apache/tamaya/inject/api/LoadPolicy.java    |  42 --
 .../org/apache/tamaya/inject/api/NoConfig.java  |  36 --
 .../apache/tamaya/inject/api/UpdatePolicy.java  |  40 --
 .../tamaya/inject/api/WithConfigOperator.java   |  45 --
 .../inject/api/WithPropertyConverter.java       |  46 --
 .../apache/tamaya/inject/api/package-info.java  |  22 -
 .../tamaya/inject/spi/ConfiguredField.java      |  68 ---
 .../tamaya/inject/spi/ConfiguredMethod.java     |  70 ---
 .../tamaya/inject/spi/ConfiguredType.java       |  63 ---
 modules/injection/cdi-ee/pom.xml                | 226 +++++++++
 .../integration/cdi/CDIAwareServiceContext.java | 169 +++++++
 .../integration/cdi/CDIConfiguredField.java     |  77 +++
 .../integration/cdi/CDIConfiguredMethod.java    |  77 +++
 .../integration/cdi/CDIConfiguredType.java      |  94 ++++
 .../integration/cdi/ConfigurationExtension.java | 290 +++++++++++
 .../integration/cdi/ConfigurationProducer.java  | 147 ++++++
 .../integration/cdi/DefaultDynamicValue.java    | 499 +++++++++++++++++++
 .../cdi/ServiceLoaderServiceContext.java        | 151 ++++++
 .../integration/cdi/TamayaCDIIntegration.java   |  52 ++
 .../src/main/resources/META-INF/beans.xml       |  19 +
 .../javax.enterprise.inject.spi.Extension       |  19 +
 .../org.apache.tamaya.spi.ServiceContext        |  38 ++
 ...onfigurationProducerFailedInjectionTest.java |  33 ++
 .../cdi/ConfigurationProducerTest.java          | 168 +++++++
 .../cdi/ConfigurationResolverTest.java          | 112 +++++
 .../integration/cdi/EnvironmentsTest.java       |  83 +++
 .../integration/cdi/InterpolationTest.java      |  62 +++
 .../integration/cdi/NotFoundNoDefault.java      |  78 +++
 .../src/test/resources/META-INF/beans.xml       |  19 +
 .../META-INF/javaconfiguration.properties       |  32 ++
 .../cdi-ee/src/test/resources/base.properties   |  32 ++
 .../cdi-ee/src/test/resources/cert.properties   |  20 +
 .../cdi-ee/src/test/resources/dev.properties    |  19 +
 .../cdi-ee/src/test/resources/prod.properties   |  20 +
 .../cdi-ee/src/test/resources/qa.properties     |  20 +
 .../cdi-ee/src/test/resources/test.properties   |  20 +
 modules/injection/cdi-se/pom.xml                | 212 ++++++++
 .../integration/cdi/CDIAwareServiceContext.java | 169 +++++++
 .../cdi/DefaultConfigurationContext.java        | 296 +++++++++++
 .../cdi/DefaultConfigurationContextBuilder.java | 152 ++++++
 .../tamaya/integration/cdi/EnumConverter.java   |  71 +++
 .../cdi/PropertyConverterManager.java           | 427 ++++++++++++++++
 .../integration/cdi/SEInjectorCDIExtension.java | 112 +++++
 .../cdi/ServiceLoaderServiceContext.java        | 151 ++++++
 .../integration/cdi/TamayaCDIIntegration.java   |  52 ++
 .../integration/cdi/TamayaConfigProvider.java   |  55 ++
 .../cdi/config/ConfiguredVetoExtension.java     |  42 ++
 .../src/main/resources/META-INF/beans.xml       |  24 +
 .../javax.enterprise.inject.spi.Extension       |  20 +
 .../org.apache.tamaya.spi.ServiceContext        |  19 +
 .../tamaya/integration/cdi/ConfiguredClass.java | 112 +++++
 .../tamaya/integration/cdi/ConfiguredTest.java  |  83 +++
 .../tamaya/integration/cdi/InjectedClass.java   |  62 +++
 .../cdi/cfg/ProvidedPropertySource.java         |  67 +++
 .../integration/cdi/cfg/TestConfigProvider.java |  45 ++
 .../integration/cdi/cfg/TestPropertySource.java |  79 +++
 .../src/test/resources/META-INF/beans.xml       |  24 +
 .../META-INF/javaconfiguration.properties       |  20 +
 modules/injection/injection-api/pom.xml         |  81 +++
 .../tamaya/inject/api/BaseDynamicValue.java     | 125 +++++
 .../org/apache/tamaya/inject/api/Config.java    |  93 ++++
 .../tamaya/inject/api/ConfigAutoInject.java     |  36 ++
 .../inject/api/ConfigDefaultSections.java       |  44 ++
 .../inject/api/ConfiguredItemSupplier.java      |  41 ++
 .../apache/tamaya/inject/api/DynamicValue.java  | 161 ++++++
 .../tamaya/inject/api/InjectionUtils.java       | 127 +++++
 .../apache/tamaya/inject/api/LoadPolicy.java    |  42 ++
 .../org/apache/tamaya/inject/api/NoConfig.java  |  36 ++
 .../apache/tamaya/inject/api/UpdatePolicy.java  |  40 ++
 .../tamaya/inject/api/WithConfigOperator.java   |  45 ++
 .../inject/api/WithPropertyConverter.java       |  46 ++
 .../apache/tamaya/inject/api/package-info.java  |  22 +
 .../tamaya/inject/spi/ConfiguredField.java      |  68 +++
 .../tamaya/inject/spi/ConfiguredMethod.java     |  70 +++
 .../tamaya/inject/spi/ConfiguredType.java       |  63 +++
 modules/injection/pom.xml                       | 123 ++---
 .../tamaya/inject/ConfigurationInjection.java   |  42 --
 .../tamaya/inject/ConfigurationInjector.java    |  94 ----
 .../ConfigTemplateInvocationHandler.java        |  73 ---
 .../inject/internal/ConfiguredFieldImpl.java    | 170 -------
 .../inject/internal/ConfiguredSetterMethod.java | 139 ------
 .../inject/internal/ConfiguredTypeImpl.java     | 237 ---------
 .../internal/DefaultConfigurationInjector.java  | 179 -------
 .../inject/internal/DefaultDynamicValue.java    | 498 ------------------
 .../tamaya/inject/internal/InjectionHelper.java | 244 ---------
 .../apache/tamaya/inject/internal/Utils.java    | 128 -----
 .../tamaya/inject/internal/package-info.java    |  22 -
 .../org/apache/tamaya/inject/package-info.java  |  22 -
 ...g.apache.tamaya.inject.ConfigurationInjector |  19 -
 .../java/annottext/AnnotatedConfigBean.java     |  78 ---
 .../java/annottext/AnnotatedConfigTemplate.java |  47 --
 .../java/annottext/NonAnnotatedConfigBean.java  |  45 --
 .../tamaya/inject/TamayaInjectionTest.java      |  87 ----
 .../tamaya/inject/TestPropertySource.java       |  68 ---
 .../internal/DefaultDynamicValueTest.java       | 315 ------------
 .../org.apache.tamaya.spi.PropertySource        |  19 -
 modules/injection/standalone/pom.xml            | 104 ++++
 .../tamaya/inject/ConfigurationInjection.java   |  42 ++
 .../tamaya/inject/ConfigurationInjector.java    |  94 ++++
 .../ConfigTemplateInvocationHandler.java        |  73 +++
 .../inject/internal/ConfiguredFieldImpl.java    | 170 +++++++
 .../inject/internal/ConfiguredSetterMethod.java | 139 ++++++
 .../inject/internal/ConfiguredTypeImpl.java     | 237 +++++++++
 .../internal/DefaultConfigurationInjector.java  | 179 +++++++
 .../inject/internal/DefaultDynamicValue.java    | 498 ++++++++++++++++++
 .../tamaya/inject/internal/InjectionHelper.java | 244 +++++++++
 .../apache/tamaya/inject/internal/Utils.java    | 128 +++++
 .../tamaya/inject/internal/package-info.java    |  22 +
 .../org/apache/tamaya/inject/package-info.java  |  22 +
 ...g.apache.tamaya.inject.ConfigurationInjector |  19 +
 .../java/annottext/AnnotatedConfigBean.java     |  78 +++
 .../java/annottext/AnnotatedConfigTemplate.java |  47 ++
 .../java/annottext/NonAnnotatedConfigBean.java  |  45 ++
 .../tamaya/inject/TamayaInjectionTest.java      |  87 ++++
 .../tamaya/inject/TestPropertySource.java       |  68 +++
 .../internal/DefaultDynamicValueTest.java       | 315 ++++++++++++
 .../org.apache.tamaya.spi.PropertySource        |  19 +
 modules/json/pom.xml                            | 149 ------
 .../java/org/apache/tamaya/json/JSONFormat.java |  85 ----
 .../apache/tamaya/json/JSONPropertySource.java  | 149 ------
 .../org/apache/tamaya/json/JSONVisitor.java     | 119 -----
 ...org.apache.tamaya.format.ConfigurationFormat |  19 -
 .../json/CommonJSONTestCaseCollection.java      | 190 -------
 .../org/apache/tamaya/json/JSONFormatIT.java    |  48 --
 .../org/apache/tamaya/json/JSONFormatTest.java  |  75 ---
 .../tamaya/json/JSONPropertySourceTest.java     |  56 ---
 modules/json/src/test/resources/arquillian.xml  |  30 --
 .../test/resources/configs/invalid/array.json   |  21 -
 .../resources/configs/invalid/empty-file.json   |  18 -
 .../configs/invalid/only-opening-bracket.json   |  19 -
 .../resources/configs/invalid/with-array.json   |  27 -
 .../test/resources/configs/valid/cyrillic.json  |  22 -
 .../configs/valid/empty-object-config.json      |  20 -
 .../valid/simple-flat-string-only-config.json   |  23 -
 .../simple-nested-string-only-config-1.json     |  27 -
 .../simple-nested-string-only-config-2.json     |  26 -
 .../configs/valid/with-explicit-priority.json   |  25 -
 modules/pom.xml                                 |   4 +-
 modules/yaml/pom.xml                            | 119 -----
 .../java/org/apache/tamaya/json/YAMLFormat.java | 156 ------
 .../apache/tamaya/json/YAMLPropertySource.java  | 100 ----
 ...org.apache.tamaya.format.ConfigurationFormat |  19 -
 .../org/apache/tamaya/json/YAMLFormatTest.java  |  73 ---
 .../tamaya/json/YAMLPropertySourceTest.java     |  54 --
 .../test/resources/configs/valid/contact.yaml   |  46 --
 .../resources/configs/valid/test-with-prio.yaml |  39 --
 .../src/test/resources/configs/valid/test.yaml  |  35 --
 222 files changed, 12315 insertions(+), 7370 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/pom.xml
----------------------------------------------------------------------
diff --git a/modules/formats/common/pom.xml b/modules/formats/common/pom.xml
new file mode 100644
index 0000000..93f4bd2
--- /dev/null
+++ b/modules/formats/common/pom.xml
@@ -0,0 +1,88 @@
+<!-- 
+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-formats-all</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>tamaya-formats</artifactId>
+    <name>Apache Tamaya Modules Formats</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>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-resources</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <!-- Test scope only, do not create a code 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>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</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.format,
+                            org.apache.tamaya.format.formats
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/BaseFormatPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/BaseFormatPropertySourceProvider.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/BaseFormatPropertySourceProvider.java
new file mode 100644
index 0000000..84d6cfa
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/BaseFormatPropertySourceProvider.java
@@ -0,0 +1,154 @@
+/*
+ * 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.format;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of a {@link PropertySourceProvider} that reads configuration from some given resource paths
+ * and using the given formats. The resource path are resolved as classpath resources. This can be changed by
+ * overriding {@link #getPropertySources()}.
+ * For each resource found the configuration formats passed get a chance to read the resource, if they succeed the
+ * result is taken as the providers PropertySources to be exposed.
+ */
+public abstract class BaseFormatPropertySourceProvider implements PropertySourceProvider {
+    /**
+     * The logger used.
+     */
+    private static final Logger LOG = Logger.getLogger(BaseFormatPropertySourceProvider.class.getName());
+    /**
+     * The config formats supported for the given location/resource paths.
+     */
+    private final List<ConfigurationFormat> configFormats = new ArrayList<>();
+    /**
+     * The paths to be evaluated.
+     */
+    private final Collection<URL> paths = new ArrayList<>();
+
+    /**
+     * Creates a new instance.
+     *
+     * @param formats the formats to be used, not null, not empty.
+     * @param paths   the paths to be resolved, not null, not empty.
+     */
+    public BaseFormatPropertySourceProvider(
+            List<ConfigurationFormat> formats,
+            URL... paths) {
+        this.configFormats.addAll(Objects.requireNonNull(formats));
+        this.paths.addAll(Arrays.asList(Objects.requireNonNull(paths)));
+    }
+
+    /**
+     * Creates a new instance, hereby using the current thread context classloader, or if not available the classloader
+     * that loaded this class.
+     * @param formats the formats to be used, not null, not empty.
+     * @param paths   the paths to be resolved, not null, not empty.
+     */
+    public BaseFormatPropertySourceProvider(
+            List<ConfigurationFormat> formats, String... paths) {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        if(cl==null){
+            cl = getClass().getClassLoader();
+        }
+        this.configFormats.addAll(Objects.requireNonNull(formats));
+        for(String path:paths) {
+            Enumeration<URL> urls;
+            try {
+                urls = cl.getResources(path);
+            } catch (IOException e) {
+                LOG.log(Level.WARNING, "Failed to read resource: " + path, e);
+                continue;
+            }
+            while(urls.hasMoreElements()) {
+                this.paths.add(urls.nextElement());
+            }
+        }
+    }
+
+    /**
+     * Creates a new instance.
+     *
+     * @param classLoader the ClassLoader to be used, not null, not empty.
+     * @param formats the formats to be used, not null, not empty.
+     * @param paths   the paths to be resolved, not null, not empty.
+     */
+    public BaseFormatPropertySourceProvider(
+            List<ConfigurationFormat> formats,
+            ClassLoader classLoader, String... paths) {
+        this.configFormats.addAll(Objects.requireNonNull(formats));
+        for(String path:paths) {
+            Enumeration<URL> urls;
+            try {
+                urls = classLoader.getResources(path);
+            } catch (IOException e) {
+                LOG.log(Level.WARNING, "Failed to read resource: " + path, e);
+                continue;
+            }
+            while(urls.hasMoreElements()) {
+                this.paths.add(urls.nextElement());
+            }
+        }
+    }
+
+
+    /**
+     * Method to create a {@link org.apache.tamaya.spi.PropertySource} based on the given entries read.
+     *
+     * @param data the configuration data, not null.
+     * @return the {@link org.apache.tamaya.spi.PropertySource} instance ready to be registered.
+     */
+    protected abstract Collection<PropertySource> getPropertySources(ConfigurationData data);
+
+    /**
+     * This method does dynamically resolve the paths using the current ClassLoader set. If no ClassLoader was
+     * explcitly set during creation the current Thread context ClassLoader is used. If none of the supported
+     * formats is able to parse a resource a WARNING log is written.
+     *
+     * @return the PropertySources successfully read
+     */
+    @Override
+    public Collection<PropertySource> getPropertySources() {
+        List<PropertySource> propertySources = new ArrayList<>();
+        for (URL res : this.paths) {
+            try(InputStream is = res.openStream()) {
+                for (ConfigurationFormat format : configFormats) {
+                    ConfigurationData data = format.readConfiguration(res.toString(), is);
+                    propertySources.addAll(getPropertySources(data));
+                }
+            } catch (Exception e) {
+                LOG.log(Level.WARNING, "Failed to put resource based config: " + res, e);
+            }
+        }
+        return propertySources;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationData.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationData.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationData.java
new file mode 100644
index 0000000..b58d2ab
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationData.java
@@ -0,0 +1,206 @@
+/*
+ * 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.format;
+
+import java.util.*;
+
+/**
+ * <p>Data that abstracts the data read from a configuration resources using a certain format. The data can be divided
+ * into different sections, similar to ini-files. Herebey different sections the best map to entries with different
+ * priorities to be applied, when integrated into PropertySource instances.</p>
+ * New instances of this class can be created using a {@link org.apache.tamaya.format.ConfigurationDataBuilder}.
+ * <h3>Implementation Specification</h3>
+ * This class is
+ * <ul>
+ *     <li>immutable</li>
+ *     <li>thread-safe</li>
+ * </ul>
+ */
+public final class ConfigurationData {
+    /**
+     * The properties of the default section (no name).
+     */
+    private Map<String, String> defaultProperties;
+    /**
+     * A normalized flattened set of this configuration data.
+     */
+    private Map<String, String> combinedProperties;
+    /**
+     * The sections read.
+     */
+    private Map<String, Map<String, String>> namedSections;
+    /** The format instance used to read this instance. */
+    private final ConfigurationFormat format;
+    /** The resource read. */
+    private final String resource;
+
+
+    /**
+     * COnstructor used by builder.
+     * @param builder the builder instance passing the read configuration data.
+     */
+    ConfigurationData(ConfigurationDataBuilder builder){
+        this.format = builder.format;
+        this.resource = builder.resource;
+        if (builder.defaultProperties != null) {
+            this.defaultProperties = new HashMap<>();
+            this.defaultProperties.putAll(builder.defaultProperties);
+        }
+        if (builder.combinedProperties != null) {
+            this.combinedProperties = new HashMap<>();
+            this.combinedProperties.putAll(builder.combinedProperties);
+        }
+        if (builder.namedSections != null) {
+            this.namedSections = new HashMap<>();
+            this.namedSections.putAll(builder.namedSections);
+        }
+        if (this.combinedProperties == null || this.combinedProperties.isEmpty()) {
+            this.combinedProperties = new HashMap<>();
+            this.combinedProperties.putAll(getDefaultProperties());
+            // popuilate it with sections...
+            for (String sectionName : getSectionNames()) {
+                Map<String, String> section = getSection(sectionName);
+                for (Map.Entry<String, String> en : section.entrySet()) {
+                    String key = sectionName + '.' + en.getKey();
+                    combinedProperties.put(key, en.getValue());
+                }
+            }
+        }
+    }
+
+    /**
+     * Get the {@link org.apache.tamaya.format.ConfigurationFormat} that read this data.
+     * @return the {@link org.apache.tamaya.format.ConfigurationFormat} that read this data, never null.
+     */
+    public ConfigurationFormat getFormat(){
+        return format;
+    }
+
+    /**
+     * Get the resource from which this data was read.
+     * @return the resource from which this data was read, never null.
+     */
+    public String getResource(){
+        return resource;
+    }
+
+    /**
+     * Access an immutable Set of all present section names, including the default section (if any).
+     * @return the set of present section names, never null.
+     */
+    public Set<String> getSectionNames() {
+        if (namedSections == null) {
+            return Collections.emptySet();
+        }
+        return namedSections.keySet();
+    }
+
+    /**
+     * Get a section's data.
+     * @param name the section name, not null.
+     * @return the data of this section, or null, if no such section exists.
+     */
+    public Map<String, String> getSection(String name) {
+        return this.namedSections.get(name);
+    }
+
+    /**
+     * Convenience accessor for accessing the default section.
+     * @return the default section's data, or null, if no such section exists.
+     */
+    public Map<String, String> getDefaultProperties() {
+        if (defaultProperties == null) {
+            return Collections.emptyMap();
+        }
+        return defaultProperties;
+    }
+
+    /**
+     * Get combined properties for this config data instance. If
+     *
+     * @return the normalized properties.
+     */
+    public Map<String, String> getCombinedProperties() {
+        if (combinedProperties == null) {
+            return Collections.emptyMap();
+        }
+        return combinedProperties;
+    }
+
+    /**
+     * Accessor used for easily creating a new builder based on a given data instance.
+     *
+     * @return the data contained, never null.
+     */
+    public Map<String, Map<String, String>> getSections() {
+        if (namedSections == null) {
+            return Collections.emptyMap();
+        }
+        return namedSections;
+    }
+
+    /**
+     * Immutable accessor to ckeck, if there are default properties present.
+     *
+     * @return true, if default properties are present.
+     */
+    public boolean hasDefaultProperties() {
+        return this.defaultProperties != null && !this.defaultProperties.isEmpty();
+    }
+
+    /**
+     * Immutable accessor to ckeck, if there are combined properties set.
+     *
+     * @return true, if combined properties are set.
+     */
+    public boolean hasCombinedProperties() {
+        return this.combinedProperties != null && !this.combinedProperties.isEmpty();
+    }
+
+    /**
+     * Immutable accessor to ckeck, if there are named sections present.
+     *
+     * @return true, if at least one named section is present.
+     */
+    private boolean hasSections() {
+        return this.namedSections != null && !this.namedSections.isEmpty();
+    }
+
+    /**
+     * Checks if no properties are contained in this data item.
+     *
+     * @return true, if no properties are contained in this data item.
+     */
+    public boolean isEmpty() {
+        return !hasCombinedProperties() && !hasDefaultProperties() && !hasSections();
+    }
+
+    @Override
+    public String toString() {
+        return "ConfigurationData{" +
+                "format=" + format +
+                ", default properties=" + defaultProperties +
+                ", combined properties=" + combinedProperties +
+                ", sections=" + namedSections +
+                ", resource=" + resource +
+                '}';
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationDataBuilder.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationDataBuilder.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationDataBuilder.java
new file mode 100644
index 0000000..da5fa35
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationDataBuilder.java
@@ -0,0 +1,219 @@
+/*
+ * 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.format;
+
+import java.util.*;
+
+
+/**
+ * Builder for creating {@link org.apache.tamaya.format.ConfigurationData} instances. This class is not thread-safe.
+ */
+public final class ConfigurationDataBuilder {
+
+    /** The format instance used to read this instance. */
+    final ConfigurationFormat format;
+    /** The resource read. */
+    final String resource;
+    /**
+     * The properties of the default section (no name).
+     */
+    Map<String, String> defaultProperties;
+    /**
+     * A normalized flattened set of this configuration data.
+     */
+    Map<String, String> combinedProperties;
+    /**
+     * The sections read.
+     */
+    Map<String, Map<String, String>> namedSections;
+
+    /**
+     * Private constructor.
+     * @param resource the configuration resource URL, not null.
+     * @param format the format that read this data, not null.
+     */
+    private ConfigurationDataBuilder(String resource, ConfigurationFormat format){
+        this.format = Objects.requireNonNull(format);
+        this.resource = Objects.requireNonNull(resource);
+    }
+
+    /**
+     * Creates a new instance.
+     * @param resource the configuration resource URL, not null.
+     * @param format the format that read this data, not null.
+     * @return new instance of this class.
+     */
+    public static ConfigurationDataBuilder of(String resource, ConfigurationFormat format){
+        return new ConfigurationDataBuilder(resource, format);
+    }
+
+    /**
+     * Creates a new instance.
+     * @param data an existing ConfigurationData instances used to initialize the builder.
+     * @return new instance of this class from the given configuration.
+     */
+    public static ConfigurationDataBuilder of(ConfigurationData data){
+        ConfigurationDataBuilder b = new ConfigurationDataBuilder(data.getResource(), data.getFormat());
+        if (data.hasDefaultProperties()) {
+            b.getDefaultProperties().putAll(data.getDefaultProperties());
+        }
+        if (data.hasCombinedProperties()) {
+            b.getCombinedProperties().putAll(data.getCombinedProperties());
+        }
+        if (!data.getSections().isEmpty()) {
+            b.getSections().putAll(data.getSections());
+        }
+        return b;
+    }
+
+    /**
+     * Adds (empty) sections,if they are not yet existing. Already existing sections will not be touched.
+     * @param sections the new sections to put.
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder addSections(String... sections){
+        for (String section : sections) {
+            if (!getSections().containsKey(section)) {
+                getSections().put(section, new HashMap<String, String>());
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Adds a single entry to a target section.
+     * @param section the target section (will be created if not existing).
+     * @param key the entry's key
+     * @param value the entry's value
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder addSectionProperty(String section, String key, String value) {
+        Map<String, String> map = getSections().get(section);
+        if (map == null) {
+            map = new HashMap<>();
+            getSections().put(section, map);
+        }
+        map.put(key, value);
+        return this;
+    }
+
+    /**
+     * Adds a single entry to the <i>default</i> section.
+     * @param key the entry's key
+     * @param value the entry's value
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder addProperty(String key, String value) {
+        getDefaultProperties().put(key, value);
+        return this;
+    }
+
+    /**
+     * Adds the given entries to the given section, all existing values will be overridden.
+     * @param section the target section (will be created if not existing).
+     * @param properties the entry's data
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder addSectionProperties(String section, Map<String, String> properties) {
+        Map<String, String> map = getSections().get(section);
+        if (map == null) {
+            map = new HashMap<>();
+            getSections().put(section, map);
+        }
+        map.putAll(properties);
+        return this;
+    }
+
+    /**
+     * Adds the given entries to the <i>default</i> section, all existing values will be overridden.
+     * @param properties the entry's data
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder addProperties(Map<String, String> properties) {
+        getDefaultProperties().putAll(properties);
+        return this;
+    }
+
+    /**
+     * Sets the given entries as the <i>combined</i> properties map, all existing properties of the
+     * combined map will be overridden.
+     *
+     * @param properties the entry's data
+     * @return the builder for chaining.
+     */
+    public ConfigurationDataBuilder setCombinedProperties(Map<String, String> properties) {
+        this.combinedProperties = new HashMap<>(properties);
+        return this;
+    }
+
+    /**
+     * Access the current default section, if not present a new instance is initialized.
+     *
+     * @return the current default section, never null.
+     */
+    public Map<String, String> getDefaultProperties() {
+        if (defaultProperties == null) {
+            defaultProperties = new HashMap<>();
+        }
+        return defaultProperties;
+    }
+
+    /**
+     * Access the current combined properties, if not present a new instance is initialized.
+     *
+     * @return the current combined properties, never null.
+     */
+    public Map<String, String> getCombinedProperties() {
+        if (combinedProperties == null) {
+            combinedProperties = new HashMap<>();
+        }
+        return combinedProperties;
+    }
+
+    /**
+     * Access the current named sections, if not present a new instance is initialized.
+     *
+     * @return the current named sections, never null.
+     */
+    public Map<String, Map<String, String>> getSections() {
+        if (namedSections == null) {
+            namedSections = new HashMap<>();
+        }
+        return namedSections;
+    }
+
+    /**
+     * Builds a new {@link org.apache.tamaya.format.ConfigurationData} instance.
+     * @return a new {@link org.apache.tamaya.format.ConfigurationData} instance, not null.
+     */
+    public ConfigurationData build(){
+        return new ConfigurationData(this);
+    }
+
+    @Override
+    public String toString() {
+        return "ConfigurationDataBuilder{" +
+                "format=" + format +
+                ", default properties=" + defaultProperties +
+                ", sections=" + namedSections +
+                ", combined properties=" + combinedProperties +
+                ", resource=" + resource +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormat.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormat.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormat.java
new file mode 100644
index 0000000..997ef3a
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormat.java
@@ -0,0 +1,103 @@
+/*
+ * 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.format;
+
+import java.io.InputStream;
+import java.net.URL;
+
+/**
+ * <p>Implementations current this class encapsulate the mechanism how to read a
+ * resource including interpreting the format correctly (e.g. xml vs.
+ * properties vs. ini). In most cases file only contains entries of the same priority, which would then
+ * result in only one {@link org.apache.tamaya.spi.PropertySource}. Complex file formats, however, may contain entries
+ * of different priorities. In this cases, each ordinal type found typically is returned as a separate section so the
+ * consuming {@link org.apache.tamaya.spi.PropertySourceProvider} implementation can distribute the different part to
+ * individual {@link org.apache.tamaya.spi.PropertySource}s.</p>
+ *
+ * <h3>Implementation Requirements</h3>
+ * Implementations of this type must be
+ * <ul>
+ *     <li>thread-safe</li>
+ * </ul>
+ */
+public interface ConfigurationFormat {
+
+    /**
+     * Get a unique name of the format. This name can be used to access the format.
+     * @return the (unique) format's name, never null and not empty.
+     */
+    String getName();
+
+    /**
+     * Allows the format to examine the given resource, e.g. for a matching file ending. Only, if a format accepts an
+     * URL, it will be tried for reading the configuration.
+     * @param url the url to read the configuration data from (could be a file, a server location, a classpath
+     *            resource or something else, not null.
+     * @return true, if this format accepts the given URL for reading.
+     */
+    boolean accepts(URL url);
+
+    /**
+     * Reads a configuration from an URL, hereby parsing the given {@link java.io.InputStream}. Dependening on
+     * the capabilities of the format the returned {@link org.apache.tamaya.format.ConfigurationData} may contain
+     * different levels of data:
+     * <ul>
+     *     <li>Only a <i>default</i> section is returned, since the configuration format does not support
+     *     hierarchies. This is the case for properties and xml properties.</li>
+     *     <li>Hierarchical formats such as INI, XML and JSON can map each node to a section. Each section
+     *     can have its own key/value pairs. This allows to map also complex formats in a generic way. A
+     *     format implementation should then additionally flatten the whole data and store it in a accessible as
+     *     {@link ConfigurationData#getCombinedProperties()}. This allows to use the properties as inout to a default mapping,
+     *     which is always appropriate as long as no other semnatics
+     *     are defined in the concrete target scenario.</li>
+     *     <li>More complex custom scenarios should map their configuration data read into different
+     *     sections. Typically the data will be mapped into different {@link org.apache.tamaya.spi.PropertySource}
+     *     instances with different ordinal levels. As an example imagine a custom format that contains sections
+     *     'defaults', 'global-defaults', 'application', 'server-overrides'.</li>
+     *     <li>Alternate formats</li>
+     * </ul>
+     *
+     * Summarizing implementations common formats should always provide
+     * <ul>
+     *     <li>the data organized in sections as useful for the given format. If data is organized in one section, it
+     *     should be mapped into the DEFAULT section.</li>
+     *     <li>Formats that do provide multiple sections, should always provide a FLATTENED section as well, where
+     *     all the data is organized as a flattened key/value pairs, enabling a generic mapping to a
+     *     {@link org.apache.tamaya.spi.PropertySource}.</li>
+     * </ul>
+     *
+     * If the configuration format only contains entries of one ordinal type, normally only one single
+     * instance of PropertySource is returned (the corresponding key/values should end up in the DEFAULT section).
+     * Nevertheless custom formats may contain different sections or parts,
+     * where each part maps to a different target ordinal (eg defaults, domain config and app config). In the
+     * ladder case multiple PropertySources can be returned, each one with its own ordinal and the corresponding
+     * entries.
+     * @see org.apache.tamaya.spi.PropertySource
+     * @param resource a descriptive name for the resource, since an InputStream does not have any)
+     * @param inputStream the inputStream to read the configuration data from (could be a file, a server location, a classpath
+     *            resource or something else.
+     * @return the corresponding {@link ConfigurationData} containing sections/properties read, never {@code null}.
+     * @throws org.apache.tamaya.ConfigException if parsing of the input fails.
+     */
+    ConfigurationData readConfiguration(String resource, InputStream inputStream);
+
+    //X TODO Add support to access a default format to see a correct formatting
+    //X String getFormatExample();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormats.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormats.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormats.java
new file mode 100644
index 0000000..bc8aabd
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/ConfigurationFormats.java
@@ -0,0 +1,187 @@
+/*
+ * 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.format;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.tamaya.spi.ServiceContextManager;
+
+/**
+ * Small accessor and management class dealing with {@link org.apache.tamaya.format.ConfigurationFormat}
+ * instances.
+ */
+public final class ConfigurationFormats {
+    /**
+     * The logger used.
+     */
+    private static final Logger LOG = Logger.getLogger(ConfigurationFormats.class.getName());
+
+    /**
+     * Singleton constructor.
+     */
+    private ConfigurationFormats() {
+    }
+
+    /**
+     * Get all currently available formats, ordered by priority.
+     *
+     * @return the currently available formats, never null.
+     */
+    public static List<ConfigurationFormat> getFormats() {
+        return ServiceContextManager.getServiceContext().getServices(ConfigurationFormat.class);
+    }
+
+    /**
+     * Get all currently available formats, ordered by priority.
+     *
+     * @param formatNames available formats to be ordered.
+     * @return the currently available formats, never null.
+     */
+    public static List<ConfigurationFormat> getFormats(String... formatNames) {
+        final List<ConfigurationFormat> result = new ArrayList<>();
+        final Set<String> names = new HashSet<>(Arrays.asList(formatNames));
+        for (final ConfigurationFormat f : getFormats()) {
+            if (names.contains(f.getName())) {
+                result.add(f);
+            }
+        }
+        return result;
+    }
+
+    // Activate for JDK 8...
+//    /**
+//     * Get all currently available formats, ordered by priority.
+//     *
+//     * @return the currently available formats, never null.
+//     */
+//    public static List<ConfigurationFormat> getFormats(Predicate<String> namePredicate) {
+//        List<ConfigurationFormat> result = new ArrayList<>();
+//        for(ConfigurationFormat f:getFormats()){
+//            if(namePredicate.test(f.getName()){
+//                result.add(f);
+//            }
+//        }
+//        return result;
+//    }
+
+    /**
+     * Get all currently available formats, ordered by priority.
+     *
+     * @param url source to read configuration from.
+     * @return the currently available formats, never null.
+     */
+    public static List<ConfigurationFormat> getFormats(final URL url) {
+        final List<ConfigurationFormat> formats = getFormats();
+        final List<ConfigurationFormat> result = new ArrayList<>();
+        for (final ConfigurationFormat f : formats) {
+            if (f.accepts(url)) {
+                result.add(f);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Tries to read configuration data from a given URL, hereby traversing all known formats in order of precedence.
+     * Hereby the formats are first filtered to check if the URL is acceptable, before the input is being parsed.
+     *
+     * @param url the url from where to read, not null.
+     * @return the ConfigurationData read, or null.
+     * @throws IOException if the resource cannot be read.
+     */
+    public static ConfigurationData readConfigurationData(final URL url) throws IOException {
+        final List<ConfigurationFormat> formats = getFormats(url);
+        return readConfigurationData(url, formats.toArray(new ConfigurationFormat[formats.size()]));
+    }
+
+    /**
+     * Tries to read configuration data from a given URL, hereby explicitly trying all given formats in order.
+     *
+     * @param url     the url from where to read, not null.
+     * @param formats the formats to try.
+     * @return the ConfigurationData read, or null.
+     * @throws IOException if the resource cannot be read.
+     */
+    public static ConfigurationData readConfigurationData(URL url, ConfigurationFormat... formats) throws IOException {
+        return readConfigurationData(url.toString(), url.openStream(), formats);
+    }
+
+    /**
+     * @param urls    the urls from where to read, not null.
+     * @param formats the formats to try.
+     * @return the {@link org.apache.tamaya.format.ConfigurationData} of the files successfully decoded by the
+     * given formats.
+     */
+    public static Collection<ConfigurationData> getPropertySources(Collection<URL> urls, ConfigurationFormat... formats) {
+        final List<ConfigurationData> dataRead = new ArrayList<>();
+        for (final URL url : urls) {
+            try {
+                final ConfigurationData data = readConfigurationData(url, formats);
+                if (data != null) {
+                    dataRead.add(data);
+                }
+            } catch (final Exception e) {
+                LOG.log(Level.SEVERE, "Error reading file: " + url.toExternalForm(), e);
+            }
+        }
+        return dataRead;
+    }
+
+    /**
+     * Tries to read configuration data from a given URL, hereby explicitly trying all given formats in order.
+     *
+     * @param resource    a descriptive name for the resource, since an InputStream does not have any
+     * @param inputStream the inputStream from where to read, not null.
+     * @param formats     the formats to try.
+     * @return the ConfigurationData read, or null.
+     * @throws IOException if the resource cannot be read.
+     */
+    public static ConfigurationData readConfigurationData(String resource, InputStream inputStream,
+                                                          ConfigurationFormat... formats) throws IOException {
+        Objects.requireNonNull(inputStream);
+        Objects.requireNonNull(resource);
+        try(InputStreamFactory isFactory = new InputStreamFactory(inputStream)) {
+            for (final ConfigurationFormat format : formats) {
+                try (InputStream is = isFactory.createInputStream()) {
+                    final ConfigurationData data = format.readConfiguration(resource, is);
+                    if (data != null) {
+                        return data;
+                    }
+                } catch (final Exception e) {
+                    LOG.log(Level.INFO,
+                            "Format " + format.getClass().getName() + " failed to read resource " + resource, e);
+                }
+            }
+        }
+        return null;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java
new file mode 100644
index 0000000..9d2097f
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.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.format;
+
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Flattened default PropertySource that uses the flattened config data read from an URL by a
+ * ${@link org.apache.tamaya.format.ConfigurationFormat}.
+ */
+public class FlattenedDefaultPropertySource implements PropertySource {
+    private static final Logger LOG = Logger.getLogger(FlattenedDefaultPropertySource.class.getName());
+    private final Map<String, String> properties;
+    private final ConfigurationData data;
+    private int defaultOrdinal = 0;
+
+
+    /*
+     * Constructor, uses hereby the flattened config data read from an URL by a
+     * ${@link org.apache.tamaya.format.ConfigurationFormat}, and if not present falls back to the default section.
+     */
+    public FlattenedDefaultPropertySource(ConfigurationData data) {
+        this.properties = populateData(data);
+        this.data = data;
+    }
+
+    /*
+     * Constructor, uses hereby the flattened config data read from an URL by a
+     * ${@link org.apache.tamaya.format.ConfigurationFormat}, and if not present falls back to the default section.
+     */
+    public FlattenedDefaultPropertySource(int defaultOrdinal, ConfigurationData data) {
+        this.properties = populateData(data);
+        this.data = data;
+        this.defaultOrdinal = defaultOrdinal;
+    }
+
+    protected Map<String, String> populateData(ConfigurationData data) {
+        Map<String, String> result = data.getCombinedProperties();
+        if (result.isEmpty()) {
+            result = data.getDefaultProperties();
+        }
+        if (result.isEmpty()) {
+            result = new HashMap<>();
+        }
+        if(result.isEmpty()){
+            for (String section : data.getSectionNames()) {
+                Map<String,String> sectionMap = data.getSection(section);
+                for(Map.Entry<String,String> en: sectionMap.entrySet()){
+                    result.put(section + '.' + en.getKey(), en.getValue());
+                }
+            }
+        }
+        return Collections.unmodifiableMap(result);
+    }
+
+    @Override
+    public String getName() {
+        String name = this.properties.get("[meta].name");
+        if (name == null) {
+            name = this.data.getResource();
+        }
+        if (name == null) {
+            name = getClass().getSimpleName();
+        }
+        return name;
+    }
+
+    @Override
+    public int getOrdinal() {
+        String ordinalValue = this.properties.get(PropertySource.TAMAYA_ORDINAL);
+        if (ordinalValue != null) {
+            try {
+                return Integer.parseInt(ordinalValue.trim());
+            } catch (Exception e) {
+                LOG.log(Level.WARNING, "Failed to parse Tamaya ordinal from " + data.getResource(), e);
+            }
+        }
+        return defaultOrdinal;
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        return PropertyValue.of(key, properties.get(key), getName());
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    @Override
+    public boolean isScannable() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/InputStreamFactory.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/InputStreamFactory.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/InputStreamFactory.java
new file mode 100644
index 0000000..912dd08
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/InputStreamFactory.java
@@ -0,0 +1,89 @@
+/*
+ * 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.format;
+
+import java.io.*;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Wrapper for a given {@link InputStream} to be able to close
+ * it via the try-with-resources construct of Java 7.
+ *
+ * <h1>Usage example</h1>
+ *
+ * <pre>
+ * public void readIt(InputStream inputStream) {
+ *    try (InputStream is = new ParallelInputStream(inputStream) {
+ *        // Consume the stream
+ *    }
+ * }
+ * </pre>
+ */
+public class InputStreamFactory implements Closeable {
+    private static final Logger LOG = Logger.getLogger(InputStreamFactory.class.getName());
+
+    private byte[] data;
+
+    /**
+     * Creates a new InputStreamFactory.
+     *
+     * @param original the InputStream to be read for extract its data into memory.
+     * @throws IOException if thrown by the original during read.
+     */
+    public InputStreamFactory(InputStream original) throws IOException {
+        Objects.requireNonNull(original);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        byte[] bytes = new byte[256];
+        try {
+            int read = original.read(bytes);
+            while (read > 0) {
+                bos.write(bytes, 0, read);
+                read = original.read(bytes);
+            }
+            this.data = bos.toByteArray();
+        } finally {
+            try {
+                original.close();
+            } catch (IOException e) {
+                LOG.log(Level.FINEST, "Error closing stream: " + original, e);
+            }
+        }
+    }
+
+    /**
+     * Creates a new InputStream with the same data as provided by the InputStream passed on factory creation.
+     *
+     * @return a new InputStream , never null.
+     * @throws IOException if no data is available.
+     */
+    public InputStream createInputStream() throws IOException {
+        byte[] bytes = this.data;
+        if (bytes == null) {
+            throw new IOException("InputStreamFactory is closed.");
+        }
+        return new ByteArrayInputStream(bytes);
+    }
+
+    @Override
+    public void close() throws IOException {
+        this.data = null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/IniConfigurationFormat.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/IniConfigurationFormat.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/IniConfigurationFormat.java
new file mode 100644
index 0000000..fe27ba7
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/IniConfigurationFormat.java
@@ -0,0 +1,95 @@
+/*
+ * 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.format.formats;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationDataBuilder;
+import org.apache.tamaya.format.ConfigurationFormat;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implements a ini file format.
+ */
+public class IniConfigurationFormat implements ConfigurationFormat {
+
+    /**
+     * The logger.
+     */
+    private final static Logger LOG = Logger.getLogger(IniConfigurationFormat.class.getName());
+
+    @Override
+    public String getName() {
+        return "ini";
+    }
+
+    @Override
+    public boolean accepts(URL url) {
+        String fileName = url.getFile();
+        return fileName.endsWith(".ini") || fileName.endsWith(".INI");
+    }
+
+    @Override
+    public ConfigurationData readConfiguration(String resource, InputStream inputStream) {
+        ConfigurationDataBuilder builder = ConfigurationDataBuilder.of(resource, this);
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
+            String line = reader.readLine();
+            int lineNum = 0;
+            String section = null;
+            while (line != null) {
+                lineNum++;
+                line = line.trim();
+                if (line.isEmpty()) {
+                    line = reader.readLine();
+                    continue;
+                }
+                if (line.startsWith("[")) {
+                    int end = line.indexOf(']');
+                    if (end < 0) {
+                        throw new ConfigException(
+                                "Invalid INI-Format, ']' expected, at " + lineNum + " in " + resource);
+                    }
+                    section = line.substring(1, end);
+                } else if (line.trim().startsWith("#")) {
+                    // comment
+                } else {
+                    int sep = line.indexOf('=');
+                    String key = line.substring(0, sep);
+                    String value = line.substring(sep + 1);
+                    if (section != null) {
+                        builder.addSectionProperty(section, key, value);
+                    } else {
+                        builder.addProperty(key, value);
+                    }
+                }
+                line = reader.readLine();
+            }
+            return builder.build();
+        } catch (Exception e) {
+            LOG.log(Level.SEVERE, "Could not read configuration: " + resource, e);
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesFormat.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesFormat.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesFormat.java
new file mode 100644
index 0000000..35cef77
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesFormat.java
@@ -0,0 +1,71 @@
+/*
+ * 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.format.formats;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationDataBuilder;
+import org.apache.tamaya.format.ConfigurationFormat;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of a {@link org.apache.tamaya.format.ConfigurationFormat} for -properties files.
+ *
+ * @see java.util.Properties#load(java.io.InputStream)
+ */
+public class PropertiesFormat implements ConfigurationFormat {
+    /**
+     * The logger.
+     */
+    private final static Logger LOG = Logger.getLogger(PropertiesFormat.class.getName());
+
+
+    @Override
+    public String getName() {
+        return "properties";
+    }
+
+    @Override
+    public boolean accepts(URL url) {
+        String fileName = url.getFile();
+        return fileName.endsWith(".properties") || fileName.endsWith(".PROPERTIES") ||
+                fileName.endsWith(".conf") || fileName.endsWith(".CONF");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ConfigurationData readConfiguration(String resource, InputStream inputStream) {
+        Objects.requireNonNull(inputStream);
+        Objects.requireNonNull(resource);
+        try {
+            final Properties p = new Properties();
+            p.load(inputStream);
+            return ConfigurationDataBuilder.of(resource, this).addProperties(Map.class.cast(p)).build();
+        } catch (Exception e) {
+            LOG.log(Level.FINEST, "Failed to read config from resource: " + resource, e);
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesXmlFormat.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesXmlFormat.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesXmlFormat.java
new file mode 100644
index 0000000..c47b6f6
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/PropertiesXmlFormat.java
@@ -0,0 +1,69 @@
+/*
+ * 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.format.formats;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationDataBuilder;
+import org.apache.tamaya.format.ConfigurationFormat;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of a {@link org.apache.tamaya.format.ConfigurationFormat} for xml property
+ * files.
+ *
+ * @see java.util.Properties#loadFromXML(java.io.InputStream)
+ */
+public class PropertiesXmlFormat implements ConfigurationFormat {
+    /**
+     * The logger.
+     */
+    private final static Logger LOG = Logger.getLogger(PropertiesXmlFormat.class.getName());
+
+    @Override
+    public String getName() {
+        return "xml-properties";
+    }
+
+    @Override
+    public boolean accepts(URL url) {
+        String fileName = url.getFile();
+        return fileName.endsWith(".xml") || fileName.endsWith(".XML");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ConfigurationData readConfiguration(String resource, InputStream inputStream) {
+        Objects.requireNonNull(inputStream);
+        Objects.requireNonNull(resource);
+
+        try {
+            final Properties p = new Properties();
+            p.loadFromXML(inputStream);
+            return ConfigurationDataBuilder.of(resource, this).addProperties(Map.class.cast(p)).build();
+        } catch (Exception e) {
+            LOG.log(Level.FINEST, "Failed to read config from resource: " + resource, e);
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/package-info.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/package-info.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/package-info.java
new file mode 100644
index 0000000..db8987d
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/formats/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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 implementtion of {@link org.apache.tamaya.format.ConfigurationFormat}
+ * for properties, xml-properties and ini files.
+ */
+package org.apache.tamaya.format.formats;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/java/org/apache/tamaya/format/package-info.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/java/org/apache/tamaya/format/package-info.java b/modules/formats/common/src/main/java/org/apache/tamaya/format/package-info.java
new file mode 100644
index 0000000..39b5f0b
--- /dev/null
+++ b/modules/formats/common/src/main/java/org/apache/tamaya/format/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 an abstraction for parsing a configuration
+ * from an input strem, called {@link org.apache.tamaya.format.ConfigurationFormat}
+ * and corresponding helper artifacts.
+ *
+ * @see org.apache.tamaya.format.ConfigurationFormat
+ * @see org.apache.tamaya.format.ConfigurationData
+ * @see org.apache.tamaya.format.ConfigurationFormats
+ */
+package org.apache.tamaya.format;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/main/resources/META-INF/services/org.apache.tamaya.format.ConfigurationFormat
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/main/resources/META-INF/services/org.apache.tamaya.format.ConfigurationFormat b/modules/formats/common/src/main/resources/META-INF/services/org.apache.tamaya.format.ConfigurationFormat
new file mode 100644
index 0000000..96e898f
--- /dev/null
+++ b/modules/formats/common/src/main/resources/META-INF/services/org.apache.tamaya.format.ConfigurationFormat
@@ -0,0 +1,21 @@
+#
+# 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.format.formats.IniConfigurationFormat
+org.apache.tamaya.format.formats.PropertiesFormat
+org.apache.tamaya.format.formats.PropertiesXmlFormat
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/test/java/org/apache/tamaya/format/ConfigurationFormatsTest.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/test/java/org/apache/tamaya/format/ConfigurationFormatsTest.java b/modules/formats/common/src/test/java/org/apache/tamaya/format/ConfigurationFormatsTest.java
new file mode 100644
index 0000000..0839714
--- /dev/null
+++ b/modules/formats/common/src/test/java/org/apache/tamaya/format/ConfigurationFormatsTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.format;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Tests for {@link org.apache.tamaya.format.ConfigurationFormats}.
+ */
+public class ConfigurationFormatsTest {
+
+    @org.junit.Test
+    public void testGetFormats() throws Exception {
+        List<ConfigurationFormat> formats = ConfigurationFormats.getFormats();
+        assertNotNull(formats);
+        assertEquals(formats.size(), 3);
+    }
+
+    @org.junit.Test
+    public void testReadConfigurationData() throws Exception {
+        List<ConfigurationFormat> formats = ConfigurationFormats.getFormats(getClass().getResource("/Test.ini"));
+        assertNotNull(formats);
+        assertEquals(formats.size(), 1);
+        formats = ConfigurationFormats.getFormats(getClass().getResource("/Test.properties"));
+        assertNotNull(formats);
+        assertEquals(formats.size(), 1);
+//        formats = ConfigurationFormats.getFormats(getClass().getResource("/Test.xml"));
+//        assertNotNull(formats);
+//        assertEquals(formats.size(), 1);
+
+    }
+
+    @org.junit.Test
+    public void testReadConfigurationData_URL() throws Exception {
+        ConfigurationData data = ConfigurationFormats.readConfigurationData(getClass().getResource("/Test.ini"));
+        assertNotNull(data);
+        data = ConfigurationFormats.readConfigurationData(getClass().getResource("/Test.properties"));
+        assertNotNull(data);
+    }
+
+    @org.junit.Test
+    public void testReadConfigurationData2() throws Exception {
+        List<ConfigurationFormat> formats = ConfigurationFormats.getFormats();
+        ConfigurationData data = ConfigurationFormats.readConfigurationData(getClass().getResource("/Test.ini"),
+                formats.toArray(new ConfigurationFormat[formats.size()]));
+        assertNotNull(data);
+        System.out.println(data);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/formats/common/src/test/java/org/apache/tamaya/format/FlattenedDefaultPropertySourceTest.java
----------------------------------------------------------------------
diff --git a/modules/formats/common/src/test/java/org/apache/tamaya/format/FlattenedDefaultPropertySourceTest.java b/modules/formats/common/src/test/java/org/apache/tamaya/format/FlattenedDefaultPropertySourceTest.java
new file mode 100644
index 0000000..adc94f6
--- /dev/null
+++ b/modules/formats/common/src/test/java/org/apache/tamaya/format/FlattenedDefaultPropertySourceTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.format;
+
+import org.apache.tamaya.format.formats.PropertiesFormat;
+import org.apache.tamaya.spi.PropertySource;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Tests for {@link org.apache.tamaya.format.FlattenedDefaultPropertySource}.
+ */
+public class FlattenedDefaultPropertySourceTest {
+
+    @Test
+    public void testGetName() throws Exception {
+        FlattenedDefaultPropertySource ps = new FlattenedDefaultPropertySource(createConfigurationData("test1"));
+        assertEquals("test1", ps.getName());
+    }
+
+    private ConfigurationData createConfigurationData(String sourceName) {
+        return ConfigurationDataBuilder.of(sourceName, new PropertiesFormat())
+                .addProperty("a", "aValue").addSectionProperty("section1", "sectionKey1", "sectionValue11")
+                .addSections("section1", "section12")
+                .addSectionProperty("section2", "sectionKey1", "sectionValue21").build();
+    }
+
+    private ConfigurationData createConfigurationData(String sourceName, int ordinal) {
+        return ConfigurationDataBuilder.of(sourceName, new PropertiesFormat())
+                .addProperty("a", "aValue").addSectionProperty("section1", "sectionKey1", "sectionValue11")
+                .addSections("section1", "section12").addProperty(PropertySource.TAMAYA_ORDINAL, String.valueOf(ordinal))
+                .addSectionProperty("section2", "sectionKey1", "sectionValue21").build();
+    }
+
+    private ConfigurationData createConfigurationDataNoDefault(String sourceName) {
+        return ConfigurationDataBuilder.of(sourceName, new PropertiesFormat())
+                .addSectionProperty("section1", "sectionKey1", "sectionValue11")
+                .addSections("section1", "section12")
+                .addSectionProperty("section2", "sectionKey1", "sectionValue21").build();
+    }
+
+    @Test
+    public void testGetOrdinal() throws Exception {
+        FlattenedDefaultPropertySource ps = new FlattenedDefaultPropertySource(createConfigurationData("test1", 11));
+        assertEquals(11, ps.getOrdinal());
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        FlattenedDefaultPropertySource ps = new FlattenedDefaultPropertySource(createConfigurationData("test2"));
+        assertEquals("aValue", ps.get("a").get("a"));
+        assertNotNull(ps.get("section1.sectionKey1").get("section1.sectionKey1"));
+        assertNotNull(ps.get("section2.sectionKey1").get("section2.sectionKey1"));
+        assertNull(ps.get("sectionKey1"));
+        ps = new FlattenedDefaultPropertySource(createConfigurationDataNoDefault("test2"));
+        assertEquals("sectionValue11", ps.get("section1.sectionKey1").get("section1.sectionKey1"));
+        assertEquals("sectionValue21", ps.get("section2.sectionKey1").get("section2.sectionKey1"));
+        assertNull(ps.get("a"));
+        assertNull(ps.get("section1"));
+    }
+
+    @Test
+    public void testGetProperties() throws Exception {
+        FlattenedDefaultPropertySource ps = new FlattenedDefaultPropertySource(createConfigurationData("test3"));
+        assertNotNull(ps.getProperties());
+        assertEquals("aValue", ps.getProperties().get("a"));
+        assertNotNull(ps.getProperties().get("section1.sectionKey1"));
+        assertNotNull(ps.getProperties().get("section2.sectionKey1"));
+        assertNull(ps.getProperties().get("section1.sectionKey2"));
+        assertNull(ps.getProperties().get("section2.sectionKey2"));
+        assertNull(ps.getProperties().get("sectionKey1"));
+        assertNull(ps.getProperties().get("sectionKey2"));
+        ps = new FlattenedDefaultPropertySource(createConfigurationDataNoDefault("test3"));
+        assertNotNull(ps.getProperties());
+        assertEquals("sectionValue11", ps.getProperties().get("section1.sectionKey1"));
+        assertEquals("sectionValue21", ps.getProperties().get("section2.sectionKey1"));
+        assertNull(ps.get("section1"));
+    }
+}
\ No newline at end of file



Mime
View raw message