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 2018/11/18 21:21:12 UTC

[08/22] incubator-tamaya git commit: TAMAYA-274 Reduced API footprint by using Java 8 features. Added some lambdas. TAMAYA-355 Enable mapping of lists and arrays into internal datastructures. TAMAYA-353 Adding support for different classloaders.

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/DefaultServiceContext.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/DefaultServiceContext.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/DefaultServiceContext.java
index f870c46..9c940ae 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/DefaultServiceContext.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/DefaultServiceContext.java
@@ -26,6 +26,7 @@ import javax.annotation.Priority;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -49,24 +50,36 @@ public final class DefaultServiceContext implements ServiceContext {
 	private Map<Class, Class> factoryTypes = new ConcurrentHashMap<>();
 
     @Override
-    public <T> T getService(Class<T> serviceType) {
-        Object cached = singletons.get(serviceType);
-        if (cached == null) {
-            cached = create(serviceType);
-            if(cached!=null) {
-                singletons.put(serviceType, cached);
+    public <T> T getService(Class<T> serviceType, Supplier<T> supplier) {
+        T service = (T)singletons.get(serviceType);
+        if(service!=null){
+            return service;
+        }
+        Collection<T> services = loadServices(serviceType, null);
+        if (services.isEmpty() && supplier!=null){
+            T instance = supplier.get();
+            if(instance instanceof ClassloaderAware){
+                ((ClassloaderAware)instance).init(this.classLoader);
             }
+            register(serviceType, instance, true);
+            return instance;
+        }
+        T t = getServiceWithHighestPriority(services, serviceType);
+        if(t!=null) {
+            this.singletons.put(serviceType, t);
         }
-        return serviceType.cast(cached);
+        return t;
     }
 
     @Override
-    public <T> T create(Class<T> serviceType) {
-        @SuppressWarnings("unchecked")
-		Class<? extends T> implType = factoryTypes.get(serviceType);
+    public <T> T create(Class<T> serviceType, Supplier<T> supplier) {
+        Class<? extends T> implType = factoryTypes.get(serviceType);
         if(implType==null) {
-            Collection<T> services = getServices(serviceType);
+            Collection<T> services = loadServices(serviceType, null);
             if (services.isEmpty()) {
+                if(supplier!=null){
+                    return supplier.get();
+                }
                 return null;
             } else {
                 return getServiceWithHighestPriority(services, serviceType);
@@ -75,7 +88,7 @@ public final class DefaultServiceContext implements ServiceContext {
         try {
             return implType.newInstance();
         } catch (Exception e) {
-            LOG.log(Level.SEVERE, "Failed to create instance of " + implType.getName(), e);
+            LOG.log(Level.SEVERE, "Failed to createObject instance of " + implType.getName(), e);
             return  null;
         }
     }
@@ -90,7 +103,7 @@ public final class DefaultServiceContext implements ServiceContext {
      */
     private <T> T getServiceWithHighestPriority(Collection<T> services, Class<T> serviceType) {
         T highestService = null;
-        // we do not need the priority stuff if the list contains only one element
+        // we do not need the priority stuff if the createList contains only one element
         if (services.size() == 1) {
             highestService = services.iterator().next();
             this.factoryTypes.put(serviceType, highestService.getClass());
@@ -118,7 +131,9 @@ public final class DefaultServiceContext implements ServiceContext {
                     highestPriority,
                     services));
         }
-        this.factoryTypes.put(serviceType, highestService.getClass());
+        if(highestService!=null) {
+            this.factoryTypes.put(serviceType, highestService.getClass());
+        }
         return highestService;
     }
 
@@ -130,12 +145,26 @@ public final class DefaultServiceContext implements ServiceContext {
      * @return the items found, never {@code null}.
      */
     @Override
-    public <T> List<T> getServices(final Class<T> serviceType) {
+    public <T> List<T> getServices(final Class<T> serviceType, Supplier<List<T>> supplier) {
         @SuppressWarnings("unchecked")
 		List<T> found = (List<T>) servicesLoaded.get(serviceType);
         if (found != null) {
             return found;
         }
+        List<T> services = loadServices(serviceType, supplier);
+        @SuppressWarnings("unchecked")
+		final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>) services));
+        return previousServices != null ? previousServices : services;
+    }
+
+    /**
+     * Loads services.
+     *
+     * @param <T>         the concrete type.
+     * @param serviceType The service type.
+     * @return the items found, never {@code null}.
+     */
+    private <T> List<T> loadServices(final Class<T> serviceType, Supplier<List<T>> supplier) {
         List<T> services = new ArrayList<>();
         try {
             for (T t : ServiceLoader.load(serviceType, classLoader)) {
@@ -144,27 +173,40 @@ public final class DefaultServiceContext implements ServiceContext {
                 }
                 services.add(t);
             }
-            // TODO does this make sense here...?
-//            if(services.isEmpty()) {
-//                for (T t : ServiceLoader.load(serviceType, serviceType.getClassLoader())) {
-//                    if(t instanceof ClassloaderAware){
-//                        ((ClassloaderAware)t).init(classLoader);
-//                    }
-//                    services.add(t);
-//                }
-//            }
             Collections.sort(services, PriorityServiceComparator.getInstance());
             services = Collections.unmodifiableList(services);
         } catch (ServiceConfigurationError e) {
-            LOG.log(Level.WARNING,
-                    "Error loading services current type " + serviceType, e);
+            if(supplier!=null){
+                services = supplier.get();
+            }else {
+                LOG.log(Level.WARNING,
+                        "Error loading services current type " + serviceType, e);
+            }
             if(services==null){
                 services = Collections.emptyList();
             }
         }
-        @SuppressWarnings("unchecked")
-		final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>) services));
-        return previousServices != null ? previousServices : services;
+        return services;
+    }
+
+    @Override
+    public <T> T register(Class<T> serviceType, T instance, boolean force) {
+        if(force){
+            singletons.put(serviceType, instance);
+        }else {
+            singletons.putIfAbsent(serviceType, instance);
+        }
+        return (T)singletons.get(serviceType);
+    }
+
+    @Override
+    public <T> List<T> register(Class<T> type, List<T> instances, boolean force) {
+        if(force){
+            servicesLoaded.put(type, (List)instances);
+        }else {
+            servicesLoaded.putIfAbsent(type, (List)instances);
+        }
+        return (List<T>)servicesLoaded.get(type);
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/EnumConverter.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/EnumConverter.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/EnumConverter.java
index 029c93d..2c0054f 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/EnumConverter.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/EnumConverter.java
@@ -24,6 +24,7 @@ import org.apache.tamaya.spi.PropertyConverter;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.math.RoundingMode;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.logging.Level;
@@ -45,7 +46,7 @@ public class EnumConverter<T> implements PropertyConverter<T> {
         try {
             this.factory = enumType.getMethod("valueOf", String.class);
         } catch (NoSuchMethodException e) {
-            throw new ConfigException("Uncovertible enum type without valueOf method found, please provide a custom " +
+            throw new ConfigException("Uncovertible enum type without createValue method found, please provide a custom " +
                     "PropertyConverter for: " + enumType.getName());
         }
     }
@@ -57,12 +58,12 @@ public class EnumConverter<T> implements PropertyConverter<T> {
         try {
             return (T) factory.invoke(null, value);
         } catch (InvocationTargetException | IllegalAccessException e) {
-            LOG.log(Level.FINEST, "Invalid enum value '" + value + "' for " + enumType.getName(), e);
+            LOG.log(Level.FINEST, "Invalid enum createValue '" + value + "' for " + enumType.getName(), e);
         }
         try {
             return (T) factory.invoke(null, value.toUpperCase(Locale.ENGLISH));
         } catch (InvocationTargetException | IllegalAccessException e) {
-            LOG.log(Level.FINEST, "Invalid enum value '" + value + "' for " + enumType.getName(), e);
+            LOG.log(Level.FINEST, "Invalid enum createValue '" + value + "' for " + enumType.getName(), e);
         }
         return null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/MetadataProvider.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/MetadataProvider.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/MetadataProvider.java
new file mode 100644
index 0000000..24e28ef
--- /dev/null
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/MetadataProvider.java
@@ -0,0 +1,75 @@
+/*
+ * 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.spisupport;
+
+import org.apache.tamaya.spi.ConfigurationContext;
+
+import java.util.Map;
+
+/**
+ * This interface allows to plugin different metadata mechanism. The default implementation
+ * does load metadata information along the same property sources hierarchy as configuration.
+ * MetaData entries are identified by a {@code [META]} prefix. Alternate implementations can
+ * choose whatever is appropriate, including loading metadata from external sources.
+ */
+public interface MetadataProvider {
+
+    /**
+     * Initializes the provider with the given context. Each context must manage it's own
+     * provider instance.
+     * @param context the target context, never null.
+     * @return this instance, for chaining.
+     */
+    MetadataProvider init(ConfigurationContext context);
+
+    /**
+     * Access the current metadata for the given configuration context. The MetaData will be
+     * accessible from {@link ConfigurationContext#getMetadata()}. Note that the metadata must not
+     * to be cached by it's consumers, so caching/optimazitation is delegated to this implementation.
+     * @return the (immutable) metadata of this configuration context.
+     */
+    Map<String,String> getMetaData();
+
+    /**
+     * Adds additional metadata. This metadata entries typically override all entries
+     * from alternate sources.
+     *
+     * @param key the key, not null.
+     * @param value the value, not null.
+     * @return this instance, for chaining.
+     */
+    MetadataProvider setMeta(String key, String value);
+
+    /**
+     * Adds additional metadata. This metadata entries typically override all entries
+     * from alternate sources.
+     *
+     * @param metaData the metadata to set/replace.
+     * @return this instance, for chaining.
+     */
+    MetadataProvider setMeta(Map<String, String> metaData);
+
+    /**
+     * Resets this instance, which means it reloads metadata based on the given context and
+     *
+     * @return this instance, for chaining.
+     */
+    MetadataProvider reset();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PriorityServiceComparator.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PriorityServiceComparator.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PriorityServiceComparator.java
index 8cc1fef..2f484a1 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PriorityServiceComparator.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PriorityServiceComparator.java
@@ -55,7 +55,7 @@ public class PriorityServiceComparator implements Comparator<Object>, Serializab
     }
 
     /**
-     * Checks the given instance for a @Priority annotation. If present the annotation's value is evaluated. If no such
+     * Checks the given instance for a @Priority annotation. If present the annotation's createValue is evaluated. If no such
      * annotation is present, a default priority {@code 1} is returned.
      *
      * @param o the instance, not {@code null}.
@@ -66,7 +66,7 @@ public class PriorityServiceComparator implements Comparator<Object>, Serializab
     }
 
     /**
-     * Checks the given type optionally annotated with a @Priority. If present the annotation's value is evaluated.
+     * Checks the given type optionally annotated with a @Priority. If present the annotation's createValue is evaluated.
      * If no such annotation is present, a default priority {@code 1} is returned.
      *
      * @param type the type, not {@code null}.

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyConverterManager.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyConverterManager.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyConverterManager.java
index a672fe7..22fe67e 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyConverterManager.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyConverterManager.java
@@ -205,16 +205,16 @@ public class PropertyConverterManager {
 
 
     /**
-     * Get the list of all current registered converters for the given target type.
+     * Get the createList of all current registered converters for the given target type.
      *
      * <p>
-     * If no converters are registered, the component tries to create and register dynamic
+     * If no converters are registered, the component tries to createObject and register dynamic
      * converters based on String constructor or static factory methods available.
      * The converters provided are of the following type and returned in the following order:
      * <ul>
      * <li>Converters mapped explicitly to the required target type are returned first, ordered
      * by decreasing priority. This means, if explicit converters are registered these are used
-     * primarily for converting a value.</li>
+     * primarily for converting a createValue.</li>
      * <li>The target type of each explicitly registered converter can also be transitively mapped to
      * 1) all directly implemented interfaces, 2) all its superclasses (except Object), 3) all the interfaces
      * implemented by its superclasses. This group of transitive converters is returned similarly in the
@@ -224,14 +224,14 @@ public class PropertyConverterManager {
      * compares the configuration values with the different enum members defined (case sensitive mapping).</li>
      * </ul>
      * <p>
-     * The above list of directly registered mappings are always tried first, before any transitive mapping
+     * The above createList of directly registered mappings are always tried first, before any transitive mapping
      * should be used. Also in all cases @Priority annotations are honored for ordering of the converters in place.
      * Transitive conversion is supported for all directly implemented interfaces (including inherited ones) and
      * the inheritance hierarchy (exception Object). Superinterfaces of implemented interfaces are ignored.
      *
      * @param targetType the target type, not {@code null}.
      * @param <T>        the type class
-     * @return the ordered list of converters (may be empty for not convertible types).
+     * @return the ordered createList of converters (may be empty for not convertible types).
      * @see #createDefaultPropertyConverter(org.apache.tamaya.TypeLiteral)
      */
     public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) {
@@ -365,7 +365,7 @@ public class PropertyConverterManager {
             return new EnumConverter<>(targetType.getRawType());
         }
         PropertyConverter<T> converter = null;
-        final Method factoryMethod = getFactoryMethod(targetType.getRawType(), "of", "valueOf", "instanceOf", "getInstance", "from", "fromString", "parse");
+        final Method factoryMethod = getFactoryMethod(targetType.getRawType(), "of", "createValue", "instanceOf", "getInstance", "from", "fromString", "parse");
         if (factoryMethod != null) {
             converter = new DefaultPropertyConverter<>(factoryMethod, targetType.getRawType());
         }
@@ -374,7 +374,7 @@ public class PropertyConverterManager {
             try {
                 constr = targetType.getRawType().getDeclaredConstructor(String.class);
             } catch (NoSuchMethodException e) {
-                LOG.log(Level.FINEST, "No matching constrctor for " + targetType, e);
+                LOG.log(Level.FINEST, "No matching constructor for " + targetType, e);
                 return null;
             }
             converter = new PropertyConverter<T>() {
@@ -406,7 +406,7 @@ public class PropertyConverterManager {
     }
 
     /**
-     * Tries to evaluate a factory method that can be used to create an instance based on a String.
+     * Tries to evaluate a factory method that can be used to createObject an instance based on a String.
      *
      * @param type        the target type
      * @param methodNames the possible static method names

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyFiltering.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyFiltering.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyFiltering.java
index c910a0d..9e63770 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyFiltering.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertyFiltering.java
@@ -46,10 +46,10 @@ public final class PropertyFiltering{
     private PropertyFiltering(){}
 
     /**
-     * Filters a single value.
-     * @param value the raw value, not {@code null}.
+     * Filters a single createValue.
+     * @param value the raw createValue, not {@code null}.
      * @param context the context
-     * @return the filtered value, including {@code null}.
+     * @return the filtered createValue, including {@code null}.
      */
     public static PropertyValue applyFilter(PropertyValue value, ConfigurationContext context) {
         FilterContext filterContext = new FilterContext(value, context);
@@ -57,10 +57,10 @@ public final class PropertyFiltering{
     }
 
     /**
-     * Filters a single value.
+     * Filters a single createValue.
      * @param values the full values, not {@code null}.
      * @param context the context
-     * @return the filtered value, including {@code null}.
+     * @return the filtered createValue, including {@code null}.
      */
     public static List<PropertyValue> applyFilters(List<PropertyValue> values, ConfigurationContext context) {
         List<PropertyValue> result = new ArrayList<>();
@@ -83,7 +83,7 @@ public final class PropertyFiltering{
      * Filters all properties.
      * @param rawProperties the unfiltered properties, not {@code null}.
      * @param context the context
-     * @return the filtered value, including {@code null}.
+     * @return the filtered createValue, including {@code null}.
      */
     public static Map<String, PropertyValue> applyFilters(Map<String, PropertyValue> rawProperties, ConfigurationContext context) {
         Map<String, PropertyValue> result = new HashMap<>();
@@ -106,7 +106,7 @@ public final class PropertyFiltering{
     /**
      * Basic filter logic.
      * @param context the filter context, not {@code null}.
-     * @return the filtered value.
+     * @return the filtered createValue.
      */
     private static PropertyValue filterValue(PropertyValue inputValue, FilterContext context) {
         PropertyValue filteredValue = inputValue;

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertySourceComparator.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertySourceComparator.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertySourceComparator.java
index 92057c4..cccdd34 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertySourceComparator.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/PropertySourceComparator.java
@@ -71,18 +71,18 @@ public class PropertySourceComparator implements Comparator<PropertySource>, Ser
     }
 
     /**
-     * Evaluates an ordinal value from a {@link PropertySource}, whereby the ordinal of type {@code int}
+     * Evaluates an ordinal createValue from a {@link PropertySource}, whereby the ordinal of type {@code int}
      * is evaluated as follows:
      * <ol>
-     *     <li>It evaluates the {@code String} value for {@link PropertySource#TAMAYA_ORDINAL} and tries
-     *     to convert it to an {@code int} value, using {@link Integer#parseInt(String)}.</li>
+     *     <li>It evaluates the {@code String} createValue for {@link PropertySource#TAMAYA_ORDINAL} and tries
+     *     to convert it to an {@code int} createValue, using {@link Integer#parseInt(String)}.</li>
      *     <li>It tries to find and evaluate a method {@code int getOrdinal()}.</li>
      *     <li>It tries to find and evaluate a static field {@code int ORDINAL}.</li>
      *     <li>It tries to find and evaluate a class level {@link Priority} annotation.</li>
      *     <li>It uses the default priority ({@code 0}.</li>
      * </ol>
      * @param propertySource the property source, not {@code null}.
-     * @return the ordinal value to compare the property source.
+     * @return the ordinal createValue to compare the property source.
      */
     public static int getOrdinal(PropertySource propertySource) {
         return getOrdinal(propertySource, null);

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BasePropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BasePropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BasePropertySource.java
index c026a11..bf75fb9 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BasePropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BasePropertySource.java
@@ -125,7 +125,7 @@ public abstract class BasePropertySource implements PropertySource{
     }
 
     /**
-     * Returns the  default ordinal used, when no ordinal is setCurrent, or the ordinal was not parseable to an int value.
+     * Returns the  default ordinal used, when no ordinal is setCurrent, or the ordinal was not parseable to an int createValue.
      * @return the  default ordinal used, by default 0.
      */
     public int getDefaultOrdinal(){

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BuildablePropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BuildablePropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BuildablePropertySource.java
index fbea188..a5a5a05 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BuildablePropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/BuildablePropertySource.java
@@ -140,7 +140,7 @@ public class BuildablePropertySource implements PropertySource{
          * With simple property builder.
          *
          * @param key   the key
-         * @param value the value
+         * @param value the createValue
          * @return the builder
          */
         public Builder withSimpleProperty(String key, String value) {
@@ -151,7 +151,7 @@ public class BuildablePropertySource implements PropertySource{
          * With simple property builder.
          *
          * @param key    the key
-         * @param value  the value
+         * @param value  the createValue
          * @param source the source
          * @return the builder
          */

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/CLIPropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/CLIPropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/CLIPropertySource.java
index 8364ec2..f7bf8a3 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/CLIPropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/CLIPropertySource.java
@@ -73,7 +73,7 @@ public class CLIPropertySource extends BasePropertySource {
 
     /**
      * Configure the main arguments, hereby parsing and mapping the main arguments into
-     * configuration properties as key-value pairs.
+     * configuration properties as key-createValue pairs.
      * @param args the main arguments, not null.
      */
     public static void initMainArgs(String... args){

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySource.java
index df16b76..f16903f 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySource.java
@@ -26,8 +26,8 @@ import java.util.Map;
 
 /**
  * <p>{@link org.apache.tamaya.spi.PropertySource} to access environment variables via Tamaya
- * which are setCurrent via {@code export VARIABLE=value} on UNIX systems or
- * {@code setCurrent VARIABLE=value} on Windows systems.</p>
+ * which are setCurrent via {@code export VARIABLE=createValue} on UNIX systems or
+ * {@code setCurrent VARIABLE=createValue} on Windows systems.</p>
  *
  * <p>Using the {@linkplain EnvironmentPropertySource} without any
  * additional configuration gives access to all existing environment
@@ -71,7 +71,7 @@ import java.util.Map;
  * $ java -Dtamaya.envprops.prefix=a81 -jar application.jar
  * </pre>
  *
- * <p>The application specific value can now be accessed from the code of the
+ * <p>The application specific createValue can now be accessed from the code of the
  * application like this:</p>
  *
  * <pre>
@@ -153,7 +153,7 @@ public class EnvironmentPropertySource extends BasePropertySource {
     }
 
     /**
-     * Creates a new instance using a fixed ordinal value.
+     * Creates a new instance using a fixed ordinal createValue.
      * @param ordinal the ordinal number.
      */
     public EnvironmentPropertySource(int ordinal){

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SimplePropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SimplePropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SimplePropertySource.java
index 335ed23..690a809 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SimplePropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SimplePropertySource.java
@@ -262,7 +262,7 @@ public class SimplePropertySource extends BasePropertySource {
          * Sets the {@code properties} and returns a reference to this Builder so that the methods can be chained together.
          *
          * @param key the {@code properties} key to setCurrent
-         * @param val the {@code properties} value to setCurrent
+         * @param val the {@code properties} createValue to setCurrent
          * @return a reference to this Builder
          */
         public Builder withProperty(String key, String val) {

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SystemPropertySource.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SystemPropertySource.java b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SystemPropertySource.java
index 7f7fac2..f3e9dd1 100644
--- a/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SystemPropertySource.java
+++ b/code/spi-support/src/main/java/org/apache/tamaya/spisupport/propertysource/SystemPropertySource.java
@@ -101,7 +101,7 @@ public class SystemPropertySource extends BasePropertySource {
     }
 
     /**
-     * Creates a new instance using a fixed ordinal value.
+     * Creates a new instance using a fixed ordinal createValue.
      * @param ordinal the ordinal number.
      */
     public SystemPropertySource(int ordinal){

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/C.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/C.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/C.java
index 9d51bb0..648cd15 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/C.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/C.java
@@ -38,8 +38,8 @@ public class C extends B implements Readable{
     }
 
     /**
-     * Returns the input value, setCurrent on creation. Used for test assertion.
-     * @return the in value.
+     * Returns the input createValue, setCurrent on creation. Used for test assertion.
+     * @return the in createValue.
      */
     public String getInValue() {
         return inValue;

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultConfigurationTest.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultConfigurationTest.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultConfigurationTest.java
index afe5db6..6dd14d7 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultConfigurationTest.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultConfigurationTest.java
@@ -164,7 +164,7 @@ public class DefaultConfigurationTest {
     }
 
     /**
-     * Tests for convertValue(String key, String value, TypeLiteral<T> type)
+     * Tests for convertValue(String key, String createValue, TypeLiteral<T> type)
      */
     @Test
     public void testConvertValue() {

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultServiceContextTest.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultServiceContextTest.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultServiceContextTest.java
index 0cb21ab..934a0e3 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultServiceContextTest.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/DefaultServiceContextTest.java
@@ -23,6 +23,7 @@ import org.apache.tamaya.spi.ConfigurationProviderSpi;
 import org.junit.Test;
 
 import javax.annotation.Priority;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import static org.assertj.core.api.Assertions.*;
@@ -104,6 +105,22 @@ public class DefaultServiceContextTest {
         assertThat(services.isEmpty()).isTrue();
     }
 
+    @Test
+    public void testRegister_One() throws Exception {
+        context.register(Long.class, Long.valueOf(11L), true);
+        Long service = context.getService(Long.class);
+        assertThat(service).isNotNull();
+    }
+
+    @Test
+    public void testRegister_Many() throws Exception {
+        context.register(Double.class, Arrays.asList(Double.valueOf(1.2345), Double.valueOf(2345), Double.valueOf(345)), false);
+        List<Double> services = context.getServices(Double.class);
+        assertThat(services).isNotNull();
+        assertThat(services.isEmpty()).isFalse();
+        assertThat(services.size()).isEqualTo(3);
+    }
+
 
     // some test interfaces and classes
 

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContext.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContext.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContext.java
deleted file mode 100644
index 96d2cd4..0000000
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContext.java
+++ /dev/null
@@ -1,83 +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.spisupport;
-
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.*;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class EmptyConfigurationContext implements ConfigurationContext{
-
-    private static final ConfigurationContext INSTANCE = new EmptyConfigurationContext();
-
-    @Override
-    public ServiceContext getServiceContext() {
-        return ServiceContextManager.getServiceContext(getClass().getClassLoader());
-    }
-
-    @Override
-    public void addPropertySources(PropertySource... propertySources) {
-    }
-
-    @Override
-    public List<PropertySource> getPropertySources() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public PropertySource getPropertySource(String name) {
-        return null;
-    }
-
-    @Override
-    public <T> void addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter) {
-    }
-
-    @Override
-    public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-        return Collections.emptyMap();
-    }
-
-    @Override
-    public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public List<PropertyFilter> getPropertyFilters() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
-        return PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_POLICY;
-    }
-
-    @Override
-    public ConfigurationContextBuilder toBuilder() {
-        return EmptyConfigurationContextBuilder.instance();
-    }
-
-    public static ConfigurationContext instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContextBuilder.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContextBuilder.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContextBuilder.java
index 5ea6bfa..837445d 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContextBuilder.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/EmptyConfigurationContextBuilder.java
@@ -43,6 +43,16 @@ public class EmptyConfigurationContextBuilder implements ConfigurationContextBui
     }
 
     @Override
+    public ConfigurationContextBuilder addMetaData(Map<String, String> metaData) {
+        return this;
+    }
+
+    @Override
+    public ConfigurationContextBuilder addMetaData(String key, String value) {
+        return this;
+    }
+
+    @Override
     public ConfigurationContextBuilder addPropertySources(PropertySource... propertySources) {
         return this;
     }
@@ -179,7 +189,7 @@ public class EmptyConfigurationContextBuilder implements ConfigurationContextBui
 
     @Override
     public ConfigurationContext build() {
-        return EmptyConfigurationContext.instance();
+        return ConfigurationContext.EMPTY;
     }
 
     public static ConfigurationContextBuilder instance() {

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/MockedConfigurationContext.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/MockedConfigurationContext.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/MockedConfigurationContext.java
index 23226b0..5c09039 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/MockedConfigurationContext.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/MockedConfigurationContext.java
@@ -18,10 +18,8 @@
  */
 package org.apache.tamaya.spisupport;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
 import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.spi.*;
 
@@ -34,6 +32,7 @@ public class MockedConfigurationContext implements ConfigurationContext {
     ServiceContext serviceContext = ServiceContextManager.getServiceContext(getClass().getClassLoader());
     PropertyConverterManager pcm = new PropertyConverterManager(serviceContext,false);
     List<PropertySource> pss = new ArrayList<>();
+    Map<String,String> metaData = new HashMap<>();
 
     public MockedConfigurationContext() {
         pcm.register(TypeLiteral.of(Integer.class), new IntegerTestConverter());
@@ -41,6 +40,11 @@ public class MockedConfigurationContext implements ConfigurationContext {
     }
 
     @Override
+    public Map<String, String> getMetadata() {
+        return metaData;
+    }
+
+    @Override
     public ServiceContext getServiceContext() {
         return serviceContext;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
index aa0fe85..7e7d64e 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/RegexPropertyFilterTest.java
@@ -34,7 +34,7 @@ public class RegexPropertyFilterTest {
     private static PropertyValue prop1 = PropertyValue.of("test1", "test1", "test");
     private static PropertyValue prop2 = PropertyValue.of("test2", "test2", "test");
     private static PropertyValue prop3 = PropertyValue.of("test1.test3", "test.test3", "test");
-    private static ConfigurationContext configContext = EmptyConfigurationContext.instance();
+    private static ConfigurationContext configContext = ConfigurationContext.EMPTY;
 
     @org.junit.Test
     public void testFilterProperty() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySourceTest.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySourceTest.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySourceTest.java
index 2b7928e..bff46d7 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySourceTest.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/propertysource/EnvironmentPropertySourceTest.java
@@ -115,7 +115,7 @@ public class EnvironmentPropertySourceTest {
 		System.out.println(localEnvironmentPropertySource);
 		assertThat(localEnvironmentPropertySource.getPrefix()).isEqualTo("fancyprefix");
 		localEnvironmentPropertySource.setPropertiesProvider(new MockedSystemPropertiesProvider());
-		assertThat(localEnvironmentPropertySource.get("somekey").getValue()).isEqualTo("somekey.value");
+		assertThat(localEnvironmentPropertySource.get("somekey").getValue()).isEqualTo("somekey.createValue");
 	}
 
 	@Test
@@ -149,7 +149,7 @@ public class EnvironmentPropertySourceTest {
 	private class MockedSystemPropertiesProvider extends EnvironmentPropertySource.SystemPropertiesProvider {
 		@Override
 		String getenv(String key) {
-			return key + ".value";
+			return key + ".createValue";
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/code/spi-support/src/test/java/org/apache/tamaya/spisupport/services/DefaultServiceContext.java
----------------------------------------------------------------------
diff --git a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/services/DefaultServiceContext.java b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/services/DefaultServiceContext.java
index 963bfbb..c0e4a23 100644
--- a/code/spi-support/src/test/java/org/apache/tamaya/spisupport/services/DefaultServiceContext.java
+++ b/code/spi-support/src/test/java/org/apache/tamaya/spisupport/services/DefaultServiceContext.java
@@ -19,6 +19,7 @@
 package org.apache.tamaya.spisupport.services;
 
 import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.spi.ClassloaderAware;
 import org.apache.tamaya.spi.ServiceContext;
 import org.apache.tamaya.spisupport.PriorityServiceComparator;
 
@@ -28,6 +29,7 @@ import java.net.URL;
 import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -63,11 +65,12 @@ public final class DefaultServiceContext implements ServiceContext {
     @SuppressWarnings("rawtypes")
 	private Map<Class, Class> factoryTypes = new ConcurrentHashMap<>();
 
+
     @Override
-    public <T> T getService(Class<T> serviceType) {
+    public <T> T getService(Class<T> serviceType, Supplier<T> supplier) {
         Object cached = singletons.get(serviceType);
         if (cached == null) {
-            cached = create(serviceType);
+            cached = create(serviceType, supplier);
             if(cached!=null) {
                 singletons.put(serviceType, cached);
             }
@@ -76,12 +79,19 @@ public final class DefaultServiceContext implements ServiceContext {
     }
 
     @Override
-    public <T> T create(Class<T> serviceType) {
+    public <T> T create(Class<T> serviceType, Supplier<T> supplier) {
         @SuppressWarnings("unchecked")
-		Class<? extends T> implType = factoryTypes.get(serviceType);
+        Class<? extends T> implType = factoryTypes.get(serviceType);
         if(implType==null) {
-            Collection<T> services = getServices(serviceType);
+            Collection<T> services = loadServices(serviceType, null);
             if (services.isEmpty()) {
+                if(supplier!=null){
+                    T instance = supplier.get();
+                    if(instance instanceof ClassloaderAware){
+                        ((ClassloaderAware)instance).init(this.classLoader);
+                    }
+                    return instance;
+                }
                 return null;
             } else {
                 return getServiceWithHighestPriority(services, serviceType);
@@ -90,51 +100,51 @@ public final class DefaultServiceContext implements ServiceContext {
         try {
             return implType.newInstance();
         } catch (Exception e) {
-            LOG.log(Level.SEVERE, "Failed to create instance of " + implType.getName(), e);
+            LOG.log(Level.SEVERE, "Failed to createObject instance of " + implType.getName(), e);
+            if(supplier!=null){
+                return supplier.get();
+            }
             return  null;
         }
     }
 
-    /**
-     * Loads and registers services.
-     *
-     * @param <T>         the concrete type.
-     * @param serviceType The service type.
-     * @return the items found, never {@code null}.
-     */
+
     @Override
-    public <T> List<T> getServices(final Class<T> serviceType) {
+    public <T> List<T> getServices(Class<T> serviceType, Supplier<List<T>> supplier) {
         @SuppressWarnings("unchecked")
-		List<T> found = (List<T>) servicesLoaded.get(serviceType);
+        List<T> found = (List<T>) servicesLoaded.get(serviceType);
         if (found != null) {
             return found;
         }
+        List<T> services = loadServices(serviceType, supplier);
+        @SuppressWarnings("unchecked")
+        final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>) services));
+        return previousServices != null ? previousServices : services;
+    }
+
+    private <T> List<T> loadServices(Class<T> serviceType, Supplier<List<T>> supplier) {
         List<T> services = new ArrayList<>();
         try {
-            for (T t : ServiceLoader.load(serviceType)) {
+            for (T t : ServiceLoader.load(serviceType, classLoader)) {
                 services.add(t);
             }
-            if(services.isEmpty()) {
-                for (T t : ServiceLoader.load(serviceType, serviceType.getClassLoader())) {
-                    services.add(t);
-                }
-            }
             Collections.sort(services, PriorityServiceComparator.getInstance());
             services = Collections.unmodifiableList(services);
         } catch (ServiceConfigurationError e) {
             LOG.log(Level.WARNING,
                     "Error loading services current type " + serviceType, e);
+            if(supplier!=null){
+                services = supplier.get();
+            }
             if(services==null){
                 services = Collections.emptyList();
             }
         }
-        @SuppressWarnings("unchecked")
-		final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>) services));
-        return previousServices != null ? previousServices : services;
+        return services;
     }
 
     /**
-     * Checks the given instance for a @Priority annotation. If present the annotation's value is evaluated. If no such
+     * Checks the given instance for a @Priority annotation. If present the annotation's createValue is evaluated. If no such
      * annotation is present, a default priority of {@code 1} is returned.
      * @param o the instance, not {@code null}.
      * @return a priority, by default 1.
@@ -158,7 +168,7 @@ public final class DefaultServiceContext implements ServiceContext {
      */
     private <T> T getServiceWithHighestPriority(Collection<T> services, Class<T> serviceType) {
         T highestService = null;
-        // we do not need the priority stuff if the list contains only one element
+        // we do not need the priority stuff if the createList contains only one element
         if (services.size() == 1) {
             highestService = services.iterator().next();
             this.factoryTypes.put(serviceType, highestService.getClass());
@@ -186,7 +196,9 @@ public final class DefaultServiceContext implements ServiceContext {
                                                            highestPriority,
                                                            services));
         }
-        this.factoryTypes.put(serviceType, highestService.getClass());
+        if(highestService!=null) {
+            this.factoryTypes.put(serviceType, highestService.getClass());
+        }
         return highestService;
     }
 
@@ -210,4 +222,24 @@ public final class DefaultServiceContext implements ServiceContext {
         return classLoader.getResource(resource);
     }
 
+    @Override
+    public <T> T register(Class<T> type, T instance, boolean force) {
+        if(force){
+            singletons.put(type, instance);
+        }else{
+            singletons.putIfAbsent(type, instance);
+        }
+        return (T)singletons.get(type);
+    }
+
+    @Override
+    public <T> List<T> register(Class<T> type, List<T> instances, boolean force) {
+        if(force){
+            singletons.put(type, Collections.unmodifiableList(instances));
+        }else {
+            servicesLoaded.putIfAbsent(type, Collections.unmodifiableList(instances));
+        }
+        return (List<T>)servicesLoaded.get(type);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/Main.java
----------------------------------------------------------------------
diff --git a/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/Main.java b/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/Main.java
index dc254e8..a56d18c 100644
--- a/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/Main.java
+++ b/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/Main.java
@@ -19,7 +19,6 @@
 package org.apache.tamaya.examples.custompropertysource;
 
 import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
 
 import java.io.PrintStream;
 import java.util.Map;
@@ -64,7 +63,7 @@ public class Main {
     }
 
     public static void main(String[] args) {
-        Configuration cfg = ConfigurationProvider.getConfiguration();
+        Configuration cfg = Configuration.current();
 
         System.out.println("*****************************************************");
         System.out.println("Simple Example (with a PropertySource and a Provider)");

http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/67ffcbf2/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/SimplePropertySource.java
----------------------------------------------------------------------
diff --git a/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/SimplePropertySource.java b/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/SimplePropertySource.java
index d21230e..7510090 100644
--- a/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/SimplePropertySource.java
+++ b/examples/02-custom-property-source/src/main/java/org/apache/tamaya/examples/custompropertysource/SimplePropertySource.java
@@ -43,8 +43,8 @@ public class SimplePropertySource extends BasePropertySource {
 
             for(Map.Entry en: properties.entrySet()){
                 props.put(en.getKey().toString(),
-                        PropertyValue.of(en.getKey().toString(), en.getValue().toString(),
-                                getName()));
+                        PropertyValue.createValue(en.getKey().toString(), en.getValue().toString())
+                        .setMeta("source", getName()));
             }
         }
         finally{