Repository: incubator-tamaya Updated Branches: refs/heads/master d441521e4 -> 45087eeba
TAMAYA-63: Aligned API with Java 8. Fixed issues. TAMAYA 61: Implemented value combination interface logic. Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/commit/a95b0ba2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/tree/a95b0ba2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya/diff/a95b0ba2 Branch: refs/heads/master Commit: a95b0ba24d20365463f91b14542e1e6973a39d78 Parents: d441521 Author: anatole <[email protected]> Authored: Sun Jan 25 23:42:48 2015 +0100 Committer: anatole <[email protected]> Committed: Mon Jan 26 00:09:58 2015 +0100 ---------------------------------------------------------------------- .../java/org/apache/tamaya/Configuration.java | 29 ++++++- .../org/apache/tamaya/PropertyConverter.java | 41 ++++++++++ .../java/org/apache/tamaya/TypeLiteral.java | 6 +- .../apache/tamaya/spi/ConfigurationContext.java | 20 +++-- .../apache/tamaya/spi/PropertyConverter.java | 41 ---------- .../core/internal/DefaultConfiguration.java | 46 ++++++++--- .../internal/DefaultConfigurationContext.java | 85 +++++++++++++++++--- .../core/internal/PropertyConverterManager.java | 45 +++++++---- .../converters/BigDecimalConverter.java | 2 +- .../converters/BigIntegerConverter.java | 2 +- .../internal/converters/BooleanConverter.java | 2 +- .../core/internal/converters/ByteConverter.java | 2 +- .../core/internal/converters/CharConverter.java | 2 +- .../internal/converters/CurrencyConverter.java | 2 +- .../internal/converters/DoubleConverter.java | 2 +- .../core/internal/converters/EnumConverter.java | 2 +- .../internal/converters/FloatConverter.java | 2 +- .../internal/converters/IntegerConverter.java | 2 +- .../core/internal/converters/LongConverter.java | 2 +- .../internal/converters/NumberConverter.java | 2 +- .../internal/converters/ShortConverter.java | 2 +- .../org.apache.tamaya.PropertyConverter | 30 +++++++ .../org.apache.tamaya.spi.PropertyConverter | 30 ------- 23 files changed, 269 insertions(+), 130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/api/src/main/java/org/apache/tamaya/Configuration.java ---------------------------------------------------------------------- diff --git a/java7/api/src/main/java/org/apache/tamaya/Configuration.java b/java7/api/src/main/java/org/apache/tamaya/Configuration.java index 25ecaec..c9a012e 100644 --- a/java7/api/src/main/java/org/apache/tamaya/Configuration.java +++ b/java7/api/src/main/java/org/apache/tamaya/Configuration.java @@ -19,6 +19,7 @@ package org.apache.tamaya; import java.util.Map; +import java.util.Objects; /** @@ -50,7 +51,7 @@ public interface Configuration { /** * Get the property keys as type T. This will implicitly require a corresponding {@link - * org.apache.tamaya.spi.PropertyConverter} to be available that is capable current providing type T + * PropertyConverter} 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 @@ -62,6 +63,32 @@ public interface Configuration { <T> T get(String key, Class<T> type); /** + * Get the property keys as type T. This will implicitly require a corresponding {@link + * PropertyConverter} 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 + * a/b/c/d.myProperty}. + * @param type The target type required, not null. + * @return the property value, never null.. + * @throws ConfigException if the keys could not be converted to the required target type. + */ + <T> T get(String key, TypeLiteral<T> type); + + /** + * Get the property keys as type T. This will implicitly require a corresponding {@link + * PropertyConverter} 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 + * a/b/c/d.myProperty}. + * @param converter The target converter to be used, not null. + * @return the property value, never null.. + * @throws ConfigException if the keys could not be converted to the required target type. + */ + <T> T get(String key, PropertyConverter<T> converter); + + /** * Access all current known Configuration properties as a full {@code Map<String,String>}. * Be aware that entries from non scannable parts of the registered {@link org.apache.tamaya.spi.PropertySource} * instances may not be contained in the result, but nevertheless be accessible calling one of the http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/api/src/main/java/org/apache/tamaya/PropertyConverter.java ---------------------------------------------------------------------- diff --git a/java7/api/src/main/java/org/apache/tamaya/PropertyConverter.java b/java7/api/src/main/java/org/apache/tamaya/PropertyConverter.java new file mode 100644 index 0000000..bff85a3 --- /dev/null +++ b/java7/api/src/main/java/org/apache/tamaya/PropertyConverter.java @@ -0,0 +1,41 @@ +/* + * 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; + + +/** + * Interface for an property that converts a configured String into something else. + * This is used for implementing type conversion from a property (String) to a certain target + * type. Hereby the target type can be multivalued (eg collections) or complex if needed. + */ +public interface PropertyConverter<T>{ + + /** + * Convert the given configuration keys from it' String representation into the required target type. + * @param value the configuration keys + * @return converted keys + */ + T convert(String value); + + //X TODO probably add some diagnostic info which explains what kind of + //X format(s) is supported. + //X This could be useful if e.g. no converter in the chain felt responsible + //X because a wrongly formatted configuration string had been used. + //X This could probably also be handled via an additional Annotation on the converter. +} http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/api/src/main/java/org/apache/tamaya/TypeLiteral.java ---------------------------------------------------------------------- diff --git a/java7/api/src/main/java/org/apache/tamaya/TypeLiteral.java b/java7/api/src/main/java/org/apache/tamaya/TypeLiteral.java index 32c32a6..2e1ab31 100644 --- a/java7/api/src/main/java/org/apache/tamaya/TypeLiteral.java +++ b/java7/api/src/main/java/org/apache/tamaya/TypeLiteral.java @@ -46,7 +46,11 @@ public class TypeLiteral<T> implements Serializable { protected TypeLiteral() { } - public static <T> TypeLiteral<T> of(Type type){ + public static <L> TypeLiteral<L> of(Type type){ + return new TypeLiteral<>(type); + } + + public static <L> TypeLiteral<L> of(Class<L> type){ return new TypeLiteral<>(type); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/api/src/main/java/org/apache/tamaya/spi/ConfigurationContext.java ---------------------------------------------------------------------- diff --git a/java7/api/src/main/java/org/apache/tamaya/spi/ConfigurationContext.java b/java7/api/src/main/java/org/apache/tamaya/spi/ConfigurationContext.java index 6f5de4b..160194b 100644 --- a/java7/api/src/main/java/org/apache/tamaya/spi/ConfigurationContext.java +++ b/java7/api/src/main/java/org/apache/tamaya/spi/ConfigurationContext.java @@ -19,13 +19,16 @@ package org.apache.tamaya.spi; +import org.apache.tamaya.PropertyConverter; +import org.apache.tamaya.TypeLiteral; + import java.util.List; import java.util.Map; /** * Central SPI for programmatically dealing with the setup of the configuration system. * This includes adding and enlisting {@link org.apache.tamaya.spi.PropertySource}s, - * managing {@link PropertyConverter}s, ConfigFilters, etc. + * managing {@link org.apache.tamaya.PropertyConverter}s, ConfigFilters, etc. */ public interface ConfigurationContext { @@ -53,13 +56,13 @@ public interface ConfigurationContext { /** - * This method can be used for programmatically adding {@link PropertyConverter}s. + * This method can be used for programmatically adding {@link org.apache.tamaya.PropertyConverter}s. * It is not needed for normal 'usage' by end users, but only for Extension Developers! * * @param typeToConvert the type which the converter is for * @param propertyConverter the PropertyConverters to add for this type */ - <T> void addPropertyConverter(Class<T> typeToConvert, PropertyConverter<T> propertyConverter); + <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter); /** * <p> @@ -81,7 +84,7 @@ public interface ConfigurationContext { * * @return map with sorted list of registered PropertySources per type. */ - Map<Class<?>, List<PropertyConverter<?>>> getPropertyConverters(); + Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters(); /** * <p> @@ -130,11 +133,18 @@ public interface ConfigurationContext { * * @return a sorted list of registered PropertySources per type. */ - <T> List<PropertyConverter<T>> getPropertyConverters(Class<T> type); + <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type); /** * Access the current PropertyFilter instances. * @return the list of registered PropertyFilters, never null. */ List<PropertyFilter> getPropertyFilters(); + + /** + * Access the {@link org.apache.tamaya.spi.PropertyValueCombinationPolicy} used to evaluate the final + * property values. + * @return the {@link org.apache.tamaya.spi.PropertyValueCombinationPolicy} used, never null. + */ + PropertyValueCombinationPolicy getPropertyValueCombinationPolicy(); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/api/src/main/java/org/apache/tamaya/spi/PropertyConverter.java ---------------------------------------------------------------------- diff --git a/java7/api/src/main/java/org/apache/tamaya/spi/PropertyConverter.java b/java7/api/src/main/java/org/apache/tamaya/spi/PropertyConverter.java deleted file mode 100644 index 167e0a8..0000000 --- a/java7/api/src/main/java/org/apache/tamaya/spi/PropertyConverter.java +++ /dev/null @@ -1,41 +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 for an property that converts a configured String into something else. - * This is used for implementing type conversion from a property (String) to a certain target - * type. Hereby the target type can be multivalued (eg collections) or complex if needed. - */ -public interface PropertyConverter<T>{ - - /** - * Convert the given configuration keys from it' String representation into the required target type. - * @param value the configuration keys - * @return converted keys - */ - T convert(String value); - - //X TODO probably add some diagnostic info which explains what kind of - //X format(s) is supported. - //X This could be useful if e.g. no converter in the chain felt responsible - //X because a wrongly formatted configuration string had been used. - //X This could probably also be handled via an additional Annotation on the converter. -} http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java index 4215a73..9d8ad00 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfiguration.java @@ -22,11 +22,12 @@ import org.apache.tamaya.ConfigException; import org.apache.tamaya.ConfigOperator; import org.apache.tamaya.ConfigQuery; import org.apache.tamaya.Configuration; +import org.apache.tamaya.TypeLiteral; import org.apache.tamaya.spi.ConfigurationContext; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import org.apache.tamaya.spi.PropertyFilter; import org.apache.tamaya.spi.PropertySource; -import org.apache.tamaya.spi.ServiceContextManager; +import org.apache.tamaya.spi.PropertyValueCombinationPolicy; import java.util.ArrayList; import java.util.Collections; @@ -80,12 +81,10 @@ public class DefaultConfiguration implements Configuration { public String get(String key) { List<PropertySource> propertySources = configurationContext.getPropertySources(); String unfilteredValue = null; + PropertyValueCombinationPolicy combinationPolicy = this.configurationContext + .getPropertyValueCombinationPolicy(); for (PropertySource propertySource : propertySources) { - String value = propertySource.get(key); - if (value != null) { - unfilteredValue = value.length() > 0 ? value : null; - break; - } + unfilteredValue = combinationPolicy.collect(unfilteredValue, key, propertySource); } return applyFilter(key, unfilteredValue); } @@ -166,13 +165,11 @@ public class DefaultConfiguration implements Configuration { * @return the filtered map. */ private Map<String, String> applyFilters(Map<String, String> inputMap) { - final Map<String, String> resultMap = new HashMap<>(); + Map<String, String> resultMap = new HashMap<>(); // Apply filters to values, prevent values filtered to null! for (int i = 0; i < MAX_FILTER_LOOPS; i++) { AtomicInteger changes = new AtomicInteger(); for (PropertyFilter filter : configurationContext.getPropertyFilters()) { - - for (Map.Entry<String, String> entry : inputMap.entrySet()) { final String k = entry.getKey(); final String v = entry.getValue(); @@ -189,6 +186,9 @@ public class DefaultConfiguration implements Configuration { if (null != newValue) { resultMap.put(k, newValue); } + else{ + resultMap.remove(k); + } } } if (changes.get() == 0) { @@ -205,13 +205,12 @@ public class DefaultConfiguration implements Configuration { changes.set(0); } } - return resultMap; } /** * Accesses the current String value for the given key and tries to convert it - * using the {@link org.apache.tamaya.spi.PropertyConverter} instances provided by the current + * using the {@link org.apache.tamaya.PropertyConverter} instances provided by the current * {@link org.apache.tamaya.spi.ConfigurationContext}. * * @param key the property's absolute, or relative path, e.g. @code @@ -222,6 +221,22 @@ public class DefaultConfiguration implements Configuration { */ @Override public <T> T get(String key, Class<T> type) { + return get(key, TypeLiteral.of(type)); + } + + /** + * Accesses the current String value for the given key and tries to convert it + * using the {@link org.apache.tamaya.PropertyConverter} instances provided by the current + * {@link org.apache.tamaya.spi.ConfigurationContext}. + * + * @param key the property's absolute, or relative path, e.g. @code + * a/b/c/d.myProperty}. + * @param type The target type required, not null. + * @param <T> the value type + * @return the converted value, never null. + */ + @Override + public <T> T get(String key, TypeLiteral<T> type) { String value = get(key); if (value != null) { List<PropertyConverter<T>> converters = configurationContext.getPropertyConverters(type); @@ -235,12 +250,17 @@ public class DefaultConfiguration implements Configuration { LOG.log(Level.FINEST, "PropertyConverter: " + converter + " failed to convert value: " + value, e); } } - throw new ConfigException("Unparseable config value for type: " + type.getName() + ": " + key); + throw new ConfigException("Unparseable config value for type: " + type.getRawType().getName() + ": " + key); } return null; } + @Override + public <T> T get(String key, PropertyConverter<T> converter) { + return null; + } + public Configuration with(ConfigOperator operator) { return operator.operate(this); } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java index 3abae9d..a754310 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/DefaultConfigurationContext.java @@ -18,11 +18,14 @@ */ package org.apache.tamaya.core.internal; +import org.apache.tamaya.TypeLiteral; import org.apache.tamaya.spi.ConfigurationContext; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import org.apache.tamaya.spi.PropertyFilter; import org.apache.tamaya.spi.PropertySource; import org.apache.tamaya.spi.PropertySourceProvider; +import org.apache.tamaya.spi.PropertyValueCombinationPolicy; +import org.apache.tamaya.spi.ServiceContext; import org.apache.tamaya.spi.ServiceContextManager; import javax.annotation.Priority; @@ -36,13 +39,16 @@ import java.util.List; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.logging.Logger; /** * Default Implementation of a simple ConfigurationContext. */ public class DefaultConfigurationContext implements ConfigurationContext { + /** The logger used. */ + private final static Logger LOG = Logger.getLogger(DefaultConfigurationContext.class.getName()); /** - * Cubcomponent handling {@link org.apache.tamaya.spi.PropertyConverter} instances. + * Cubcomponent handling {@link org.apache.tamaya.PropertyConverter} instances. */ private PropertyConverterManager propertyConverterManager = new PropertyConverterManager(); @@ -57,6 +63,12 @@ public class DefaultConfigurationContext implements ConfigurationContext { private List<PropertyFilter> immutablePropertyFilters; /** + * The overriding policy used when combining PropertySources registered to evalute the final configuration + * values. + */ + private PropertyValueCombinationPolicy propertyValueCombinationPolicy; + + /** * Lock for internal synchronization. */ private ReentrantReadWriteLock propertySourceLock = new ReentrantReadWriteLock(); @@ -80,13 +92,41 @@ public class DefaultConfigurationContext implements ConfigurationContext { Collections.sort(propertySources, new PropertySourceComparator()); immutablePropertySources = Collections.unmodifiableList(propertySources); + LOG.info("Registered " + immutablePropertySources.size() + " property sources: " + + createStringList(immutablePropertySources, new Function<PropertySource, String>() { + @Override + public String apply(PropertySource ps) { + return ps.getName() + '[' + ps.getClass().getName()+']'; + } + })); // as next step we pick up the PropertyFilters pretty much the same way List<PropertyFilter> propertyFilters = new ArrayList<>(); propertyFilters.addAll(ServiceContextManager.getServiceContext().getServices(PropertyFilter.class)); Collections.sort(propertyFilters, new PropertyFilterComparator()); + immutablePropertyFilters = Collections.unmodifiableList(propertyFilters); + LOG.info("Registered " + immutablePropertyFilters.size() + " property filters: " + + createStringList(immutablePropertyFilters, new Function<PropertyFilter, String>() { + @Override + public String apply(PropertyFilter propertyFilter) { + return propertyFilter.getClass().getName(); + } + })); immutablePropertyFilters = Collections.unmodifiableList(propertyFilters); + LOG.info("Registered " + immutablePropertyFilters.size() + " property filters: " + + createStringList(immutablePropertyFilters,new Function<PropertyFilter, String>() { + @Override + public String apply(PropertyFilter propertyFilter) { + return propertyFilter.getClass().getName(); + } + })); + + propertyValueCombinationPolicy = ServiceContextManager.getServiceContext().getService(PropertyValueCombinationPolicy.class); + if(propertyValueCombinationPolicy==null) { + propertyValueCombinationPolicy = PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR; + } + LOG.info("Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy); } /** @@ -97,7 +137,16 @@ public class DefaultConfigurationContext implements ConfigurationContext { List<PropertySource> propertySources = new ArrayList<>(); List<PropertySourceProvider> propertySourceProviders = ServiceContextManager.getServiceContext().getServices(PropertySourceProvider.class); for (PropertySourceProvider propertySourceProvider : propertySourceProviders) { - propertySources.addAll(propertySourceProvider.getPropertySources()); + Collection<PropertySource> sources = propertySourceProvider.getPropertySources(); + LOG.finer("PropertySourceProvider " + propertySourceProvider.getClass().getName() + + " provided the following property sources: " + + createStringList(sources,new Function<PropertySource, String>() { + @Override + public String apply(PropertySource ps) { + return ps.getName() + '[' + ps.getClass().getName()+']'; + } + })); + propertySources.addAll(sources); } return propertySources; @@ -131,11 +180,11 @@ public class DefaultConfigurationContext implements ConfigurationContext { */ private int comparePropertySources(PropertySource source1, PropertySource source2) { if (source1.getOrdinal() < source2.getOrdinal()) { - return 1; - } else if (source1.getOrdinal() > source2.getOrdinal()) { return -1; + } else if (source1.getOrdinal() > source2.getOrdinal()) { + return 1; } else { - return source2.getClass().getName().compareTo(source1.getClass().getName()); + return source1.getClass().getName().compareTo(source2.getClass().getName()); } } @@ -183,17 +232,18 @@ public class DefaultConfigurationContext implements ConfigurationContext { } @Override - public <T> void addPropertyConverter(Class<T> typeToConvert, PropertyConverter<T> propertyConverter) { + public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) { propertyConverterManager.register(typeToConvert, propertyConverter); + LOG.info("Added PropertyConverter: " + propertyConverter.getClass().getName()); } @Override - public Map<Class<?>, List<PropertyConverter<?>>> getPropertyConverters() { + public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() { return propertyConverterManager.getPropertyConverters(); } @Override - public <T> List<PropertyConverter<T>> getPropertyConverters(Class<T> targetType) { + public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) { return propertyConverterManager.getPropertyConverters(targetType); } @@ -202,4 +252,21 @@ public class DefaultConfigurationContext implements ConfigurationContext { return immutablePropertyFilters; } + @Override + public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy(){ + return propertyValueCombinationPolicy; + } + + private <T> String createStringList(Collection<T> items, Function<T,String> mapper){ + StringBuilder builder = new StringBuilder(); + for(T t: items){ + builder.append(mapper.apply(t)); + } + return builder.toString(); + } + + private static interface Function<T,R>{ + R apply(T t); + } + } http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/PropertyConverterManager.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/PropertyConverterManager.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/PropertyConverterManager.java index 67d77b6..3fa97b9 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/PropertyConverterManager.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/PropertyConverterManager.java @@ -19,8 +19,9 @@ package org.apache.tamaya.core.internal; import org.apache.tamaya.ConfigException; +import org.apache.tamaya.TypeLiteral; import org.apache.tamaya.core.internal.converters.EnumConverter; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import org.apache.tamaya.spi.ServiceContextManager; import java.lang.reflect.Constructor; @@ -43,7 +44,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * Manager that deals with {@link org.apache.tamaya.spi.PropertyConverter} instances. + * Manager that deals with {@link org.apache.tamaya.PropertyConverter} instances. * This class is thread-safe. */ public class PropertyConverterManager { @@ -54,7 +55,7 @@ public class PropertyConverterManager { /** * The registered converters. */ - private Map<Class<?>, List<PropertyConverter<?>>> converters = new ConcurrentHashMap<>(); + private Map<TypeLiteral<?>, List<PropertyConverter<?>>> converters = new ConcurrentHashMap<>(); /** * The lock used. */ @@ -79,7 +80,7 @@ public class PropertyConverterManager { conv.getClass().getName()); } else { Type targetType = type.getActualTypeArguments()[0]; - register((Class<?>) targetType, conv); + register(TypeLiteral.of(targetType), conv); } } } @@ -91,7 +92,7 @@ public class PropertyConverterManager { * @param converter the converter, not null. * @param <T> the type. */ - public <T> void register(Class<T> targetType, PropertyConverter<T> converter) { + public <T> void register(TypeLiteral<T> targetType, PropertyConverter<T> converter) { Objects.requireNonNull(converter); Lock writeLock = lock.writeLock(); try { @@ -115,8 +116,18 @@ public class PropertyConverterManager { * @return true, if a converter for the given type is registered, or a default one can be created. */ public boolean isTargetTypeSupported(Class<?> targetType) { + return isTargetTypeSupported(TypeLiteral.of(targetType)); + } + + /** + * Allows to evaluate if a given target type is supported. + * + * @param targetType the target type, not null. + * @return true, if a converter for the given type is registered, or a default one can be created. + */ + public boolean isTargetTypeSupported(TypeLiteral<?> targetType) { return converters.containsKey(targetType) - || createDefaultPropertyConverter(targetType) != null; + || createDefaultPropertyConverter(targetType) != null; } /** @@ -125,9 +136,9 @@ public class PropertyConverterManager { * factory methods taking a single String instance. * * @return the current map of instantiated and registered converters. - * @see #createDefaultPropertyConverter(Class) + * @see #createDefaultPropertyConverter(org.apache.tamaya.TypeLiteral) */ - public Map<Class<?>, List<PropertyConverter<?>>> getPropertyConverters() { + public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() { Lock readLock = lock.readLock(); try { readLock.lock(); @@ -145,9 +156,9 @@ public class PropertyConverterManager { * @param targetType the target type, not null. * @param <T> the type class * @return the ordered list of converters (may be empty for not convertible types). - * @see #createDefaultPropertyConverter(Class) + * @see #createDefaultPropertyConverter(org.apache.tamaya.TypeLiteral) */ - public <T> List<PropertyConverter<T>> getPropertyConverters(Class<T> targetType) { + public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) { Lock readLock = lock.readLock(); List<PropertyConverter<T>> converters; try { @@ -181,21 +192,21 @@ public class PropertyConverterManager { * @param <T> the type class * @return a new converter, or null. */ - protected <T> PropertyConverter<T> createDefaultPropertyConverter(final Class<T> targetType) { - if (Enum.class.isAssignableFrom(targetType)) { - return new EnumConverter<T>(targetType); + protected <T> PropertyConverter<T> createDefaultPropertyConverter(final TypeLiteral<T> targetType) { + if (Enum.class.isAssignableFrom(targetType.getRawType())) { + return new EnumConverter<T>(targetType.getRawType()); } PropertyConverter<T> converter = null; - final Method factoryMethod = getFactoryMethod(targetType, "of", "valueOf", "instanceOf", "getInstance", "from", "fromString", "parse"); + final Method factoryMethod = getFactoryMethod(targetType.getRawType(), "of", "valueOf", "instanceOf", "getInstance", "from", "fromString", "parse"); if (factoryMethod != null) { - converter = new ViaMethodPropertyConverter<>(factoryMethod, targetType); + converter = new ViaMethodPropertyConverter<>(factoryMethod, targetType.getRawType()); } if (converter == null) { try { - final Constructor<T> constr = targetType.getDeclaredConstructor(String.class); + final Constructor<T> constr = targetType.getRawType().getDeclaredConstructor(String.class); converter = new ViaConstructorPropertyConverter<>(constr); } catch (Exception e) { - LOG.log(Level.FINEST, "Failed to construct instance of type: " + targetType.getName(), e); + LOG.log(Level.FINEST, "Failed to construct instance of type: " + targetType.getRawType().getName(), e); } } return converter; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigDecimalConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigDecimalConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigDecimalConverter.java index f927e22..87f3d14 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigDecimalConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigDecimalConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.math.BigDecimal; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigIntegerConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigIntegerConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigIntegerConverter.java index f0eba47..4db9bcd 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigIntegerConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BigIntegerConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.math.BigInteger; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BooleanConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BooleanConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BooleanConverter.java index 6c33d7f..f07a8ee 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BooleanConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/BooleanConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Locale; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ByteConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ByteConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ByteConverter.java index 1d9bf65..191e9e5 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ByteConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ByteConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; /** http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CharConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CharConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CharConverter.java index 829c16b..f3773bb 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CharConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CharConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CurrencyConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CurrencyConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CurrencyConverter.java index c3c6e56..4d033eb 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CurrencyConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/CurrencyConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Currency; import java.util.Locale; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/DoubleConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/DoubleConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/DoubleConverter.java index 8eb016b..1814cba 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/DoubleConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/DoubleConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/EnumConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/EnumConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/EnumConverter.java index 652c808..dbdabf6 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/EnumConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/EnumConverter.java @@ -19,7 +19,7 @@ package org.apache.tamaya.core.internal.converters; import org.apache.tamaya.ConfigException; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/FloatConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/FloatConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/FloatConverter.java index 839dbe0..955197b 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/FloatConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/FloatConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/IntegerConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/IntegerConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/IntegerConverter.java index c67e587..923b132 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/IntegerConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/IntegerConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/LongConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/LongConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/LongConverter.java index 600d875..67434d2 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/LongConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/LongConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/NumberConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/NumberConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/NumberConverter.java index 6c8094f..3fdc68d 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/NumberConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/NumberConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.math.BigDecimal; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ShortConverter.java ---------------------------------------------------------------------- diff --git a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ShortConverter.java b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ShortConverter.java index 8a71ef7..e41c1d6 100644 --- a/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ShortConverter.java +++ b/java7/core/src/main/java/org/apache/tamaya/core/internal/converters/ShortConverter.java @@ -18,7 +18,7 @@ */ package org.apache.tamaya.core.internal.converters; -import org.apache.tamaya.spi.PropertyConverter; +import org.apache.tamaya.PropertyConverter; import java.util.Objects; http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.PropertyConverter ---------------------------------------------------------------------- diff --git a/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.PropertyConverter b/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.PropertyConverter new file mode 100644 index 0000000..0f0cb26 --- /dev/null +++ b/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.PropertyConverter @@ -0,0 +1,30 @@ +# +# 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.converters.BooleanConverter +org.apache.tamaya.core.internal.converters.ByteConverter +org.apache.tamaya.core.internal.converters.CharConverter +org.apache.tamaya.core.internal.converters.DoubleConverter +org.apache.tamaya.core.internal.converters.FloatConverter +org.apache.tamaya.core.internal.converters.IntegerConverter +org.apache.tamaya.core.internal.converters.LongConverter +org.apache.tamaya.core.internal.converters.ShortConverter +org.apache.tamaya.core.internal.converters.BigDecimalConverter +org.apache.tamaya.core.internal.converters.BigIntegerConverter +org.apache.tamaya.core.internal.converters.CurrencyConverter +org.apache.tamaya.core.internal.converters.NumberConverter http://git-wip-us.apache.org/repos/asf/incubator-tamaya/blob/a95b0ba2/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter ---------------------------------------------------------------------- diff --git a/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter b/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter deleted file mode 100644 index 0f0cb26..0000000 --- a/java7/core/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertyConverter +++ /dev/null @@ -1,30 +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.core.internal.converters.BooleanConverter -org.apache.tamaya.core.internal.converters.ByteConverter -org.apache.tamaya.core.internal.converters.CharConverter -org.apache.tamaya.core.internal.converters.DoubleConverter -org.apache.tamaya.core.internal.converters.FloatConverter -org.apache.tamaya.core.internal.converters.IntegerConverter -org.apache.tamaya.core.internal.converters.LongConverter -org.apache.tamaya.core.internal.converters.ShortConverter -org.apache.tamaya.core.internal.converters.BigDecimalConverter -org.apache.tamaya.core.internal.converters.BigIntegerConverter -org.apache.tamaya.core.internal.converters.CurrencyConverter -org.apache.tamaya.core.internal.converters.NumberConverter
