You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2018/01/03 00:09:10 UTC
[14/18] incubator-tamaya-extensions git commit: Rewrite/adaptation
based on JSR API.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
index e39b070..699208e 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
@@ -18,18 +18,18 @@
*/
package org.apache.tamaya.inject.internal;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.TypeLiteral;
import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.spi.InjectionUtils;
+import org.apache.tamaya.inject.spi.InjectionEvaluator;
import org.apache.tamaya.inject.spi.ConfiguredField;
+import javax.config.Config;
+import javax.config.ConfigProvider;
import java.lang.reflect.Field;
+import java.lang.reflect.Type;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Collection;
+import java.util.NoSuchElementException;
import java.util.Objects;
/**
@@ -58,9 +58,9 @@ public class ConfiguredFieldImpl implements ConfiguredField{
* Evaluate the initial keys from the configuration and apply changes to the field.
*
* @param target the target instance.
- * @throws ConfigException if evaluation or conversion failed.
+ * @throws java.util.NoSuchElementException if evaluation or conversion failed.
*/
- public void configure(Object target, Configuration config) throws ConfigException {
+ public void configure(Object target, Config config) {
if (this.annotatedField.getType() == DynamicValue.class) {
applyDynamicValue(target);
} else {
@@ -73,9 +73,9 @@ public class ConfiguredFieldImpl implements ConfiguredField{
* This method instantiates and assigns a dynamic value.
*
* @param target the target instance, not null.
- * @throws ConfigException if the configuration required could not be resolved or converted.
+ * @throws NoSuchElementException if the configuration required could not be resolved or converted.
*/
- private void applyDynamicValue(Object target) throws ConfigException {
+ private void applyDynamicValue(Object target) {
Objects.requireNonNull(target);
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@@ -83,13 +83,13 @@ public class ConfiguredFieldImpl implements ConfiguredField{
public Object run() throws Exception {
annotatedField.setAccessible(true);
annotatedField.set(target,
- DefaultDynamicValue.of(target, annotatedField, ConfigurationProvider.getConfiguration()));
+ DefaultDynamicValue.of(target, annotatedField, ConfigProvider.getConfig()));
return annotatedField;
}
});
} catch (Exception e) {
- throw new ConfigException("Failed to annotation configured field: " + this.annotatedField.getDeclaringClass()
- .getName() + '.' + annotatedField.getName(), e);
+ throw new NoSuchElementException("Failed to annotation configured field: " + this.annotatedField.getDeclaringClass()
+ .getName() + '.' + annotatedField.getName()+": " + e);
}
}
@@ -99,34 +99,28 @@ public class ConfiguredFieldImpl implements ConfiguredField{
* @param target the target instance, not null.
* @param config The configuration to be used.
* @param resolve set to true, if expression resolution should be applied on the keys passed.
- * @throws ConfigException if the configuration required could not be resolved or converted.
+ * @throws NoSuchElementException if the configuration required could not be resolved or converted.
*/
- private void applyValue(Object target, Configuration config, boolean resolve) throws ConfigException {
+ private void applyValue(Object target, Config config, boolean resolve) {
Objects.requireNonNull(target);
try {
- String[] retKey = new String[1];
- String configValue = InjectionHelper.getConfigValue(this.annotatedField, retKey, config);
- // Next step perform expression resolution, if any
- String evaluatedValue = resolve && configValue != null
- ? InjectionHelper.evaluateValue(configValue)
- : configValue;
-
- // Check for adapter/filter
- Object value = InjectionHelper.adaptValue(this.annotatedField,
- TypeLiteral.of(this.annotatedField.getType()), retKey[0], evaluatedValue);
+ Class targetType = this.annotatedField.getType();
+ Object configValue = InjectionHelper.getConfigValue(this.annotatedField, targetType, config);
+
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
annotatedField.setAccessible(true);
- if(value!=null) {
- annotatedField.set(target, value);
+ if(configValue!=null) {
+ annotatedField.set(target, configValue);
}
return annotatedField;
}
});
} catch (Exception e) {
- throw new ConfigException("Failed to evaluate annotated field: " + this.annotatedField.getDeclaringClass()
- .getName() + '.' + annotatedField.getName(), e);
+ e.printStackTrace();
+ throw new NoSuchElementException("Failed to evaluate annotated field: " + this.annotatedField.getDeclaringClass()
+ .getName() + '.' + annotatedField.getName()+": "+ e);
}
}
@@ -145,7 +139,7 @@ public class ConfiguredFieldImpl implements ConfiguredField{
*/
@Override
public Collection<String> getConfiguredKeys(){
- return InjectionUtils.getKeys(this.annotatedField);
+ return InjectionEvaluator.getKeys(this.annotatedField);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
index b10300e..7ea94d0 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
@@ -18,16 +18,16 @@
*/
package org.apache.tamaya.inject.internal;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.inject.spi.InjectionUtils;
+import org.apache.tamaya.inject.spi.InjectionEvaluator;
import org.apache.tamaya.inject.spi.ConfiguredMethod;
+import javax.config.Config;
import java.lang.reflect.Method;
+import java.lang.reflect.Type;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Collection;
+import java.util.NoSuchElementException;
import java.util.Objects;
/**
@@ -55,20 +55,11 @@ public class ConfiguredSetterMethod implements ConfiguredMethod {
}
@Override
- public void configure(Object target, Configuration config) throws ConfigException {
- String[] retKey = new String[1];
- String configValue = InjectionHelper.getConfigValue(this.setterMethod, retKey, config);
+ public void configure(Object target, Config config) {
+ Class targetType = this.setterMethod.getParameterTypes()[0];
+ Object configValue = InjectionHelper.getConfigValue(this.setterMethod, targetType, config);
Objects.requireNonNull(target);
try {
- String evaluatedString = configValue != null
- ? InjectionHelper.evaluateValue(configValue)
- : configValue;
-
- // Check for adapter/filter
- Object value = InjectionHelper.adaptValue(
- this.setterMethod, TypeLiteral.of(this.setterMethod.getParameterTypes()[0]),
- retKey[0], evaluatedString);
-
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
@@ -76,11 +67,10 @@ public class ConfiguredSetterMethod implements ConfiguredMethod {
return setterMethod;
}
});
-
- setterMethod.invoke(target, value);
+ setterMethod.invoke(target, configValue);
} catch (Exception e) {
- throw new ConfigException("Failed to annotation configured method: " + this.setterMethod.getDeclaringClass()
- .getName() + '.' + setterMethod.getName(), e);
+ throw new NoSuchElementException("Failed to annotation configured method: " + this.setterMethod.getDeclaringClass()
+ .getName() + '.' + setterMethod.getName()+": "+ e);
}
}
@@ -92,7 +82,7 @@ public class ConfiguredSetterMethod implements ConfiguredMethod {
*/
@Override
public Collection<String> getConfiguredKeys() {
- return InjectionUtils.getKeys(this.setterMethod);
+ return InjectionEvaluator.getKeys(this.setterMethod);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
index 85f1f4a..25bd051 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
@@ -24,17 +24,17 @@ import java.lang.reflect.Modifier;
import java.util.*;
import java.util.logging.Logger;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.inject.api.ConfigAutoInject;
+import org.apache.tamaya.inject.api.ConfigAutoDetect;
+import org.apache.tamaya.inject.api.ConfigFallbackKeys;
import org.apache.tamaya.inject.api.NoConfig;
-import org.apache.tamaya.inject.api.Config;
import org.apache.tamaya.inject.api.ConfigDefaultSections;
import org.apache.tamaya.inject.spi.ConfiguredField;
import org.apache.tamaya.inject.spi.ConfiguredMethod;
import org.apache.tamaya.inject.spi.ConfiguredType;
+import javax.config.ConfigProvider;
+import javax.config.inject.ConfigProperty;
+
/**
* Structure that contains and manages configuration related things for a configured type registered.
* Created by Anatole on 03.10.2014.
@@ -69,7 +69,7 @@ public class ConfiguredTypeImpl implements ConfiguredType{
initFields(type, true);
initMethods(type, true);
}else {
- ConfigAutoInject autoInject = (ConfigAutoInject) type.getAnnotation(ConfigAutoInject.class);
+ ConfigAutoDetect autoInject = (ConfigAutoDetect) type.getAnnotation(ConfigAutoDetect.class);
if (autoInject != null) {
initFields(type, autoInject != null);
initMethods(type, autoInject != null);
@@ -108,8 +108,8 @@ public class ConfiguredTypeImpl implements ConfiguredType{
f.toGenericString());
}
} catch (Exception e) {
- throw new ConfigException("Failed to initialized configured field: " +
- f.getDeclaringClass().getName() + '.' + f.getName(), e);
+ throw new NoSuchElementException("Failed to initialized configured field: " +
+ f.getDeclaringClass().getName() + '.' + f.getName()+": "+ e);
}
}
}
@@ -131,8 +131,10 @@ public class ConfiguredTypeImpl implements ConfiguredType{
continue;
}
if(isConfiguredMethod(m) || autoConfigure) {
- Config propAnnot = m.getAnnotation(Config.class);
- if (addPropertySetter(m, propAnnot)) {
+ if (addPropertySetter(
+ m,
+ m.getAnnotation(ConfigProperty.class),
+ m.getAnnotation(ConfigFallbackKeys.class))) {
LOG.finer("Added configured setter: " + m.getClass().getName() + "#" +
m.toGenericString());
}
@@ -140,7 +142,7 @@ public class ConfiguredTypeImpl implements ConfiguredType{
}
}
- private boolean addPropertySetter(Method m, Config prop) {
+ private boolean addPropertySetter(Method m, ConfigProperty prop, ConfigFallbackKeys fallbackKeys) {
if (prop!=null) {
if (m.getParameterTypes().length == 1) {
// getter method
@@ -150,8 +152,8 @@ public class ConfiguredTypeImpl implements ConfiguredType{
configuredSetterMethods.add(new ConfiguredSetterMethod(m));
return true;
} catch (Exception e) {
- throw new ConfigException("Failed to initialize configured setter method: " +
- m.getDeclaringClass().getName() + '.' + m.getName(), e);
+ throw new NoSuchElementException("Failed to initialize configured setter method: " +
+ m.getDeclaringClass().getName() + '.' + m.getName()+": "+ e);
}
}
}
@@ -166,11 +168,11 @@ public class ConfiguredTypeImpl implements ConfiguredType{
* @param instance The instance to be configured.
*/
public void configure(Object instance) {
- configure(instance, ConfigurationProvider.getConfiguration());
+ configure(instance, ConfigProvider.getConfig());
}
@Override
- public void configure(Object instance, Configuration config) {
+ public void configure(Object instance, javax.config.Config config) {
for (ConfiguredField field : configuredFields) {
field.configure(instance, config);
}
@@ -204,11 +206,11 @@ public class ConfiguredTypeImpl implements ConfiguredType{
}
public static boolean isConfiguredField(Field field) {
- return field.isAnnotationPresent(Config.class);
+ return field.isAnnotationPresent(ConfigProperty.class);
}
public static boolean isConfiguredMethod(Method method) {
- return method.isAnnotationPresent(Config.class);
+ return method.isAnnotationPresent(ConfigProperty.class);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
index 7b3fb61..b3fa28a 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
@@ -18,11 +18,11 @@
*/
package org.apache.tamaya.inject.internal;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
import org.apache.tamaya.inject.ConfigurationInjector;
import javax.annotation.Priority;
+import javax.config.ConfigProvider;
+import javax.config.inject.ConfigProperty;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
@@ -33,7 +33,6 @@ import java.util.function.Supplier;
import java.util.logging.Logger;
import org.apache.tamaya.inject.api.NoConfig;
-import org.apache.tamaya.inject.api.Config;
import org.apache.tamaya.inject.api.ConfigDefaultSections;
import org.apache.tamaya.inject.spi.ConfiguredType;
import org.osgi.service.component.annotations.Component;
@@ -57,13 +56,26 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
* @param type the type to be configured.
* @return the configured type registered.
*/
- public ConfiguredType registerType(Class<?> type) {
+ public ConfiguredType getConfiguredType(Class<?> type) {
ConfiguredType confType = configuredTypes.get(type);
if (confType == null) {
if(!isConfigAnnotated(type) && !autoConfigureEnabled){
return null;
}
confType = new ConfiguredTypeImpl(type);
+ }
+ return confType;
+ }
+
+ /**
+ * Extract the configuration annotation config and registers it per class, for later reuse.
+ *
+ * @param type the type to be configured.
+ * @return the configured type registered.
+ */
+ public ConfiguredType registerType(Class<?> type) {
+ ConfiguredType confType = getConfiguredType(type);
+ if (confType != null) {
configuredTypes.put(type, confType);
InjectionHelper.sendConfigurationEvent(confType);
}
@@ -97,12 +109,12 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
return true;
}
for (Field f : type.getDeclaredFields()) {
- if (f.isAnnotationPresent(NoConfig.class) || f.isAnnotationPresent(Config.class)) {
+ if (f.isAnnotationPresent(NoConfig.class) || f.isAnnotationPresent(ConfigProperty.class)) {
return true;
}
}
for (Method m : type.getDeclaredMethods()) {
- if (m.isAnnotationPresent(NoConfig.class) || m.isAnnotationPresent(Config.class)) {
+ if (m.isAnnotationPresent(NoConfig.class) || m.isAnnotationPresent(ConfigProperty.class)) {
return true;
}
}
@@ -117,7 +129,7 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
*/
@Override
public <T> T configure(T instance) {
- return configure(instance, ConfigurationProvider.getConfiguration());
+ return configure(instance, ConfigProvider.getConfig());
}
/**
@@ -128,7 +140,7 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
* @param config the target configuration, not null.
*/
@Override
- public <T> T configure(T instance, Configuration config) {
+ public <T> T configure(T instance, javax.config.Config config) {
Class<?> type = Objects.requireNonNull(instance).getClass();
ConfiguredType configuredType = registerType(type);
if(configuredType!=null){
@@ -146,7 +158,7 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
*/
@Override
public <T> T createTemplate(Class<T> templateType) {
- return createTemplate(templateType, ConfigurationProvider.getConfiguration());
+ return createTemplate(templateType, ConfigProvider.getConfig());
}
/**
@@ -156,7 +168,7 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
* @param config the target configuration, not null.
*/
@Override
- public <T> T createTemplate(Class<T> templateType, Configuration config) {
+ public <T> T createTemplate(Class<T> templateType, javax.config.Config config) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if(cl==null){
cl = this.getClass().getClassLoader();
@@ -167,15 +179,16 @@ public class DefaultConfigurationInjector implements ConfigurationInjector {
@Override
public <T> Supplier<T> getConfiguredSupplier(final Supplier<T> supplier) {
- return getConfiguredSupplier(supplier, ConfigurationProvider.getConfiguration());
+ return getConfiguredSupplier(supplier, ConfigProvider.getConfig());
}
@Override
- public <T> Supplier<T> getConfiguredSupplier(final Supplier<T> supplier, final Configuration config) {
- return new Supplier<T>() {
- public T get() {
- return configure(supplier.get(), config);
- }
- };
+ public <T> Supplier<T> getConfiguredSupplier(final Supplier<T> supplier, final javax.config.Config config) {
+ return () -> configure(supplier.get(), config);
+ }
+
+ @Override
+ public boolean isConfigured(Object o) {
+ return getConfiguredType(o.getClass())!=null;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
index ac7e977..f0763a8 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
@@ -18,34 +18,26 @@
*/
package org.apache.tamaya.inject.internal;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.spi.InjectionUtils;
+import org.apache.tamaya.inject.spi.InjectionEvaluator;
import org.apache.tamaya.inject.api.LoadPolicy;
import org.apache.tamaya.inject.api.UpdatePolicy;
-import org.apache.tamaya.inject.api.WithPropertyConverter;
+import org.apache.tamaya.inject.api.WithConverter;
import org.apache.tamaya.inject.spi.BaseDynamicValue;
-import org.apache.tamaya.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
+import javax.config.Config;
+import javax.config.spi.Converter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
+import java.util.NoSuchElementException;
import java.util.Objects;
-import java.util.function.Supplier;
+import java.util.Optional;
import java.util.logging.Logger;
/**
@@ -70,11 +62,11 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
* Back reference to the base configuration instance. This reference is used reevaluate the given property and
* compare the result with the previous value after a configuration change was triggered.
*/
- private final Configuration configuration;
+ private final Config configuration;
/**
* The property converter to be applied, may be null. In the ladder case targetType is not null.
*/
- private final PropertyConverter<T> propertyConverter;
+ private final Converter<T> propertyConverter;
/**
* Load policy.
@@ -90,8 +82,8 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
* @param targetType the target type, not null.
* @param propertyConverter the optional converter to be used.
*/
- private DefaultDynamicValue(Object owner, String propertyName, Configuration configuration, TypeLiteral<T> targetType,
- PropertyConverter<T> propertyConverter, List<String> keys, LoadPolicy loadPolicy,
+ private DefaultDynamicValue(Object owner, String propertyName, Config configuration, Type targetType,
+ Converter<T> propertyConverter, List<String> keys, LoadPolicy loadPolicy,
UpdatePolicy updatePolicy) {
super(owner, propertyName, targetType, keys);
this.configuration = Objects.requireNonNull(configuration);
@@ -103,102 +95,102 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
}
- public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration) {
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Config configuration) {
return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Config configuration, LoadPolicy loadPolicy) {
return of(owner, annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Config configuration, UpdatePolicy updatePolicy) {
return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
- public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Config configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = annotatedField.getGenericType();
if (targetType == null) {
- throw new ConfigException("Failed to evaluate target type for " + annotatedField.getDeclaringClass().getName()
+ throw new IllegalArgumentException("Failed to evaluate target type for " + annotatedField.getDeclaringClass().getName()
+ '.' + annotatedField.getName());
}
if (targetType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) targetType;
Type[] types = pt.getActualTypeArguments();
if (types.length != 1) {
- throw new ConfigException("Failed to evaluate target type for " + annotatedField.getDeclaringClass().getName()
+ throw new IllegalArgumentException("Failed to evaluate target type for " + annotatedField.getDeclaringClass().getName()
+ '.' + annotatedField.getName());
}
targetType = types[0];
}
- PropertyConverter<?> propertyConverter = null;
- WithPropertyConverter annot = annotatedField.getAnnotation(WithPropertyConverter.class);
+ Converter<?> propertyConverter = null;
+ WithConverter annot = annotatedField.getAnnotation(WithConverter.class);
if (annot != null) {
try {
propertyConverter = annot.value().newInstance();
} catch (Exception e) {
- throw new ConfigException("Failed to instantiate annotated PropertyConverter on " +
+ throw new IllegalArgumentException("Failed to instantiate annotated PropertyConverter on " +
annotatedField.getDeclaringClass().getName()
+ '.' + annotatedField.getName(), e);
}
}
- List<String> keys = InjectionUtils.getKeys(annotatedField);
+ List<String> keys = InjectionEvaluator.getKeys(annotatedField);
return new DefaultDynamicValue(owner, annotatedField.getName(), configuration,
- TypeLiteral.of(targetType), propertyConverter, keys, loadPolicy, updatePolicy);
+ targetType, propertyConverter, keys, loadPolicy, updatePolicy);
}
- public static DynamicValue<?> of(Object owner, Method method, Configuration configuration) {
+ public static DynamicValue<?> of(Object owner, Method method, Config configuration) {
return of(owner, method, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Method method, Config configuration, UpdatePolicy updatePolicy) {
return of(owner, method, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
- public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy) {
+ public static DynamicValue<?> of(Object owner, Method method, Config configuration, LoadPolicy loadPolicy) {
return of(owner, method, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
@SuppressWarnings("unchecked")
- public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Method method, Config configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = method.getGenericReturnType();
if (targetType == null) {
- throw new ConfigException("Failed to evaluate target type for " + method.getDeclaringClass()
+ throw new IllegalArgumentException("Failed to evaluate target type for " + method.getDeclaringClass()
.getName() + '.' + method.getName());
}
if (targetType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) targetType;
Type[] types = pt.getActualTypeArguments();
if (types.length != 1) {
- throw new ConfigException("Failed to evaluate target type for " + method.getDeclaringClass()
+ throw new IllegalArgumentException("Failed to evaluate target type for " + method.getDeclaringClass()
.getName() + '.' + method.getName());
}
targetType = types[0];
}
- PropertyConverter<Object> propertyConverter = null;
- WithPropertyConverter annot = method.getAnnotation(WithPropertyConverter.class);
+ Converter<Object> propertyConverter = null;
+ WithConverter annot = method.getAnnotation(WithConverter.class);
if (annot != null) {
try {
- propertyConverter = (PropertyConverter<Object>) annot.value().newInstance();
+ propertyConverter = (Converter<Object>) annot.value().newInstance();
} catch (Exception e) {
- throw new ConfigException("Failed to instantiate annotated PropertyConverter on " +
+ throw new IllegalArgumentException("Failed to instantiate annotated PropertyConverter on " +
method.getDeclaringClass().getName()
+ '.' + method.getName(), e);
}
}
- return new DefaultDynamicValue<>(owner, method.getName(),
- configuration, TypeLiteral.of(targetType), propertyConverter, InjectionUtils.getKeys(method),
+ return new DefaultDynamicValue(owner, method.getName(),
+ configuration, targetType, propertyConverter, InjectionEvaluator.getKeys(method),
loadPolicy, updatePolicy);
}
- protected PropertyConverter getCustomConverter(){
+ protected Converter getCustomConverter(){
return this.propertyConverter;
}
@Override
- protected Configuration getConfiguration() {
+ protected Config getConfiguration() {
return configuration;
}
@@ -207,10 +199,23 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
* otherwise throws {@code ConfigException}.
*
* @return the non-null value held by this {@code Optional}
- * @throws ConfigException if there is no value present
+ * @throws java.util.NoSuchElementException if there is no value present
* @see DefaultDynamicValue#isPresent()
*/
- public T get() {
+ public T getValue() {
+ return getOptionalValue()
+ .orElseThrow(() -> new NoSuchElementException("No config value for: " + getKeys()));
+ }
+
+ /**
+ * If a value is present in this {@code DynamicValue}, returns the value,
+ * otherwise throws {@code ConfigException}.
+ *
+ * @return the non-null value held by this {@code Optional}
+ * @throws java.util.NoSuchElementException if there is no value present
+ * @see DefaultDynamicValue#isPresent()
+ */
+ public Optional<T> getOptionalValue() {
T newLocalValue;
if(loadPolicy!=LoadPolicy.INITIAL) {
newLocalValue = evaluateValue();
@@ -219,11 +224,9 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
if(!Objects.equals(this.value, newLocalValue)){
switch (getUpdatePolicy()){
- case IMMEDEATE:
case IMMEDIATE:
commit();
break;
- case EXPLCIT:
case EXPLICIT:
this.newValue = newLocalValue;
break;
@@ -240,7 +243,7 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
}
}
- return value;
+ return Optional.ofNullable(value);
}
/**
@@ -268,8 +271,9 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
case NEVER:
this.newValue = null;
break;
- case EXPLCIT:
- case IMMEDEATE:
+ case EXPLICIT:
+ this.newValue = newValue;
+ break;
default:
this.newValue = newValue;
commit();
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
index 06f3556..d404b3e 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
@@ -18,31 +18,28 @@
*/
package org.apache.tamaya.inject.internal;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
+import java.lang.reflect.*;
import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.base.convert.ConversionContext;
import org.apache.tamaya.events.ConfigEventManager;
import org.apache.tamaya.events.spi.BaseConfigEvent;
-import org.apache.tamaya.inject.api.Config;
-import org.apache.tamaya.inject.api.ConfigDefaultSections;
-import org.apache.tamaya.inject.spi.InjectionUtils;
-import org.apache.tamaya.inject.api.WithPropertyConverter;
+import org.apache.tamaya.inject.spi.InjectionEvaluator;
+import org.apache.tamaya.inject.api.WithConverter;
import org.apache.tamaya.inject.spi.ConfiguredType;
import org.apache.tamaya.resolver.spi.ExpressionEvaluator;
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
+import org.apache.tamaya.spi.ConfigContext;
+import org.apache.tamaya.spi.ConfigContextSupplier;
import org.apache.tamaya.spi.ServiceContextManager;
+import javax.config.Config;
+import javax.config.inject.ConfigProperty;
+import javax.config.spi.Converter;
+
/**
* Utility class containing several aspects used in this module.
@@ -58,7 +55,7 @@ final class InjectionHelper {
private static boolean checkForEvents() {
try{
- Class.forName("org.apache.tamaya.events.FrozenConfiguration");
+ Class.forName("org.apache.tamaya.events.FrozenConfig");
LOG.info("Detected tamaya-events is loaded, will trigger ConfigEvents...");
return true;
} catch(Exception e){
@@ -81,123 +78,134 @@ final class InjectionHelper {
/**
* Internally evaluated the current valid configuration keys based on the given annotations present.
- * @param method the method
+ * @param method the method, not null.
+ * @param config the config, not null.
* @return the keys to be returned, or null.
*/
- public static String getConfigValue(Method method, Configuration config) {
- return getConfigValue(method, null, config);
+ public static <T> T getConfigValue(Method method, Class<T> type, javax.config.Config config) {
+ return getConfigValue(method, type, null, config);
}
/**
* Internally evaluated the current valid configuration keys based on the given annotations present.
- * @param method the method
- * @param retKey the array to return the key found, or null.
+ * @param field the field, not null.
+ * @param config the config, not null.
* @return the keys to be returned, or null.
*/
- public static String getConfigValue(Method method, String[] retKey, Configuration config) {
- ConfigDefaultSections areasAnnot = method.getDeclaringClass().getAnnotation(ConfigDefaultSections.class);
- return getConfigValueInternal(method, areasAnnot, retKey, config);
+ public static <T> T getConfigValue(Field field, Class<T> type, javax.config.Config config) {
+ return getConfigValue(field, type, null, config);
}
- /**
- * Internally evaluated the current valid configuration keys based on the given annotations present.
- * @param field the field
- * @return the keys to be returned, or null.
- */
- public static String getConfigValue(Field field, Configuration config) {
- return getConfigValue(field, null, config);
- }
/**
* Internally evaluated the current valid configuration keys based on the given annotations present.
- * @param field the field
+ * @param member the member, not null.
* @param retKey the array to return the key found, or null.
* @return the keys to be returned, or null.
*/
- public static String getConfigValue(Field field, String[] retKey, Configuration config) {
- ConfigDefaultSections areasAnnot = field.getDeclaringClass().getAnnotation(ConfigDefaultSections.class);
- return getConfigValueInternal(field, areasAnnot, retKey, config);
- }
+ private static <T> T getConfigValue(AccessibleObject member, Class<T> targetType,
+ String[] retKey,
+ javax.config.Config config) {
+ Objects.requireNonNull(targetType);
+ targetType = unboxType(targetType);
+ List<String> keys = InjectionEvaluator.getKeys(member);
+
+ WithConverter converterAnnot = member.getAnnotation(WithConverter.class);
+ if(converterAnnot!=null && !converterAnnot.value().getName().equals(WithConverter.class.getName())){
+ return getCustomConvertedConfigValue(member, converterAnnot, targetType, keys, config);
+ }
- /**
- * Internally evaluated the current valid configuration keys based on the given annotations present.
- *
- * @return the keys to be returned, or null.
- */
- private static String getConfigValueInternal(AnnotatedElement element, ConfigDefaultSections areasAnnot, String[] retKey, Configuration config) {
- Config prop = element.getAnnotation(Config.class);
- List<String> keys;
- if (prop == null) {
- keys = InjectionUtils.evaluateKeys((Member) element, areasAnnot);
- } else {
- keys = InjectionUtils.evaluateKeys((Member) element, areasAnnot, prop);
+ Optional<T> result = null;
+ for(String key:keys) {
+ result = config.getOptionalValue(key, targetType);
+ if (result.isPresent()) {
+ if (retKey != null) {
+ retKey[0] = key;
+ }
+ return result.get();
+ }
}
- String configValue = evaluteConfigValue(keys, retKey, config);
- if (configValue == null) {
- if(prop!=null && !prop.defaultValue().equals(Config.UNCONFIGURED_VALUE)){
- return prop.defaultValue();
+ ConfigProperty prop = member.getAnnotation(ConfigProperty.class);
+ if(prop!=null && !prop.defaultValue().equals(ConfigProperty.UNCONFIGURED_VALUE)){
+ String textValue = prop.defaultValue();
+ // How tp convert the default value in a portable way?
+ if(config instanceof ConfigContextSupplier){
+ ConfigContext ctx = ((ConfigContextSupplier)config).getConfigContext();
+ for(Converter converter:ctx.getConverters(targetType)){
+ try{
+ Object o = converter.convert(textValue);
+ if(o!=null){
+ return (T)o;
+ }
+ }catch(Exception e){
+ LOG.log(Level.SEVERE, "Failed to convert using Converter on " +
+ converter.getClass().getName(), e);
+ }
+ }
+ if(String.class.equals(targetType) || CharSequence.class.equals(targetType)){
+ return (T)textValue;
+ }
+ throw new IllegalArgumentException("Non convertible value: " + textValue + ", target: " + targetType.getName());
}
}
- return configValue;
+ return null;
}
- private static String evaluteConfigValue(List<String> keys, String[] retKey, Configuration config) {
- String configValue = null;
- for (String key : keys) {
- configValue = config.get(key);
- if (configValue != null) {
- if(retKey!=null && retKey.length>0){
- retKey[0] = key;
- }
- break;
- }
+ private static Class unboxType(Class targetType) {
+ switch(targetType.getName()){
+ case "byte":
+ return Byte.class;
+ case "char":
+ return Character.class;
+ case "boolean":
+ return Boolean.class;
+ case "int":
+ return Integer.class;
+ case "short":
+ return Short.class;
+ case "long":
+ return Long.class;
+ case "float":
+ return Float.class;
+ case "double":
+ return Double.class;
+ default:
+ return targetType;
+
}
- return configValue;
}
- public static <T> T adaptValue(AnnotatedElement element, TypeLiteral<T> targetType, String key, String configValue) {
+ public static <T> T getCustomConvertedConfigValue(AccessibleObject element, WithConverter converterAnnot,
+ Class<T> targetType, List<String> keys, Config config) {
// Check for adapter/filter
- T adaptedValue = null;
- WithPropertyConverter converterAnnot = element.getAnnotation(WithPropertyConverter.class);
- Class<? extends PropertyConverter<T>> converterType;
- if (converterAnnot != null) {
- converterType = (Class<? extends PropertyConverter<T>>) converterAnnot.value();
- if (!converterType.getName().equals(WithPropertyConverter.class.getName())) {
+ Class<? extends Converter<T>> converterType = (Class<? extends Converter<T>>) converterAnnot.value();
+ if (!converterType.getName().equals(WithConverter.class.getName())) {
+ Converter<T> converter = null;
+ try {
+ converter = Converter.class.cast(converterType.newInstance());
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Failed to instantiate converter: " + converterType.getName(), e);
+ }
+ for (String key : keys) {
try {
- // TODO cache here...
- ConversionContext ctx = new ConversionContext.Builder(key,targetType)
+ ConversionContext ctx = new ConversionContext.Builder(key, targetType)
.setAnnotatedElement(element).build();
-
- PropertyConverter<T> converter = PropertyConverter.class.cast(converterType.newInstance());
- adaptedValue = converter.convert(configValue, ctx);
+ ConversionContext.setContext(ctx);
+ Optional<String> textValue = config.getOptionalValue(key, String.class);
+ if (textValue.isPresent()) {
+ T adaptedValue = converter.convert(textValue.get());
+ if (adaptedValue != null) {
+ return adaptedValue;
+ }
+ }
} catch (Exception e) {
- LOG.log(Level.SEVERE, "Failed to convert using explicit PropertyConverter on " + element +
- ", trying default conversion.", e);
- }
- }
- }
- if (adaptedValue != null) {
- return adaptedValue;
- }
- if (String.class == targetType.getType()) {
- return (T) configValue;
- } else{
- if(configValue==null) {
- return null;
- }
- ConfigurationContext configContext = ConfigurationProvider.getConfiguration().getContext();
- List<PropertyConverter<T>> converters = configContext
- .getPropertyConverters(targetType);
- ConversionContext ctx = new ConversionContext.Builder(ConfigurationProvider.getConfiguration(),
- configContext, key, targetType).setAnnotatedElement(element).build();
- for (PropertyConverter<T> converter : converters) {
- adaptedValue = converter.convert(configValue, ctx);
- if (adaptedValue != null) {
- return adaptedValue;
+ LOG.log(Level.SEVERE, "Failed to convert using explicit PropertyConverter on " + element, e);
+ } finally {
+ ConversionContext.reset();
}
}
}
- throw new ConfigException("Non convertible property type: " + element);
+ return null;
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigBean.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigBean.java b/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigBean.java
index 3420977..5c0fe98 100644
--- a/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigBean.java
+++ b/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigBean.java
@@ -18,10 +18,11 @@
*/
package annottext;
+import org.apache.tamaya.inject.api.ConfigFallbackKeys;
import org.apache.tamaya.inject.api.DynamicValue;
import org.apache.tamaya.inject.api.NoConfig;
-import org.apache.tamaya.inject.api.Config;
+import javax.config.inject.ConfigProperty;
import java.util.ArrayList;
import java.util.List;
@@ -32,20 +33,20 @@ import java.util.List;
*/
public class AnnotatedConfigBean {
- @Config(value = {"foo.bar.myprop", "mp", "common.testdata.myProperty"}, defaultValue = "ET")
- // @ConfigLoadPolicy(listener = MyListener.class)
+ @ConfigProperty(name="foo.bar.myprop", defaultValue = "ET")
+ @ConfigFallbackKeys({"mp", "common.testdata.myProperty"})
public String myParameter;
- @Config("simple_value")
+ @ConfigProperty(name="simple_value")
public String simpleValue;
- @Config
+ @ConfigProperty
String anotherValue;
- @Config("host.name")
+ @ConfigProperty(name="host.name")
private String hostName;
- @Config("host.name")
+ @ConfigProperty(name="host.name")
private DynamicValue<String> dynamicHostname;
@NoConfig
@@ -70,7 +71,7 @@ public class AnnotatedConfigBean {
public static final String CONSTANT = "a constant";
- @Config("java.version")
+ @ConfigProperty(name="java.version")
void setJavaVersion(String version){
this.javaVersion = version;
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigTemplate.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigTemplate.java b/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigTemplate.java
index 8c6d692..6dbcde7 100644
--- a/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigTemplate.java
+++ b/modules/injection/standalone/src/test/java/annottext/AnnotatedConfigTemplate.java
@@ -18,8 +18,10 @@
*/
package annottext;
+import org.apache.tamaya.inject.api.ConfigFallbackKeys;
import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.Config;
+
+import javax.config.inject.ConfigProperty;
/**
* An example showing some basic annotations, using an interface to be proxied by the
@@ -28,20 +30,20 @@ import org.apache.tamaya.inject.api.Config;
*/
public interface AnnotatedConfigTemplate {
- @Config(value = {"foo.bar.myprop", "mp","common.testdata.myProperty"}, defaultValue = "ET")
- // @ConfigLoadPolicy(listener = MyListener.class)
+ @ConfigProperty(name = "foo.bar.myprop", defaultValue = "ET")
+ @ConfigFallbackKeys({"mp","common.testdata.myProperty"})
String myParameter();
- @Config("simple_value")
+ @ConfigProperty(name="simple_value")
String simpleValue();
- @Config
+ @ConfigProperty
String simplestValue();
- @Config("host.name")
+ @ConfigProperty(name="host.name")
String hostName();
- @Config("host.name")
+ @ConfigProperty(name="host.name")
DynamicValue<String> getDynamicValue();
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/annottext/InheritedAnnotatedConfigBean.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/annottext/InheritedAnnotatedConfigBean.java b/modules/injection/standalone/src/test/java/annottext/InheritedAnnotatedConfigBean.java
index 9952b18..778d689 100644
--- a/modules/injection/standalone/src/test/java/annottext/InheritedAnnotatedConfigBean.java
+++ b/modules/injection/standalone/src/test/java/annottext/InheritedAnnotatedConfigBean.java
@@ -18,11 +18,12 @@
*/
package annottext;
-import org.apache.tamaya.inject.api.Config;
+
+import javax.config.inject.ConfigProperty;
public class InheritedAnnotatedConfigBean extends AnnotatedConfigBean {
- @Config("someMoreValue")
+ @ConfigProperty(name="someMoreValue")
public String someMoreValue;
public String notConfigured;
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/annottext/NonAnnotatedConfigBean.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/annottext/NonAnnotatedConfigBean.java b/modules/injection/standalone/src/test/java/annottext/NonAnnotatedConfigBean.java
index 87f8be7..03bfd54 100644
--- a/modules/injection/standalone/src/test/java/annottext/NonAnnotatedConfigBean.java
+++ b/modules/injection/standalone/src/test/java/annottext/NonAnnotatedConfigBean.java
@@ -18,13 +18,6 @@
*/
package annottext;
-import org.apache.tamaya.inject.api.Config;
-import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.NoConfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
/**
* An example showing some basic annotations, using an interface to be proxied by the
* configuration system, nevertheless extending the overall Configuration interface.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestConfigSource.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestConfigSource.java b/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestConfigSource.java
new file mode 100644
index 0000000..0ae2843
--- /dev/null
+++ b/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestConfigSource.java
@@ -0,0 +1,69 @@
+/*
+ * 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.inject;
+
+import javax.config.spi.ConfigSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by Anatole on 12.01.2015.
+ */
+public class TestConfigSource implements ConfigSource {
+
+ private Map<String,String> properties = new HashMap<>();
+
+ public TestConfigSource(){
+ properties.put("env.stage", "ET");
+ properties.put("simple_value", "aSimpleValue");
+ properties.put("host.name", "tamaya01.incubator.apache.org");
+ properties.put("anotherValue", "HALLO!");
+ properties.put("NonAnnotatedConfigBean.classFieldKey", "Class-Field-Value");
+ properties.put("NonAnnotatedConfigBean.fieldKey", "Field-Value");
+ properties.put("annottext.NonAnnotatedConfigBean.fullKey", "Fullkey-Value");
+ properties.put("someMoreValue", "s'more");
+ }
+
+ @Override
+ public int getOrdinal() {
+ return 0;
+ }
+
+ @Override
+ public String getName() {
+ return getClass().getName();
+ }
+
+ @Override
+ public String getValue(String key) {
+ return properties.get(key);
+ }
+
+ @Override
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ @Override
+ public Set<String> getPropertyNames() {
+ return properties.keySet();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestPropertySource.java b/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
deleted file mode 100644
index 20de8e8..0000000
--- a/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
+++ /dev/null
@@ -1,73 +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.inject;
-
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by Anatole on 12.01.2015.
- */
-public class TestPropertySource implements PropertySource {
-
- private Map<String,String> properties = new HashMap<>();
-
- public TestPropertySource(){
- properties.put("env.stage", "ET");
- properties.put("simple_value", "aSimpleValue");
- properties.put("host.name", "tamaya01.incubator.apache.org");
- properties.put("anotherValue", "HALLO!");
- properties.put("NonAnnotatedConfigBean.classFieldKey", "Class-Field-Value");
- properties.put("NonAnnotatedConfigBean.fieldKey", "Field-Value");
- properties.put("annottext.NonAnnotatedConfigBean.fullKey", "Fullkey-Value");
- properties.put("someMoreValue", "s'more");
- }
-
- @Override
- public int getOrdinal() {
- return 0;
- }
-
- @Override
- public String getName() {
- return getClass().getName();
- }
-
- @Override
- public PropertyValue get(String key) {
- return PropertyValue.of(key,properties.get(key),getName());
- }
-
- @Override
- public Map<String, PropertyValue> getProperties() {
- Map<String,PropertyValue> result = new HashMap<>();
- for(Map.Entry<String,String> en:properties.entrySet()){
- result.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), getName()));
- }
- return result;
- }
-
- @Override
- public boolean isScannable() {
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java b/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
index a071584..856ca4c 100644
--- a/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
+++ b/modules/injection/standalone/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
@@ -18,18 +18,15 @@
*/
package org.apache.tamaya.inject.internal;
-import org.apache.tamaya.ConfigurationProvider;
import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.Config;
import org.apache.tamaya.inject.api.UpdatePolicy;
-import org.apache.tamaya.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
import org.junit.Test;
-import org.apache.tamaya.Configuration;
-
+import javax.config.ConfigProvider;
+import javax.config.inject.ConfigProperty;
+import javax.config.spi.ConfigProviderResolver;
+import javax.config.spi.ConfigSource;
+import javax.config.spi.Converter;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
@@ -42,13 +39,13 @@ import static org.junit.Assert.*;
*/
public class DefaultDynamicValueTest {
- @Config("a")
+ @ConfigProperty(name="a")
String myValue;
- @Config("a")
+ @ConfigProperty(name="a")
String myValue2;
- @Config("a")
+ @ConfigProperty(name="a")
void setterMethod(String value){
}
@@ -62,10 +59,10 @@ public class DefaultDynamicValueTest {
}
};
- private Map<String,PropertyValue> properties = new HashMap<>();
- private Configuration config = ConfigurationProvider.createConfiguration(
- ConfigurationProvider.getConfigurationContextBuilder().addPropertySources(
- new PropertySource() {
+ private Map<String,String> properties = new HashMap<>();
+ private javax.config.Config config = ConfigProviderResolver.instance().getBuilder()
+ .withSources(
+ new ConfigSource() {
@Override
public int getOrdinal() {
return 0;
@@ -77,26 +74,22 @@ public class DefaultDynamicValueTest {
}
@Override
- public PropertyValue get(String key) {
+ public String getValue(String key) {
return properties.get(key);
}
@Override
- public Map<String, PropertyValue> getProperties() {
+ public Map<String, String> getProperties() {
return properties;
}
- @Override
- public boolean isScannable() {
- return false;
- }
}
- ).build());
+ ).build();
@Test
public void testOf_Field() throws Exception {
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
- ConfigurationProvider.getConfiguration());
+ ConfigProvider.getConfig());
assertNotNull(val);
}
@@ -109,7 +102,7 @@ public class DefaultDynamicValueTest {
@Test
public void testCommitAndGet() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
assertNotNull(val);
@@ -118,7 +111,7 @@ public class DefaultDynamicValueTest {
@Test
public void testCommitAndGets() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
@@ -126,14 +119,14 @@ public class DefaultDynamicValueTest {
assertEquals("aValue",val.evaluateValue());
// change config
val.get();
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
assertTrue(val.updateValue());
assertEquals("aValue2", val.commitAndGet());
}
@Test
public void testCommit() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
@@ -141,7 +134,7 @@ public class DefaultDynamicValueTest {
assertEquals("aValue", val.evaluateValue());
// change config
val.get();
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
assertEquals("aValue2", val.evaluateValue());
assertTrue(val.updateValue());
val.commit();
@@ -160,37 +153,37 @@ public class DefaultDynamicValueTest {
@Test
public void testAddRemoveListener() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
val.addListener(consumer);
// change config
val.get();
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
val.get();
assertNotNull(event);
event = null;
val.removeListener(consumer);
- properties.put("a",PropertyValue.of("a","aValue3","test"));
+ properties.put("a","aValue3");
val.updateValue();
assertNull(event);
}
@Test
public void testGet() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
val.updateValue();
assertEquals("aValue2", val.get());
}
@Test
public void testUpdateValue() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
@@ -205,25 +198,25 @@ public class DefaultDynamicValueTest {
@Test
public void testEvaluateValue() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
assertNotNull(val.get());
assertEquals("aValue",val.evaluateValue());
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
assertEquals("aValue2", val.evaluateValue());
}
@Test
public void testGetNewValue() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
val.get();
assertNull(val.getNewValue());
- properties.put("a",PropertyValue.of("a","aValue2","test"));
+ properties.put("a","aValue2");
val.get();
assertNotNull(val.getNewValue());
assertEquals("aValue2", val.getNewValue());
@@ -239,7 +232,7 @@ public class DefaultDynamicValueTest {
@Test
public void testIfPresent() throws Exception {
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
@@ -255,7 +248,7 @@ public class DefaultDynamicValueTest {
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
assertEquals("bla", val.orElse("bla"));
- properties.put("a",PropertyValue.of("a","aValue","test"));
+ properties.put("a","aValue");
val.updateValue();
assertEquals("aValue", val.orElse("bla"));
}
@@ -305,10 +298,10 @@ public class DefaultDynamicValueTest {
// }));
// }
- private static final class DoublicatingConverter implements PropertyConverter<String>{
+ private static final class DoublicatingConverter implements Converter<String> {
@Override
- public String convert(String value, ConversionContext context) {
+ public String convert(String value) {
return value + value;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/resources/META-INF/services/javax.config.spi.ConfigSource
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/resources/META-INF/services/javax.config.spi.ConfigSource b/modules/injection/standalone/src/test/resources/META-INF/services/javax.config.spi.ConfigSource
new file mode 100644
index 0000000..60a2faf
--- /dev/null
+++ b/modules/injection/standalone/src/test/resources/META-INF/services/javax.config.spi.ConfigSource
@@ -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.inject.TestConfigSource
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/injection/standalone/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource b/modules/injection/standalone/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
deleted file mode 100644
index 5dfb894..0000000
--- a/modules/injection/standalone/src/test/resources/META-INF/services/org.apache.tamaya.spi.PropertySource
+++ /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.inject.TestPropertySource
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/jndi/pom.xml
----------------------------------------------------------------------
diff --git a/modules/jndi/pom.xml b/modules/jndi/pom.xml
index 805729b..a91072f 100644
--- a/modules/jndi/pom.xml
+++ b/modules/jndi/pom.xml
@@ -35,12 +35,6 @@ under the License.
<dependencies>
<dependency>
<groupId>org.apache.tamaya</groupId>
- <artifactId>tamaya-api</artifactId>
- <version>${tamaya-apicore.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.tamaya</groupId>
<artifactId>tamaya-core</artifactId>
<version>${tamaya-apicore.version}</version>
<scope>provided</scope>
@@ -55,7 +49,7 @@ under the License.
</dependency>
<dependency>
<groupId>org.apache.tamaya</groupId>
- <artifactId>tamaya-spisupport</artifactId>
+ <artifactId>tamaya-base</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIConfigSource.java
----------------------------------------------------------------------
diff --git a/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIConfigSource.java b/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIConfigSource.java
new file mode 100644
index 0000000..8e5b7ac
--- /dev/null
+++ b/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIConfigSource.java
@@ -0,0 +1,182 @@
+/*
+ * 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.jndi;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameClassPair;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+
+import org.apache.tamaya.base.configsource.BaseConfigSource;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * Propertysource that accesses JNDI as source for configuration entries.
+ */
+@Component
+public class JNDIConfigSource extends BaseConfigSource {
+ /** The logger used. */
+ private static final Logger LOG = Logger.getLogger(JNDIConfigSource.class.getName());
+
+ /**
+ * Default ordinal to be used, as defined by {@link javax.config.spi.ConfigSource#getOrdinal()} documentation.
+ */
+ private static final int DEFAULT_ORDINAL = 200;
+
+ /** The root context, not null. */
+ private Context context;
+ /** The scanable property, default is {@code false}. */
+ private boolean scannable = false;
+
+ /**
+ * Creates a new instance.
+ * @param name the name of the property source, see {@link javax.config.spi.ConfigSource#getName()}.
+ * @param context the root context to be used, not null.
+ */
+ public JNDIConfigSource(String name, Context context){
+ super(name);
+ this.context = Objects.requireNonNull(context);
+ }
+
+ /**
+ * Creates a new instance.
+ * @param name the name of the property source, see {@link javax.config.spi.ConfigSource#getName()}.
+ * @throws NamingException if {@code new InitialContext()} throws an exception.
+ */
+ public JNDIConfigSource(String name) throws NamingException {
+ super(name);
+ this.context = new InitialContext();
+ }
+
+ /**
+ * Creates a new instance, using {@code "jndi"} as property source name.
+ * @throws NamingException if {@code new InitialContext()} throws an exception.
+ */
+ public JNDIConfigSource() throws NamingException {
+ this("jndi");
+ setDefaultOrdinal(DEFAULT_ORDINAL);
+ }
+
+ /**
+ * If the property source is not scanable, an empty map is returned, otherwise
+ * the current JNDI context is mapped to configuration map:
+ * <ul>
+ * <li>For each leave entry one entry is created.</li>
+ * <li>The key is the fully path of parent contexts, separated by a '.'.</li>
+ * <li>The value is the value returned from {@code String.valueOf(leaveObject)}.</li>
+ * </ul>
+ * @return a map representation of the JNDI tree.
+ */
+ @Override
+ public Map<String, String> getProperties() {
+ if(scannable){
+ try {
+ return toMap(this.context);
+ } catch (NamingException e) {
+ LOG.log(Level.WARNING, "Error scanning JNDI tree.", e);
+ }
+ }
+ return Collections.emptyMap();
+ }
+
+
+ /**
+ * If set to true, the property source will return a String representation of the JNDI
+ * tree when calling {@code getProperties()}.
+ * @see #getProperties()
+ * @param val true, to activate scanable (default is false).
+ */
+ public void setScannable(boolean val){
+ this.scannable = val;
+ }
+
+ @Override
+ public String getValue(String key) {
+ try {
+ key = key.replace('.', '/');
+ Object o = context.lookup(key);
+ return o.toString();
+ } catch (NamingException e) {
+ LOG.log(Level.FINER, "Failed to lookup key in JNDI: " + key, e);
+ return null;
+ }
+ }
+
+ @Override
+ protected String toStringValues() {
+ return super.toStringValues() +
+ "\n context=" + context + '\'';
+ }
+
+ /**
+ * Maps the given JNDI Context to a {@code Map<String,String>}:
+ * mapped to configuration map:
+ * <ul>
+ * <li>For each leave entry one entry is created.</li>
+ * <li>The key is the fully path of parent contexts, separated by a '.'.</li>
+ * <li>The value is the value returned from {@code String.valueOf(leaveObject)}.</li>
+ * </ul>
+ * @param ctx the JNDI context, not null.
+ * @return the corresponding map, never null.
+ * @throws NamingException If some JNDI issues occur.
+ */
+ public static Map<String,String> toMap(Context ctx) throws NamingException {
+ String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : "";
+ Map<String, String> map = new HashMap<>();
+ NamingEnumeration<NameClassPair> list = ctx.list(namespace);
+ while (list.hasMoreElements()) {
+ NameClassPair next = list.next();
+ String name = next.getName();
+ String jndiPath = namespace + name;
+ try {
+ Object lookup = ctx.lookup(jndiPath);
+ if (namespace.isEmpty()) {
+ if (lookup instanceof Context) {
+ Map<String, String> childMap = toMap((Context) lookup);
+ for (Map.Entry<String, String> en : childMap.entrySet()) {
+ map.put(name + "." + en.getKey(), en.getValue());
+ }
+ } else {
+ map.put(name, String.valueOf(lookup));
+ }
+ }else{
+ if (lookup instanceof Context) {
+ Map<String, String> childMap = toMap((Context) lookup);
+ for (Map.Entry<String, String> en : childMap.entrySet()) {
+ map.put(namespace + "." + name + "." + en.getKey(), en.getValue());
+ }
+ } else {
+ map.put(namespace + "." + name, String.valueOf(lookup));
+ }
+ }
+ } catch (Exception t) {
+ map.put(namespace + "." + name, "ERROR: " + t.getMessage());
+ }
+ }
+ return map;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/cfb364cd/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIPropertySource.java b/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIPropertySource.java
deleted file mode 100644
index d2b549b..0000000
--- a/modules/jndi/src/main/java/org/apache/tamaya/jndi/JNDIPropertySource.java
+++ /dev/null
@@ -1,188 +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.jndi;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameClassPair;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-import org.apache.tamaya.spisupport.propertysource.BasePropertySource;
-import org.osgi.service.component.annotations.Component;
-
-/**
- * Propertysource that accesses JNDI as source for configuration entries.
- */
-@Component
-public class JNDIPropertySource extends BasePropertySource {
- /** The logger used. */
- private static final Logger LOG = Logger.getLogger(JNDIPropertySource.class.getName());
-
- /**
- * Default ordinal to be used, as defined by {@link PropertySource#getOrdinal()} documentation.
- */
- private static final int DEFAULT_ORDINAL = 200;
-
- /** The root context, not null. */
- private Context context;
- /** The scanable property, default is {@code false}. */
- private boolean scannable = false;
-
- /**
- * Creates a new instance.
- * @param name the name of the property source, see {@link PropertySource#getName()}.
- * @param context the root context to be used, not null.
- */
- public JNDIPropertySource(String name, Context context){
- super(name);
- this.context = Objects.requireNonNull(context);
- }
-
- /**
- * Creates a new instance.
- * @param name the name of the property source, see {@link PropertySource#getName()}.
- * @throws NamingException if {@code new InitialContext()} throws an exception.
- */
- public JNDIPropertySource(String name) throws NamingException {
- super(name);
- this.context = new InitialContext();
- }
-
- /**
- * Creates a new instance, using {@code "jndi"} as property source name.
- * @throws NamingException if {@code new InitialContext()} throws an exception.
- */
- public JNDIPropertySource() throws NamingException {
- this("jndi");
- setDefaultOrdinal(DEFAULT_ORDINAL);
- }
-
- /**
- * If the property source is not scanable, an empty map is returned, otherwise
- * the current JNDI context is mapped to configuration map:
- * <ul>
- * <li>For each leave entry one entry is created.</li>
- * <li>The key is the fully path of parent contexts, separated by a '.'.</li>
- * <li>The value is the value returned from {@code String.valueOf(leaveObject)}.</li>
- * </ul>
- * @return a map representation of the JNDI tree.
- */
- @Override
- public Map<String, PropertyValue> getProperties() {
- if(scannable){
- try {
- return PropertyValue.map(toMap(this.context), getName());
- } catch (NamingException e) {
- LOG.log(Level.WARNING, "Error scanning JNDI tree.", e);
- }
- }
- return Collections.emptyMap();
- }
-
- @Override
- public boolean isScannable() {
- return scannable;
- }
-
- /**
- * If set to true, the property source will return a String representation of the JNDI
- * tree when calling {@code getProperties()}.
- * @see #getProperties()
- * @param val true, to activate scanable (default is false).
- */
- public void setScannable(boolean val){
- this.scannable = val;
- }
-
- @Override
- public PropertyValue get(String key) {
- try {
- key = key.replace('.', '/');
- Object o = context.lookup(key);
- return PropertyValue.of(key, o.toString(), getName());
- } catch (NamingException e) {
- LOG.log(Level.FINER, "Failed to lookup key in JNDI: " + key, e);
- return null;
- }
- }
-
- @Override
- protected String toStringValues() {
- return super.toStringValues() +
- "\n context=" + context + '\'';
- }
-
- /**
- * Maps the given JNDI Context to a {@code Map<String,String>}:
- * mapped to configuration map:
- * <ul>
- * <li>For each leave entry one entry is created.</li>
- * <li>The key is the fully path of parent contexts, separated by a '.'.</li>
- * <li>The value is the value returned from {@code String.valueOf(leaveObject)}.</li>
- * </ul>
- * @param ctx the JNDI context, not null.
- * @return the corresponding map, never null.
- * @throws NamingException If some JNDI issues occur.
- */
- public static Map<String,String> toMap(Context ctx) throws NamingException {
- String namespace = ctx instanceof InitialContext ? ctx.getNameInNamespace() : "";
- Map<String, String> map = new HashMap<>();
- NamingEnumeration<NameClassPair> list = ctx.list(namespace);
- while (list.hasMoreElements()) {
- NameClassPair next = list.next();
- String name = next.getName();
- String jndiPath = namespace + name;
- try {
- Object lookup = ctx.lookup(jndiPath);
- if (namespace.isEmpty()) {
- if (lookup instanceof Context) {
- Map<String, String> childMap = toMap((Context) lookup);
- for (Map.Entry<String, String> en : childMap.entrySet()) {
- map.put(name + "." + en.getKey(), en.getValue());
- }
- } else {
- map.put(name, String.valueOf(lookup));
- }
- }else{
- if (lookup instanceof Context) {
- Map<String, String> childMap = toMap((Context) lookup);
- for (Map.Entry<String, String> en : childMap.entrySet()) {
- map.put(namespace + "." + name + "." + en.getKey(), en.getValue());
- }
- } else {
- map.put(namespace + "." + name, String.valueOf(lookup));
- }
- }
- } catch (Exception t) {
- map.put(namespace + "." + name, "ERROR: " + t.getMessage());
- }
- }
- return map;
- }
-}