You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2016/12/12 16:13:07 UTC

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

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentFactory.java
new file mode 100644
index 0000000..906b704
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ComponentFactory.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.spi.ServiceContextManager;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Small helper class for loading of configured instances.
+ */
+public final class ComponentFactory<T> {
+
+    private Class<T> type;
+    private Map<String, T> serviceContext = new HashMap<>();
+    private Set<String> loaded = new HashSet<>();
+
+    /**
+     * Constructor.
+     * @param type the service type, not null.
+     */
+    public ComponentFactory(Class<T> type){
+        this.type = Objects.requireNonNull(type);
+        for(T service: ServiceContextManager.getServiceContext().getServices(type)){
+            serviceContext.put(service.getClass().getName(), service);
+        }
+    }
+
+    /**
+     * Creates an instance of the given type based on a type configuration.
+     * Type hereby is
+     * <ul>
+     *     <li>A fully qualified class name</li>
+     *     <li>A simple class name of a filter class registered with the current
+     *     ServiceContext.</li>
+     * </ul>
+     * @param identifier the configured type
+     * @return the component found, or null.
+     */
+    public T getComponent(String identifier)
+            throws IllegalAccessException, InstantiationException {
+        T comp = this.serviceContext.get(identifier);
+        if(comp==null){
+            for(Map.Entry<String, T> en:serviceContext.entrySet()){
+                if(en.getKey().endsWith("."+identifier)){
+                    comp = en.getValue();
+                }
+            }
+        }
+        // Multiple instances: create a new instance using the parameterless constructor for all subsequent
+        // resolutions.
+        if(loaded.contains(comp.getClass().getName())){
+            return (T)comp.getClass().newInstance();
+        }
+        // Ensure that the next access will return a new instance.
+        loaded.add(comp.getClass().getName());
+        return comp;
+    }
+
+    public Collection<T> loadInstances(NodeList nodeList) {
+        List<T> items = new ArrayList<>();
+        for(int i=0;i<nodeList.getLength();i++){
+            Node node = nodeList.item(i);
+            if(node.getNodeName().equals("filter")){
+                String type = node.getNodeValue();
+                try {
+                    T item = getComponent(type);
+                    ComponentConfigurator.configure(item, node);
+                    items.add(item);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return items;
+    }
+
+    @Override
+    public String toString() {
+        return "ComponentFactory{" +
+                "type=" + type +
+                ", serviceContext=" + serviceContext +
+                '}';
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ContextReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ContextReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ContextReader.java
new file mode 100644
index 0000000..5754e4f
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/ContextReader.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.metamodel.MetaContext;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.annotation.Priority;
+import java.util.logging.Logger;
+
+/**
+ * Meta-configuration reader that reads the shared context data.
+ */
+@Priority(-1)
+public class ContextReader implements MetaConfigurationReader {
+
+    private static final Logger LOG = Logger.getLogger(ContextReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("context");
+        String contextName = "DEFAULT";
+        LOG.finer("Reading " + nodeList.getLength() + " meta context entries...");
+        for(int i=0;i<nodeList.getLength();i++){
+            Node node = nodeList.item(i);
+            if(node.getNodeName().equals("context")){
+                Node nameNode = node.getAttributes().getNamedItem("name");
+                if(nameNode!=null){
+                    contextName = nameNode.getTextContent();
+                }
+                MetaContext context = MetaContext.getInstance(contextName);
+                NodeList entryNodes = node.getChildNodes();
+                for(int c=0;c<entryNodes.getLength();c++){
+                    Node entryNode = entryNodes.item(c);
+                    if("context-entry".equals(entryNode.getNodeName())){
+                        String key = entryNode.getAttributes().getNamedItem("name").getNodeValue();
+                        String value = entryNode.getTextContent();
+                        // TODO add support for placeholders here...
+                        LOG.finest("Applying context entry: " + key + '=' + value + " on " + contextName);
+                        context.setProperty(key, value);
+                    }
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DSLLoadingConfigurationProviderSpi.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DSLLoadingConfigurationProviderSpi.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DSLLoadingConfigurationProviderSpi.java
new file mode 100644
index 0000000..266ed5a
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DSLLoadingConfigurationProviderSpi.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.metamodel.MetaConfiguration;
+import org.apache.tamaya.spi.*;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.spisupport.DefaultConfiguration;
+import org.apache.tamaya.spisupport.DefaultConfigurationContextBuilder;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+
+import javax.annotation.Priority;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * ConfigurationContext that uses {@link MetaConfiguration} to configure the
+ * Tamaya configuration context.
+ */
+@Priority(10)
+public class DSLLoadingConfigurationProviderSpi implements ConfigurationProviderSpi{
+
+    private volatile Configuration config;
+    private final Object LOCK = new Object();
+
+    @Override
+    public ConfigurationContextBuilder getConfigurationContextBuilder() {
+        return ServiceContextManager.getServiceContext().getService(ConfigurationContextBuilder.class);
+    }
+
+    @Override
+    public void setConfiguration(Configuration config) {
+        this.config = Objects.requireNonNull(config);
+    }
+
+    @Override
+    public boolean isConfigurationSettable() {
+        return true;
+    }
+
+    @Override
+    public void setConfigurationContext(ConfigurationContext context){
+        this.config = Objects.requireNonNull(createConfiguration(context));
+    }
+
+    @Override
+    public boolean isConfigurationContextSettable() {
+        return true;
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+        checkInitialized();
+        return config;
+    }
+
+    @Override
+    public Configuration createConfiguration(ConfigurationContext context) {
+        return new DefaultConfiguration(context);
+    }
+
+    @Override
+    public ConfigurationContext getConfigurationContext() {
+        checkInitialized();
+        return config.getContext();
+    }
+
+    private void checkInitialized() {
+        if(config==null){
+            synchronized (LOCK) {
+                if(config==null){
+                    MetaConfiguration.configure();
+                }
+                if(config==null){
+                    // load defaults
+                    this.config = new DefaultConfiguration(
+                            new DefaultConfigurationContextBuilder()
+                                .addDefaultPropertyConverters()
+                                .addDefaultPropertyFilters()
+                                .addDefaultPropertySources()
+                                .sortPropertyFilter(
+                                        (Comparator<PropertyFilter>)
+                                                DefaultConfigurationContextBuilder.DEFAULT_PROPERTYFILTER_COMPARATOR)
+                                .sortPropertySources(DefaultConfigurationContextBuilder.DEFAULT_PROPERTYSOURCE_COMPARATOR)
+                                .build());
+                }
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
deleted file mode 100644
index f968a15..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/DefaultRefreshablePropertySourceProvider.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.tamaya.metamodel.internal;
-
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertySourceProvider;
-
-import java.util.Collection;
-import java.util.Objects;
-
-/**
- * Wrapped property source that allows dynamically reassigning the property source's
- * ordinal value. This is needed for reordering the property sources to
- * match the DSL configured ordering.
- */
-public final class DefaultRefreshablePropertySourceProvider implements PropertySourceProvider, Refreshable {
-
-    private SourceConfig sourceConfig;
-    private PropertySourceProvider wrapped;
-    private Collection<PropertySource> propertSources;
-
-    public DefaultRefreshablePropertySourceProvider(SourceConfig sourceConfig)
-            throws IllegalAccessException, InstantiationException,
-                    ClassNotFoundException {
-        this.sourceConfig = Objects.requireNonNull(sourceConfig);
-        this.wrapped = Objects.requireNonNull(sourceConfig.create(PropertySourceProvider.class));
-        this.propertSources = Objects.requireNonNull(wrapped.getPropertySources());
-    }
-
-    @Override
-    public Collection<PropertySource> getPropertySources() {
-        return this.propertSources;
-    }
-
-    @Override
-    public ConfigurationContext refresh(ConfigurationContext context) {
-        Collection<PropertySource> newPropertySources =
-                Objects.requireNonNull(wrapped.getPropertySources());
-        ConfigurationContextBuilder builder = context.toBuilder();
-        // remove previous sources
-        builder.removePropertySources(this.propertSources);
-        // add new sources
-        builder.addPropertySources(newPropertySources);
-        return builder.build();
-    }
-
-    @Override
-    public String toString() {
-        return "WrappedPropertySource{" +
-                "sourceConfig=" + sourceConfig +
-                ", wrapped=" + wrapped +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
deleted file mode 100644
index a8129f6..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/FactoryManager.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.tamaya.metamodel.internal;
-
-import org.apache.tamaya.metamodel.spi.PropertySourceFactory;
-import org.apache.tamaya.metamodel.spi.PropertySourceProviderFactory;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertySourceProvider;
-import org.apache.tamaya.spi.ServiceContextManager;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Small manager component to maintain the factories to be referenced by type names.
- */
-final class FactoryManager {
-
-    private static final Logger LOG = Logger.getLogger(FactoryManager.class.getName());
-    private static final FactoryManager INSTANCE = new FactoryManager();
-
-    private Map<String, PropertySourceFactory> sourceFactories = new HashMap<>();
-    private Map<String, PropertySourceProviderFactory> providerFactories = new HashMap<>();
-
-    private FactoryManager(){
-        for(PropertySourceFactory f: ServiceContextManager.getServiceContext().getServices(PropertySourceFactory.class)){
-            this.sourceFactories.put(f.getType(), f);
-        }
-        for(PropertySourceProviderFactory f: ServiceContextManager.getServiceContext().getServices(PropertySourceProviderFactory.class)){
-            this.providerFactories.put(f.getType(), f);
-        }
-    }
-
-    public static FactoryManager getInstance(){
-        return INSTANCE;
-    }
-
-    public PropertySourceFactory getSourceFactory(String type){
-        PropertySourceFactory fact = this.sourceFactories.get(type);
-        if(fact==null){
-            try{
-                Class<? extends PropertySource> psType = (Class<? extends PropertySource>)Class.forName(type);
-                fact = new ImplicitPropertySourceFactory(psType);
-                this.sourceFactories.put(type, fact);
-                return fact;
-            }catch(Exception e){
-                LOG.log(Level.SEVERE, "Failed to load PropertySourceFactory: " + type);
-            }
-        }
-        throw new IllegalArgumentException("No such PropertySourceFactory: " + type);
-    }
-
-    public PropertySourceProviderFactory getProviderFactory(String type){
-        PropertySourceProviderFactory fact = this.providerFactories.get(type);
-        if(fact==null){
-            try{
-                Class<? extends PropertySourceProvider> psType = (Class<? extends PropertySourceProvider>)Class.forName(type);
-                fact = new ImplicitPropertySourceProviderFactory(psType);
-                this.providerFactories.put(type, fact);
-                return fact;
-            }catch(Exception e){
-                LOG.log(Level.SEVERE, "Failed to load PropertySourceProviderFactory: " + type);
-            }
-        }
-        throw new IllegalArgumentException("No such PropertySourceProviderFactory: " + type);
-    }
-
-    @Override
-    public String toString() {
-        return "FactoryManager{" +
-                "providerFactories=" + providerFactories.keySet() +
-                ", sourceFactories=" + sourceFactories.keySet() +
-                '}';
-    }
-
-    private static class ImplicitPropertySourceFactory implements PropertySourceFactory{
-
-        private Class<? extends PropertySource> type;
-
-        ImplicitPropertySourceFactory(Class<? extends PropertySource> type){
-            this.type = Objects.requireNonNull(type);
-        }
-
-        @Override
-        public PropertySource create(Map<String, String> config) {
-            try {
-                return this.type.newInstance();
-            } catch (Exception e) {
-                throw new IllegalStateException("Cannot instantiate PropertySource: " + this.type.getName(), e);
-            }
-        }
-
-        @Override
-        public String getType() {
-            return null;
-        }
-    }
-
-    private static class ImplicitPropertySourceProviderFactory implements PropertySourceProviderFactory{
-
-        private Class<? extends PropertySourceProvider> type;
-
-        ImplicitPropertySourceProviderFactory(Class<? extends PropertySourceProvider> type){
-            this.type = Objects.requireNonNull(type);
-        }
-
-        @Override
-        public PropertySourceProvider create(Map<String, String> config) {
-            try {
-                return this.type.newInstance();
-            } catch (Exception e) {
-                throw new IllegalStateException("Cannot instantiate PropertySourceProvider: " + this.type.getName(), e);
-            }
-        }
-
-        @Override
-        public String getType() {
-            return null;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyConverterReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyConverterReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyConverterReader.java
new file mode 100644
index 0000000..f82e92d
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyConverterReader.java
@@ -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 of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Metaconfiguration reader to read property sources and property source providers.
+ */
+public class PropertyConverterReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(PropertyConverterReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("property-converters");
+        if(nodeList.getLength()==0){
+            LOG.finer("No property converters configured");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            LOG.warning("Multiple property-converters sections configured, onyl reading first...");
+            return;
+        }
+        nodeList = nodeList.item(0).getChildNodes();
+        for(int i=0;i<nodeList.getLength();i++){
+            Node node = nodeList.item(i);
+            try{
+                if(node.getNodeName().equals("converter")){
+                    String type = node.getAttributes().getNamedItem("type").getNodeValue();
+                    try {
+                        ItemFactory<PropertyConverter> converterFactory = ItemFactoryManager.getInstance().getFactory(PropertyConverter.class, type);
+                        if(converterFactory==null){
+                            LOG.severe("No such property converter: " + type);
+                            continue;
+                        }
+                        Map<String,String> params = ComponentConfigurator.extractParameters(node);
+                        PropertyConverter converter = converterFactory.create(params);
+                        if(converter!=null) {
+                            ComponentConfigurator.configure(converter, node);
+                            Class targetType = Class.forName(params.get("targetType"));
+                            LOG.finer("Adding converter for type " + targetType.getName() + ": " + converter.getClass());
+                            contextBuilder.addPropertyConverters(TypeLiteral.of(targetType), converter);
+                        }
+                    } catch (Exception e) {
+                        LOG.log(Level.SEVERE, "Failed to configure PropertyConverter: " + type, e);
+                    }
+                }else if(node.getNodeName().equals("default-converters")){
+                    LOG.finer("Adding default property converters...");
+                    contextBuilder.addDefaultPropertyConverters();
+                }
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to read property converter configuration: " + node, e);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterOrderingReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterOrderingReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterOrderingReader.java
new file mode 100644
index 0000000..818b785
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterOrderingReader.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.annotation.Priority;
+import java.util.Comparator;
+import java.util.logging.Logger;
+
+
+/**
+ * Metaconfiguration reader that reads the configuration combination policy to be used.
+ */
+@Priority(Integer.MAX_VALUE)
+public class PropertyFilterOrderingReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(PropertyFilterOrderingReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("property-filter-order");
+        if(nodeList.getLength()==0){
+            LOG.finer("No property filter ordering configured.");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            throw new ConfigException("Only one property filter order can be applied.");
+        }
+        Node node = nodeList.item(0);
+        String type = node.getAttributes().getNamedItem("type").getNodeValue();
+        ItemFactory<Comparator> comparatorFactory = ItemFactoryManager.getInstance().getFactory(Comparator.class, type);
+        Comparator comparator = comparatorFactory.create(ComponentConfigurator.extractParameters(node));
+        ComponentConfigurator.configure(comparator, node);
+        LOG.finer("Sorting property filters using comparator: " + comparator.getClass().getName());
+        contextBuilder.sortPropertyFilter(comparator);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterReader.java
new file mode 100644
index 0000000..94bb6ec
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertyFilterReader.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertyFilter;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+/**
+ * Metaconfiguration reader that reads the configuration filters to be used.
+ */
+public class PropertyFilterReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(PropertyFilterReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("property-filters");
+        if(nodeList.getLength()==0){
+            LOG.finer("No property filters configured.");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            LOG.warning("Multiple property-filters sections configured, onyl reading first...");
+            return;
+        }
+        nodeList = nodeList.item(0).getChildNodes();
+        for(int i=0;i<nodeList.getLength();i++){
+            Node node = nodeList.item(i);
+            try {
+                if ("filter".equals(node.getNodeName())) {
+                    String type = node.getAttributes().getNamedItem("type").getNodeValue();
+                    ItemFactory<PropertyFilter> filterFactory = ItemFactoryManager.getInstance().getFactory(PropertyFilter.class, type);
+                    if(filterFactory==null){
+                        LOG.severe("No such property filter: " + type);
+                        continue;
+                    }
+                    Map<String,String> params = ComponentConfigurator.extractParameters(node);
+                    PropertyFilter filter = filterFactory.create(params);
+                    if(filter!=null) {
+                        ComponentConfigurator.configure(filter, params);
+                        LOG.finer("Adding configured property filter: " + filter.getClass().getName());
+                        contextBuilder.addPropertyFilters(filter);
+                    }
+                } else if ("default-filters".equals(node.getNodeName())) {
+                    LOG.finer("Adding default property filters...");
+                    contextBuilder.addDefaultPropertyFilters();
+                }
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to read property filter configuration: " + node, e);
+            }
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceOrderingReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceOrderingReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceOrderingReader.java
new file mode 100644
index 0000000..b811afa
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceOrderingReader.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.internal;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertyValueCombinationPolicy;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.annotation.Priority;
+import java.util.Comparator;
+import java.util.logging.Logger;
+
+
+/**
+ * Metaconfiguration reader that reads the configuration combination policy to be used.
+ */
+@Priority(Integer.MAX_VALUE)
+public class PropertySourceOrderingReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(PropertySourceOrderingReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("property-source-order");
+        if(nodeList.getLength()==0){
+            LOG.finer("No property source ordering defined.");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            throw new ConfigException("Only one property source order can be applied.");
+        }
+        Node node = nodeList.item(0);
+        String type = node.getAttributes().getNamedItem("type").getNodeValue();
+        ItemFactory<Comparator> comparatorFactory = ItemFactoryManager.getInstance().getFactory(Comparator.class, type);
+        Comparator comparator = comparatorFactory.create(ComponentConfigurator.extractParameters(node));
+        ComponentConfigurator.configure(comparator, node);
+        LOG.finer("Sorting property sources using comparator: " + comparator.getClass().getName());
+        contextBuilder.sortPropertySources(comparator);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceReader.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceReader.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceReader.java
new file mode 100644
index 0000000..8f42a3b
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/PropertySourceReader.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.metamodel.internal;
+
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.metamodel.spi.ItemFactoryManager;
+import org.apache.tamaya.metamodel.spi.MetaConfigurationReader;
+import org.apache.tamaya.spi.ConfigurationContextBuilder;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Metaconfiguration reader to read property sources and property source providers.
+ */
+public class PropertySourceReader implements MetaConfigurationReader{
+
+    private static final Logger LOG = Logger.getLogger(PropertySourceReader.class.getName());
+
+    @Override
+    public void read(Document document, ConfigurationContextBuilder contextBuilder) {
+        NodeList nodeList = document.getDocumentElement().getElementsByTagName("property-sources");
+        if(nodeList.getLength()==0){
+            LOG.finer("No property sources configured.");
+            return;
+        }
+        if(nodeList.getLength()>1){
+            LOG.warning("Multiple property-sources sections configured, onyl reading first...");
+            return;
+        }
+        nodeList = nodeList.item(0).getChildNodes();
+        for(int i=0;i<nodeList.getLength();i++){
+            Node node = nodeList.item(i);
+            try{
+                if(node.getNodeName().equals("source")){
+                    String type = node.getAttributes().getNamedItem("type").getNodeValue();
+                    try {
+                        ItemFactory<PropertySource> sourceFactory = ItemFactoryManager.getInstance().getFactory(PropertySource.class, type);
+                        if(sourceFactory==null){
+                            LOG.severe("No such property source: " + type);
+                            continue;
+                        }
+                        Map<String,String> params = ComponentConfigurator.extractParameters(node);
+                        PropertySource ps = sourceFactory.create(params);
+                        if(ps!=null) {
+                            ComponentConfigurator.configure(ps, params);
+                            LOG.finer("Adding configured property source: " + ps.getName());
+                            contextBuilder.addPropertySources(ps);
+                        }
+                    } catch (Exception e) {
+                        LOG.log(Level.SEVERE, "Failed to configure PropertySource: " + type, e);
+                    }
+                }else if(node.getNodeName().equals("source-provider")){
+                    String type = node.getAttributes().getNamedItem("type").getNodeValue();
+                    try {
+                        ItemFactory<PropertySourceProvider> providerFactory = ItemFactoryManager.getInstance().getFactory(PropertySourceProvider.class, type);
+                        if(providerFactory==null){
+                            LOG.severe("No such property source provider: " + type);
+                            continue;
+                        }
+                        Map<String,String> params = ComponentConfigurator.extractParameters(node);
+                        PropertySourceProvider prov = providerFactory.create(params);
+                        if(prov!=null) {
+                            ComponentConfigurator.configure(prov, node);
+                            LOG.finer("Adding configured property source provider: " + prov.getClass().getName());
+                            contextBuilder.addPropertySources(prov.getPropertySources());
+                        }
+                    } catch (Exception e) {
+                        LOG.log(Level.SEVERE, "Failed to configure PropertySourceProvider: " + type, e);
+                    }
+                }else if(node.getNodeName().equals("default-sources")){
+                    LOG.finer("Adding default property sources.");
+                    contextBuilder.addDefaultPropertySources();
+                }
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to read property source configuration: " + node, e);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
deleted file mode 100644
index bd0103e..0000000
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/Refreshable.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.tamaya.metamodel.internal;
-
-import org.apache.tamaya.spi.ConfigurationContext;
-
-/**
- * Common interface for refreshable items.
- */
-public interface Refreshable {
-
-    /**
-     * Refreshes the given configuration context, by applying any changes
-     * needed to reflect the change.
-     * @param context the configuration context, not null.
-     * @return the new configuration context. In case no changes are
-     *         needed or the changes could be applied implicitly, the
-     *         instance passed as input should be returned.
-     */
-    ConfigurationContext refresh(ConfigurationContext context);
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
index 4987111..00d823e 100644
--- a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/SourceConfig.java
@@ -1,233 +1,233 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.tamaya.metamodel.internal;
-
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Resolver to resolve/map DSL related source expressions into PropertySources
- * loadable by a ConfigurationContext. Hereby the ordering of loaded property sources must be
- * honored if possible by implicitly adapting/Overriding the default ordinal for the sources
- * added.
- */
-public class SourceConfig {
-
-    private boolean enabled;
-    private String type;
-    private String name;
-    private Integer ordinal;
-    private long refreshInterval;
-    private Map<String,String> sourceConfiguration = new HashMap<>();
-
-    private SourceConfig(Builder builder) {
-        enabled = builder.enabled;
-        type = builder.type;
-        name = builder.name;
-        refreshInterval = builder.refreshInterval;
-        ordinal = builder.ordinal;
-        sourceConfiguration = builder.sourceConfiguration;
-    }
-
-    /**
-     * New builder builder.
-     *
-     * @param type the type
-     * @return the builder
-     */
-    public static Builder newBuilder(String type) {
-        return new Builder(type);
-    }
-
-    /**
-     * New builder builder using this instance's settings.
-     *
-     * @return the builder
-     */
-    public Builder toBuilder() {
-        Builder builder = new Builder(this.type);
-        builder.enabled = this.enabled;
-        builder.type = this.type;
-        builder.ordinal = this.ordinal;
-        builder.name = this.name;
-        builder.sourceConfiguration = this.sourceConfiguration;
-        return builder;
-    }
-
-    /**
-     * Is enabled boolean.
-     *
-     * @return the boolean
-     */
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    /**
-     * Gets source configuration.
-     *
-     * @return the source configuration
-     */
-    public Map<String, String> getSourceConfiguration() {
-        return sourceConfiguration;
-    }
-
-    /**
-     * Gets type.
-     *
-     * @return the type
-     */
-    public String getType() {
-        return type;
-    }
-
-    /**
-     * Gets the current refresh interval, default is 0 meaning the property
-     * source is never refreshed.
-     *
-     * @return the refresh interval
-     */
-    public long getRefreshInterval() {
-        return refreshInterval;
-    }
-
-    /**
-     * Gets name.
-     *
-     * @return the name
-     */
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String toString() {
-        return "PropertySourceConfig{" +
-                "enabled=" + enabled +
-                ", type='" + type + '\'' +
-                ", name='" + name + '\'' +
-                ", ordinal=" + ordinal +
-                ", sourceConfiguration=" + sourceConfiguration +
-                '}';
-    }
-
-
-    public <T> T create(Class<T> type)
-            throws ClassNotFoundException, IllegalAccessException,
-            InstantiationException {
-        return (T)Class.forName(this.getType()).newInstance();
-    }
-
-
-    /**
-     * {@code PropertySourceConfig} builder static inner class.
-     */
-    public static final class Builder {
-        private boolean enabled;
-        private String type;
-        private String name;
-        private Integer ordinal;
-        private long refreshInterval;
-        private Map<String, String> sourceConfiguration;
-
-        private Builder(String type) {
-            this.type = Objects.requireNonNull(type);
-            if(type.trim().isEmpty()){
-                throw new IllegalArgumentException("Type is empty.");
-            }
-        }
-
-        /**
-         * Sets the {@code refreshInterval} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code refreshInterval} to set
-         * @return a reference to this Builder
-         */
-        public Builder withRefreshInterval(long val) {
-            refreshInterval = val;
-            return this;
-        }
-
-        /**
-         * Sets the {@code ordinal} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code ordinal} to set
-         * @return a reference to this Builder
-         */
-        public Builder withOrdinal(Integer val) {
-            ordinal = val;
-            return this;
-        }
-
-        /**
-         * Sets the {@code enabled} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code enabled} to set
-         * @return a reference to this Builder
-         */
-        public Builder withEnabled(boolean val) {
-            enabled = val;
-            return this;
-        }
-
-        /**
-         * Sets the {@code type} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code type} to set
-         * @return a reference to this Builder
-         */
-        public Builder withType(String val) {
-            type = val;
-            return this;
-        }
-
-        /**
-         * Sets the {@code name} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code name} to set
-         * @return a reference to this Builder
-         */
-        public Builder withName(String val) {
-            name = val;
-            return this;
-        }
-
-        /**
-         * Sets the {@code sourceConfiguration} and returns a reference to this Builder so that the methods can be chained together.
-         *
-         * @param val the {@code sourceConfiguration} to set
-         * @return a reference to this Builder
-         */
-        public Builder withSourceConfiguration(Map<String, String> val) {
-            sourceConfiguration = val;
-            return this;
-        }
-
-        /**
-         * Returns a {@code PropertySourceConfig} built from the parameters previously set.
-         *
-         * @return a {@code PropertySourceConfig} built with parameters of this {@code PropertySourceConfig.Builder}
-         */
-        public SourceConfig build() {
-            return new SourceConfig(this);
-        }
-    }
-}
+///*
+// * Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// */
+//package org.apache.tamaya.metamodel.internal;
+//
+//
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.Objects;
+//
+///**
+// * Resolver to resolve/map DSL related source expressions into PropertySources
+// * loadable by a ConfigurationContext. Hereby the ordering of loaded property sources must be
+// * honored if possible by implicitly adapting/Overriding the default ordinal for the sources
+// * added.
+// */
+//public class SourceConfig {
+//
+//    private boolean enabled;
+//    private String type;
+//    private String name;
+//    private Integer ordinal;
+//    private long refreshInterval;
+//    private Map<String,String> sourceConfiguration = new HashMap<>();
+//
+//    private SourceConfig(Builder builder) {
+//        enabled = builder.enabled;
+//        type = builder.type;
+//        name = builder.name;
+//        refreshInterval = builder.refreshInterval;
+//        ordinal = builder.ordinal;
+//        sourceConfiguration = builder.sourceConfiguration;
+//    }
+//
+//    /**
+//     * New builder builder.
+//     *
+//     * @param type the type
+//     * @return the builder
+//     */
+//    public static Builder newBuilder(String type) {
+//        return new Builder(type);
+//    }
+//
+//    /**
+//     * New builder builder using this instance's settings.
+//     *
+//     * @return the builder
+//     */
+//    public Builder toBuilder() {
+//        Builder builder = new Builder(this.type);
+//        builder.enabled = this.enabled;
+//        builder.type = this.type;
+//        builder.ordinal = this.ordinal;
+//        builder.name = this.name;
+//        builder.sourceConfiguration = this.sourceConfiguration;
+//        return builder;
+//    }
+//
+//    /**
+//     * Is enabled boolean.
+//     *
+//     * @return the boolean
+//     */
+//    public boolean isEnabled() {
+//        return enabled;
+//    }
+//
+//    /**
+//     * Gets source configuration.
+//     *
+//     * @return the source configuration
+//     */
+//    public Map<String, String> getSourceConfiguration() {
+//        return sourceConfiguration;
+//    }
+//
+//    /**
+//     * Gets type.
+//     *
+//     * @return the type
+//     */
+//    public String getType() {
+//        return type;
+//    }
+//
+//    /**
+//     * Gets the current refresh interval, default is 0 meaning the property
+//     * source is never refreshed.
+//     *
+//     * @return the refresh interval
+//     */
+//    public long getRefreshInterval() {
+//        return refreshInterval;
+//    }
+//
+//    /**
+//     * Gets name.
+//     *
+//     * @return the name
+//     */
+//    public String getName() {
+//        return name;
+//    }
+//
+//    @Override
+//    public String toString() {
+//        return "PropertySourceConfig{" +
+//                "enabled=" + enabled +
+//                ", type='" + type + '\'' +
+//                ", name='" + name + '\'' +
+//                ", ordinal=" + ordinal +
+//                ", sourceConfiguration=" + sourceConfiguration +
+//                '}';
+//    }
+//
+//
+//    public <T> T create(Class<T> type)
+//            throws ClassNotFoundException, IllegalAccessException,
+//            InstantiationException {
+//        return (T)Class.forName(this.getType()).newInstance();
+//    }
+//
+//
+//    /**
+//     * {@code PropertySourceConfig} builder static inner class.
+//     */
+//    public static final class Builder {
+//        private boolean enabled;
+//        private String type;
+//        private String name;
+//        private Integer ordinal;
+//        private long refreshInterval;
+//        private Map<String, String> sourceConfiguration;
+//
+//        private Builder(String type) {
+//            this.type = Objects.requireNonNull(type);
+//            if(type.trim().isEmpty()){
+//                throw new IllegalArgumentException("Type is empty.");
+//            }
+//        }
+//
+//        /**
+//         * Sets the {@code refreshInterval} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code refreshInterval} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withRefreshInterval(long val) {
+//            refreshInterval = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Sets the {@code ordinal} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code ordinal} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withOrdinal(Integer val) {
+//            ordinal = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Sets the {@code enabled} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code enabled} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withEnabled(boolean val) {
+//            enabled = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Sets the {@code type} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code type} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withType(String val) {
+//            type = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Sets the {@code name} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code name} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withName(String val) {
+//            name = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Sets the {@code sourceConfiguration} and returns a reference to this Builder so that the methods can be chained together.
+//         *
+//         * @param val the {@code sourceConfiguration} to set
+//         * @return a reference to this Builder
+//         */
+//        public Builder withSourceConfiguration(Map<String, String> val) {
+//            sourceConfiguration = val;
+//            return this;
+//        }
+//
+//        /**
+//         * Returns a {@code PropertySourceConfig} built from the parameters previously set.
+//         *
+//         * @return a {@code PropertySourceConfig} built with parameters of this {@code PropertySourceConfig.Builder}
+//         */
+//        public SourceConfig build() {
+//            return new SourceConfig(this);
+//        }
+//    }
+//}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/CLIArgumentsFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/CLIArgumentsFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/CLIArgumentsFactory.java
new file mode 100644
index 0000000..ae4bf24
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/CLIArgumentsFactory.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.CLIPropertySource;
+import org.apache.tamaya.spisupport.EnvironmentPropertySource;
+
+import java.util.Map;
+
+/**
+ * Factory for configuring CLI argument based property sources.
+ */
+public final class CLIArgumentsFactory implements ItemFactory<PropertySource>{
+    @Override
+    public String getName() {
+        return "CLI";
+    }
+
+    @Override
+    public PropertySource create(Map<String,String> parameters) {
+        return new CLIPropertySource();
+    }
+
+    @Override
+    public Class<? extends PropertySource> getType() {
+        return PropertySource.class;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/EnvPropertiesFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/EnvPropertiesFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/EnvPropertiesFactory.java
new file mode 100644
index 0000000..f6c9909
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/EnvPropertiesFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.EnvironmentPropertySource;
+
+import java.util.Map;
+
+/**
+ * Factory for configuring environment properties based property sources.
+ */
+public final class EnvPropertiesFactory implements ItemFactory<PropertySource>{
+    @Override
+    public String getName() {
+        return "env-properties";
+    }
+
+    @Override
+    public PropertySource create(Map<String,String> parameters) {
+        return new EnvironmentPropertySource();
+    }
+
+    @Override
+    public Class<? extends PropertySource> getType() {
+        return PropertySource.class;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/FilePropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/FilePropertySourceFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/FilePropertySourceFactory.java
new file mode 100644
index 0000000..d3961d4
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/FilePropertySourceFactory.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.MappedConfigurationDataPropertySource;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.resource.ConfigResources;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.PropertiesResourcePropertySource;
+import org.apache.tamaya.spisupport.SimplePropertySource;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collection;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Factory for configuring file based property sources.
+ */
+public final class FilePropertySourceFactory extends ResourcePropertySourceFactory{
+
+    private static final Logger LOG = Logger.getLogger(FilePropertySourceFactory.class.getName());
+
+    @Override
+    public String getName() {
+        return "file";
+    }
+
+    @Override
+    protected String example() {
+        return "<source type=\""+getName()+"\">\n" +
+                "  <param name=\"location\">c:/temp/config.xml</param>\n" +
+                "  <param name=\"formats\">xml-properties</param>\n" +
+                "</source>\n";
+    }
+
+    @Override
+    protected URL createResource(String location) {
+        try {
+            Path path = Paths.get(location);
+            if(!path.toFile().exists()){
+                LOG.info("Cannot read resource '" + location + "': no such file.");
+            }else if(!path.toFile().canRead()){
+                LOG.info("Cannot read resource '" + location + "': not readable.");
+            }
+            return path.toUri().toURL();
+        } catch (MalformedURLException e) {
+            LOG.warning("Invalid file '" + location + "'.");
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceFactory.java
new file mode 100644
index 0000000..a36fd7f
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceFactory.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.MappedConfigurationDataPropertySource;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.PropertiesResourcePropertySource;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Factory for configuring resource based property sources.
+ */
+public class ResourcePropertySourceFactory extends URLPropertySourceFactory{
+
+    private static final Logger LOG = Logger.getLogger(ResourcePropertySourceFactory.class.getName());
+
+    @Override
+    public String getName() {
+        return "classpath";
+    }
+
+
+    protected String example() {
+        return "<source type=\""+getName()+"\">\n" +
+                "  <param name=\"location\">/META-INF/config.xml</param>\n" +
+                "  <param name=\"formats\">xml-properties</param>\n" +
+                "</source>\n";
+    }
+
+    protected URL createResource(String location) {
+        try {
+            return getClass().getClassLoader().getResource(location);
+        } catch (Exception e) {
+            LOG.warning("Invalid resource '" + location + "'.");
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceProviderFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceProviderFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceProviderFactory.java
new file mode 100644
index 0000000..77f22d4
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/ResourcePropertySourceProviderFactory.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.MappedConfigurationDataPropertySource;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.resource.ConfigResources;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+
+import java.net.URL;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Factory for configuring resource based property sources.
+ */
+public class ResourcePropertySourceProviderFactory implements ItemFactory<PropertySourceProvider>{
+
+    private static final Logger LOG = Logger.getLogger(ResourcePropertySourceProviderFactory.class.getName());
+
+    @Override
+    public String getName() {
+        return "resource";
+    }
+
+    @Override
+    public PropertySourceProvider create(Map<String,String> parameters) {
+        String location = parameters.get("location");
+        if(location==null){
+            LOG.warning("Cannot read 'location' from " + parameters + ", example: " + example());
+            return null;
+        }
+        Collection<URL> resources = createResources(location);
+        List<PropertySource> propertySources = new ArrayList<>();
+        if(resources!=null) {
+            String[] formats = getFormats(parameters);
+            for(URL resource:resources) {
+                ConfigurationData data;
+                try {
+                    if (formats.length == 0) {
+                        data = ConfigurationFormats.readConfigurationData(resource);
+                    } else {
+                        data = ConfigurationFormats.readConfigurationData(resource,
+                                ConfigurationFormats.getFormats(formats));
+                    }
+                    propertySources.add(new MappedConfigurationDataPropertySource(data));
+                } catch (Exception e) {
+                    LOG.log(Level.SEVERE, "Failed to read property source from resource: " + location, e);
+                }
+            }
+        }
+        final List<PropertySource> finalPropertySources = Collections.unmodifiableList(propertySources);
+        return new PropertySourceProvider() {
+            @Override
+            public Collection<PropertySource> getPropertySources() {
+                return finalPropertySources;
+            }
+        };
+    }
+
+    @Override
+    public Class<? extends PropertySourceProvider> getType() {
+        return PropertySourceProvider.class;
+    }
+
+    protected String[] getFormats(Map<String, String> parameters) {
+        String val = parameters.get("formats");
+        if(val==null){
+            return new String[0];
+        }
+        String[] formats = val.split(",");
+        for(int i=0;i<formats.length;i++){
+            formats[i] = formats[i].trim();
+        }
+        return formats;
+    }
+
+    protected String example() {
+        return "<source-provider type=\""+getName()+"\">\n" +
+                "  <param name=\"location\">/META-INF/**/config.xml</param>\n" +
+                "  <param name=\"formats\">xml-properties</param>\n" +
+                "</source-provider>\n";
+    }
+
+    protected Collection<URL> createResources(String location) {
+        try {
+            return ConfigResources.getResourceResolver().getResources(location.split(":"));
+        } catch (Exception e) {
+            LOG.warning("Invalid resource expression '" + location + "'.");
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/SysPropertiesFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/SysPropertiesFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/SysPropertiesFactory.java
new file mode 100644
index 0000000..aec4837
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/SysPropertiesFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.SystemPropertySource;
+
+import java.util.Map;
+
+/**
+ * Factory for configuring system properties based property sources.
+ */
+public final class SysPropertiesFactory implements ItemFactory<PropertySource>{
+    @Override
+    public String getName() {
+        return "sys-properties";
+    }
+
+    @Override
+    public PropertySource create(Map<String,String> parameters) {
+        return new SystemPropertySource();
+    }
+
+    @Override
+    public Class<? extends PropertySource> getType() {
+        return PropertySource.class;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/URLPropertySourceFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/URLPropertySourceFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/URLPropertySourceFactory.java
new file mode 100644
index 0000000..342eebb
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/internal/factories/URLPropertySourceFactory.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tamaya.metamodel.internal.factories;
+
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.MappedConfigurationDataPropertySource;
+import org.apache.tamaya.functions.Supplier;
+import org.apache.tamaya.metamodel.internal.ComponentConfigurator;
+import org.apache.tamaya.metamodel.spi.ItemFactory;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spisupport.PropertiesResourcePropertySource;
+
+import javax.security.auth.RefreshFailedException;
+import javax.security.auth.Refreshable;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Factory for configuring resource based property sources.
+ */
+public class URLPropertySourceFactory implements ItemFactory<PropertySource>{
+
+    private static final Logger LOG = Logger.getLogger(FilePropertySourceFactory.class.getName());
+
+    @Override
+    public String getName() {
+        return "url";
+    }
+
+    @Override
+    public PropertySource create(Map<String,String> parameters) {
+        String location = parameters.get("location");
+        if(location==null){
+            LOG.warning("Cannot read 'location' from " + parameters + ", example: " + example());
+            return null;
+        }
+        URL resource = createResource(location);
+        if(resource!=null) {
+            String[] formats = getFormats(parameters);
+            String name = resource.toString();
+            RefreshablePropertySource ps = new RefreshablePropertySource(name, new LazyDataSupplier(resource, formats));
+            ComponentConfigurator.configure(ps, parameters);
+            return ps;
+        }
+        return null;
+    }
+
+    protected String example() {
+        return "<source type=\""+getName()+"\">\n" +
+                "  <param name=\"location\">http://127.0.0.1:1110/config.xml</param>\n" +
+                "  <param name=\"formats\">xml-properties</param>\n" +
+                "</source>\n";
+    }
+
+    protected URL createResource(String location) {
+        try {
+            return new URL(location);
+        } catch (MalformedURLException e) {
+            LOG.warning("Invalid url '" + location + "'.");
+            return null;
+        }
+    }
+
+    protected String[] getFormats(Map<String, String> parameters) {
+        String val = parameters.get("formats");
+        if(val==null){
+            return new String[0];
+        }
+        String[] formats = val.split(",");
+        for(int i=0;i<formats.length;i++){
+            formats[i] = formats[i].trim();
+        }
+        return formats;
+    }
+
+    @Override
+    public Class<? extends PropertySource> getType() {
+        return PropertySource.class;
+    }
+
+    private static final class LazyDataSupplier implements Supplier<ConfigurationData> {
+
+        private String[] formats;
+        private URL resource;
+
+        public LazyDataSupplier(URL resource, String[] formats) {
+            this.formats = Objects.requireNonNull(formats);
+            this.resource = Objects.requireNonNull(resource);
+        }
+
+        @Override
+        public ConfigurationData get() {
+            ConfigurationData data;
+            try {
+                if (formats.length == 0) {
+                    data = ConfigurationFormats.readConfigurationData(resource);
+                } else {
+                    data = ConfigurationFormats.readConfigurationData(resource,
+                            ConfigurationFormats.getFormats(formats));
+                }
+                return data;
+            } catch (Exception e) {
+                LOG.log(Level.INFO, "Failed to read property source from resource: " + resource, e);
+                return null;
+            }
+        }
+    }
+
+    private static final class RefreshablePropertySource extends MappedConfigurationDataPropertySource
+    implements Refreshable{
+
+        public RefreshablePropertySource(String name, Supplier<ConfigurationData> dataSupplier) {
+            super(name, dataSupplier);
+        }
+
+        public RefreshablePropertySource(String name, int defaultOrdinal, Supplier<ConfigurationData> dataSupplier) {
+            super(name, dataSupplier);
+        }
+
+        @Override
+        public boolean isCurrent() {
+            return false;
+        }
+
+        @Override
+        public void refresh() throws RefreshFailedException {
+            super.load();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-sandbox/blob/afc19d0e/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/ItemFactory.java
----------------------------------------------------------------------
diff --git a/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/ItemFactory.java b/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/ItemFactory.java
new file mode 100644
index 0000000..1cfb8b9
--- /dev/null
+++ b/metamodel/src/main/java/org/apache/tamaya/metamodel/spi/ItemFactory.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.tamaya.metamodel.spi;
+
+import java.util.Map;
+
+/**
+ * Factory for items that are configurable using meta-configuration.
+ * This allows easy registration using the name, instead of the fully qualified
+ * class name.
+ */
+public interface ItemFactory<T> {
+
+    /**
+     * Get the factory name.
+     * @return the factory name, not null.
+     */
+    String getName();
+
+    /**
+     * Create a new instance.
+     * @param parameters the parameters for configuring the instance.
+     * @return the new instance, not null.
+     */
+    T create(Map<String,String> parameters);
+
+    /**
+     * Get the target type created by this factory. This can be used to
+     * assign the factory to an acording item base type, e.g. a PropertySource,
+     * PropertySourceProvider, PropertyFilter etc.
+     * @return the target type, not null.
+     */
+    Class<? extends T> getType();
+
+}