You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2015/01/03 12:59:15 UTC

[06/27] incubator-tamaya git commit: TAMAYA-19: Reorganized dormant part for better focus of future discussions.

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFactory.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFactory.java
deleted file mode 100644
index 3f8a0b1..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFactory.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.properties;
-
-import java.net.URL;
-import java.time.Instant;
-import java.util.*;
-import java.util.function.BiFunction;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-
-import org.apache.tamaya.PropertySource;
-
-/**
- * Default implementation current the singleton backing bean for the {@link org.apache.tamaya.core.properties.PropertySourceBuilder}.
- */
-public final class PropertySourceFactory {
-
-    private static final PropertySource EMPTY_PROPERTYSOURCE = fromMap("<empty>", Collections.emptyMap());
-    private static final PropertySource ENV_PROPERTYSOURCE = new EnvironmentPropertySource();
-
-
-    /**
-     * Singleton constructor.
-     */
-    private PropertySourceFactory(){}
-
-    public static PropertySource fromArgs(String name, String... args) {
-        if(name==null){
-            name ="<CLI> " + Arrays.toString(args);
-        }
-        // TODO read the CLI with some better library, e.g. move parsing service to ext. service SPI
-        Map<String, String> properties = new HashMap<>();
-        for (int base = 0; base < args.length; base++) {
-            if (args[base].startsWith("--")) {
-                String argKey = args[base].substring(2);
-                String value = "true"; // flag only
-                if (base != args.length - 1) {
-                    if (args[base + 1].startsWith("-")) {
-                        base++;
-                        int eqIndex = argKey.indexOf('=');
-                        if (eqIndex > 0) {
-                            value = argKey.substring(eqIndex + 1);
-                            argKey = argKey.substring(0, eqIndex);
-                        }
-                    } else {
-                        value = args[base + 1];
-                        base += 2;
-                    }
-                }
-                properties.put(argKey, value);
-            } else if (args[base].startsWith("-")) {
-                String argKey = args[base].substring(1);
-                String value = "true"; // flag only
-                if (base != args.length - 1) {
-                    if (args[base + 1].startsWith("-")) {
-                        base++;
-                        int eqIndex = argKey.indexOf('=');
-                        if (eqIndex > 0) {
-                            value = argKey.substring(eqIndex + 1);
-                            argKey = argKey.substring(0, eqIndex);
-                        }
-                    } else {
-                        value = args[base + 1];
-                        base += 2;
-                    }
-                }
-                properties.put(argKey, value);
-            }
-        }
-        return fromMap(name, properties);
-    }
-
-    public static PropertySource fromPaths(String name, AggregationPolicy aggregationPolicy, List<String> paths) {
-        if(name==null){
-            name ="<Paths> " + paths.toString();
-        }
-        return new PathBasedPropertySource(name, paths, aggregationPolicy);
-    }
-
-    public static PropertySource fromURLs(String name, AggregationPolicy aggregationPolicy, List<URL> urls) {
-        if(name==null){
-            name ="<URLs> " + urls.toString();
-        }
-        return new URLBasedPropertySource(name, urls, aggregationPolicy);
-    }
-
-    public static PropertySource fromMap(String name, Map<String, String> map) {
-        if(name==null){
-            name ="<Map> " + map.toString();
-        }
-        return new MapBasedPropertySource(name, map);
-    }
-
-    public static PropertySource empty(String name) {
-        if(name==null) {
-            return EMPTY_PROPERTYSOURCE;
-        }
-        return fromMap(name, Collections.emptyMap());
-    }
-
-    /**
-     * Returns a read-only {@link org.apache.tamaya.PropertySource} reflecting the current runtime environment properties.
-     *
-     * @return a new read-only {@link org.apache.tamaya.PropertySource} instance based on the current runtime environment properties.
-     */
-    public static PropertySource fromEnvironmentProperties() {
-        return ENV_PROPERTYSOURCE;
-    }
-
-    /**
-     * Creates a new read-only {@link org.apache.tamaya.PropertySource} reflecting the current system properties.
-     *
-     * @return a new read-only {@link org.apache.tamaya.PropertySource} instance based on the current system properties.
-     */
-    public static PropertySource fromSystemProperties() {
-        return new SystemPropertiesPropertySource();
-    }
-
-    public static PropertySource freezed(String name, PropertySource source) {
-        if(name==null){
-            name ="<Freezed> source=" + source.toString()+", at="+Instant.now().toString();
-        }
-        return FreezedPropertySource.of(name, source);
-    }
-
-    /**
-     * Creates a new {@link org.apache.tamaya.PropertySource} containing all property maps given, hereby using the given AggregationPolicy.
-     *
-     * @param policy       the AggregationPolicy to be used, not null.
-     * @param providers the maps to be included, not null.
-     * @return the aggregated instance containing all given maps.
-     */
-    public static PropertySource aggregate(String name, AggregationPolicy policy, List<PropertySource> providers) {
-        if(name==null){
-            name ="<Aggregate> policy=" + policy.toString()+", providers="+providers.toString();
-        }
-        return new AggregatedPropertySource(name, null, policy, providers);
-    }
-
-    /**
-     * Creates a new {@link org.apache.tamaya.PropertySource} that is mutable by adding a map based instance that overrides
-     * values fromMap the original map.
-     * @param provider the provider to be made mutable, not null.
-     * @return the mutable instance.
-     */
-    public static PropertySource mutable(String name, PropertySource provider) {
-        if(name==null){
-            name ="<Mutable> provider="+provider.getName();
-        }
-        PropertySource mutableProvider = fromMap(name,new HashMap<>());
-        List<PropertySource> providers = new ArrayList<>(2);
-        providers.add(provider);
-        providers.add(mutableProvider);
-        return new AggregatedPropertySource(name, mutableProvider, AggregationPolicy.OVERRIDE, providers);
-    }
-
-    /**
-     * Creates a new {@link org.apache.tamaya.PropertySource} containing only properties that are shared by all given maps,
-     * hereby later maps in the array override  properties fromMap previous instances.
-     * @param aggregationPolicy the policy to resolve aggregation conflicts.
-     * @param providers the maps to be included, not null.
-     * @return the intersecting instance containing all given maps.
-     */
-    public static PropertySource intersected(String name, AggregationPolicy aggregationPolicy, List<PropertySource> providers) {
-        return new IntersectingPropertySource(name, aggregationPolicy, providers);
-    }
-
-    /**
-     * Creates a new {@link org.apache.tamaya.PropertySource} containing only properties fromMap the target instance, that are not contained
-     * in one current the other maps passed.
-     *
-     * @param target         the base map, not null.
-     * @param subtrahendSets the maps to be subtracted, not null.
-     * @return the intersecting instance containing all given maps.
-     */
-    public static PropertySource subtracted(String name, PropertySource target, List<PropertySource> subtrahendSets) {
-        return new SubtractingPropertySource(name, target,subtrahendSets);
-    }
-
-
-    /**
-     * Creates a filtered {@link org.apache.tamaya.PropertySource} (a view) current a given base {@link }PropertyMap}. The filter hereby is
-     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
-     *
-     * @param name the base map instance, not null.
-     * @param filter      the filtger to be applied, not null.
-     * @return the new filtering instance.
-     */
-    public static PropertySource filtered(String name, Predicate<String> filter, PropertySource source) {
-        if(name==null){
-            name ="<Filtered> filter="+filter+", source="+source.getName();
-        }
-        return new FilteredPropertySource(name, source, filter);
-    }
-
-    /**
-     * Creates a new contextual {@link org.apache.tamaya.PropertySource}. Contextual maps delegate to different instances current PropertyMap depending
-     * on the keys returned fromMap the isolationP
-     *
-     * @param name the base name instance, not null.
-     * @param mapSupplier          the supplier creating new provider instances
-     * @param isolationKeySupplier the supplier providing contextual keys based on the current environment.
-     */
-    public static PropertySource contextual(String name, Supplier<PropertySource> mapSupplier,
-                                              Supplier<String> isolationKeySupplier) {
-        if(name==null){
-            name ="<Contextual> mapSupplier="+mapSupplier+", isolationKeyProvider="+isolationKeySupplier;
-        }
-        return new ContextualPropertySource(name, mapSupplier, isolationKeySupplier);
-    }
-
-
-    /**
-     * Creates a filtered {@link org.apache.tamaya.PropertySource} (a view) current a given base {@link }PropertyMap}. The filter hereby is
-     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
-     *
-     * @param name the base name instance, not null.
-     * @param source   the main map instance, not null.
-     * @param parentMap the delegated parent map instance, not null.
-     * @return the new delegating instance.
-     */
-    public static PropertySource delegating(String name, PropertySource source, Map<String, String> parentMap) {
-        if(name==null){
-            name ="<Delegating> source="+source+", delegates="+parentMap;
-        }
-        return new DelegatingPropertySource(name, source, parentMap);
-    }
-
-    /**
-     * Creates a {@link org.apache.tamaya.PropertySource} where all keys current a current map,
-     * existing in another map are replaced
-     * with the ones fromMap the other {@link org.apache.tamaya.PropertySource}. The filter hereby is
-     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
-     * Keys not existing in the {@code mainMap}, but present in {@code replacementMao} will be hidden.
-     *
-     * @param name the base name instance, not null.
-     * @param source the main source instance, which keys, present in {@code replacementMap} will be replaced
-     *                       with the ones
-     *                       in {@code replacementMap}, not null.
-     * @param replacementMap the map instance, that will replace all corresponding entries in {@code mainMap}, not null.
-     * @return the new delegating instance.
-     */
-    public static PropertySource replacing(String name, PropertySource source, Map<String, String> replacementMap) {
-        if(name==null){
-            name ="<Replacement> source="+source+", replacements="+replacementMap;
-        }
-        return new ReplacingPropertySource(name, source, replacementMap);
-    }
-
-    /**
-     * Creates a new {@link org.apache.tamaya.PropertySource} given an existing one, and an alternate
-     * meta-info.
-     * @param name the new meta-information, not null.
-     * @param baseProvider the property source, not null.
-     * @return the new property source.never null.
-     */
-    public static PropertySource build(String name, PropertySource baseProvider) {
-        return new BuildablePropertySource(name, baseProvider);
-    }
-
-    /**
-     * Creates a new filtered {@link org.apache.tamaya.PropertySource} using the given filter.
-     * @param name the base name instance, not null.
-     * @param valueFilter the value filter function, null result will remove the given entries.
-     * @param current the source to be filtered
-     */
-    public static PropertySource filterValues(String name, BiFunction<String, String, String> valueFilter, PropertySource current) {
-        return new ValueFilteredPropertySource(name, valueFilter, current);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFunctions.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFunctions.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFunctions.java
index 5fcf895..c081c94 100644
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFunctions.java
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/PropertySourceFunctions.java
@@ -62,4 +62,57 @@ public final class PropertySourceFunctions {
         return (c) -> new MappedPropertySource(c, keyMapper);
     }
 
+
+
+    /**
+     * Intersetcs the current properties with the given {@link org.apache.tamaya.PropertySource} instance.
+     *
+     * @param providers the maps to be intersected, not null.
+     * @return the builder for chaining.
+     */
+    public UnaryOperator<PropertySource> intersect(PropertySource... providers) {
+        if (providers.length == 0) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "<intersection> -> " + Arrays.toString(providers);
+        }
+        return addPropertySources(PropertySourceFactory.intersected(name, aggregationPolicy, Arrays.asList(providers)));
+    }
+
+
+    /**
+     * Filters the current properties based on the given predicate..
+     *
+     * @param filter the filter to be applied, not null.
+     * @return the new filtering instance.
+     */
+    public UnaryOperator<PropertySource> filter(Predicate<String> filter) {
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "<filtered> -> " + filter;
+        }
+        current = PropertySourceFactory.filtered(name, filter, current);
+        this.currentName = null;
+        return this;
+    }
+
+
+    /**
+     * Replaces all keys in the current provider by the given map.
+     *
+     * @param replacementMap the map instance, that will replace all corresponding entries in {@code mainMap}, not null.
+     * @return the new delegating instance.
+     */
+    public PropertySourceBuilder replace(Map<String, String> replacementMap) {
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "<replacement> -> current=" + current.getName() + " with =" + replacementMap;
+        }
+        current = PropertySourceFactory.replacing(name, current, replacementMap);
+        this.currentName = null;
+        return this;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/ReplacingPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/ReplacingPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/ReplacingPropertySource.java
deleted file mode 100644
index 85100e3..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/ReplacingPropertySource.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.properties;
-
-import org.apache.tamaya.PropertySource;
-
-import java.util.*;
-
-/**
- * Implementation for a {@link org.apache.tamaya.PropertySource} that is an aggregate current
- * multiple child instances, where all existing key/values in a replacementMap will
- * replace values in a main map, if present there.
- */
-class ReplacingPropertySource implements PropertySource {
-
-    private PropertySource mainMap;
-    private Map<String,String> replacingMap;
-    private String name;
-
-    /**
-     * Creates a mew instance, with aggregation polilcy
-     * {@code AggregationPolicy.OVERRIDE}.
-     *
-     * @param mainMap      The main ConfigMap.
-     * @param replacingMap The replacing ConfigMap.
-     */
-    public ReplacingPropertySource(String name, PropertySource mainMap, Map<String, String> replacingMap){
-        this.replacingMap = Objects.requireNonNull(replacingMap);
-        this.mainMap = Objects.requireNonNull(mainMap);
-        this.name = Objects.requireNonNull(name);
-    }
-
-    @Override
-    public Map<String,String> getProperties(){
-        Map<String,String> result = new HashMap<>(replacingMap);
-        mainMap.getProperties().entrySet().stream().filter(en -> !replacingMap.containsKey(en.getKey())).forEach(en ->
-                result.put(en.getKey(), en.getValue()));
-        return result;
-    }
-
-    @Override
-    public String getName(){
-        return this.name;
-    }
-
-    @Override
-    public Optional<String> get(String key){
-        String val = replacingMap.get(key);
-        if(val == null){
-            return mainMap.get(key);
-        }
-        return Optional.ofNullable(val);
-    }
-
-    @Override
-    public String toString(){
-        return super.toString() + "(mainMap=" + mainMap + ", replacingMap=" + replacingMap + ")";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/SubtractingPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/SubtractingPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/SubtractingPropertySource.java
deleted file mode 100644
index f78ceb9..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/SubtractingPropertySource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.properties;
-
-import org.apache.tamaya.PropertySource;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-class SubtractingPropertySource extends AbstractPropertySource {
-
-    private static final long serialVersionUID = 4301042530074932562L;
-    private PropertySource unit;
-    private List<PropertySource> subtrahends;
-
-    public SubtractingPropertySource(String name, PropertySource configuration, List<PropertySource> subtrahends){
-        super(name);
-        Objects.requireNonNull(configuration);
-        this.unit = configuration;
-        this.subtrahends = new ArrayList<>(subtrahends);
-    }
-
-    private boolean filter(Map.Entry<String,String> entry){
-        for(PropertySource prov: subtrahends){
-            if(prov.get(entry.getKey()).isPresent()){
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public Map<String,String> getProperties(){
-        return this.unit.getProperties().entrySet().stream().filter(this::filter).collect(Collectors.toMap(
-                Map.Entry::getKey,
-                Map.Entry::getValue
-        ));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/SystemPropertiesPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/SystemPropertiesPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/SystemPropertiesPropertySource.java
index f66c4f8..1964b16 100644
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/SystemPropertiesPropertySource.java
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/SystemPropertiesPropertySource.java
@@ -21,36 +21,35 @@ package org.apache.tamaya.core.properties;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Properties;
 
-class SystemPropertiesPropertySource extends AbstractPropertySource {
+public class SystemPropertiesPropertySource implements PropertySource {
 
 
     private static final long serialVersionUID = -5935940312707001199L;
 
+    private int ordinal;
+
+    private String name;
+
     /**
      * Constructor.
      */
-    protected SystemPropertiesPropertySource() {
-        super("<System.getProperties()>");
+    public SystemPropertiesPropertySource(int ordinal, String name) {
+        this.ordinal = ordinal;
+        this.name = Objects.requireNonNull(name);
+
     }
 
     @Override
     public Map<String,String> getProperties(){
-        Properties sysProps = System.getProperties();
-//        if(sysProps instanceof ConfiguredSystemProperties){
-//            sysProps = ((ConfiguredSystemProperties)sysProps).getInitialProperties();
-//        }
-        Map<String,String> props = new HashMap<>();
-        for (Map.Entry<Object,Object> en : sysProps.entrySet()) {
-            props.put(en.getKey().toString(), en.getValue().toString());
-        }
-        return Collections.unmodifiableMap(props);
+        return Collections.unmodifiableMap(System.getProperties());
     }
 
     @Override
     public String toString(){
-        return "SystemPropertiesPropertyProvider[" + System.getProperties().size() + " system properties]";
+        return "PropertySource[System Properties]";
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
deleted file mode 100644
index f690ef9..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.properties;
-
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.core.internal.resources.io.UrlResource;
-import org.apache.tamaya.core.resource.Resource;
-
-import java.net.URL;
-import java.util.*;
-
-/**
- * Created by Anatole on 16.10.2014.
- */
-final class URLBasedPropertySource extends AbstractPropertySource {
-
-	private static final long serialVersionUID = 648272283683183532L;
-	private List<URL> resources = new ArrayList<>();
-    private Map<String,String> properties = new HashMap<>();
-    private AggregationPolicy aggregationPolicy;
-
-    public URLBasedPropertySource(String name, List<URL> resources, AggregationPolicy aggregationPolicy) {
-        super(name);
-        this.resources.addAll(Objects.requireNonNull(resources));
-        this.aggregationPolicy = Objects.requireNonNull(aggregationPolicy);
-        init();
-    }
-
-    private void init(){
-        List<String> sources = new ArrayList<>();
-        for(URL url : resources){
-            Resource res = new UrlResource(url);
-            ConfigurationFormat format = ConfigurationFormat.from(res);
-            if(format != null){
-                try{
-                    Map<String, String> read = format.readConfiguration(res);
-                    sources.add(res.toString());
-                    read.forEach((k, v) -> {
-                        String newValue = aggregationPolicy.aggregate(k, properties.get(k), v);
-                        if(newValue==null) {
-                            properties.remove(k);
-                        }
-                        else {
-                            properties.put(k, newValue);
-                        }
-                    });
-                }
-                catch(ConfigException e){
-                    throw e;
-                }
-                catch(Exception e){
-                    e.printStackTrace();
-                }
-            }
-        }
-//        MetaInfoBuilder metaInfoBuilder = MetaInfoBuilder.of(getMetaInfo());
-//        metaInfo = metaInfoBuilder
-//                .setSources(sources.toString()).build();
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        return properties;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/ValueFilteredPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/ValueFilteredPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/ValueFilteredPropertySource.java
deleted file mode 100644
index db17d21..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/properties/ValueFilteredPropertySource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.apache.tamaya.core.properties;
-
-import org.apache.tamaya.PropertySource;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.BiFunction;
-
-/**
- * Property source which filters any key/values dynamically.
- */
-class ValueFilteredPropertySource implements PropertySource{
-
-    private String name;
-    private BiFunction<String, String, String> valueFilter;
-    private PropertySource source;
-
-    public ValueFilteredPropertySource(String name, BiFunction<String, String, String> valueFilter, PropertySource current) {
-        this.name = Optional.ofNullable(name).orElse("<valueFiltered> -> name="+current.getName()+", valueFilter="+valueFilter.toString());
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public Optional<String> get(String key) {
-        String value = this.source.get(key).orElse(null);
-        value = valueFilter.apply(key, value);
-        return Optional.ofNullable(value);
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        Map<String, String> map = new HashMap<>(source.getProperties());
-        map.replaceAll(valueFilter);
-        return map;
-    }
-
-    @Override
-    public String toString() {
-        return "ValueFilteredPropertySource{" +
-                "source=" + source.getName() +
-                ", name='" + name + '\'' +
-                ", valueFilter=" + valueFilter +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourceFactory.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourceFactory.java
new file mode 100644
index 0000000..b7d985c
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourceFactory.java
@@ -0,0 +1,279 @@
+/*
+ * 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.core.properties;
+
+import java.net.URL;
+import java.time.Instant;
+import java.util.*;
+import java.util.function.BiFunction;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+import org.apache.tamaya.PropertySource;
+
+/**
+ * Default implementation current the singleton backing bean for the {@link org.apache.tamaya.core.properties.PropertySourceBuilder}.
+ */
+public final class PropertySourceFactory {
+
+    private static final PropertySource ENV_PROPERTYSOURCE = new EnvironmentPropertySource();
+
+
+    /**
+     * Singleton constructor.
+     */
+    private PropertySourceFactory(){}
+
+    public static PropertySource fromArgs(int ordinal, String name, String... args) {
+        if(name==null){
+            name ="<CLI> " + Arrays.toString(args);
+        }
+        //X TODO read the CLI with some better library, e.g. move parsing service to ext. service SPI
+        Map<String, String> properties = new HashMap<>();
+        for (int base = 0; base < args.length; base++) {
+            if (args[base].startsWith("--")) {
+                String argKey = args[base].substring(2);
+                String value = "true"; // flag only
+                if (base != args.length - 1) {
+                    if (args[base + 1].startsWith("-")) {
+                        base++;
+                        int eqIndex = argKey.indexOf('=');
+                        if (eqIndex > 0) {
+                            value = argKey.substring(eqIndex + 1);
+                            argKey = argKey.substring(0, eqIndex);
+                        }
+                    } else {
+                        value = args[base + 1];
+                        base += 2;
+                    }
+                }
+                properties.put(argKey, value);
+            } else if (args[base].startsWith("-")) {
+                String argKey = args[base].substring(1);
+                String value = "true"; // flag only
+                if (base != args.length - 1) {
+                    if (args[base + 1].startsWith("-")) {
+                        base++;
+                        int eqIndex = argKey.indexOf('=');
+                        if (eqIndex > 0) {
+                            value = argKey.substring(eqIndex + 1);
+                            argKey = argKey.substring(0, eqIndex);
+                        }
+                    } else {
+                        value = args[base + 1];
+                        base += 2;
+                    }
+                }
+                properties.put(argKey, value);
+            }
+        }
+        return fromMap(ordinal, name, properties);
+    }
+
+    public static Collection<PropertySource> fromPaths(int ordinal, String name, List<String> paths) {
+        if(name==null){
+            name ="<Paths> " + paths.toString();
+        }
+        return new PathBasedPropertySource(ordinal, name, paths);
+    }
+
+    public static Collection<PropertySource> fromURLs(int ordinal, String name, List<URL> urls) {
+        if(name==null){
+            name ="<URLs> " + urls.toString();
+        }
+        return new URLBasedPropertySource(ordinal, name, urls);
+    }
+
+    public static PropertySource fromMap(int ordinal, String name, Map<String, String> map) {
+        if(name==null){
+            name ="<Map> " + map.toString();
+        }
+        return new MapBasedPropertySource(name, map);
+    }
+
+    /**
+     * Returns a read-only {@link org.apache.tamaya.PropertySource} reflecting the current runtime environment properties.
+     *
+     * @return a new read-only {@link org.apache.tamaya.PropertySource} instance based on the current runtime environment properties.
+     */
+    public static PropertySource fromEnvironmentProperties() {
+        return ENV_PROPERTYSOURCE;
+    }
+
+    /**
+     * Creates a new read-only {@link org.apache.tamaya.PropertySource} reflecting the current system properties.
+     *
+     * @return a new read-only {@link org.apache.tamaya.PropertySource} instance based on the current system properties.
+     */
+    public static PropertySource fromSystemProperties() {
+        return new SystemPropertiesPropertySource();
+    }
+
+    public static PropertySource freezed(String name, PropertySource source) {
+        if(name==null){
+            name ="<Freezed> source=" + source.toString()+", at="+Instant.now().toString();
+        }
+        return FreezedPropertySource.of(name, source);
+    }
+
+    /**
+     * Creates a new {@link org.apache.tamaya.PropertySource} containing all property maps given, hereby using the given AggregationPolicy.
+     *
+     * @param policy       the AggregationPolicy to be used, not null.
+     * @param providers the maps to be included, not null.
+     * @return the aggregated instance containing all given maps.
+     */
+    public static PropertySource aggregate(String name, AggregationPolicy policy, List<PropertySource> providers) {
+        if(name==null){
+            name ="<Aggregate> policy=" + policy.toString()+", providers="+providers.toString();
+        }
+        return new AggregatedPropertySource(name, null, policy, providers);
+    }
+
+    /**
+     * Creates a new {@link org.apache.tamaya.PropertySource} that is mutable by adding a map based instance that overrides
+     * values fromMap the original map.
+     * @param provider the provider to be made mutable, not null.
+     * @return the mutable instance.
+     */
+    public static PropertySource mutable(String name, PropertySource provider) {
+        if(name==null){
+            name ="<Mutable> provider="+provider.getName();
+        }
+        PropertySource mutableProvider = fromMap(name,new HashMap<>());
+        List<PropertySource> providers = new ArrayList<>(2);
+        providers.add(provider);
+        providers.add(mutableProvider);
+        return new AggregatedPropertySource(name, mutableProvider, AggregationPolicy.OVERRIDE, providers);
+    }
+
+    /**
+     * Creates a new {@link org.apache.tamaya.PropertySource} containing only properties that are shared by all given maps,
+     * hereby later maps in the array override  properties fromMap previous instances.
+     * @param aggregationPolicy the policy to resolve aggregation conflicts.
+     * @param providers the maps to be included, not null.
+     * @return the intersecting instance containing all given maps.
+     */
+    public static PropertySource intersected(String name, AggregationPolicy aggregationPolicy, List<PropertySource> providers) {
+        return new IntersectingPropertySource(name, aggregationPolicy, providers);
+    }
+
+    /**
+     * Creates a new {@link org.apache.tamaya.PropertySource} containing only properties fromMap the target instance, that are not contained
+     * in one current the other maps passed.
+     *
+     * @param target         the base map, not null.
+     * @param subtrahendSets the maps to be subtracted, not null.
+     * @return the intersecting instance containing all given maps.
+     */
+    public static PropertySource subtracted(String name, PropertySource target, List<PropertySource> subtrahendSets) {
+        return new SubtractingPropertySource(name, target,subtrahendSets);
+    }
+
+
+    /**
+     * Creates a filtered {@link org.apache.tamaya.PropertySource} (a view) current a given base {@link }PropertyMap}. The filter hereby is
+     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
+     *
+     * @param name the base map instance, not null.
+     * @param filter      the filtger to be applied, not null.
+     * @return the new filtering instance.
+     */
+    public static PropertySource filtered(String name, Predicate<String> filter, PropertySource source) {
+        if(name==null){
+            name ="<Filtered> filter="+filter+", source="+source.getName();
+        }
+        return new FilteredPropertySource(name, source, filter);
+    }
+
+    /**
+     * Creates a new contextual {@link org.apache.tamaya.PropertySource}. Contextual maps delegate to different instances current PropertyMap depending
+     * on the keys returned fromMap the isolationP
+     *
+     * @param name the base name instance, not null.
+     * @param mapSupplier          the supplier creating new provider instances
+     * @param isolationKeySupplier the supplier providing contextual keys based on the current environment.
+     */
+    public static PropertySource contextual(String name, Supplier<PropertySource> mapSupplier,
+                                              Supplier<String> isolationKeySupplier) {
+        if(name==null){
+            name ="<Contextual> mapSupplier="+mapSupplier+", isolationKeyProvider="+isolationKeySupplier;
+        }
+        return new ContextualPropertySource(name, mapSupplier, isolationKeySupplier);
+    }
+
+
+    /**
+     * Creates a filtered {@link org.apache.tamaya.PropertySource} (a view) current a given base {@link }PropertyMap}. The filter hereby is
+     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
+     *
+     * @param name the base name instance, not null.
+     * @param source   the main map instance, not null.
+     * @param parentMap the delegated parent map instance, not null.
+     * @return the new delegating instance.
+     */
+    public static PropertySource delegating(String name, PropertySource source, Map<String, String> parentMap) {
+        if(name==null){
+            name ="<Delegating> source="+source+", delegates="+parentMap;
+        }
+        return new DelegatingPropertySource(name, source, parentMap);
+    }
+
+    /**
+     * Creates a {@link org.apache.tamaya.PropertySource} where all keys current a current map,
+     * existing in another map are replaced
+     * with the ones fromMap the other {@link org.apache.tamaya.PropertySource}. The filter hereby is
+     * applied dynamically on access, so also runtime changes current the base map are reflected appropriately.
+     * Keys not existing in the {@code mainMap}, but present in {@code replacementMao} will be hidden.
+     *
+     * @param name the base name instance, not null.
+     * @param source the main source instance, which keys, present in {@code replacementMap} will be replaced
+     *                       with the ones
+     *                       in {@code replacementMap}, not null.
+     * @param replacementMap the map instance, that will replace all corresponding entries in {@code mainMap}, not null.
+     * @return the new delegating instance.
+     */
+    public static PropertySource replacing(String name, PropertySource source, Map<String, String> replacementMap) {
+        if(name==null){
+            name ="<Replacement> source="+source+", replacements="+replacementMap;
+        }
+        return new ReplacingPropertySource(name, source, replacementMap);
+    }
+
+    /**
+     * Creates a new {@link org.apache.tamaya.PropertySource} given an existing one, and an alternate
+     * meta-info.
+     * @param name the new meta-information, not null.
+     * @param baseProvider the property source, not null.
+     * @return the new property source.never null.
+     */
+    public static PropertySource build(String name, PropertySource baseProvider) {
+        return new BuildablePropertySource(name, baseProvider);
+    }
+
+    /**
+     * Creates a new filtered {@link org.apache.tamaya.PropertySource} using the given filter.
+     * @param name the base name instance, not null.
+     * @param valueFilter the value filter function, null result will remove the given entries.
+     * @param current the source to be filtered
+     */
+    public static PropertySource filterValues(String name, BiFunction<String, String, String> valueFilter, PropertySource current) {
+        return new ValueFilteredPropertySource(name, valueFilter, current);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourcesBuilder.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourcesBuilder.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourcesBuilder.java
new file mode 100644
index 0000000..712e3f6
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/PropertySourcesBuilder.java
@@ -0,0 +1,367 @@
+/*
+* 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.core.properties.factories;
+
+import java.lang.IllegalArgumentException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.tamaya.core.properties.AggregationPolicy;
+import org.apache.tamaya.core.properties.PropertySourceFactory;
+import org.apache.tamaya.spi.PropertySource;
+
+/**
+ * Builder for assembling non trivial property providers.
+ */
+public final class PropertySourcesBuilder {
+
+    /**
+     * Name used for the final result.
+     */
+    private Map<String, PropertySource> propertySources = new HashMap<>();
+
+    /**
+     * The current aggregation policy used, when aggregating providers.
+     */
+    private AggregationPolicy aggregationPolicy = AggregationPolicy.OVERRIDE;
+
+    /**
+     * The current ordinal used for creating property source instances.
+     */
+    private int currentOrdinal;
+    /** The increment added to {@code currentOrdinal}, when new property sources are added and no
+     * explcit ordinal is used. */
+    private int ordinalIncrement;
+
+    /** The name to be used for the next PropertySource constructed, or null, for creating a defau,t name. */
+    private String currentName;
+
+    /**
+     * Private singleton constructor.
+     */
+    private PropertySourcesBuilder(int ordinal, int ordinalIncrement) {
+        this.ordinalIncrement = ordinalIncrement;
+        this.currentOrdinal = ordinal;
+    }
+
+    /**
+     * Creates a new builder instance.
+     *
+     * @param ordinal The initial starting ordinal to be used when new property sources are created and added.
+     * @param ordinalIncrement the ordinal increment to be added when no new property sources are created and added.
+     * @return a new builder instance, never null.
+     */
+    public static PropertySourcesBuilder of(int ordinal, int ordinalIncrement) {
+        return new PropertySourcesBuilder(ordinal, ordinalIncrement);
+    }
+
+    /**
+     * Creates a new builder instance.
+     *
+     * @param ordinal The initial starting ordinal to be used when new property sources are created and added.
+     *                The default ordinal increment used is 10.
+     * @return a new builder instance, never null.
+     */
+    public static PropertySourcesBuilder of(int ordinal) {
+        return new PropertySourceBuilder(ordinal, 10);
+    }
+
+
+    /**
+     * Creates a new builder instance, starting with ordinal of 1 and an ordinal increment of 10.
+     *
+     * @param name the provider name, not null.
+     * @return a new builder instance, never null.
+     */
+    public static PropertySourcesBuilder of() {
+        return new PropertySourceBuilder(1, 10);
+    }
+
+    /**
+     * Sets the current ordinal used, when additional property sets are added. The ordinal will normally implicitly
+     * incresed for each property set by {@code ordinalIncrement}. If the ordinal is passed explcitly to a method
+     * all created sources will have the same ordinal.
+     *
+     * @param ordinal the ordinal to be used.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder withOrdinal(int ordinal) {
+        this.currentOrdinal = ordinal;
+        return this;
+    }
+
+    /**
+     * Sets the current name used, when the next property sets is added. If set to null a default name will be
+     * constructed.
+     *
+     * @param name the name to be used for the next property set created, or null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder withName(String name) {
+        this.currentName = name;
+        return this;
+    }
+
+    /**
+     * Aggregates the given {@code sources} (at least 2) into a new
+     * {@link PropertySource} and adds it with the given current ordinal and name.
+     *
+     * @param aggregationPolicy the aggregation policy, not null.
+     * @param sources the property sources to be aggregated.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addAggregation(AggregationPolicy aggregationPolicy, PropertySource... sources) {
+        this.aggregationPolicy = Objects.requireNonNull(aggregationPolicy);
+        String name = this.currentName;
+        if(name==null){
+            name = "Aggregate["+ Arrays.stream(sources).map(s -> s.getName()).collect(
+                    () -> "",
+                    (s,o) -> s + ',' + o,
+                    (s1, s2) -> s1 + ',' + s2) +"]"
+        }
+        ProperttySource source = new new AggregatedPropertySource(currentOrdinal, name, aggregationPolicy, sources);
+        this.propertySources.put(source.getName(), source);
+        this.currentOrdinal +=  ordinalIncrement;
+        return this;
+    }
+
+    /**
+     * Adds the given providers with the current active {@link AggregationPolicy}. By
+     * default {@link AggregationPolicy#OVERRIDE} is used.
+     *
+     * @param propertySources the property sources to be added, not null.
+     * @return the builder for chaining.
+     * @see #withAggregationPolicy(AggregationPolicy)
+     */
+    public PropertySourcesBuilder addPropertySources(PropertySource... propertySources) {
+        if (propertySources.length == 0) {
+            return this;
+        }
+        return addPropertySources(Arrays.asList(propertySources));
+    }
+
+    /**
+     * Adds the given providers with the current active {@link AggregationPolicy}. By
+     * default {@link AggregationPolicy#OVERRIDE} is used.
+     *
+     * @param providers providers to be added, not null.
+     * @return the builder for chaining.
+     * @see #withAggregationPolicy(AggregationPolicy)
+     */
+    public PropertySourcesBuilder addPropertySources(List<PropertySource> providers) {
+        if (providers.isEmpty()) {
+            return this;
+        }
+        for (PropertySource src : providers) {
+            PropertySource current = this.propertySources.get(src.getName());
+            if (src != null) {
+                throw new IllegalArgumentException("PropertySource with that name is already existing: " + src.getName())
+            }
+        }
+        for (PropertySource src : providers) {
+            this.propertySources.put(sec.getName(), src);
+        }
+        return this;
+    }
+
+    /**
+     * Creates a new {@link PropertySource} using the given command line arguments and adds it
+     * using the current aggregation policy in place.
+     *
+     * @param args the command line arguments, not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addArgs(String... args) {
+        if (args.length == 0) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "CLI-Args";
+        }
+        PropertySource argProvider = PropertySourceFactory.fromArgs(currentOrdinal, name, args);
+        currentOrdinal+=ordinalIncrement;
+        return addPropertySources(argProvider);
+    }
+
+    /**
+     * Creates a new read-only {@link PropertySource} by reading the according path resources. The effective resources read
+     * hereby are determined by the {@code PathResolverService} configured into the {@code Bootstrap} SPI.
+     * Properties read are aggregated using the current aggregation policy active.
+     *
+     * @param paths the paths to be resolved by the {@code PathResolverService} , not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addPaths(String... paths) {
+        if (paths.length == 0) {
+            return this;
+        }
+        return addPaths(Arrays.asList(paths));
+    }
+
+
+    /**
+     * Creates a new read-only {@link PropertySource} by reading the according path resources. The effective resources read
+     * hereby are determined by the {@code PathResolverService} configured into the {@code Bootstrap} SPI.
+     * Properties read are aggregated using the current aggregation policy active.
+     *
+     * @param paths the paths to be resolved by the {@code PathResolverService} , not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addPaths(List<String> paths) {
+        if (paths.isEmpty()) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "paths=" + paths.toString();
+        }
+        addPropertySources(PropertySourceFactory.fromPaths(currentOrdinal, name, paths));
+    }
+
+    /**
+     * Creates a new read-only {@link PropertySource} by reading the according URL resources.
+     * Properties read are aggregated using the current aggregation policy active.
+     *
+     * @param urls the urls to be read, not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addURLs(URL... urls) {
+        if (urls.length == 0) {
+            return this;
+        }
+        return addURLs(Arrays.asList(urls));
+    }
+
+    /**
+     * Creates a new read-only {@link PropertySource} by reading the according URL resources.
+     * Properties read are aggregated using the current aggregation policy active.
+     *
+     * @param urls the urls to be read, not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addURLs(List<URL> urls) {
+        if (urls.isEmpty()) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "URL: =" + urls;
+        }
+        return addPropertySources(PropertySourceFactory.fromURLs(name, this.aggregationPolicy, urls));
+    }
+
+
+    /**
+     * Creates a new read-only {@link PropertySource} based on the given map.
+     * Properties read are aggregated using the current aggregation policy active.
+     *
+     * @param map the map to be added, not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addMap(Map<String, String> map) {
+        if (map.isEmpty()) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "Map;
+        }
+        return addPropertySources(PropertySourceFactory.fromMap(currentOrdinal, name, map));
+    }
+
+
+    /**
+     * Add the current environment properties. Aggregation is based on the current {@link AggregationPolicy} acvtive.
+     *
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addEnvironmentProperties() {
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "Environment-Properties";
+        }
+        return addPropertySources(PropertySourceFactory.fromEnvironmentProperties());
+    }
+
+    /**
+     * Add the current system properties. Aggregation is based on the current {@link AggregationPolicy} acvtive.
+     *
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder addSystemProperties() {
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "System-Properties";
+        }
+        return addPropertySources(PropertySourceFactory.fromSystemProperties());
+    }
+
+
+//
+//    /**
+//     * Filters the current {@link org.apache.tamaya.PropertySource} with the given valueFilter.
+//     *
+//     * @param valueFilter the value filter, not null.
+//     * @return the (dynamically) filtered source instance, never null.
+//     */
+//    public PropertySourceBuilder filterValues(BiFunction<String, String, String> valueFilter) {
+//        String name = this.currentName;
+//        if (currentName == null) {
+//            name = "<filteredValues> -> " + valueFilter;
+//        }
+//        this.current = PropertySourceFactory.filterValues(name, valueFilter, this.current);
+//        return this;
+//    }
+
+
+    /**
+     * Subtracts with the given {@link org.apache.tamaya.PropertySource} instance from the current properties.
+     *
+     * @param providers the maps to be subtracted, not null.
+     * @return the builder for chaining.
+     */
+    public PropertySourcesBuilder subtract(PropertySource... providers) {
+        if (providers.length == 0) {
+            return this;
+        }
+        String name = this.currentName;
+        if (currentName == null) {
+            name = "<subtraction> -> " + Arrays.toString(providers);
+        }
+        current = PropertySourceFactory.subtracted(name, current, Arrays.asList(providers));
+        return this;
+    }
+
+
+    /**
+     * Build a new property provider based on the input.
+     *
+     * @return a new property provider, or null.
+     */
+    public Collection<PropertySource> build() {
+        return this.propertySources.values();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/ResourcePropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/ResourcePropertySourceProvider.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/ResourcePropertySourceProvider.java
new file mode 100644
index 0000000..6dae705
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/factories/ResourcePropertySourceProvider.java
@@ -0,0 +1,70 @@
+/*
+ * 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.core.properties;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.Override;
+import java.lang.String;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ResourcePropertySourceProvider implements PropertySourceProvider {
+
+	private static final Logger LOG = Logger.getLogger(ResourcePropertySourceProvider.class.getName());
+
+    private int baseOrdinal;
+
+	private Collection<PropertySource> propertySources;
+
+    private Resource resource;
+
+	public ResourcePropertySourceProvider(int baseOrdinal, String baseName, Resource resource) {
+        this.resource = Objects.requireNonNull(resource);
+        this.baseOrdinal = baseOrdinal;
+        List<ConfigFormat> formats = ConfigFormat.getFormats(resource);
+        for(ConfigFormat format: formats){
+            try{
+                propertySources = format.readConfiguration(baseOrdinal, baseName, resource);
+            }
+            catch(Exception e){
+                LOG.info(() -> "Format was not matching: " + format.getFormatName() + " for resource: " + resource.getName());
+            }
+        }
+	}
+
+	public Resource getResource(){
+        return this.resource;
+    }
+
+
+    @Override
+    public String toString() {
+        return "ResourcePropertySourceProvider{" +
+                "resource=" + resource +
+                ", propertySources=" + propertySources +
+                '}';
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/AggregatedPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/AggregatedPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/AggregatedPropertySource.java
new file mode 100644
index 0000000..e62a9a6
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/AggregatedPropertySource.java
@@ -0,0 +1,97 @@
+/*
+ * 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.core.properties.filtered;
+
+import org.apache.tamaya.core.properties.AggregationPolicy;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.util.*;
+
+/**
+ * Implementation for a {@link org.apache.tamaya.spi.PropertySource} that is an aggregate current
+ * multiple child instances.
+ */
+public class AggregatedPropertySource implements PropertySource {
+
+    private PropertySource baseSource;
+    private PropertySource aggregatedSource;
+    private String name;
+    private int ordinal;
+    private AggregationPolicy aggregationPolicy;
+
+    /**
+     * Creates a mew instance, with aggregation polilcy
+     * {@code AggregationPolicy.OVERRIDE}.
+     *
+     * @param ordinal           the ordinal
+     * @param name              The name to be used, not null.
+     * @param aggregationPolicy the {@link org.apache.tamaya.core.properties.AggregationPolicy} to be applied
+     * @param baseSource        the base property source, not null
+     * @param aggregatedSource  the aggregatesd property source, not null
+     */
+    public AggregatedPropertySource(int ordinal, String name, AggregationPolicy aggregationPolicy,
+                                    PropertySource baseSource, PropertySource aggregatedSource) {
+        this.aggregationPolicy = Objects.requireNonNull(aggregationPolicy);
+        this.name = Objects.requireNonNull(name);
+        this.ordinal = ordinal;
+        this.baseSource = Objects.requireNonNull(baseSource);
+        this.aggregatedSource = Objects.requireNonNull(aggregatedSource);
+    }
+
+    @Override
+    public int getOrdinal() {
+        return this.ordinal;
+    }
+
+    @Override
+    public String getName() {
+        return this.name;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> result = new HashMap<>();
+        Set<String> keySet = new HashSet<>(this.baseSource.getProperties().keySet());
+        keySet.addAll(this.aggregatedSource.getProperties().keySet());
+        for (String key : keySet) {
+            String value = this.aggregationPolicy.aggregate(
+                    key,
+                    baseSource.get(key).orElse(null),
+                    aggregatedSource.get(key).orElse(null));
+            if (value != null) {
+                result.put(key, value);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public Optional<String> get(String key) {
+        String value1 = this.baseSource.get(key).orElse(null);
+        String value2 = this.aggregatedSource.get(key).orElse(null);
+        return Optional.ofNullable(aggregationPolicy.aggregate(key, value1, value2));
+    }
+
+    @Override
+    public String toString() {
+        return "Aggregate(baseSource=" + baseSource +
+                ", aggregatedSource=" + aggregatedSource.getName() +
+                ", aggregationPolicy=" + aggregationPolicy + ")";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/FilteredPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/FilteredPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/FilteredPropertySource.java
new file mode 100644
index 0000000..ecf2950
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/FilteredPropertySource.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.core.properties;
+
+import org.apache.tamaya.PropertySource;
+
+import java.lang.Override;
+import java.lang.String;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+class FilteredPropertySource implements PropertySource {
+
+    private PropertySource baseSource;
+    private Predicate<String> filter;
+
+    public FilteredPropertySource(PropertySource baseSource, Predicate<String> filter){
+        this.baseSource = Objects.requireNonNull(baseSource);
+        this.filter = Objects.requireNonNull(filter);
+    }
+
+    @Override
+    public int ordinal(){
+        return baseSource.ordinal();
+    }
+
+    @Override
+    public String getName(){
+        return baseSource + "(filtered)";
+    }
+
+    @Override
+    public Map<String,String> getProperties(){
+        final Map<String,String> result = new HashMap<>();
+        this.unit.getProperties().entrySet().forEach(e -> {
+            if(filter.test(e.getKey())){
+                result.put(e.getKey(), e.getValue());
+            }
+        });
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "FilteredPropertySource{" +
+                "baseSource=" + baseSource +
+                ", filter=" + filter +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/IntersectingPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/IntersectingPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/IntersectingPropertySource.java
new file mode 100644
index 0000000..e441985
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/IntersectingPropertySource.java
@@ -0,0 +1,55 @@
+/*
+ * 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.core.properties.filtered;
+
+import org.apache.tamaya.*;
+import org.apache.tamaya.core.properties.filtered.AggregatedPropertySource;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Provider implementation that combines multiple other config by intersecting
+ * the key/values common to one source.
+ */
+class IntersectingPropertySource extends AggregatedPropertySource {
+
+
+    /**
+     * Creates a mew instance, with aggregation polilcy
+     * {@code AggregationPolicy.OVERRIDE}.
+     *
+     * @param ordinal           the ordinal
+     * @param name              The name to be used, not null.
+     * @param baseSource        the base property source, not null
+     * @param aggregatedSource  the aggregatesd property source, not null
+     */
+    public IntersectingPropertySource(int ordinal, String name,
+                                    PropertySource baseSource, PropertySource aggregatedSource) {
+        super(ordinal, name, (k,v1,v2) -> {
+            if(v1!=null && v2!=null && v1.equals(v2)){
+                return v1;
+            }
+            return null;
+        }, baseSource, aggregatedSource);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/MappedPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/MappedPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/MappedPropertySource.java
new file mode 100644
index 0000000..0db716d
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/MappedPropertySource.java
@@ -0,0 +1,67 @@
+package org.apache.tamaya.core.properties.filtered;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.UnaryOperator;
+
+import org.apache.tamaya.PropertySource;
+import org.apache.tamaya.spi.PropertySource;
+
+/**
+ * PropertySource implementation that maps certain parts (defined by an {@code UnaryOperator<String>}) to alternate areas.
+ */
+class MappedPropertySource implements PropertySource {
+
+	private static final long serialVersionUID = 8690637705511432083L;
+
+	/** The mapping operator. */
+    private UnaryOperator<String> keyMapper;
+    /** The base configuration. */
+    private PropertySource propertySource;
+
+    /**
+     * Creates a new instance.
+     * @param config the base configuration, not null
+     * @param keyMapper The mapping operator, not null
+     */
+    public MappedPropertySource(PropertySource config, UnaryOperator<String> keyMapper) {
+        this.propertySource = Objects.requireNonNull(config);
+        this.keyMapper = Objects.requireNonNull(keyMapper);
+    }
+
+    @Override
+    public int getOrdinal(){
+        return this.propertySource.getOrdinal();
+    }
+
+    @Override
+    public String getName(){
+        return this.propertySource.getName()+"[mapped]";
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> result = new HashMap<>();
+        Map<String, String> map = this.propertySource.getProperties();
+        map.forEach((k,v) -> {
+            String targetKey = keyMapper.apply(k);
+            if(targetKey!=null){
+                result.put(targetKey, v);
+            }
+        });
+        return result;
+    }
+
+    @Override
+    public Optional<String> get(String key){
+        return Optional.of(getProperties().get(key));
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return this.propertySource.isEmpty();
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/ValueFilteredPropertySource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/ValueFilteredPropertySource.java b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/ValueFilteredPropertySource.java
new file mode 100644
index 0000000..8eb0f60
--- /dev/null
+++ b/dormant/core/src/main/java/org/apache/tamaya/core/properties/filtered/ValueFilteredPropertySource.java
@@ -0,0 +1,55 @@
+package org.apache.tamaya.core.properties.filtered;
+
+import org.apache.tamaya.spi.PropertySource;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+
+/**
+ * Property source which filters any key/values dynamically.
+ */
+class ValueFilteredPropertySource implements PropertySource{
+
+    private String name;
+    private BiFunction<String, String, String> valueFilter;
+    private PropertySource source;
+
+    public ValueFilteredPropertySource(String name, BiFunction<String, String, String> valueFilter, PropertySource current) {
+        this.name = Optional.ofNullable(name).orElse("<valueFiltered> -> name="+current.getName()+", valueFilter="+valueFilter.toString());
+    }
+
+    @Override
+    public int getOrdinal() {
+        return source.getOrdinal();
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public Optional<String> get(String key) {
+        String value = this.source.get(key).orElse(null);
+        value = valueFilter.apply(key, value);
+        return Optional.ofNullable(value);
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        Map<String, String> map = new HashMap<>(source.getProperties());
+        map.replaceAll(valueFilter);
+        return map;
+    }
+
+    @Override
+    public String toString() {
+        return "ValueFilteredPropertySource{" +
+                "source=" + source.getName() +
+                ", name='" + name + '\'' +
+                ", valueFilter=" + valueFilter +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/resource/InputStreamSource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/resource/InputStreamSource.java b/dormant/core/src/main/java/org/apache/tamaya/core/resource/InputStreamSource.java
deleted file mode 100644
index 102337d..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/resource/InputStreamSource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-* Copyright 2002-2012 the original author or authors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.apache.tamaya.core.resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
-* Simple interface for objects that are sources for an {@link InputStream}.
-*
-* <p>This is the base interface for Spring's more extensive {@link Resource} interface.
-*
-* <p>For single-use streams, {@link org.apache.tamaya.core.internal.resources.io.InputStreamResource} can be used for any
-* given {@code InputStream}. Spring's {@code ByteArrayResource} or any
-* file-based {@code Resource} implementation can be used as a concrete
-* instance, allowing one to read the underlying content stream multiple times.
-* This makes this interface useful as an abstract content source for mail
-* attachments, for example.
-*
-* @author Juergen Hoeller
-* @since 20.01.2004
-* @see java.io.InputStream
-* @see Resource
-* @see org.apache.tamaya.core.internal.resources.io.InputStreamResource
-*/
-@FunctionalInterface
-public interface InputStreamSource {
-
-	/**
-	 * Return an {@link InputStream}.
-	 * <p>It is expected that each call creates a <i>fresh</i> stream.
-	 * <p>This requirement is particularly important when you consider an API such
-	 * as JavaMail, which needs to be able to read the stream multiple times when
-	 * creating mail attachments. For such a use case, it is <i>required</i>
-	 * that each {@code getInputStreamSupplier()} call returns a fresh stream.
-	 * @return the input stream for the underlying resource (must not be {@code null})
-	 * @throws IOException if the stream could not be opened
-	 */
-	InputStream getInputStream() throws IOException;
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/resource/Resource.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/resource/Resource.java b/dormant/core/src/main/java/org/apache/tamaya/core/resource/Resource.java
deleted file mode 100644
index ca76974..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/resource/Resource.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2002-2012 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tamaya.core.resource;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URL;
-
-/**
- * Interface for a resource descriptor that abstracts from the actual
- * type current underlying resource, such as a file or class path resource.
- *
- * <p>An InputStream can be opened for every resource if it exists in
- * physical form, but a URL or File handle can just be returned for
- * certain resources. The actual behavior is implementation-specific.
- *
- * @author Juergen Hoeller
- * @since 28.12.2003
- * @see #getInputStream()
- * @see #getURL()
- * @see #getURI()
- * @see #getFile()
- */
-public interface Resource extends InputStreamSource {
-
-	/**
-	 * Return whether this resource actually exists in physical form.
-	 * <p>This method performs a definitive existence check, whereas the
-	 * existence current a {@code Resource} handle only guarantees a
-	 * valid descriptor handle.
-	 */
-	boolean exists();
-
-	/**
-	 * Return whether the contents current this resource can be read,
-	 * e.g. via {@link #getInputStream()} or {@link #getFile()}.
-	 * <p>Will be {@code true} for typical resource descriptors;
-	 * note that actual content reading may still fail when attempted.
-	 * However, a keys current {@code false} is a definitive indication
-	 * that the resource content cannot be read.
-	 * @see #getInputStream()
-	 */
-	boolean isReadable();
-
-	/**
-	 * Return whether this resource represents a handle with an open
-	 * stream. If true, the InputStream cannot be read multiple times,
-	 * and must be read and closed to avoid resource leaks.
-	 * <p>Will be {@code false} for typical resource descriptors.
-	 */
-	boolean isOpen();
-
-	/**
-	 * Return a URL handle for this resource.
-	 * @throws IOException if the resource cannot be resolved as URL,
-	 * i.e. if the resource is not available as descriptor
-	 */
-	URL getURL() throws IOException;
-
-	/**
-	 * Return a URI handle for this resource.
-	 * @throws IOException if the resource cannot be resolved as URI,
-	 * i.e. if the resource is not available as descriptor
-	 */
-	URI getURI() throws IOException;
-
-	/**
-	 * Return a File handle for this resource.
-	 * @throws IOException if the resource cannot be resolved as absolute
-	 * file path, i.e. if the resource is not available in a file system
-	 */
-	File getFile() throws IOException;
-
-	/**
-	 * Determine the content length for this resource.
-	 * @throws IOException if the resource cannot be resolved
-	 * (in the file system or as some other known physical resource type)
-	 */
-	long contentLength() throws IOException;
-
-	/**
-	 * Determine the last-modified timestamp for this resource.
-	 * @throws IOException if the resource cannot be resolved
-	 * (in the file system or as some other known physical resource type)
-	 */
-	long lastModified() throws IOException;
-
-	/**
-	 * Create a resource relative to this resource.
-	 * @param relativePath the relative path (relative to this resource)
-	 * @return the resource handle for the relative resource
-	 * @throws IOException if the relative resource cannot be determined
-	 */
-	Resource createRelative(String relativePath) throws IOException;
-
-	/**
-	 * Determine a filename for this resource, i.e. typically the last
-	 * part current the path: for example, "myfile.txt".
-	 * <p>Returns {@code null} if this type current resource does not
-	 * have a filename.
-	 */
-	String getFilename();
-
-    /**
-     * Get a description of the resource.
-     * @return the description.
-     */
-    String getDescription();
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/b56817f7/dormant/core/src/main/java/org/apache/tamaya/core/resource/ResourceLoader.java
----------------------------------------------------------------------
diff --git a/dormant/core/src/main/java/org/apache/tamaya/core/resource/ResourceLoader.java b/dormant/core/src/main/java/org/apache/tamaya/core/resource/ResourceLoader.java
deleted file mode 100644
index 1c55e55..0000000
--- a/dormant/core/src/main/java/org/apache/tamaya/core/resource/ResourceLoader.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.resource;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Interface to be implemented by containers that decouples loading current classpath resources fromMap the effective
- * classloader architecture current a runtime environment. Implementations current this class encapsulate the mechanism current
- * determining the
- * concrete resources available base on an expression defining the configuration
- * locations. A an example the expression {@code cfg/global/*.xml} defines a
- * location for reading global configuration in the classpath. A resources
- * interprets this expression and evaluates the concrete resources to be read,
- * e.g. {@code cfg/global/default.xml, cfg/global/myApp.xml}.
- * Created by Anatole on 16.06.2014.
- */
-public interface ResourceLoader{
-
-    /**
-     * Get the prefixes supportedby this loader.
-     *
-     * @return the supported prefixes, not empty.
-     */
-    Collection<String> getResolverIds();
-
-    /**
-     * Called, when a given expression has to be resolved.
-     *
-     * @param expressions the expressions to be resolved, not empty.
-     * @return the corresponding collection current {@link java.net.URI}s defining the
-     * concrete resources to be read by a {@link org.apache.tamaya.core.properties.ConfigurationFormat}
-     * .
-     */
-    List<Resource> getResources(String... expressions);
-
-    /**
-     * Called, when a given expression has to be resolved.
-     *
-     * @param expressions the expressions to be resolved, not empty.
-     * @return the corresponding collection current {@link java.net.URI}s defining the
-     * concrete resources to be read by a {@link org.apache.tamaya.core.properties.ConfigurationFormat}
-     * .
-     */
-    List<Resource> getResources(Collection<String> expressions);
-
-    /**
-     * Called, when a given expression has to be resolved.
-     *
-     * @param expressions the expressions to be resolved, not empty.
-     * @return the corresponding collection current {@link java.net.URI}s defining the
-     * concrete resources to be read by a {@link org.apache.tamaya.core.properties.ConfigurationFormat}
-     * .
-     */
-    List<Resource> getResources(ClassLoader classLoader, String... expressions);
-
-    /**
-     * Called, when a given expression has to be resolved.
-     *
-     * @param expressions the expressions to be resolved, not empty.
-     * @return the corresponding collection current {@link java.net.URI}s defining the
-     * concrete resources to be read by a {@link org.apache.tamaya.core.properties.ConfigurationFormat}
-     * .
-     */
-    List<Resource> getResources(ClassLoader classLoader, Collection<String> expressions);
-
-}