You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2015/01/03 12:59:28 UTC
[19/27] incubator-tamaya git commit: TAMAYA-42, 43,
44: Added initial implementation of Configuration, ConfigurationContext,
ResourceLoading and ConfigurationFormat.
TAMAYA-42,43,44: Added initial implementation of Configuration, ConfigurationContext, ResourceLoading and ConfigurationFormat.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/8b2cc9b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/8b2cc9b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/8b2cc9b1
Branch: refs/heads/master
Commit: 8b2cc9b15c95470ea430bea899ba5854d4ce434c
Parents: b56817f
Author: anatole <an...@apache.org>
Authored: Sat Jan 3 09:44:57 2015 +0100
Committer: anatole <an...@apache.org>
Committed: Sat Jan 3 09:44:57 2015 +0100
----------------------------------------------------------------------
core/pom.xml | 36 +++++
.../core/PathBasedPropertySourceProvider.java | 76 +++++++++
.../core/ResourcePropertySourceProvider.java | 83 ++++++++++
.../core/formats/ConfigurationFormat.java | 46 ++++++
.../tamaya/core/formats/PropertiesFormat.java | 109 +++++++++++++
.../core/formats/PropertiesXmlFormat.java | 111 +++++++++++++
.../core/internal/DefaultConfiguration.java | 68 ++++++++
.../internal/DefaultConfigurationContext.java | 158 +++++++++++++++++++
.../core/internal/DefaultServiceContext.java | 89 +++++++++++
.../resource/DefaultResourceLoader.java | 94 +++++++++++
.../services/org.apache.tamaya.Configuration | 19 +++
....apache.tamaya.core.resources.ResourceLoader | 19 +++
.../org.apache.tamaya.spi.ConfigurationContext | 19 +++
.../org.apache.tamaya.spi.ServiceContext | 19 +++
.../apache/tamaya/core/ConfigurationTest.java | 53 +++++++
.../TestPropertyDefaultSourceProvider.java | 32 ++++
...org.apache.tamaya.spi.PropertySourceProvider | 20 +++
.../resources/cfg/defaults/test1.properties | 20 +++
.../cfg/final/anotherTestFile.properties | 22 +++
19 files changed, 1093 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 26ccce0..64c868a 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,12 +30,48 @@ under the License.
<artifactId>tamaya-core</artifactId>
+ <properties>
+ <slf4j.version>1.7.2</slf4j.version>
+ <log4j.version>1.2.17</log4j.version>
+ <log4j2.version>2.1</log4j2.version>
+ </properties>
+
<dependencies>
<dependency>
<groupId>org.apache.tamaya</groupId>
<artifactId>tamaya-api</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- Deps for logging backends -->
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>${log4j.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-api</artifactId>
+ <version>${log4j2.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/PathBasedPropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/PathBasedPropertySourceProvider.java b/core/src/main/java/org/apache/tamaya/core/PathBasedPropertySourceProvider.java
new file mode 100644
index 0000000..aba7a9f
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/PathBasedPropertySourceProvider.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core;
+
+import org.apache.tamaya.core.formats.ConfigurationFormat;
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.core.resources.ResourceLoader;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.apache.tamaya.spi.ServiceContext;
+
+import java.util.*;
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of a PropertySourceProvider that reads configuration from some given resource paths
+ * and using the goven formats.
+ */
+public class PathBasedPropertySourceProvider implements PropertySourceProvider {
+
+ private static final Logger LOG = Logger.getLogger(PathBasedPropertySourceProvider.class.getName());
+
+ private String baseName;
+ private List<ConfigurationFormat> configFormats = new ArrayList<>();
+ private List<String> paths = new ArrayList<>();
+
+ public PathBasedPropertySourceProvider(String baseName, List<ConfigurationFormat> formats, String... paths) {
+ this.baseName = Objects.requireNonNull(baseName);
+ this.configFormats.addAll(Objects.requireNonNull(formats));
+ this.paths.addAll(Arrays.asList(Objects.requireNonNull(paths)));
+ }
+
+ public PathBasedPropertySourceProvider(String baseName, ConfigurationFormat format, String... paths) {
+ this.baseName = Objects.requireNonNull(baseName);
+ this.configFormats.add(Objects.requireNonNull(format));
+ this.paths.addAll(Arrays.asList(Objects.requireNonNull(paths)));
+ }
+
+ @Override
+ public Collection<PropertySource> getPropertySources(){
+ List<PropertySource> propertySources = new ArrayList<>();
+ paths.forEach((path) -> {
+ for (Resource res : ServiceContext.getInstance().getService(ResourceLoader.class).get().getResources(path)) {
+ try{
+ for(ConfigurationFormat format:configFormats){
+ propertySources.addAll(format.readConfiguration(res));
+ }
+ }
+ catch(Exception e){
+ LOG.log(Level.WARNING, "Failed to add resource based config: " + res.getDisplayName(), e);
+ }
+ }
+ });
+ return propertySources;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/ResourcePropertySourceProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/ResourcePropertySourceProvider.java b/core/src/main/java/org/apache/tamaya/core/ResourcePropertySourceProvider.java
new file mode 100644
index 0000000..978ab9a
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/ResourcePropertySourceProvider.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.core;
+
+import org.apache.tamaya.core.formats.ConfigurationFormat;
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+public class ResourcePropertySourceProvider implements PropertySourceProvider {
+
+ private static final Logger LOG = Logger.getLogger(ResourcePropertySourceProvider.class.getName());
+
+ private List<ConfigurationFormat> formats = new ArrayList<>();
+
+ private Resource resource;
+
+ public ResourcePropertySourceProvider(Resource resource, ConfigurationFormat... formats) {
+ this.resource = Objects.requireNonNull(resource);
+ this.formats.addAll(Arrays.asList(formats));
+ }
+
+ public ResourcePropertySourceProvider(Resource resource, List<ConfigurationFormat> formats) {
+ this.resource = Objects.requireNonNull(resource);
+ this.formats.addAll(formats);
+ }
+
+
+ /**
+ * Get the underlying resource.
+ *
+ * @return
+ */
+ public Resource getResource() {
+ return this.resource;
+ }
+
+
+ @Override
+ public String toString() {
+ return "ResourcePropertySourceProvider{" +
+ "resource=" + resource +
+ ", formats=+" + formats +
+ '}';
+ }
+
+ @Override
+ public Collection<PropertySource> getPropertySources() {
+ List<PropertySource> propertySources = new ArrayList<>();
+ for (ConfigurationFormat format : formats) {
+ try {
+ propertySources.addAll(format.readConfiguration(resource));
+ } catch (Exception e) {
+ LOG.info(() -> "Format was not matching: " + format + " for resource: " + resource.getDisplayName());
+ }
+ }
+ return propertySources;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/formats/ConfigurationFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/formats/ConfigurationFormat.java b/core/src/main/java/org/apache/tamaya/core/formats/ConfigurationFormat.java
new file mode 100644
index 0000000..e9308c7
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/formats/ConfigurationFormat.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.core.formats;
+
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * Implementations current this class encapsulate the mechanism how to read a
+ * resource including interpreting the format correctly (e.g. xml vs.
+ * properties). In most cases file only contains entries of the same priority, which would then
+ * result in only one {@link PropertySource}. Complex file formats, hoiwever, may contain entries
+ * of different priorities. In this cases, each ordinal type found must be returned as a separate
+ * {@link PropertySource} instance.
+ */
+@FunctionalInterface
+public interface ConfigurationFormat{
+
+ /**
+ * Reads a list {@link org.apache.tamaya.spi.PropertySource} instances from a resource, using this format.
+ * Hereby the ordinal given is used as a base ordinal
+ * @param resource the configuration resource, not null
+ * @return the corresponding {@link java.util.Map}, never {@code null}.
+ */
+ Collection<PropertySource> readConfiguration(Resource resource)throws IOException;
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/formats/PropertiesFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/formats/PropertiesFormat.java b/core/src/main/java/org/apache/tamaya/core/formats/PropertiesFormat.java
new file mode 100644
index 0000000..dc3d9bb
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/formats/PropertiesFormat.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.formats;
+
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of a configuration format for -properties files.
+ */
+public class PropertiesFormat implements ConfigurationFormat{
+
+ private final static Logger LOG = Logger.getLogger(PropertiesFormat.class.getName());
+
+ /** The target ordinal. */
+ private int ordinal;
+
+ /**
+ * Creates a new ordinal.
+ * @param ordinal the target ordinal.
+ */
+ private PropertiesFormat(int ordinal){
+ this.ordinal = ordinal;
+ }
+
+ public static PropertiesFormat of(int ordinal){
+ // TODO caching...
+ return new PropertiesFormat(ordinal);
+ }
+
+ /**
+ * Get the target ordinal, produced by this format.
+ * @return the target ordinal
+ */
+ public int getOrdinal(){
+ return ordinal;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection<PropertySource> readConfiguration(Resource resource) {
+ if (resource.exists()) {
+ List<PropertySource> propertySources = new ArrayList<>();
+ try (InputStream is = resource.getInputStream()) {
+ final Properties p = new Properties();
+ p.load(is);
+ propertySources.add(new PropertySource(){
+ @Override
+ public int getOrdinal() {
+ return ordinal;
+ }
+
+ @Override
+ public String getName() {
+ return resource.getDisplayName();
+ }
+
+ @Override
+ public Optional<String> get(String key) {
+ return Optional.ofNullable(p.getProperty(key));
+ }
+
+ @Override
+ public Map<String, String> getProperties() {
+ return Map.class.cast(p);
+ }
+ });
+ return propertySources;
+ } catch (Exception e) {
+ LOG.log(Level.FINEST, e, () -> "Failed to read config from resource: " + resource);
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String toString() {
+ return "PropertiesFormat{" +
+ "ordinal=" + ordinal +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/formats/PropertiesXmlFormat.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/formats/PropertiesXmlFormat.java b/core/src/main/java/org/apache/tamaya/core/formats/PropertiesXmlFormat.java
new file mode 100644
index 0000000..625dd32
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/formats/PropertiesXmlFormat.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.formats;
+
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.spi.PropertySource;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+public class PropertiesXmlFormat implements ConfigurationFormat {
+
+ private final static Logger LOG = Logger.getLogger(PropertiesXmlFormat.class.getName());
+
+ /**
+ * The target ordinal.
+ */
+ private int ordinal;
+
+ /**
+ * Creates a new ordinal.
+ *
+ * @param ordinal the target ordinal.
+ */
+ private PropertiesXmlFormat(int ordinal) {
+ this.ordinal = ordinal;
+ }
+
+ public static PropertiesXmlFormat of(int ordinal){
+ // TODO caching...
+ return new PropertiesXmlFormat(ordinal);
+ }
+
+ /**
+ * Get the target ordinal, produced by this format.
+ *
+ * @return the target ordinal
+ */
+ public int getOrdinal() {
+ return ordinal;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Collection<PropertySource> readConfiguration(Resource resource) {
+ if (resource.exists()) {
+ List<PropertySource> propertySources = new ArrayList<>();
+ try (InputStream is = resource.getInputStream()) {
+ final Properties p = new Properties();
+ p.loadFromXML(is);
+ propertySources.add(new PropertySource() {
+ @Override
+ public int getOrdinal() {
+ return ordinal;
+ }
+
+ @Override
+ public String getName() {
+ return resource.getDisplayName();
+ }
+
+ @Override
+ public Optional<String> get(String key) {
+ return Optional.ofNullable(p.getProperty(key));
+ }
+
+ @Override
+ public Map<String, String> getProperties() {
+ return Map.class.cast(p);
+ }
+ });
+ return propertySources;
+ } catch (Exception e) {
+ LOG.log(Level.FINEST, e, () -> "Failed to read config from resource: " + resource);
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String toString() {
+ return "PropertiesXmlFormat{" +
+ "ordinal=" + ordinal +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java b/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java
new file mode 100644
index 0000000..ef27c87
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.internal;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.ServiceContext;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Implementation of the Configuration API.
+ */
+public class DefaultConfiguration implements Configuration{
+
+ @Override
+ public Optional<String> get(String key) {
+ List<PropertySource> propertySources = ServiceContext.getInstance().getService(ConfigurationContext.class).get().getPropertySources();
+ for(PropertySource propertySource:propertySources){
+ Optional<String> value = propertySource.get(key);
+ if(value.isPresent()){
+ return value;
+ }
+ }
+ return Optional.empty();
+ }
+
+ @Override
+ public <T> Optional<T> get(String key, Class<T> type) {
+ Optional<String> value = get(key);
+ if(value.isPresent()){
+ List<PropertyConverter<T>> converters = ServiceContext.getInstance().getService(ConfigurationContext.class).get().getPropertyConverters(type);
+ for(PropertyConverter<T> converter:converters){
+ try{
+ T t = converter.convert(value.get());
+ if(t!=null){
+ return Optional.of(t);
+ }
+ }
+ catch(Exception e){
+ // TODO LOG
+ }
+ }
+ throw new ConfigException("Unparseable config value for type: " + type.getName() + ": " + key);
+ }
+ return Optional.empty();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java b/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java
new file mode 100644
index 0000000..90b1d16
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.internal;
+
+import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.PropertyFilter;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertySourceProvider;
+import org.apache.tamaya.spi.ServiceContext;
+
+import javax.annotation.Priority;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.StampedLock;
+import java.util.stream.Stream;
+
+/**
+ * Default Implementation of a simple ConfigurationContext.
+ */
+public class DefaultConfigurationContext implements ConfigurationContext{
+
+ private PropertyConverterManager propertyConverterManager = new PropertyConverterManager();
+
+ private List<PropertySource> propertySources = new ArrayList<>();
+ private List<PropertySourceProvider> propertySourceProviders = new ArrayList<>();
+ private List<PropertyFilter> propertyFilters = new ArrayList<>();
+ private boolean loaded = false;
+
+ private StampedLock propertySourceLock = new StampedLock();
+
+
+ @Override
+ public void addPropertySources(PropertySource... propertySourcesToAdd) {
+ Lock writeLock = propertySourceLock.asWriteLock();
+ try{
+ writeLock.lock();
+ List<PropertySource> newPropertySources = new ArrayList<>(this.propertySources);
+ newPropertySources.addAll(Arrays.asList(propertySourcesToAdd));
+ Collections.sort(newPropertySources, this::comparePropertySources);
+ this.propertySources = newPropertySources;
+ }
+ finally{
+ writeLock.unlock();
+ }
+ }
+
+ /**
+ * Order property source reversely, the most important come first.
+ * @param source1
+ * @param source2
+ * @return
+ */
+ private int comparePropertySources(PropertySource source1, PropertySource source2){
+ if(source1.getOrdinal() < source2.getOrdinal()){
+ return 1;
+ }
+ else if(source1.getOrdinal()>source2.getOrdinal()){
+ return -1;
+ }
+ else{
+ return source2.getClass().getName().compareTo(source1.getClass().getName());
+ }
+ }
+
+ private int comparePropertyFilters(PropertyFilter filter1, PropertyFilter filter2){
+ Priority prio1 = filter1.getClass().getAnnotation(Priority.class);
+ Priority prio2 = filter2.getClass().getAnnotation(Priority.class);
+ int ord1 = prio1!=null?prio1.value():0;
+ int ord2 = prio2!=null?prio2.value():0;
+ if(ord1 < ord2){
+ return -1;
+ }
+ else if(ord1>ord2){
+ return 1;
+ }
+ else{
+ return filter1.getClass().getName().compareTo(filter2.getClass().getName());
+ }
+ }
+
+ @Override
+ public List<PropertySource> getPropertySources() {
+ if(!loaded){
+ Lock writeLock = propertySourceLock.asWriteLock();
+ try{
+ writeLock.lock();
+ if(!loaded) {
+ this.propertySources.addAll(ServiceContext.getInstance().getServices(PropertySource.class));
+ this.propertySourceProviders.addAll(ServiceContext.getInstance().getServices(PropertySourceProvider.class));
+ for (PropertySourceProvider prov : this.propertySourceProviders) {
+ try {
+ this.propertySources.addAll(prov.getPropertySources());
+ } catch (Exception e) {
+ //X TODO Log!
+ }
+ }
+ Collections.sort(this.propertySources, this::comparePropertySources);
+ this.propertyFilters.addAll(ServiceContext.getInstance().getServices(PropertyFilter.class));
+ Collections.sort(this.propertyFilters, this::comparePropertyFilters);
+ loaded = true;
+ }
+ }
+ finally{
+ writeLock.unlock();
+ }
+ }
+ Lock readLock = propertySourceLock.asReadLock();
+ try{
+ readLock.lock();
+ return Collections.unmodifiableList(propertySources);
+ }
+ finally{
+ readLock.unlock();
+ }
+ }
+
+ @Override
+ public <T> void addPropertyConverter(Class<T> typeToConvert, PropertyConverter<T> propertyConverter) {
+ propertyConverterManager.register(typeToConvert, propertyConverter);
+ }
+
+ @Override
+ public Map<Class<?>, List<PropertyConverter<?>>> getPropertyConverters() {
+ return propertyConverterManager.getPropertyConverters();
+ }
+
+ @Override
+ public <T> List<PropertyConverter<T>> getPropertyConverters(Class<T> targetType) {
+ return propertyConverterManager.getPropertyConverters(targetType);
+ }
+
+ @Override
+ public List<PropertyFilter> getPropertyFilters() {
+ return Collections.unmodifiableList(this.propertyFilters);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/internal/DefaultServiceContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/DefaultServiceContext.java b/core/src/main/java/org/apache/tamaya/core/internal/DefaultServiceContext.java
new file mode 100644
index 0000000..e86ca17
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/internal/DefaultServiceContext.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.internal;
+
+import org.apache.tamaya.spi.ServiceContext;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.ServiceLoader;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * This class implements the (default) {@link org.apache.tamaya.spi.ServiceContext} interface and hereby uses the JDK
+ * {@link java.util.ServiceLoader} to load the services required.
+ */
+public final class DefaultServiceContext implements ServiceContext {
+ /** List current services loaded, per class. */
+ private final ConcurrentHashMap<Class, List<Object>> servicesLoaded = new ConcurrentHashMap<>();
+ /** Singletons. */
+ private final Map<Class, Optional<?>> singletons = new ConcurrentHashMap<>();
+
+ @Override
+ public <T> Optional<T> getService(Class<T> serviceType) {
+ Optional<T> cached = Optional.class.cast(singletons.get(serviceType));
+ if(cached==null) {
+ List<? extends T> services = getServices(serviceType);
+ if (services.isEmpty()) {
+ cached = Optional.empty();
+ }
+ else{
+ cached = Optional.of(services.get(0));
+ }
+ singletons.put(serviceType, cached);
+ }
+ return cached;
+ }
+
+ /**
+ * Loads and registers services.
+ *
+ * @param serviceType
+ * The service type.
+ * @param <T>
+ * the concrete type.
+ * @return the items found, never {@code null}.
+ */
+ @Override
+ public <T> List<T> getServices(final Class<T> serviceType) {
+ List<T> found = List.class.cast(servicesLoaded.get(serviceType));
+ if (found != null) {
+ return found;
+ }
+ List<T> services = new ArrayList<>();
+ try {
+ for (T t : ServiceLoader.load(serviceType)) {
+ services.add(t);
+ }
+ services = Collections.unmodifiableList(services);
+ } catch (Exception e) {
+ Logger.getLogger(DefaultServiceContext.class.getName()).log(Level.WARNING,
+ "Error loading services current type " + serviceType, e);
+ }
+ final List<T> previousServices = List.class.cast(servicesLoaded.putIfAbsent(serviceType, (List<Object>)services));
+ return previousServices != null ? previousServices : services;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/java/org/apache/tamaya/core/internal/resource/DefaultResourceLoader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/resource/DefaultResourceLoader.java b/core/src/main/java/org/apache/tamaya/core/internal/resource/DefaultResourceLoader.java
new file mode 100644
index 0000000..c65be65
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/internal/resource/DefaultResourceLoader.java
@@ -0,0 +1,94 @@
+package org.apache.tamaya.core.internal.resource;
+
+import org.apache.tamaya.core.resources.Resource;
+import org.apache.tamaya.core.resources.ResourceLoader;
+
+import javax.annotation.Priority;
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+
+/**
+ * Simple default implementation of the resource loader.
+ */
+@Priority(0)
+public class DefaultResourceLoader implements ResourceLoader{
+
+ private static final Logger LOG = Logger.getLogger(DefaultResourceLoader.class.getName());
+
+ private WeakHashMap<ClassLoader, PathMatchingResourcePatternResolver> resourceLoaders = new WeakHashMap<>();
+
+ @Override
+ public List<Resource> getResources(ClassLoader classLoader, Collection<String> expressions) {
+ List<Resource> resources = new ArrayList<>();
+ for(String expression:expressions){
+ if(tryClassPath(classLoader, expression, resources) || tryFile(expression, resources) || tryURL(expression, resources)
+ || tryAntPath(classLoader, expression, resources)){
+ continue;
+ }
+ LOG.warning("Failed to resolve resource: " + expression);
+ }
+ return resources;
+ }
+
+ private boolean tryClassPath(ClassLoader classLoader, String expression, List<Resource> resources) {
+ try{
+ Enumeration<URL> urls = classLoader.getResources(expression);
+ while(urls.hasMoreElements()){
+ URL url = urls.nextElement();
+ resources.add(new UrlResource(url));
+ }
+ return !resources.isEmpty();
+ }
+ catch(Exception e){
+ LOG.finest(() -> "Failed to load resource from CP: " + expression);
+ }
+ return false;
+ }
+
+ private boolean tryFile(String expression, List<Resource> resources) {
+ try{
+ File file = new File(expression);
+ if(file.exists()) {
+ resources.add(new FileSystemResource(file));
+ return true;
+ }
+ }
+ catch(Exception e){
+ LOG.finest(() -> "Failed to load resource from file: " + expression);
+ }
+ return false;
+ }
+
+ private boolean tryURL(String expression, List<Resource> resources) {
+ try{
+ URL url = new URL(expression);
+ resources.add(new UrlResource(url));
+ return true;
+ }
+ catch(Exception e){
+ LOG.finest(() -> "Failed to load resource from file: " + expression);
+ }
+ return false;
+
+ }
+
+ private boolean tryAntPath(ClassLoader classLoader, String expression, List<Resource> resources) {
+ PathMatchingResourcePatternResolver loader = resourceLoaders.computeIfAbsent(classLoader, cl -> new PathMatchingResourcePatternResolver(cl));
+ try{
+ resources.addAll(Arrays.asList(loader.getResources(expression)));
+ return !resources.isEmpty();
+ }
+ catch(Exception e){
+ LOG.finest(() -> "Failed to load resources from pattern: " + expression);
+ }
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/resources/META-INF/services/org.apache.tamaya.Configuration
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/org.apache.tamaya.Configuration b/core/src/main/resources/META-INF/services/org.apache.tamaya.Configuration
new file mode 100644
index 0000000..0db8402
--- /dev/null
+++ b/core/src/main/resources/META-INF/services/org.apache.tamaya.Configuration
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.tamaya.core.internal.DefaultConfiguration
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/resources/META-INF/services/org.apache.tamaya.core.resources.ResourceLoader
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/org.apache.tamaya.core.resources.ResourceLoader b/core/src/main/resources/META-INF/services/org.apache.tamaya.core.resources.ResourceLoader
new file mode 100644
index 0000000..08c9577
--- /dev/null
+++ b/core/src/main/resources/META-INF/services/org.apache.tamaya.core.resources.ResourceLoader
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.tamaya.core.internal.resource.DefaultResourceLoader
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationContext
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationContext b/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationContext
new file mode 100644
index 0000000..32b4302
--- /dev/null
+++ b/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ConfigurationContext
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.tamaya.core.internal.DefaultConfigurationContext
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
----------------------------------------------------------------------
diff --git a/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext b/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
new file mode 100644
index 0000000..2721eff
--- /dev/null
+++ b/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.ServiceContext
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.tamaya.core.internal.DefaultServiceContext
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/test/java/org/apache/tamaya/core/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/tamaya/core/ConfigurationTest.java b/core/src/test/java/org/apache/tamaya/core/ConfigurationTest.java
new file mode 100644
index 0000000..9c7b894
--- /dev/null
+++ b/core/src/test/java/org/apache/tamaya/core/ConfigurationTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core;
+
+import org.apache.tamaya.Configuration;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * This tests checks if the combination of 2 prioritized PropertySource return valid results on the final Configuration.
+ */
+public class ConfigurationTest {
+
+ @Test
+ public void testAccess(){
+ assertNotNull(Configuration.current());
+ }
+
+ @Test
+ public void testContent(){
+ assertEquals("Robin", Configuration.current().get("name").get());
+ assertEquals("Sabine", Configuration.current().get("name2").get()); // from default
+ assertEquals("Lukas", Configuration.current().get("name3").get()); // oderridden default
+ assertEquals("Sereina", Configuration.current().get("name4").get()); // final only
+ assertEquals("Benjamin", Configuration.current().get("name5").get()); // final only
+
+ System.out.println("name : " + Configuration.current().get("name").get());
+ System.out.println("name2: " + Configuration.current().get("name2").get());
+ System.out.println("name3: " + Configuration.current().get("name3").get());
+ System.out.println("name4: " + Configuration.current().get("name4").get());
+ System.out.println("name5: " + Configuration.current().get("name5").get());
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/test/java/org/apache/tamaya/core/testdata/TestPropertyDefaultSourceProvider.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/tamaya/core/testdata/TestPropertyDefaultSourceProvider.java b/core/src/test/java/org/apache/tamaya/core/testdata/TestPropertyDefaultSourceProvider.java
new file mode 100644
index 0000000..ebd28f7
--- /dev/null
+++ b/core/src/test/java/org/apache/tamaya/core/testdata/TestPropertyDefaultSourceProvider.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.core.testdata;
+
+import org.apache.tamaya.core.PathBasedPropertySourceProvider;
+import org.apache.tamaya.core.formats.PropertiesFormat;
+
+/**
+ * Test provider reading properties from classpath:cfg/defaults/**.properties.
+ */
+public class TestPropertyDefaultSourceProvider extends PathBasedPropertySourceProvider{
+
+ public TestPropertyDefaultSourceProvider() {
+ super("default-testdata-properties", PropertiesFormat.of(100), "classpath:cfg/defaults/**/*.properties");
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
----------------------------------------------------------------------
diff --git a/core/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider b/core/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
new file mode 100644
index 0000000..e61641c
--- /dev/null
+++ b/core/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+testdata.TestPropertyDefaultSourceProvider
+testdata.TestPropertySourceProvider
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/test/resources/cfg/defaults/test1.properties
----------------------------------------------------------------------
diff --git a/core/src/test/resources/cfg/defaults/test1.properties b/core/src/test/resources/cfg/defaults/test1.properties
new file mode 100644
index 0000000..17a854d
--- /dev/null
+++ b/core/src/test/resources/cfg/defaults/test1.properties
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+name=Anatole
+name2=Sabine
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/8b2cc9b1/core/src/test/resources/cfg/final/anotherTestFile.properties
----------------------------------------------------------------------
diff --git a/core/src/test/resources/cfg/final/anotherTestFile.properties b/core/src/test/resources/cfg/final/anotherTestFile.properties
new file mode 100644
index 0000000..9e405f6
--- /dev/null
+++ b/core/src/test/resources/cfg/final/anotherTestFile.properties
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy current the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+name=Robin
+name3=Lukas
+name4=Sereina
+name5=Benjamin
\ No newline at end of file