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 2014/12/26 01:56:11 UTC
[4/4] incubator-tamaya git commit: TAMAYA-19: Streamlined API and
impl.
TAMAYA-19: Streamlined API and impl.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/a60570e8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/a60570e8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/a60570e8
Branch: refs/heads/master
Commit: a60570e8e9e561dd2c02c7d0978e846d4d9dd27e
Parents: 0b5d4fe
Author: anatole <an...@apache.org>
Authored: Fri Dec 26 01:49:55 2014 +0100
Committer: anatole <an...@apache.org>
Committed: Fri Dec 26 01:49:55 2014 +0100
----------------------------------------------------------------------
.../org/apache/tamaya/AggregationPolicy.java | 131 ---
.../java/org/apache/tamaya/Configuration.java | 37 +-
.../java/org/apache/tamaya/PropertySource.java | 45 -
.../tamaya/annotation/ConfiguredProperty.java | 2 +-
.../org/apache/tamaya/annotation/WithCodec.java | 45 -
.../tamaya/annotation/WithConfigOperator.java | 2 +-
.../tamaya/annotation/WithPropertyAdapter.java | 45 +
.../java/org/apache/tamaya/spi/CodecSpi.java | 89 --
.../tamaya/spi/DefaultServiceComparator.java | 85 --
.../spi/DefaultServiceContextProvider.java | 9 -
.../java/org/apache/tamaya/spi/Orderable.java | 34 -
.../org/apache/tamaya/spi/OrdinalProvider.java | 37 -
.../apache/tamaya/spi/PropertyAdapterSpi.java | 72 ++
.../tamaya/TestConfigServiceSingletonSpi.java | 15 -
.../TestPropertyAdaptersSingletonSpi.java | 66 +-
.../services/org.apache.tamaya.spi.CodecSpi | 19 -
.../org.apache.tamaya.spi.PropertyAdapterSpi | 19 +
.../core/config/FreezedConfiguration.java | 4 +-
.../core/internal/config/DefaultCodecSpi.java | 169 ----
.../config/DefaultPropertyAdapterSpi.java | 168 ++++
.../config/FallbackSimpleConfigProvider.java | 2 +-
.../core/internal/config/FileConfiguration.java | 2 -
.../internal/resources/io/AntPathMatcher.java | 4 +-
.../AbstractClasspathAwarePropertySource.java | 3 -
.../core/properties/AbstractPropertySource.java | 3 +-
.../core/properties/AggregationPolicy.java | 133 +++
.../properties/BuildablePropertySource.java | 2 -
.../properties/EnvironmentPropertySource.java | 3 -
.../core/properties/URLBasedPropertySource.java | 1 -
.../tamaya/core/spi/CodecProviderSpi.java | 36 -
.../core/spi/DefaultServiceComparator.java | 85 ++
.../core/spi/DefaultServiceContextProvider.java | 112 +++
.../org/apache/tamaya/core/spi/Orderable.java | 34 +
.../apache/tamaya/core/spi/OrdinalProvider.java | 37 +
.../core/spi/PropertyAdapterProviderSpi.java | 36 +
.../services/org.apache.tamaya.spi.CodecSpi | 19 -
.../org.apache.tamaya.spi.PropertyAdapterSpi | 19 +
.../apache/tamaya/ucs/UC1ReadProperties.java | 5 +-
.../apache/tamaya/ucs/UC2CombineProperties.java | 5 +-
docs/src/main/asciidoc/design/2_API.adoc | 469 ++++++++++
.../main/asciidoc/design/2_CoreConcepts.adoc | 849 -------------------
docs/src/main/asciidoc/design/3_Core.adoc | 356 ++++++++
docs/src/main/asciidoc/design/3_Extensions.adoc | 841 ------------------
docs/src/main/asciidoc/design/4_Extensions.adoc | 841 ++++++++++++++++++
.../asciidoc/usecases/se/combine-configs.adoc | 14 +
.../se/context-dependent-configuration.adoc | 7 +
.../usecases/se/dynamic-provisioning.adoc | 17 +
.../usecases/se/external-configuration.adoc | 6 +
docs/src/main/asciidoc/usecases/se/formats.adoc | 7 +
.../main/asciidoc/usecases/se/injection.adoc | 31 +
docs/src/main/asciidoc/usecases/se/java8.adoc | 13 +
.../main/asciidoc/usecases/se/locations.adoc | 9 +
.../main/asciidoc/usecases/se/management.adoc | 7 +
.../usecases/se/minimal-propertysource.adoc | 6 +
.../usecases/se/multiple-configurations.adoc | 14 +
.../usecases/se/scannable-properties.adoc | 4 +
.../asciidoc/usecases/se/service-context.adoc | 14 +
.../asciidoc/usecases/se/simple-access.adoc | 18 +
.../usecases/se/simple-property-access.adoc | 7 +
.../main/asciidoc/usecases/se/templates.adoc | 11 +
.../usecases/se/type-safe-properties.adoc | 10 +
.../usecases/se/value-placeholders.adoc | 8 +
docs/src/main/asciidoc/usecases/usecases.adoc | 19 +
63 files changed, 2695 insertions(+), 2517 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/AggregationPolicy.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/AggregationPolicy.java b/api/src/main/java/org/apache/tamaya/AggregationPolicy.java
deleted file mode 100644
index c0f7cc0..0000000
--- a/api/src/main/java/org/apache/tamaya/AggregationPolicy.java
+++ /dev/null
@@ -1,131 +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;
-
-import java.util.logging.Logger;
-
-/**
- * Policy that defines how the different configurations/property sources should be aggregated.
- * This is done by a mapping function defined as follows:
- * <pre>
- * function f(key, value1, value2) -> result
- *
- * whereas
- *
- * key = the fully qualified property key,
- * value1 = the value from the first configuration/property source (can be null)
- * value2 = the value from the second configuration/property source (can be null)
- *
- * result = the value to be used in the aggregation, or null, which removed the
- * key from the result.
- * </pre>
- *
- * Of course, during this evaluation step additional actions can be taken, e.g. refer to #LOG_ERROR, which
- * ignores duplicate entries, but also logs the conflict on severe/error level.
- */
-public interface AggregationPolicy {
-
- /**
- * Method which decides how keys/values are aggregated.
- * @param key the key current the entry, must not be {@code null}.
- * @param currentValue the current keys, or {@code null}.
- * @param newValue the new keys, never {@code null}.
- * @return the target keys to be used in the resulting property set, or null, to remove the property.
- */
- public String aggregate(String key, String currentValue, String newValue);
-
- /** Ignore overrides, only extend (additive). */
- public static final AggregationPolicy IGNORE_DUPLICATES = (k, v1, v2) -> v1 == null? v2 : v1;
-
- /** Combine multiple values into a comma separated list. */
- public static final AggregationPolicy COMBINE = (k, v1, v2) -> v1 != null && v2 != null ? v1 + ',' + v2: v2;
-
- /**
- * Interpret later keys as override (additive and override), replacing
- * the key loaded earlier/fromMap previous contained
- * {@link PropertySource}.
- */
- public static final AggregationPolicy OVERRIDE = (k, v1, v2) -> v2;
-
- /**
- * Throw an exception, when keys are not disjunctive (strictly
- * additive).
- */
- public static final AggregationPolicy EXCEPTION =
- (String key, String value, String newValue) -> {
- if(value!=null && newValue!=null && !value.equals(newValue)){
- throw new ConfigException("Conflicting values encountered key="+key+", keys="+value+", newValue="+newValue);
- }
- return newValue;
- };
-
- /**
- * Ignores any duplicates, but logs the conflict encountered to error/severe level.
- */
- public static final AggregationPolicy LOG_ERROR =
- (String key, String value, String newValue) -> {
- if(value!=null && newValue!=null && !value.equals(newValue)){
- Logger.getLogger(AggregationPolicy.class.getName())
- .severe(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
- return value;
- }
- return newValue;
- };
-
- /**
- * Ignores any duplicates, but logs the conflict encountered to info level.
- */
- public static final AggregationPolicy LOG_WARNING =
- (String key, String value, String newValue) -> {
- if(value!=null && newValue!=null && !value.equals(newValue)){
- Logger.getLogger(AggregationPolicy.class.getName())
- .warning(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
- return value;
- }
- return newValue;
- };
-
- /**
- * Ignores any duplicates, but logs the conflict encountered to info level.
- */
- public static final AggregationPolicy LOG_INFO =
- (String key, String value, String newValue) -> {
- if(value!=null && newValue!=null && !value.equals(newValue)){
- Logger.getLogger(AggregationPolicy.class.getName())
- .info(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
- return value;
- }
- return newValue;
- };
-
- /**
- * Ignores any duplicates, but logs the conflict encountered to debug/finest level.
- */
- public static final AggregationPolicy LOG_DEBUG =
- (String key, String value, String newValue) -> {
- if(value!=null && newValue!=null && !value.equals(newValue)){
- Logger.getLogger(AggregationPolicy.class.getName())
- .finest(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
- return value;
- }
- return newValue;
- };
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/Configuration.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/Configuration.java b/api/src/main/java/org/apache/tamaya/Configuration.java
index 543a515..8254e3a 100644
--- a/api/src/main/java/org/apache/tamaya/Configuration.java
+++ b/api/src/main/java/org/apache/tamaya/Configuration.java
@@ -22,7 +22,6 @@ import org.apache.tamaya.spi.ConfigurationSpi;
import org.apache.tamaya.spi.ServiceContext;
import java.util.*;
-import java.util.function.Consumer;
import java.util.function.UnaryOperator;
/**
@@ -126,10 +125,10 @@ public interface Configuration extends PropertySource {
* @throws IllegalArgumentException if the keys could not be converted to the required target
* type, or no such property exists.
*/
- default <T> Optional<T> getAdapted(String key, Codec<T> adapter){
+ default <T> Optional<T> getAdapted(String key, PropertyAdapter<T> adapter){
Optional<String> value = get(key);
if(value.isPresent()) {
- return Optional.ofNullable(adapter.deserialize(value.get()));
+ return Optional.ofNullable(adapter.adapt(value.get()));
}
return Optional.empty();
}
@@ -137,7 +136,7 @@ public interface Configuration extends PropertySource {
/**
* Get the property keys as type T. This will implicitly require a corresponding {@link
- * Codec} to be available that is capable current providing type T
+ * PropertyAdapter} to be available that is capable current providing type T
* fromMap the given String keys.
*
* @param key the property's absolute, or relative path, e.g. @code
@@ -148,7 +147,7 @@ public interface Configuration extends PropertySource {
* type.
*/
default <T> Optional<T> get(String key, Class<T> type){
- return getAdapted(key, Codec.getInstance(type));
+ return getAdapted(key, PropertyAdapter.getInstance(type));
}
/**
@@ -227,7 +226,6 @@ public interface Configuration extends PropertySource {
* @param configurations overriding configurations to be used for evaluating the values for injection into {@code instance}, not null.
* If no such config is passed, the default configurationa provided by the current
* registered providers are used.
- * @return the corresponding typed Configuration instance, never null.
* @throws ConfigException if the configuration could not be resolved.
*/
public static void configure(Object instance, Configuration... configurations){
@@ -247,31 +245,4 @@ public interface Configuration extends PropertySource {
return ServiceContext.getInstance().getSingleton(ConfigurationSpi.class).evaluateValue(expression, configurations);
}
- /**
- * Add a ConfigChangeListener to the given PropertySource instance.
- * @param l the listener, not null.
- */
- public static void addChangeListener(Consumer<ConfigChangeSet> l){
- ServiceContext.getInstance().getSingleton(ConfigurationSpi.class).addChangeListener(l);
- }
-
- /**
- * Removes a ConfigChangeListener from the given PropertySource instance.
- * @param l the listener, not null.
- */
- public static void removeChangeListener(Consumer<ConfigChangeSet> l){
- ServiceContext.getInstance().getSingleton(ConfigurationSpi.class).removeChangeListener(l);
- }
-
- /**
- * Method to publish changes on a {@link org.apache.tamaya.PropertySource} to all interested parties.
- * Basically this method gives an abstraction on the effective event bus design fo listeners. In a CDI context
- * the CDI enterprise event bus should be used internally to do the work, whereas in a SE only environment
- * a more puristic approach would be useful.
- * @param configChange the change to be published, not null.
- */
- public static void publishChange(ConfigChangeSet configChange){
- ServiceContext.getInstance().getSingleton(ConfigurationSpi.class).publishChange(configChange);
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/PropertySource.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/PropertySource.java b/api/src/main/java/org/apache/tamaya/PropertySource.java
index 2cd3af7..d0c5bc1 100644
--- a/api/src/main/java/org/apache/tamaya/PropertySource.java
+++ b/api/src/main/java/org/apache/tamaya/PropertySource.java
@@ -111,36 +111,6 @@ public interface PropertySource {
}
/**
- * Reloads the {@link PropertySource}.
- */
- default ConfigChangeSet load() {
- // by default do nothing
- return ConfigChangeSet.emptyChangeSet(this);
- }
-
- /**
- * Allows to evaluate if the provider is mutable.
- *
- * @return true, if the provider is mutable.
- * @see #applyChanges(ConfigChangeSet)
- */
- default boolean isMutable() {
- return false;
- }
-
- /**
- * Apply a config change to this item. Hereby the change must be related to the same instance.
- *
- * @param change the config change
- * @throws ConfigException if an unrelated change was passed.
- * @throws UnsupportedOperationException when the configuration is not writable.
- * @see #isMutable()
- */
- default void applyChanges(ConfigChangeSet change) {
- throw new UnsupportedOperationException("Config/properties not mutable: " + this);
- }
-
- /**
* Convert the this PropertyProvider instance to a {@link org.apache.tamaya.Configuration}.
*
* @return the configuration, never null.
@@ -158,26 +128,11 @@ public interface PropertySource {
}
@Override
- public boolean isMutable() {
- return PropertySource.this.isMutable();
- }
-
- @Override
- public void applyChanges(ConfigChangeSet changes) {
- PropertySource.this.applyChanges(changes);
- }
-
- @Override
public boolean isEmpty() {
return PropertySource.this.isEmpty();
}
@Override
- public ConfigChangeSet load() {
- return PropertySource.this.load();
- }
-
- @Override
public Optional<String> get(String key) {
return PropertySource.this.get(key);
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/annotation/ConfiguredProperty.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/annotation/ConfiguredProperty.java b/api/src/main/java/org/apache/tamaya/annotation/ConfiguredProperty.java
index a29ef8b..21d4e3a 100644
--- a/api/src/main/java/org/apache/tamaya/annotation/ConfiguredProperty.java
+++ b/api/src/main/java/org/apache/tamaya/annotation/ConfiguredProperty.java
@@ -25,7 +25,7 @@ import java.lang.annotation.*;
* a configuration template method. Hereby this annotation can be used in multiple ways and combined
* with other annotations such as {@link org.apache.tamaya.annotation.DefaultValue},
* {@link org.apache.tamaya.annotation.WithLoadPolicy}, {@link org.apache.tamaya.annotation.WithConfig},
- * {@link org.apache.tamaya.annotation.WithConfigOperator}, {@link WithCodec}.
+ * {@link org.apache.tamaya.annotation.WithConfigOperator}, {@link WithPropertyAdapter}.
*
* Below the most simple variant current a configured class is given:
* {@code
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/annotation/WithCodec.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/annotation/WithCodec.java b/api/src/main/java/org/apache/tamaya/annotation/WithCodec.java
deleted file mode 100644
index 465d7b3..0000000
--- a/api/src/main/java/org/apache/tamaya/annotation/WithCodec.java
+++ /dev/null
@@ -1,45 +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.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.apache.tamaya.Codec;
-
-/**
- * Annotation to define a type adapter to be used before injecting a configured keys, or for applying changes.
- * This will override any other adapter for performing the type conversion before
- * injecting the field keys.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(value = { ElementType.FIELD, ElementType.METHOD })
-public @interface WithCodec {
-
- /**
- * Define a custom adapter or codec that should be used to deserialize the configuration entry injected. This overrides any
- * general org.apache.tamaya.core.internal registered. If no adapter is defined (default) and no corresponding adapter is
- * registered, it is handled as a deployment error.
- */
- @SuppressWarnings("rawtypes")
- Class<? extends Codec> value();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/annotation/WithConfigOperator.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/annotation/WithConfigOperator.java b/api/src/main/java/org/apache/tamaya/annotation/WithConfigOperator.java
index 0ede2c2..9f6c4f5 100644
--- a/api/src/main/java/org/apache/tamaya/annotation/WithConfigOperator.java
+++ b/api/src/main/java/org/apache/tamaya/annotation/WithConfigOperator.java
@@ -36,7 +36,7 @@ import java.util.function.UnaryOperator;
public @interface WithConfigOperator {
/**
- * Define a custom adapter that should be used to deserialize the configuration entry injected. This overrides any
+ * Define a custom adapter that should be used to adapt the configuration entry injected. This overrides any
* general org.apache.tamaya.core.internal registered. If no adapter is defined (default) and no corresponding adapter is
* registered, it is handled as a deployment error.
*/
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/annotation/WithPropertyAdapter.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/annotation/WithPropertyAdapter.java b/api/src/main/java/org/apache/tamaya/annotation/WithPropertyAdapter.java
new file mode 100644
index 0000000..fa9cfdf
--- /dev/null
+++ b/api/src/main/java/org/apache/tamaya/annotation/WithPropertyAdapter.java
@@ -0,0 +1,45 @@
+/*
+ * 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.annotation;
+
+import org.apache.tamaya.PropertyAdapter;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation to define a type adapter to be used before injecting a configured keys, or for applying changes.
+ * This will override any other adapter for performing the type conversion before
+ * injecting the field keys.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.FIELD, ElementType.METHOD })
+public @interface WithPropertyAdapter {
+
+ /**
+ * Define a custom adapter or codec that should be used to adapt the configuration entry injected. This overrides any
+ * general org.apache.tamaya.core.internal registered. If no adapter is defined (default) and no corresponding adapter is
+ * registered, it is handled as a deployment error.
+ */
+ @SuppressWarnings("rawtypes")
+ Class<? extends PropertyAdapter> value();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/CodecSpi.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/CodecSpi.java b/api/src/main/java/org/apache/tamaya/spi/CodecSpi.java
deleted file mode 100644
index 7a0670b..0000000
--- a/api/src/main/java/org/apache/tamaya/spi/CodecSpi.java
+++ /dev/null
@@ -1,89 +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.spi;
-
-import org.apache.tamaya.Codec;
-import org.apache.tamaya.annotation.WithCodec;
-
-import java.util.Objects;
-import java.util.function.Function;
-
-/**
- * SPI that is used by the {@link org.apache.tamaya.Codecs} singleton as delegation instance.
- */
-public interface CodecSpi {
-
- /**
- * Registers a new PropertyAdapter for the given target type, hereby replacing any existing adapter for
- * this type.
- * @param targetType The target class, not null.
- * @param adapter The adapter, not null.
- * @param <T> The target type
- * @return any adapter replaced with the new adapter, or null.
- */
- <T> Codec<T> register(Class<T> targetType, Codec<T> adapter);
-
- default <T> Codec<T> register(Class<T> targetType, Function<String,T> decoder, Function<T, String> encoder){
- Objects.requireNonNull(targetType);
- Objects.requireNonNull(decoder);
- Objects.requireNonNull(encoder);
- return register(targetType, new Codec<T>(){
-
- @Override
- public T deserialize(String value) {
- return decoder.apply(value);
- }
-
- @Override
- public String serialize(T value) {
- return encoder.apply(value);
- }
-
- @Override
- public String toString(){
- return "Codec(decoder="+decoder.getClass().getName()+", encoder="+encoder.getClass().getName()+")";
- }
- });
- }
-
- /**
- * Get an adapter converting to the given target type.
- * @param targetType the target type class
- * @return true, if the given target type is supported.
- */
- default <T> Codec<T> getAdapter(Class<T> targetType){
- return getCodec(targetType, null);
- }
-
- /**
- * Get an adapter converting to the given target type.
- * @param targetType the target type class
- * @param <T> the target type
- * @return the corresponding adapter, never null.
- * @throws org.apache.tamaya.ConfigException if the target type is not supported.
- */
- <T> Codec<T> getCodec(Class<T> targetType, WithCodec annotation);
-
- /**
- * Checks if the given target type is supported, i.e. a adapter is registered and accessible.
- * @param targetType the target type class
- * @return true, if the given target type is supported.
- */
- boolean isTargetTypeSupported(Class<?> targetType);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/DefaultServiceComparator.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/DefaultServiceComparator.java b/api/src/main/java/org/apache/tamaya/spi/DefaultServiceComparator.java
deleted file mode 100644
index c53a52d..0000000
--- a/api/src/main/java/org/apache/tamaya/spi/DefaultServiceComparator.java
+++ /dev/null
@@ -1,85 +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.spi;
-
-import java.util.*;
-
-/**
- * Simple comparator based on a Collection of {@link org.apache.tamaya.spi.OrdinalProvider} instances.
- */
-final class DefaultServiceComparator implements Comparator<Object>{
-
- /**
- * List of ordinal providers loaded.
- */
- private List<OrdinalProvider> ordinalProviders = new ArrayList<>();
-
- DefaultServiceComparator(Collection<? extends OrdinalProvider> providers){
- ordinalProviders.addAll(Objects.requireNonNull(providers));
- ordinalProviders.sort(this::compare);
- }
-
- private int compare(OrdinalProvider provider1, OrdinalProvider provider2){
- int o1 = getOrdinal(provider1);
- int o2 = getOrdinal(provider2);
- int order = o1-o2;
- if(order < 0){
- return -1;
- }
- else if(order > 0){
- return 1;
- }
- return 0;
- }
-
- private int getOrdinal(OrdinalProvider provider){
- if(provider instanceof Orderable){
- return ((Orderable)provider).order();
- }
- return 0;
- }
-
- public int getOrdinal(Object service){
- for(OrdinalProvider provider: ordinalProviders){
- OptionalInt ord = provider.getOrdinal(service.getClass());
- if(ord.isPresent()){
- return ord.getAsInt();
- }
- }
- if(service instanceof Orderable){
- return ((Orderable)service).order();
- }
- return 0;
- }
-
-
- @Override
- public int compare(Object o1, Object o2) {
- int ord1 = getOrdinal(o1);
- int ord2 = getOrdinal(o2);
- int order = ord1-ord2;
- if(order < 0){
- return -1;
- }
- else if(order > 0){
- return 1;
- }
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/DefaultServiceContextProvider.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/DefaultServiceContextProvider.java b/api/src/main/java/org/apache/tamaya/spi/DefaultServiceContextProvider.java
index 295bab7..e1d1740 100644
--- a/api/src/main/java/org/apache/tamaya/spi/DefaultServiceContextProvider.java
+++ b/api/src/main/java/org/apache/tamaya/spi/DefaultServiceContextProvider.java
@@ -33,12 +33,6 @@ class DefaultServiceContextProvider implements ServiceContext {
private final ConcurrentHashMap<Class, List<Object>> servicesLoaded = new ConcurrentHashMap<>();
/** Singletons. */
private final ConcurrentHashMap<Class, Optional<?>> singletons = new ConcurrentHashMap<>();
- /** Comparator for ordering of multiple services found. */
- private DefaultServiceComparator serviceComparator;
-
- public DefaultServiceContextProvider(){
- serviceComparator = new DefaultServiceComparator(getServices(OrdinalProvider.class, Collections.emptyList()));
- }
@Override
public <T> Optional<T> getService(Class<T> serviceType) {
@@ -94,9 +88,6 @@ class DefaultServiceContextProvider implements ServiceContext {
if(services.isEmpty()){
services.addAll(defaultList);
}
- if(!serviceType.equals(OrdinalProvider.class)) {
- services.sort(serviceComparator);
- }
services = Collections.unmodifiableList(services);
final List<T> previousServices = (List<T>) servicesLoaded.putIfAbsent(serviceType, (List<Object>)services);
return previousServices != null ? previousServices : services;
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/Orderable.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/Orderable.java b/api/src/main/java/org/apache/tamaya/spi/Orderable.java
deleted file mode 100644
index 56a99d7..0000000
--- a/api/src/main/java/org/apache/tamaya/spi/Orderable.java
+++ /dev/null
@@ -1,34 +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.spi;
-
-/**
- * Interface that can be optionally implemented by SPI components to be loaded into
- * the Tamaya's ServiceContext. The ordinal provided will be used to determine
- * priority and precedence, when multiple components implement the same
- * service interface.
- */
-@FunctionalInterface
-public interface Orderable {
- /**
- * Get the ordinal keys for the component, by default 0.
- * @return the ordinal keys
- */
- int order();
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/OrdinalProvider.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/OrdinalProvider.java b/api/src/main/java/org/apache/tamaya/spi/OrdinalProvider.java
deleted file mode 100644
index aad8618..0000000
--- a/api/src/main/java/org/apache/tamaya/spi/OrdinalProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.spi;
-
-import java.util.OptionalInt;
-
-/**
- * The ordinal provider is an optional component that provides an abstraction for ordering/prioritizing
- * services loaded. This can be used to determine, which SPI should be used, if multiple instances are
- * available, or for ordering chain of services.
- * @see ServiceContext
- */
-public interface OrdinalProvider {
- /**
- * Evaluate the ordinal number for the given type.
- * @param type the target type, not null.
- * @return the ordinal, if not defined, 0 should be returned.
- */
- OptionalInt getOrdinal(Class<?> type);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/main/java/org/apache/tamaya/spi/PropertyAdapterSpi.java
----------------------------------------------------------------------
diff --git a/api/src/main/java/org/apache/tamaya/spi/PropertyAdapterSpi.java b/api/src/main/java/org/apache/tamaya/spi/PropertyAdapterSpi.java
new file mode 100644
index 0000000..a1222a4
--- /dev/null
+++ b/api/src/main/java/org/apache/tamaya/spi/PropertyAdapterSpi.java
@@ -0,0 +1,72 @@
+/*
+ * 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.spi;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.PropertyAdapter;
+import org.apache.tamaya.annotation.WithPropertyAdapter;
+
+
+/**
+ * Manager for {@link org.apache.tamaya.Configuration} instances. Implementations must register an instance
+ * using the {@link org.apache.tamaya.spi.ServiceContextManager} mechanism in place (by default this is based on the {@link java.util.ServiceLoader}.
+ * The {@link org.apache.tamaya.Configuration} Singleton in the API delegates its corresponding calls to the
+ * instance returned by the current bootstrap service in place.
+ *
+ * @see org.apache.tamaya.Configuration
+ * @see org.apache.tamaya.spi.ServiceContextManager
+ */
+public interface PropertyAdapterSpi {
+
+
+ /**
+ * Registers a new PropertyAdapter for the given target type, hereby replacing any existing adapter for
+ * this type.
+ * @param targetType The target class, not null.
+ * @param adapter The adapter, not null.
+ * @param <T> The target type
+ * @return any adapter replaced with the new adapter, or null.
+ */
+ <T> PropertyAdapter<T> register(Class<T> targetType, PropertyAdapter<T> adapter);
+
+ /**
+ * Get an adapter converting to the given target type.
+ * @param targetType the target type class
+ * @return true, if the given target type is supported.
+ */
+ default <T> PropertyAdapter<T> getAdapter(Class<T> targetType){
+ return getPropertyAdapter(targetType, null);
+ }
+
+ /**
+ * Get an adapter converting to the given target type.
+ * @param targetType the target type class
+ * @param <T> the target type
+ * @return the corresponding adapter, never null.
+ * @throws org.apache.tamaya.ConfigException if the target type is not supported.
+ */
+ <T> PropertyAdapter<T> getPropertyAdapter(Class<T> targetType, WithPropertyAdapter annotation);
+
+ /**
+ * Checks if the given target type is supported, i.e. a adapter is registered and accessible.
+ * @param targetType the target type class
+ * @return true, if the given target type is supported.
+ */
+ boolean isTargetTypeSupported(Class<?> targetType);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/test/java/org/apache/tamaya/TestConfigServiceSingletonSpi.java
----------------------------------------------------------------------
diff --git a/api/src/test/java/org/apache/tamaya/TestConfigServiceSingletonSpi.java b/api/src/test/java/org/apache/tamaya/TestConfigServiceSingletonSpi.java
index 0ec2aa0..858786d 100644
--- a/api/src/test/java/org/apache/tamaya/TestConfigServiceSingletonSpi.java
+++ b/api/src/test/java/org/apache/tamaya/TestConfigServiceSingletonSpi.java
@@ -87,19 +87,4 @@ public class TestConfigServiceSingletonSpi implements ConfigurationSpi {
return expression;
}
- @Override
- public void addChangeListener(Consumer<ConfigChangeSet> l) {
- // ignore
- }
-
- @Override
- public void removeChangeListener(Consumer<ConfigChangeSet> l) {
- // ignore
- }
-
- @Override
- public void publishChange(ConfigChangeSet configChangeSet) {
- // ignore
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/test/java/org/apache/tamaya/TestPropertyAdaptersSingletonSpi.java
----------------------------------------------------------------------
diff --git a/api/src/test/java/org/apache/tamaya/TestPropertyAdaptersSingletonSpi.java b/api/src/test/java/org/apache/tamaya/TestPropertyAdaptersSingletonSpi.java
index b27164c..65e6c1d 100644
--- a/api/src/test/java/org/apache/tamaya/TestPropertyAdaptersSingletonSpi.java
+++ b/api/src/test/java/org/apache/tamaya/TestPropertyAdaptersSingletonSpi.java
@@ -29,71 +29,71 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.tamaya.annotation.WithCodec;
-import org.apache.tamaya.spi.CodecSpi;
+import org.apache.tamaya.annotation.WithPropertyAdapter;
+import org.apache.tamaya.spi.PropertyAdapterSpi;
/**
- * Test implementation current {@link org.apache.tamaya.spi.CodecSpi}, which provides codecs
+ * Test implementation current {@link org.apache.tamaya.spi.PropertyAdapterSpi}, which provides propertyAdapters
* for some basic types.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
-public final class TestPropertyAdaptersSingletonSpi implements CodecSpi {
+public final class TestPropertyAdaptersSingletonSpi implements PropertyAdapterSpi {
- private Map<Class, Codec<?>> codecs = new ConcurrentHashMap<>();
+ private Map<Class, PropertyAdapter<?>> propertyAdapters = new ConcurrentHashMap<>();
private TestPropertyAdaptersSingletonSpi(){
- register(char.class, (s) -> s.charAt(0), (ch) -> String.valueOf(ch));
- register(int.class, Integer::parseInt, Object::toString);
- register(byte.class, Byte::parseByte, Object::toString);
- register(short.class, Short::parseShort, Object::toString);
- register(boolean.class, Boolean::parseBoolean, b -> String.valueOf(b));
- register(float.class, Float::parseFloat, f -> String.valueOf(f));
- register(double.class, Double::parseDouble, d -> String.valueOf(d));
+ register(char.class, (s) -> s.charAt(0));
+ register(int.class, Integer::parseInt);
+ register(byte.class, Byte::parseByte);
+ register(short.class, Short::parseShort);
+ register(boolean.class, Boolean::parseBoolean);
+ register(float.class, Float::parseFloat);
+ register(double.class, Double::parseDouble);
- register(Character.class, (s) -> s.charAt(0), Object::toString);
- register(Integer.class, Integer::valueOf, Object::toString);
- register(Byte.class, Byte::valueOf, Object::toString);
- register(Short.class, Short::valueOf, String::valueOf);
- register(Boolean.class, Boolean::valueOf, String::valueOf);
- register(Float.class, Float::valueOf, String::valueOf);
- register(Double.class, Double::valueOf, String::valueOf);
- register(BigDecimal.class, BigDecimal::new, String::valueOf);
- register(BigInteger.class, BigInteger::new, String::valueOf);
+ register(Character.class, (s) -> s.charAt(0));
+ register(Integer.class, Integer::valueOf);
+ register(Byte.class, Byte::valueOf);
+ register(Short.class, Short::valueOf);
+ register(Boolean.class, Boolean::valueOf);
+ register(Float.class, Float::valueOf);
+ register(Double.class, Double::valueOf);
+ register(BigDecimal.class, BigDecimal::new);
+ register(BigInteger.class, BigInteger::new);
- register(Currency.class, Currency::getInstance, Object::toString);
+ register(Currency.class, Currency::getInstance);
- register(LocalDate.class, LocalDate::parse, Object::toString);
- register(LocalTime.class, LocalTime::parse, Object::toString);
- register(LocalDateTime.class, LocalDateTime::parse, Object::toString);
- register(ZoneId.class, ZoneId::of, ZoneId::getId);
+ register(LocalDate.class, LocalDate::parse);
+ register(LocalTime.class, LocalTime::parse);
+ register(LocalDateTime.class, LocalDateTime::parse);
+ register(ZoneId.class, ZoneId::of);
}
@Override
- public <T> Codec<T> register(Class<T> targetType, Codec<T> codec){
+ public <T> PropertyAdapter<T> register(Class<T> targetType, PropertyAdapter<T> codec){
Objects.requireNonNull(targetType);
Objects.requireNonNull(codec);
- return (Codec<T>) codecs.put(targetType, codec);
+ return (PropertyAdapter<T>) propertyAdapters.put(targetType, codec);
}
@Override
- public <T> Codec<T> getCodec(Class<T> targetType, WithCodec annotation){
+ public <T> PropertyAdapter<T> getPropertyAdapter(Class<T> targetType, WithPropertyAdapter annotation){
if(annotation!=null){
Class<?> adapterType = annotation.value();
- if(!adapterType.equals(Codec.class)){
+ if(!adapterType.equals(PropertyAdapter.class)){
try{
- return (Codec<T>)adapterType.newInstance();
+ return (PropertyAdapter<T>)adapterType.newInstance();
}
catch(Exception e){
throw new ConfigException("Failed to load PropertyAdapter: " + adapterType, e);
}
}
}
- return (Codec<T>) codecs.get(targetType);
+ return (PropertyAdapter<T>) propertyAdapters.get(targetType);
}
@Override
public boolean isTargetTypeSupported(Class<?> targetType){
- return codecs.containsKey(targetType);
+ return propertyAdapters.containsKey(targetType);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.CodecSpi
----------------------------------------------------------------------
diff --git a/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.CodecSpi b/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.CodecSpi
deleted file mode 100644
index e9b04b4..0000000
--- a/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.CodecSpi
+++ /dev/null
@@ -1,19 +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 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.TestPropertyAdaptersSingletonSpi
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyAdapterSpi
----------------------------------------------------------------------
diff --git a/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyAdapterSpi b/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyAdapterSpi
new file mode 100644
index 0000000..e9b04b4
--- /dev/null
+++ b/api/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertyAdapterSpi
@@ -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.TestPropertyAdaptersSingletonSpi
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/config/FreezedConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/config/FreezedConfiguration.java b/core/src/main/java/org/apache/tamaya/core/config/FreezedConfiguration.java
index 240ccbe..43d6957 100644
--- a/core/src/main/java/org/apache/tamaya/core/config/FreezedConfiguration.java
+++ b/core/src/main/java/org/apache/tamaya/core/config/FreezedConfiguration.java
@@ -22,9 +22,7 @@ import org.apache.tamaya.*;
import org.apache.tamaya.core.properties.PropertySourceBuilder;
import java.io.Serializable;
-import java.time.Instant;
import java.util.Map;
-import java.util.Objects;
/**
* Configuration implementation that stores all current values current a given (possibly dynamic, contextual and non remote
@@ -41,7 +39,7 @@ final class FreezedConfiguration extends AbstractConfiguration implements Serial
*/
private FreezedConfiguration(Configuration config){
super(config.getName());
- this.properties = PropertySourceBuilder.of(config).buildFreezed();
+ this.properties = PropertySourceBuilder.of(config).buildFrozen();
}
public static final Configuration of(Configuration config){
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultCodecSpi.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultCodecSpi.java b/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultCodecSpi.java
deleted file mode 100644
index fbbf130..0000000
--- a/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultCodecSpi.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.internal.config;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
-import java.util.Currency;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Function;
-
-import org.apache.tamaya.Codec;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.annotation.WithCodec;
-import org.apache.tamaya.spi.CodecSpi;
-
-/**
- * Default codecs singleton, which provides default codesc for all kind of classes out of the box, which will be
- * instantiatable from configuration, if one of the following is given:
- * <ul>
- * <li>static factory methods using a String as simgle argument, called {@code of, valueOf, getInstance, instance, parse}</li>
- * <li>have constructors taking a single String</li>
- * </ul>
- */
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class DefaultCodecSpi implements CodecSpi {
-
-
- private Map<Class,Codec> adapters = new ConcurrentHashMap<>();
-
- public DefaultCodecSpi(){
- // Add default adapters
- register(char.class, (s) -> s.charAt(0), (ch) -> String.valueOf(ch));
- register(byte.class, Byte::parseByte, Object::toString);
- register(short.class, Short::parseShort, Object::toString);
- register(int.class, Integer::parseInt, Object::toString);
- register(long.class, Long::parseLong, Object::toString);
- register(boolean.class, Boolean::parseBoolean, b -> String.valueOf(b));
- register(float.class, Float::parseFloat, f -> String.valueOf(f));
- register(double.class, Double::parseDouble, d -> String.valueOf(d));
-
- register(Character.class, (s) -> s.charAt(0), Object::toString);
- register(Byte.class, Byte::valueOf, Object::toString);
- register(Short.class, Short::valueOf, String::valueOf);
- register(Integer.class, Integer::valueOf, Object::toString);
- register(Long.class, Long::valueOf, Object::toString);
- register(Boolean.class, Boolean::valueOf, b -> String.valueOf(b));
- register(Float.class, Float::valueOf, f -> String.valueOf(f));
- register(Double.class, Double::valueOf, d -> String.valueOf(d));
- register(BigDecimal.class, BigDecimal::new, String::valueOf);
- register(BigInteger.class, BigInteger::new, String::valueOf);
-
- register(Currency.class, Currency::getInstance, Object::toString);
-
- register(LocalDate.class, LocalDate::parse, Object::toString);
- register(LocalTime.class, LocalTime::parse, Object::toString);
- register(LocalDateTime.class, LocalDateTime::parse, Object::toString);
- register(ZoneId.class, ZoneId::of, ZoneId::getId);
- }
-
- @Override
- public <T> Codec<T> register(Class<T> targetType, Codec<T> adapter){
- return adapters.put(targetType, adapter);
- }
-
- @Override
- public <T> Codec<T> getCodec(Class<T> targetType, WithCodec adapterAnnot){
- Codec codec = null;
- Class<? extends Codec> configuredCodec = null;
- if(adapterAnnot != null){
- configuredCodec = adapterAnnot.value();
- if(!configuredCodec.equals(Codec.class)){
- try{
- codec = configuredCodec.newInstance();
- }
- catch(Exception e){
- throw new ConfigException("Invalid codec configured.", e);
- }
- }
- }
- if(codec == null){
- codec = adapters.get(targetType);
- }
- if(codec == null){
- codec = getDefaultCodec(targetType);
- }
- if(codec == null){
- throw new ConfigException("No Codec found for " + targetType.getName());
- }
- return codec;
- }
-
- private <T> Codec getDefaultCodec(Class<T> targetType) {
- Function<String, T> decoder = null;
- Method factoryMethod = getFactoryMethod(targetType, "of", "valueOf", "instanceOf", "getInstance", "from", "parse");
- if(factoryMethod!=null){
- decoder = (s) -> {
- try{
- factoryMethod.setAccessible(true);
- return targetType.cast(factoryMethod.invoke(s));
- }
- catch (Exception e){
- throw new ConfigException("Failed to decode '"+s+"'", e);
- }
- };
- }
- if(decoder==null) {
- try {
- Constructor<T> constr = targetType.getDeclaredConstructor(String.class);
- decoder = (s) -> {
- try{
- constr.setAccessible(true);
- return constr.newInstance(s);
- }
- catch (Exception e){
- throw new ConfigException("Failed to decode '"+s+"'", e);
- }
- };
- } catch (Exception e) {
- // ignore, TODO log finest
- }
- }
- if(decoder!=null) {
- return register(targetType, decoder, String::valueOf);
- }
- return null;
- }
-
- private Method getFactoryMethod(Class<?> type, String... methodNames) {
- Method m;
- for(String name:methodNames){
- try{
- m = type.getDeclaredMethod(name, String.class);
- return m;
- }
- catch(Exception e){
- // ignore, TODO log finest
- }
- }
- return null;
- }
-
- @Override
- public boolean isTargetTypeSupported(Class<?> targetType){
- return adapters.containsKey(targetType);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultPropertyAdapterSpi.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultPropertyAdapterSpi.java b/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultPropertyAdapterSpi.java
new file mode 100644
index 0000000..f1b14e0
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/internal/config/DefaultPropertyAdapterSpi.java
@@ -0,0 +1,168 @@
+/*
+ * 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.config;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.Currency;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.PropertyAdapter;
+import org.apache.tamaya.annotation.WithPropertyAdapter;
+import org.apache.tamaya.spi.PropertyAdapterSpi;
+
+/**
+ * Default codecs singleton, which provides default codesc for all kind of classes out of the box, which will be
+ * instantiatable from configuration, if one of the following is given:
+ * <ul>
+ * <li>static factory methods using a String as simgle argument, called {@code of, valueOf, getInstance, instance, parse}</li>
+ * <li>have constructors taking a single String</li>
+ * </ul>
+ */
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class DefaultPropertyAdapterSpi implements PropertyAdapterSpi {
+
+
+ private Map<Class,PropertyAdapter> adapters = new ConcurrentHashMap<>();
+
+ public DefaultPropertyAdapterSpi(){
+ // Add default adapters
+ register(char.class, (s) -> s.charAt(0));
+ register(byte.class, Byte::parseByte);
+ register(short.class, Short::parseShort);
+ register(int.class, Integer::parseInt);
+ register(long.class, Long::parseLong);
+ register(boolean.class, Boolean::parseBoolean);
+ register(float.class, Float::parseFloat);
+ register(double.class, Double::parseDouble);
+
+ register(Character.class, (s) -> s.charAt(0));
+ register(Byte.class, Byte::valueOf);
+ register(Short.class, Short::valueOf);
+ register(Integer.class, Integer::valueOf);
+ register(Long.class, Long::valueOf);
+ register(Boolean.class, Boolean::valueOf);
+ register(Float.class, Float::valueOf);
+ register(Double.class, Double::valueOf);
+ register(BigDecimal.class, BigDecimal::new);
+ register(BigInteger.class, BigInteger::new);
+
+ register(Currency.class, Currency::getInstance);
+
+ register(LocalDate.class, LocalDate::parse);
+ register(LocalTime.class, LocalTime::parse);
+ register(LocalDateTime.class, LocalDateTime::parse);
+ register(ZoneId.class, ZoneId::of);
+ }
+
+ @Override
+ public <T> PropertyAdapter<T> register(Class<T> targetType, PropertyAdapter<T> adapter){
+ return adapters.put(targetType, adapter);
+ }
+
+ @Override
+ public <T> PropertyAdapter<T> getPropertyAdapter(Class<T> targetType, WithPropertyAdapter adapterAnnot){
+ PropertyAdapter codec = null;
+ Class<? extends PropertyAdapter> configuredCodec = null;
+ if(adapterAnnot != null){
+ configuredCodec = adapterAnnot.value();
+ if(!configuredCodec.equals(PropertyAdapter.class)){
+ try{
+ codec = configuredCodec.newInstance();
+ }
+ catch(Exception e){
+ throw new ConfigException("Invalid codec configured.", e);
+ }
+ }
+ }
+ if(codec == null){
+ codec = adapters.get(targetType);
+ }
+ if(codec == null){
+ codec = getDefaultPropertyAdapter(targetType);
+ }
+ if(codec == null){
+ throw new ConfigException("No Codec found for " + targetType.getName());
+ }
+ return codec;
+ }
+
+ private <T> PropertyAdapter getDefaultPropertyAdapter(Class<T> targetType) {
+ PropertyAdapter<T> decoder = null;
+ Method factoryMethod = getFactoryMethod(targetType, "of", "valueOf", "instanceOf", "getInstance", "from", "parse");
+ if(factoryMethod!=null){
+ decoder = (s) -> {
+ try{
+ factoryMethod.setAccessible(true);
+ return targetType.cast(factoryMethod.invoke(s));
+ }
+ catch (Exception e){
+ throw new ConfigException("Failed to decode '"+s+"'", e);
+ }
+ };
+ }
+ if(decoder==null) {
+ try {
+ Constructor<T> constr = targetType.getDeclaredConstructor(String.class);
+ decoder = (s) -> {
+ try{
+ constr.setAccessible(true);
+ return constr.newInstance(s);
+ }
+ catch (Exception e){
+ throw new ConfigException("Failed to decode '"+s+"'", e);
+ }
+ };
+ } catch (Exception e) {
+ // ignore, TODO log finest
+ }
+ }
+ if(decoder!=null) {
+ return register(targetType, decoder);
+ }
+ return null;
+ }
+
+ private Method getFactoryMethod(Class<?> type, String... methodNames) {
+ Method m;
+ for(String name:methodNames){
+ try{
+ m = type.getDeclaredMethod(name, String.class);
+ return m;
+ }
+ catch(Exception e){
+ // ignore, TODO log finest
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isTargetTypeSupported(Class<?> targetType){
+ return adapters.containsKey(targetType);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/internal/config/FallbackSimpleConfigProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/config/FallbackSimpleConfigProvider.java b/core/src/main/java/org/apache/tamaya/core/internal/config/FallbackSimpleConfigProvider.java
index 42140c7..7f997e5 100644
--- a/core/src/main/java/org/apache/tamaya/core/internal/config/FallbackSimpleConfigProvider.java
+++ b/core/src/main/java/org/apache/tamaya/core/internal/config/FallbackSimpleConfigProvider.java
@@ -1,7 +1,7 @@
package org.apache.tamaya.core.internal.config;
-import org.apache.tamaya.AggregationPolicy;
import org.apache.tamaya.Configuration;
+import org.apache.tamaya.core.properties.AggregationPolicy;
import org.apache.tamaya.core.properties.PropertySourceBuilder;
import org.apache.tamaya.core.spi.ConfigurationProviderSpi;
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/internal/config/FileConfiguration.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/config/FileConfiguration.java b/core/src/main/java/org/apache/tamaya/core/internal/config/FileConfiguration.java
index 661bf64..8286768 100644
--- a/core/src/main/java/org/apache/tamaya/core/internal/config/FileConfiguration.java
+++ b/core/src/main/java/org/apache/tamaya/core/internal/config/FileConfiguration.java
@@ -3,10 +3,8 @@ package org.apache.tamaya.core.internal.config;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.UUID;
import org.apache.tamaya.Configuration;
-import org.apache.tamaya.MetaInfo;
/**
* Implementation of Configuration which the information is from xml or properties files.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/internal/resources/io/AntPathMatcher.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/internal/resources/io/AntPathMatcher.java b/core/src/main/java/org/apache/tamaya/core/internal/resources/io/AntPathMatcher.java
index 0fd542b..43d2a20 100644
--- a/core/src/main/java/org/apache/tamaya/core/internal/resources/io/AntPathMatcher.java
+++ b/core/src/main/java/org/apache/tamaya/core/internal/resources/io/AntPathMatcher.java
@@ -286,7 +286,7 @@ class AntPathMatcher {
if (tokenized == null) {
tokenized = tokenizePath(pattern);
if (cachePatterns == null && this.tokenizedPatternCache.size() >= CACHE_TURNOFF_THRESHOLD) {
- // Try to deserialize to the runtime situation that we're encountering:
+ // Try to adapt to the runtime situation that we're encountering:
// There are obviously too many different patterns coming in here...
// So let's turn off the cache since the patterns are unlikely to be reoccurring.
deactivatePatternCache();
@@ -340,7 +340,7 @@ class AntPathMatcher {
if (matcher == null) {
matcher = new AntPathStringMatcher(pattern);
if (cachePatterns == null && this.stringMatcherCache.size() >= CACHE_TURNOFF_THRESHOLD) {
- // Try to deserialize to the runtime situation that we're encountering:
+ // Try to adapt to the runtime situation that we're encountering:
// There are obviously too many different patterns coming in here...
// So let's turn off the cache since the patterns are unlikely to be reoccurring.
deactivatePatternCache();
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/AbstractClasspathAwarePropertySource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/AbstractClasspathAwarePropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/AbstractClasspathAwarePropertySource.java
index 58fb301..47eb150 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/AbstractClasspathAwarePropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/AbstractClasspathAwarePropertySource.java
@@ -22,9 +22,6 @@ import org.apache.tamaya.core.resource.Resource;
import org.apache.tamaya.spi.ServiceContext;
import org.apache.tamaya.core.resource.ResourceLoader;
-import org.apache.tamaya.MetaInfo;
-import org.apache.tamaya.MetaInfoBuilder;
-
import java.util.*;
public abstract class AbstractClasspathAwarePropertySource extends AbstractPropertySource {
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
index 6fe3df0..fbfd6df 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
@@ -21,7 +21,6 @@ package org.apache.tamaya.core.properties;
import java.io.Serializable;
import java.util.*;
-import org.apache.tamaya.MetaInfo;
import org.apache.tamaya.PropertySource;
/**
@@ -78,7 +77,7 @@ public abstract class AbstractPropertySource implements PropertySource, Serializ
@Override
public String toString(){
StringBuilder b = new StringBuilder(getClass().getSimpleName()).append("{\n");
- b.append(" ").append("(").append(MetaInfo.NAME).append(" = ").append(getName()).append(")\n");
+ b.append(" ").append("(").append(getName()).append(" = ").append(getName()).append(")\n");
printContents(b);
return b.append('}').toString();
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/AggregationPolicy.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/AggregationPolicy.java b/core/src/main/java/org/apache/tamaya/core/properties/AggregationPolicy.java
new file mode 100644
index 0000000..99be931
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/properties/AggregationPolicy.java
@@ -0,0 +1,133 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.tamaya.core.properties;
+
+import org.apache.tamaya.ConfigException;
+
+import java.util.logging.Logger;
+
+/**
+* Policy that defines how the different configurations/property sources should be aggregated.
+* This is done by a mapping function defined as follows:
+* <pre>
+* function f(key, value1, value2) -> result
+*
+* whereas
+*
+* key = the fully qualified property key,
+* value1 = the value from the first configuration/property source (can be null)
+* value2 = the value from the second configuration/property source (can be null)
+*
+* result = the value to be used in the aggregation, or null, which removed the
+* key from the result.
+* </pre>
+*
+* Of course, during this evaluation step additional actions can be taken, e.g. refer to #LOG_ERROR, which
+* ignores duplicate entries, but also logs the conflict on severe/error level.
+*/
+public interface AggregationPolicy {
+
+ /**
+ * Method which decides how keys/values are aggregated.
+ * @param key the key current the entry, must not be {@code null}.
+ * @param currentValue the current keys, or {@code null}.
+ * @param newValue the new keys, never {@code null}.
+ * @return the target keys to be used in the resulting property set, or null, to remove the property.
+ */
+ public String aggregate(String key, String currentValue, String newValue);
+
+ /** Ignore overrides, only extend (additive). */
+ public static final AggregationPolicy IGNORE_DUPLICATES = (k, v1, v2) -> v1 == null? v2 : v1;
+
+ /** Combine multiple values into a comma separated list. */
+ public static final AggregationPolicy COMBINE = (k, v1, v2) -> v1 != null && v2 != null ? v1 + ',' + v2: v2;
+
+ /**
+ * Interpret later keys as override (additive and override), replacing
+ * the key loaded earlier/fromMap previous contained
+ * {@link org.apache.tamaya.PropertySource}.
+ */
+ public static final AggregationPolicy OVERRIDE = (k, v1, v2) -> v2;
+
+ /**
+ * Throw an exception, when keys are not disjunctive (strictly
+ * additive).
+ */
+ public static final AggregationPolicy EXCEPTION =
+ (String key, String value, String newValue) -> {
+ if(value!=null && newValue!=null && !value.equals(newValue)){
+ throw new ConfigException("Conflicting values encountered key="+key+", keys="+value+", newValue="+newValue);
+ }
+ return newValue;
+ };
+
+ /**
+ * Ignores any duplicates, but logs the conflict encountered to error/severe level.
+ */
+ public static final AggregationPolicy LOG_ERROR =
+ (String key, String value, String newValue) -> {
+ if(value!=null && newValue!=null && !value.equals(newValue)){
+ Logger.getLogger(AggregationPolicy.class.getName())
+ .severe(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
+ return value;
+ }
+ return newValue;
+ };
+
+ /**
+ * Ignores any duplicates, but logs the conflict encountered to info level.
+ */
+ public static final AggregationPolicy LOG_WARNING =
+ (String key, String value, String newValue) -> {
+ if(value!=null && newValue!=null && !value.equals(newValue)){
+ Logger.getLogger(AggregationPolicy.class.getName())
+ .warning(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
+ return value;
+ }
+ return newValue;
+ };
+
+ /**
+ * Ignores any duplicates, but logs the conflict encountered to info level.
+ */
+ public static final AggregationPolicy LOG_INFO =
+ (String key, String value, String newValue) -> {
+ if(value!=null && newValue!=null && !value.equals(newValue)){
+ Logger.getLogger(AggregationPolicy.class.getName())
+ .info(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
+ return value;
+ }
+ return newValue;
+ };
+
+ /**
+ * Ignores any duplicates, but logs the conflict encountered to debug/finest level.
+ */
+ public static final AggregationPolicy LOG_DEBUG =
+ (String key, String value, String newValue) -> {
+ if(value!=null && newValue!=null && !value.equals(newValue)){
+ Logger.getLogger(AggregationPolicy.class.getName())
+ .finest(() -> "Conflicting values encountered key=" + key + ", keys=" + value + ", newValue=" + newValue);
+ return value;
+ }
+ return newValue;
+ };
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/BuildablePropertySource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/BuildablePropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/BuildablePropertySource.java
index 33eb2a6..847fbe9 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/BuildablePropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/BuildablePropertySource.java
@@ -17,13 +17,11 @@
*/
package org.apache.tamaya.core.properties;
-import org.apache.tamaya.MetaInfo;
import org.apache.tamaya.PropertySource;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.UUID;
/**
* Created by Anatole on 07.12.2014.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/EnvironmentPropertySource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/EnvironmentPropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/EnvironmentPropertySource.java
index 9958f8d..d0b2172 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/EnvironmentPropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/EnvironmentPropertySource.java
@@ -18,9 +18,6 @@
*/
package org.apache.tamaya.core.properties;
-import org.apache.tamaya.MetaInfoBuilder;
-import org.apache.tamaya.core.properties.AbstractPropertySource;
-
import java.util.Map;
class EnvironmentPropertySource extends AbstractPropertySource {
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
index 8086c23..1d79537 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/URLBasedPropertySource.java
@@ -18,7 +18,6 @@
*/
package org.apache.tamaya.core.properties;
-import org.apache.tamaya.AggregationPolicy;
import org.apache.tamaya.ConfigException;
import org.apache.tamaya.core.internal.resources.io.UrlResource;
import org.apache.tamaya.core.resource.Resource;
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/spi/CodecProviderSpi.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/spi/CodecProviderSpi.java b/core/src/main/java/org/apache/tamaya/core/spi/CodecProviderSpi.java
deleted file mode 100644
index b814037..0000000
--- a/core/src/main/java/org/apache/tamaya/core/spi/CodecProviderSpi.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.core.spi;
-
-import org.apache.tamaya.Codec;
-
-/**
- * This service provides different {@link org.apache.tamaya.Codec} instances for types.
- */
-public interface CodecProviderSpi {
-
- /**
- * Called, when a given {@link org.apache.tamaya.Configuration} has to be evaluated.
- *
- * @return the corresponding {@link java.util.function.Function<String, T>}, or {@code null}, if
- * not available for the given target type.
- */
- <T> Codec<T> getCodec(Class<T> type);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a60570e8/core/src/main/java/org/apache/tamaya/core/spi/DefaultServiceComparator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/tamaya/core/spi/DefaultServiceComparator.java b/core/src/main/java/org/apache/tamaya/core/spi/DefaultServiceComparator.java
new file mode 100644
index 0000000..2fb719c
--- /dev/null
+++ b/core/src/main/java/org/apache/tamaya/core/spi/DefaultServiceComparator.java
@@ -0,0 +1,85 @@
+/*
+ * 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.spi;
+
+import java.util.*;
+
+/**
+ * Simple comparator based on a Collection of {@link OrdinalProvider} instances.
+ */
+final class DefaultServiceComparator implements Comparator<Object>{
+
+ /**
+ * List of ordinal providers loaded.
+ */
+ private List<OrdinalProvider> ordinalProviders = new ArrayList<>();
+
+ DefaultServiceComparator(Collection<? extends OrdinalProvider> providers){
+ ordinalProviders.addAll(Objects.requireNonNull(providers));
+ ordinalProviders.sort(this::compare);
+ }
+
+ private int compare(OrdinalProvider provider1, OrdinalProvider provider2){
+ int o1 = getOrdinal(provider1);
+ int o2 = getOrdinal(provider2);
+ int order = o1-o2;
+ if(order < 0){
+ return -1;
+ }
+ else if(order > 0){
+ return 1;
+ }
+ return 0;
+ }
+
+ private int getOrdinal(OrdinalProvider provider){
+ if(provider instanceof Orderable){
+ return ((Orderable)provider).order();
+ }
+ return 0;
+ }
+
+ public int getOrdinal(Object service){
+ for(OrdinalProvider provider: ordinalProviders){
+ OptionalInt ord = provider.getOrdinal(service.getClass());
+ if(ord.isPresent()){
+ return ord.getAsInt();
+ }
+ }
+ if(service instanceof Orderable){
+ return ((Orderable)service).order();
+ }
+ return 0;
+ }
+
+
+ @Override
+ public int compare(Object o1, Object o2) {
+ int ord1 = getOrdinal(o1);
+ int ord2 = getOrdinal(o2);
+ int order = ord1-ord2;
+ if(order < 0){
+ return -1;
+ }
+ else if(order > 0){
+ return 1;
+ }
+ return 0;
+ }
+}