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 2016/10/30 22:06:27 UTC
[05/15] incubator-tamaya-extensions git commit: TAMAYA-189: Moved
format and injection modules into separate subtrees.
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
deleted file mode 100644
index 64b0c95..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredFieldImpl.java
+++ /dev/null
@@ -1,170 +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.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.api.InjectionUtils;
-import org.apache.tamaya.inject.spi.ConfiguredField;
-
-import java.lang.reflect.Field;
-import java.security.AccessController;
-import java.security.PrivilegedExceptionAction;
-import java.util.Collection;
-import java.util.Objects;
-
-/**
- * Small class that contains and manages all information anc access to a configured field and a concrete instance current
- * it (referenced by a weak reference). It also implements all aspects current keys filtering, converting any applying the
- * final keys by reflection.
- */
-public class ConfiguredFieldImpl implements ConfiguredField{
- /**
- * The configured field instance.
- */
- protected final Field annotatedField;
-
- /**
- * Models a configured field and provides mechanisms for injection.
- *
- * @param field the field instance.
- */
- public ConfiguredFieldImpl(Field field) {
- Objects.requireNonNull(field);
- this.annotatedField = field;
- }
-
-
- /**
- * Evaluate the initial keys fromMap the configuration and applyChanges it to the field.
- *
- * @param target the target instance.
- * @throws ConfigException if evaluation or conversion failed.
- */
- public void configure(Object target, Configuration config) throws ConfigException {
- if (this.annotatedField.getType() == DynamicValue.class) {
- applyDynamicValue(target);
- } else {
- applyValue(target, config, false);
- }
- }
-
-
- /**
- * 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.
- */
- private void applyDynamicValue(Object target) throws ConfigException {
- Objects.requireNonNull(target);
- try {
- AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
- @Override
- public Object run() throws Exception {
- annotatedField.setAccessible(true);
- return annotatedField;
- }
- });
- annotatedField.set(target,
- DefaultDynamicValue.of(annotatedField, ConfigurationProvider.getConfiguration()));
- } catch (Exception e) {
- throw new ConfigException("Failed to annotation configured field: " + this.annotatedField.getDeclaringClass()
- .getName() + '.' + annotatedField.getName(), e);
- }
- }
-
- /**
- * This method applies a configuration to the field.
- *
- * @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.
- */
- private void applyValue(Object target, Configuration config, boolean resolve) throws ConfigException {
- 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);
- AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
- @Override
- public Object run() throws Exception {
- annotatedField.setAccessible(true);
- return annotatedField;
- }
- });
- if(value!=null) {
- annotatedField.set(target, value);
- }
- } catch (Exception e) {
- throw new ConfigException("Failed to evaluate annotated field: " + this.annotatedField.getDeclaringClass()
- .getName() + '.' + annotatedField.getName(), e);
- }
- }
-
- /**
- * Get the field's type.
- * @return the field's type, not null.
- */
- @Override
- public Class<?> getType(){
- return this.annotatedField.getType();
- }
-
- /**
- * Access the applyable configuration keys for this field.
- * @return the configuration keys, never null.
- */
- @Override
- public Collection<String> getConfiguredKeys(){
- return InjectionUtils.getKeys(this.annotatedField);
- }
-
- @Override
- public String toString() {
- return "ConfiguredField[" + getSignature() + ']';
- }
-
- @Override
- public String getName() {
- return annotatedField.getName();
- }
-
- @Override
- public String getSignature() {
- return getName()+':'+getType().getName();
- }
-
- @Override
- public Field getAnnotatedField() {
- return annotatedField;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
deleted file mode 100644
index b69df20..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredSetterMethod.java
+++ /dev/null
@@ -1,139 +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.internal;
-
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.inject.api.InjectionUtils;
-import org.apache.tamaya.inject.spi.ConfiguredMethod;
-
-import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedExceptionAction;
-import java.util.Collection;
-import java.util.Objects;
-
-/**
- * Small class that contains and manages all information and access to a configured field and a concrete instance current
- * it (referenced by a weak reference). It also implements all aspects current keys filtering, conversions any applying the
- * final keys by reflection.
- */
-public class ConfiguredSetterMethod implements ConfiguredMethod {
-
- /**
- * The configured field instance.
- */
- private Method setterMethod;
- private Collection<String> configuredKeys;
-
- /**
- * Models a configured field and provides mechanisms for injection.
- *
- * @param method the method instance.
- */
- public ConfiguredSetterMethod(Method method) {
- if (void.class.equals(method.getReturnType()) &&
- method.getParameterTypes().length == 1) {
- this.setterMethod = method;
- }
- }
-
- @Override
- public void configure(Object target, Configuration config) throws ConfigException {
- String[] retKey = new String[1];
- String configValue = InjectionHelper.getConfigValue(this.setterMethod, retKey, 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 {
- setterMethod.setAccessible(true);
- return setterMethod;
- }
- });
-
- setterMethod.invoke(target, value);
- } catch (Exception e) {
- throw new ConfigException("Failed to annotation configured method: " + this.setterMethod.getDeclaringClass()
- .getName() + '.' + setterMethod.getName(), e);
- }
- }
-
-
- /**
- * Access the applyable configuration keys for this field.
- *
- * @return the configuration keys, never null.
- */
- @Override
- public Collection<String> getConfiguredKeys() {
- return InjectionUtils.getKeys(this.setterMethod);
- }
-
- /**
- * Get the type to be set on the setter method.
- * @return the setter type.
- */
- @Override
- public Class<?>[] getParameterTypes() {
- return this.setterMethod.getParameterTypes();
- }
-
- /**
- * Access the annotated method.
- * @return the annotated method, not null.
- */
- @Override
- public Method getAnnotatedMethod() {
- return this.setterMethod;
- }
-
- @Override
- public String getName() {
- return this.setterMethod.getName();
- }
-
- @Override
- public String getSignature() {
- return "void " + this.setterMethod.getName()+'('+ printTypes(getParameterTypes())+')';
- }
-
- private String printTypes(Class<?>[] parameterTypes) {
- StringBuilder b = new StringBuilder();
- for(Class cl:parameterTypes){
- b.append(cl.getName());
- b.append(',');
- }
- if(b.length()>0){
- b.setLength(b.length()-1);
- }
- return b.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
deleted file mode 100644
index b40f6c9..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/ConfiguredTypeImpl.java
+++ /dev/null
@@ -1,237 +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.internal;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-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.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;
-
-/**
- * Structure that contains and manages configuration related things for a configured type registered.
- * Created by Anatole on 03.10.2014.
- */
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class ConfiguredTypeImpl implements ConfiguredType{
- /** The log used. */
- private static final Logger LOG = Logger.getLogger(ConfiguredTypeImpl.class.getName());
- /**
- * A list with all annotated instance variables.
- */
- private final List<ConfiguredField> configuredFields = new ArrayList<>();
- /**
- * A list with all annotated methods (templates).
- */
- private final List<ConfiguredMethod> configuredSetterMethods = new ArrayList<>();
- /**
- * The basic type.
- */
- private final Class type;
-
- /**
- * Creates an instance of this class hereby evaluating the config annotations given for later effective
- * injection (configuration) of instances.
- *
- * @param type the instance type.
- */
- public ConfiguredTypeImpl(Class type) {
- this.type = Objects.requireNonNull(type);
- if(!isConfigured(type)){
- LOG.info("Auto-Configuring type: " + type.getName());
- initFields(type, true);
- initMethods(type, true);
- }else {
- ConfigAutoInject autoInject = (ConfigAutoInject) type.getAnnotation(ConfigAutoInject.class);
- if (autoInject != null) {
- initFields(type, autoInject != null);
- initMethods(type, autoInject != null);
- } else {
- initFields(type, false);
- initMethods(type, false);
- }
- }
- }
-
- private void initFields(Class type, boolean autoConfigure) {
- for (Field f : type.getDeclaredFields()) {
- if (f.isAnnotationPresent(NoConfig.class)) {
- LOG.finest("Ignored @NoConfig annotated field " + f.getClass().getName() + "#" +
- f.toGenericString());
- continue;
- }
- if (Modifier.isFinal(f.getModifiers())) {
- LOG.finest("Ignored final field " + f.getClass().getName() + "#" +
- f.toGenericString());
- continue;
- }
- if (f.isSynthetic()) {
- LOG.finest("Ignored synthetic field " + f.getClass().getName() + "#" +
- f.toGenericString());
- continue;
- }
- try {
- if(isConfiguredField(f) || autoConfigure) {
- ConfiguredField configuredField = new ConfiguredFieldImpl(f);
- configuredFields.add(configuredField);
- LOG.finer("Registered field " + f.getClass().getName() + "#" +
- f.toGenericString());
- }
- } catch (Exception e) {
- throw new ConfigException("Failed to initialized configured field: " +
- f.getDeclaringClass().getName() + '.' + f.getName(), e);
- }
- }
- }
-
- private void initMethods(Class type, boolean autoConfigure) {
- // TODO revisit this logic here...
- for (Method m : type.getDeclaredMethods()) {
- if (m.isAnnotationPresent(NoConfig.class)) {
- LOG.finest("Ignored @NoConfig annotated method " + m.getClass().getName() + "#" +
- m.toGenericString());
- continue;
- }
- if (m.isSynthetic()) {
- LOG.finest("Ignored synthetic method " + m.getClass().getName() + "#" +
- m.toGenericString());
- continue;
- }
- if(isConfiguredMethod(m) || autoConfigure) {
- Config propAnnot = m.getAnnotation(Config.class);
- if (addPropertySetter(m, propAnnot)) {
- LOG.finer("Added configured setter: " + m.getClass().getName() + "#" +
- m.toGenericString());
- }
- }
- }
- }
-
- private boolean addPropertySetter(Method m, Config prop) {
- if (prop!=null) {
- if (m.getParameterTypes().length == 1) {
- // getter method
- Class<?> returnType = m.getReturnType();
- if (void.class.equals(returnType)) {
- try {
- configuredSetterMethods.add(new ConfiguredSetterMethod(m));
- return true;
- } catch (Exception e) {
- throw new ConfigException("Failed to initialized configured setter method: " +
- m.getDeclaringClass().getName() + '.' + m.getName(), e);
- }
- }
- }
- }
- return false;
- }
-
-
- /**
- * Method called to configure an instance.
- *
- * @param instance The instance to be configured.
- */
- public void configure(Object instance) {
- configure(instance, ConfigurationProvider.getConfiguration());
- }
-
- @Override
- public void configure(Object instance, Configuration config) {
- for (ConfiguredField field : configuredFields) {
- field.configure(instance, config);
- }
- for (ConfiguredMethod method : configuredSetterMethods) {
- method.configure(instance, config);
-// // TODO, if method should be recalled on changes, corresponding callbacks could be registered here
- }
- }
-
-
- public static boolean isConfigured(Class type) {
- if (type.getAnnotation(ConfigDefaultSections.class) != null) {
- return true;
- }
- // if no class level annotation is there we might have field level annotations only
- for (Field field : type.getDeclaredFields()) {
- if (isConfiguredField(field)) {
- return true;
- }
- }
- // if no class level annotation is there we might have method level annotations only
- for (Method method : type.getDeclaredMethods()) {
- if(isConfiguredMethod(method)) {
- return true;
- }
- }
- return false;
- }
-
- public static boolean isConfiguredField(Field field) {
- return field.isAnnotationPresent(Config.class);
- }
-
- public static boolean isConfiguredMethod(Method method) {
- return method.isAnnotationPresent(Config.class);
- }
-
- @Override
- public Class getType() {
- return this.type;
- }
-
- @Override
- public String getName() {
- return this.type.getName();
- }
-
- /**
- * Get the registered configured fields.
- * @return the registered configured fields, never null.
- */
- @Override
- public Collection<ConfiguredField> getConfiguredFields(){
- return configuredFields;
- }
-
- /**
- * Get the registered annotated setter methods.
- * @return the registered annotated setter methods, never null.
- */
- @Override
- public Collection<ConfiguredMethod> getConfiguredMethods(){
- return configuredSetterMethods;
- }
-
- @Override
- public String toString() {
- return "ConfigDefaultSections{"+ this.getType().getName() + '}';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
deleted file mode 100644
index a3a7015..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultConfigurationInjector.java
+++ /dev/null
@@ -1,179 +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.internal;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.inject.ConfigurationInjector;
-
-import javax.annotation.Priority;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Logger;
-
-import org.apache.tamaya.inject.api.ConfiguredItemSupplier;
-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;
-
-/**
- * Simple injector singleton that also registers instances configured using weak references.
- */
-@Priority(0)
-public final class DefaultConfigurationInjector implements ConfigurationInjector {
-
- private final Map<Class<?>, ConfiguredType> configuredTypes = new ConcurrentHashMap<>();
-
- private static final Logger LOG = Logger.getLogger(DefaultConfigurationInjector.class.getName());
-
- private boolean autoConfigureEnabled = true;
-
- /**
- * 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 = configuredTypes.get(type);
- if (confType == null) {
- if(!isConfigAnnotated(type) && !autoConfigureEnabled){
- return null;
- }
- confType = new ConfiguredTypeImpl(type);
- configuredTypes.put(type, confType);
- InjectionHelper.sendConfigurationEvent(confType);
- }
- return confType;
- }
-
- /**
- * If set also non annotated instances can be configured or created as templates.
- * @return true, if autoConfigureEnabled.
- */
- public boolean isAutoConfigureEnabled(){
- return autoConfigureEnabled;
- }
-
- /**
- * Setting to true enables also configuration/templating of non annotated classes or
- * interfaces.
- * @param enabled true enables also configuration/templating of
- */
- public void setAutoConfigureEnabled(boolean enabled){
- this.autoConfigureEnabled = enabled;
- }
-
- /**
- * CHecks if type is eligible for configuration injection.
- * @param type the target type, not null.
- * @return true, if the type, a method or field has Tamaya config annotation on it.
- */
- private boolean isConfigAnnotated(Class<?> type) {
- if(type.getClass().isAnnotationPresent(ConfigDefaultSections.class)){
- return true;
- }
- for (Field f : type.getDeclaredFields()) {
- if (f.isAnnotationPresent(NoConfig.class) || f.isAnnotationPresent(Config.class)) {
- return true;
- }
- }
- for (Method m : type.getDeclaredMethods()) {
- if (m.isAnnotationPresent(NoConfig.class) || m.isAnnotationPresent(Config.class)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Configured the current instance and reigsterd necessary listener to forward config change events as
- * defined by the current annotations in place.
- *
- * @param instance the instance to be configured
- */
- @Override
- public <T> T configure(T instance) {
- return configure(instance, ConfigurationProvider.getConfiguration());
- }
-
- /**
- * Configured the current instance and reigsterd necessary listener to forward config change events as
- * defined by the current annotations in place.
- *
- * @param instance the instance to be configured
- * @param config the target configuration, not null.
- */
- @Override
- public <T> T configure(T instance, Configuration config) {
- Class<?> type = Objects.requireNonNull(instance).getClass();
- ConfiguredType configuredType = registerType(type);
- if(configuredType!=null){
- configuredType.configure(instance, config);
- }else{
- LOG.info("Instance passed is not configurable: " + instance);
- }
- return instance;
- }
-
- /**
- * Create a template implementting the annotated methods based on current configuration data.
- *
- * @param templateType the type of the template to be created.
- */
- @Override
- public <T> T createTemplate(Class<T> templateType) {
- return createTemplate(templateType, ConfigurationProvider.getConfiguration());
- }
-
- /**
- * Create a template implementting the annotated methods based on current configuration data.
- *
- * @param templateType the type of the template to be created.
- * @param config the target configuration, not null.
- */
- @Override
- public <T> T createTemplate(Class<T> templateType, Configuration config) {
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- if(cl==null){
- cl = this.getClass().getClassLoader();
- }
- return templateType.cast(Proxy.newProxyInstance(cl, new Class[]{ConfiguredItemSupplier.class, Objects.requireNonNull(templateType)},
- new ConfigTemplateInvocationHandler(templateType)));
- }
-
- @Override
- public <T> ConfiguredItemSupplier<T> getConfiguredSupplier(final ConfiguredItemSupplier<T> supplier) {
- return getConfiguredSupplier(supplier, ConfigurationProvider.getConfiguration());
- }
-
- @Override
- public <T> ConfiguredItemSupplier<T> getConfiguredSupplier(final ConfiguredItemSupplier<T> supplier, final Configuration config) {
- return new ConfiguredItemSupplier<T>() {
- public T get() {
- return configure(supplier.get(), config);
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
deleted file mode 100644
index 2f051b3..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/DefaultDynamicValue.java
+++ /dev/null
@@ -1,498 +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.internal;
-
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.inject.api.BaseDynamicValue;
-import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.InjectionUtils;
-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.spi.ConversionContext;
-import org.apache.tamaya.spi.PropertyConverter;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-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.Objects;
-import java.util.logging.Logger;
-
-/**
- * A accessor for a single configured value. This can be used to support values that may change during runtime,
- * reconfigured or final. Hereby external code (could be Tamaya configuration listners or client code), can set a
- * new value. Depending on the {@link UpdatePolicy} the new value is immedeately active or it requires an active commit
- * by client code. Similarly an instance also can ignore all later changes to the value.
- * <h3>Implementation Details</h3>
- * This class is
- * <ul>
- * <li>Serializable, when also the item stored is serializable</li>
- * <li>Thread safe</li>
- * </ul>
- *
- * @param <T> The type of the value.
- */
-final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
-
- private static final long serialVersionUID = -2071172847144537443L;
-
- /**
- * The property name of the entry.
- */
- private final String propertyName;
- /**
- * The keys to be resolved.
- */
- private final String[] keys;
- /**
- * Back reference to the base configuration instance. This reference is used reevalaute the given property and
- * compare the result with the previous value after a configuration change was triggered.
- */
- private final Configuration configuration;
- /**
- * The target type of the property used to lookup a matching {@link PropertyConverter}.
- * If null, {@code propertyConverter} is set and used instead.
- */
- private final TypeLiteral<T> targetType;
- /**
- * The property converter to be applied, may be null. In the ladder case targetType is not null.
- */
- private final PropertyConverter<T> propertyConverter;
- /**
- * Policy that defines how new values are applied, be default it is applied initially once, but never updated
- * anymore.
- */
- private UpdatePolicy updatePolicy;
- /**
- * Load policy.
- */
- private final LoadPolicy loadPolicy;
-
- /**
- * The current value, never null.
- */
- private transient T value;
- /**
- * The new value, or null.
- */
- private transient Object[] newValue;
- /**
- * List of listeners that listen for changes.
- */
- private transient WeakList<PropertyChangeListener> listeners;
-
- /**
- * Constructor.
- *
- * @param propertyName the name of the fields' property/method.
- * @param keys the keys of the property, not null.
- * @param configuration the configuration, not null.
- * @param targetType the target type, not null.
- * @param propertyConverter the optional converter to be used.
- */
- private DefaultDynamicValue(String propertyName, Configuration configuration, TypeLiteral<T> targetType,
- PropertyConverter<T> propertyConverter, List<String> keys, LoadPolicy loadPolicy,
- UpdatePolicy updatePolicy) {
- this.propertyName = Objects.requireNonNull(propertyName);
- this.keys = keys.toArray(new String[keys.size()]);
- this.configuration = Objects.requireNonNull(configuration);
- this.propertyConverter = propertyConverter;
- this.targetType = targetType;
- this.loadPolicy = Objects.requireNonNull(loadPolicy);
- this.updatePolicy = Objects.requireNonNull(updatePolicy);
- if(loadPolicy == LoadPolicy.INITIAL){
- this.value = evaluateValue();
- }
- }
-
- public static DynamicValue of(Field annotatedField, Configuration configuration) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDEATE);
- }
-
- public static DynamicValue of(Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
- return of(annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDEATE);
- }
-
- public static DynamicValue of(Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
- }
-
- public static DynamicValue of(Field annotatedField, Configuration 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()
- + '.' + 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()
- + '.' + annotatedField.getName());
- }
- targetType = types[0];
- }
- PropertyConverter<?> propertyConverter = null;
- WithPropertyConverter annot = annotatedField.getAnnotation(WithPropertyConverter.class);
- if (annot != null) {
- try {
- propertyConverter = annot.value().newInstance();
- } catch (Exception e) {
- throw new ConfigException("Failed to instantiate annotated PropertyConverter on " +
- annotatedField.getDeclaringClass().getName()
- + '.' + annotatedField.getName(), e);
- }
- }
- List<String> keys = InjectionUtils.getKeys(annotatedField);
- return new DefaultDynamicValue(annotatedField.getName(), configuration,
- TypeLiteral.of(targetType), propertyConverter, keys, loadPolicy, updatePolicy);
- }
-
- public static DynamicValue of(Method method, Configuration configuration) {
- return of(method, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDEATE);
- }
-
- public static DynamicValue of(Method method, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(method, configuration, LoadPolicy.ALWAYS, updatePolicy);
- }
-
- public static DynamicValue of(Method method, Configuration configuration, LoadPolicy loadPolicy) {
- return of(method, configuration, loadPolicy, UpdatePolicy.IMMEDEATE);
- }
-
- public static DynamicValue of(Method method, Configuration 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()
- .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()
- .getName() + '.' + method.getName());
- }
- targetType = types[0];
- }
- PropertyConverter<Object> propertyConverter = null;
- WithPropertyConverter annot = method.getAnnotation(WithPropertyConverter.class);
- if (annot != null) {
- try {
- propertyConverter = (PropertyConverter<Object>) annot.value().newInstance();
- } catch (Exception e) {
- throw new ConfigException("Failed to instantiate annotated PropertyConverter on " +
- method.getDeclaringClass().getName()
- + '.' + method.getName(), e);
- }
- }
- return new DefaultDynamicValue<>(method.getName(),
- configuration, TypeLiteral.of(targetType), propertyConverter, InjectionUtils.getKeys(method),
- loadPolicy, updatePolicy);
- }
-
-
- /**
- * Commits a new value that has not been committed yet, make it the new value of the instance. On change any
- * registered listeners will be triggered.
- */
- public void commit() {
- T oldValue = value;
- value = newValue==null?null:(T)newValue[0];
- newValue = null;
- informListeners(oldValue, value);
- }
-
- private void informListeners(T value, T newValue) {
- synchronized (this) {
- PropertyChangeEvent evt = new PropertyChangeEvent(this, propertyName, value,
- newValue);
- if (listeners != null) {
- for (PropertyChangeListener consumer : listeners.get()) {
- consumer.propertyChange(evt);
- }
- }
- }
- }
-
- /**
- * Discards a new value that was published. No listeners will be informed.
- */
- public void discard() {
- newValue = null;
- }
-
-
- /**
- * Access the {@link UpdatePolicy} used for updating this value.
- *
- * @return the update policy, never null.
- */
- public UpdatePolicy getUpdatePolicy() {
- return updatePolicy;
- }
-
- /**
- * Sets a new {@link UpdatePolicy}.
- *
- * @param updatePolicy the new policy, not null.
- */
- public void setUpdatePolicy(UpdatePolicy updatePolicy) {
- this.updatePolicy = Objects.requireNonNull(updatePolicy);
- }
-
- /**
- * Add a listener to be called as weak reference, when this value has been changed.
- *
- * @param l the listener, not null
- */
- public void addListener(PropertyChangeListener l) {
- if (listeners == null) {
- listeners = new WeakList<>();
- }
- listeners.add(l);
- }
-
- /**
- * Removes a listener to be called, when this value has been changed.
- *
- * @param l the listner to be removed, not null
- */
- public void removeListener(PropertyChangeListener l) {
- if (listeners != null) {
- listeners.remove(l);
- }
- }
-
- /**
- * 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 ConfigException if there is no value present
- * @see DefaultDynamicValue#isPresent()
- */
- public T get() {
- T newLocalValue;
- if(loadPolicy!=LoadPolicy.INITIAL) {
- newLocalValue = evaluateValue();
- if (this.value == null) {
- this.value = newLocalValue;
- }
- if(!Objects.equals(this.value, newLocalValue)){
- switch (updatePolicy){
- case IMMEDEATE:
- commit();
- break;
- case EXPLCIT:
- this.newValue = new Object[]{newLocalValue};
- break;
- case LOG_ONLY:
- informListeners(this.value, newLocalValue);
- this.newValue = null;
- break;
- case NEVER:
- this.newValue = null;
- break;
- default:
- this.newValue = null;
- break;
- }
- }
- }
- return value;
- }
-
- /**
- * Method to check for and apply a new value. Depending on the {@link UpdatePolicy}
- * the value is immediately or deferred visible (or it may even be ignored completely).
- *
- * @return true, if a new value has been detected. The value may not be visible depending on the current
- * {@link UpdatePolicy} in place.
- */
- public boolean updateValue() {
- if(this.value==null && this.newValue==null){
- this.value = evaluateValue();
- return false;
- }
- T newValue = evaluateValue();
- if (Objects.equals(newValue, this.value)) {
- return false;
- }
- switch (this.updatePolicy) {
- case LOG_ONLY:
- Logger.getLogger(getClass().getName()).info("Discard change on " + this + ", newValue=" + newValue);
- informListeners(value, newValue);
- this.newValue = null;
- break;
- case NEVER:
- this.newValue = null;
- break;
- case EXPLCIT:
- case IMMEDEATE:
- default:
- this.newValue = new Object[]{newValue};
- commit();
- break;
- }
- return true;
- }
-
- /**
- * Evaluates the current value dynamically from the underlying configuration.
- *
- * @return the current actual value, or null.
- */
- public T evaluateValue() {
- T value = null;
-
- for (String key : keys) {
- ConversionContext ctx = new ConversionContext.Builder(key, targetType).build();
- if (propertyConverter == null) {
- value = configuration.get(key, targetType);
- } else {
- String source = configuration.get(key);
- value = propertyConverter.convert(source, ctx);
- }
-
- if (value != null) {
- break;
- }
- }
-
- return value;
- }
-
- /**
- * Access a new value that has not yet been committed.
- *
- * @return the uncommitted new value, or null.
- */
- public T getNewValue() {
- T nv = newValue==null?null:(T)newValue[0];
- if (nv != null) {
- return nv;
- }
- return null;
- }
-
-
- /**
- * Serialization implementation that strips away the non serializable Optional part.
- *
- * @param oos the output stream
- * @throws IOException if serialization fails.
- */
- private void writeObject(ObjectOutputStream oos) throws IOException {
- oos.writeObject(getUpdatePolicy());
- oos.writeObject(get());
- }
-
- /**
- * Reads an instance from the input stream.
- *
- * @param ois the object input stream
- * @throws IOException if deserialization fails.
- * @throws ClassNotFoundException
- */
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- this.updatePolicy = (UpdatePolicy) ois.readObject();
- if (isPresent()) {
- this.value = (T) ois.readObject();
- }
- newValue = null;
- }
-
-
- /**
- * Simple helper that allows keeping the listeners registered as weak references, hereby avoiding any
- * memory leaks.
- *
- * @param <I> the type
- */
- private class WeakList<I> {
- final List<WeakReference<I>> refs = new LinkedList<>();
-
- /**
- * Adds a new instance.
- *
- * @param t the new instance, not null.
- */
- void add(I t) {
- refs.add(new WeakReference<>(t));
- }
-
- /**
- * Removes a instance.
- *
- * @param t the instance to be removed.
- */
- void remove(I t) {
- synchronized (refs) {
- for (Iterator<WeakReference<I>> iterator = refs.iterator(); iterator.hasNext(); ) {
- WeakReference<I> ref = iterator.next();
- I instance = ref.get();
- if (instance == null || instance == t) {
- iterator.remove();
- break;
- }
- }
- }
- }
-
-
- /**
- * Access a list (copy) of the current instances that were not discarded by the GC.
- *
- * @return the list of accessible items.
- */
- public List<I> get() {
- synchronized (refs) {
- List<I> res = new ArrayList<>();
- for (Iterator<WeakReference<I>> iterator = refs.iterator(); iterator.hasNext(); ) {
- WeakReference<I> ref = iterator.next();
- I instance = ref.get();
- if (instance == null) {
- iterator.remove();
- } else {
- res.add(instance);
- }
- }
- return res;
- }
- }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
deleted file mode 100644
index 305a660..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/InjectionHelper.java
+++ /dev/null
@@ -1,244 +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.internal;
-
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.util.List;
-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.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.api.InjectionUtils;
-import org.apache.tamaya.inject.api.WithPropertyConverter;
-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.ServiceContextManager;
-
-
-/**
- * Utility class containing several aspects used in this module.
- */
-@SuppressWarnings("unchecked")
-final class InjectionHelper {
-
- private static final Logger LOG = Logger.getLogger(InjectionHelper.class.getName());
-
- private static final boolean RESOLUTION_MODULE_LOADED = checkResolutionModuleLoaded();
-
- private static final boolean EVENTS_AVAILABLE = checkForEvents();
-
- private static boolean checkForEvents() {
- try{
- Class.forName("org.apache.tamaya.events.FrozenConfiguration");
- LOG.info("Detected tamaya-events is loaded, will trigger ConfigEvents...");
- return true;
- } catch(Exception e){
- LOG.info("Detected tamaya-events not found, will not trigger any ConfigEvents...");
- return false;
- }
- }
-
- private static boolean checkResolutionModuleLoaded() {
- try {
- Class.forName("org.apache.tamaya.resolver.internal.DefaultExpressionEvaluator");
- return true;
- } catch (ClassNotFoundException e) {
- return false;
- }
- }
-
- private InjectionHelper() {
- }
-
- /**
- * Internally evaluated the current valid configuration keys based on the given annotations present.
- * @param method the method
- * @return the keys to be returned, or null.
- */
- public static String getConfigValue(Method method, Configuration config) {
- return getConfigValue(method, 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.
- * @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);
- }
-
- /**
- * 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 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);
- }
-
- /**
- * 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);
- }
- String configValue = evaluteConfigValue(keys, retKey, config);
- if (configValue == null) {
- if(prop==null || prop.defaultValue().isEmpty()){
- return null;
- }
- return prop.defaultValue();
- }
- return configValue;
- }
-
-
- 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;
- }
- }
- return configValue;
- }
-
-
- @SuppressWarnings("rawtypes")
- public static <T> T adaptValue(AnnotatedElement element, TypeLiteral<T> targetType, String key, String configValue) {
- // 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())) {
- try {
- // TODO cache here...
- ConversionContext ctx = new ConversionContext.Builder(key,targetType)
- .setAnnotatedElement(element).build();
-
- PropertyConverter<T> converter = PropertyConverter.class.cast(converterType.newInstance());
- adaptedValue = converter.convert(configValue, ctx);
- } 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;
- }
- }
- }
- throw new ConfigException("Non convertible property type: " + element);
- }
-
- /**
- * Method that allows to statically check, if the resolver module is loaded. If the module is loaded
- * value expressions are automatically forwarded to the resolver module for resolution.
- *
- * @return true, if the resolver module is on the classpath.
- */
- public static boolean isResolutionModuleLoaded() {
- return RESOLUTION_MODULE_LOADED;
- }
-
- /**
- * Evaluates the given expression.
- *
- * @param expression the expression, not null.
- * @return the evaluated expression.
- */
- public static String evaluateValue(String expression) {
- if (!RESOLUTION_MODULE_LOADED) {
- return expression;
- }
- ExpressionEvaluator evaluator = ServiceContextManager.getServiceContext().getService(ExpressionEvaluator.class);
- if (evaluator != null) {
- return evaluator.evaluateExpression("<injection>", expression, true);
- }
- return expression;
- }
-
- /**
- * This method distributes the configuration event, if the Tamaya event module is accessible.
- * When Tamaya events are not available, the call simply returns.
- * @param event the event to be distributed, not null.
- */
- static void sendConfigurationEvent(ConfiguredType event) {
- if(EVENTS_AVAILABLE){
- ConfigEventManager.fireEvent(new BaseConfigEvent<ConfiguredType>(event, ConfiguredType.class) {});
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/Utils.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/Utils.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/Utils.java
deleted file mode 100644
index 2c08467..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/Utils.java
+++ /dev/null
@@ -1,128 +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.internal;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Utility class simplifying some implementation aspects.
- * Created by Anatole on 11.11.2014.
- */
-@SuppressWarnings("unchecked")
-public final class Utils {
-
- private static final Logger LOG = Logger.getLogger(Utils.class.getName());
-
- private Utils() {
- }
-
- /**
- * Utility method to read out repeatable annotations.
- *
- * @param annotated the annotated instance.
- * @param repeatableAnnotation the repeatable annotation type
- * @param annotationContainer the container annotation type
- * @param <T> the repeatable annotation type
- * @param <R> the repeatable container annotation type
- * @return a list with the annotations found (could be empty, but never null).
- */
- public static <T extends Annotation, R extends Annotation> Collection<T>
- getAnnotations(AnnotatedElement annotated,
- Class<T> repeatableAnnotation,
- Class<R> annotationContainer) {
- List<T> result = new ArrayList<>();
- R containerAnnot = annotated.getAnnotation(annotationContainer);
- if (containerAnnot != null) {
- Method valueMethod;
- try {
- valueMethod = annotationContainer.getMethod("keys");
- result.addAll(Arrays.asList((T[]) valueMethod.invoke(containerAnnot)));
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "Failed to evaluate repeatable annotation.", e);
- }
- } else {
- T annot = annotated.getAnnotation(repeatableAnnotation);
- if (annot != null) {
- result.add(annot);
- }
- }
- return result;
- }
-
- /**
- * Utility method to read out repeatable annotations.
- *
- * @param annotated the annotated instance.
- * @param repeatableAnnotation the repeatable annotation type
- * @param annotationContainer the container annotation type
- * @param <T> the repeatable annotation type
- * @param <R> the repeatable container annotation type
- * @return a list with the annotations found (could be empty, but never null).
- */
- public static <T extends Annotation, R extends Annotation> Collection<T>
- getAnnotations(AccessibleObject annotated,
- Class<T> repeatableAnnotation,
- Class<R> annotationContainer) {
- List<T> result = new ArrayList<>();
- R containerAnnot = annotated.getAnnotation(annotationContainer);
- if (containerAnnot != null) {
- Method valueMethod;
- try {
- valueMethod = annotationContainer.getMethod("keys");
- result.addAll(Arrays.asList((T[]) valueMethod.invoke(containerAnnot)));
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "Failed to evaluate repeatable annotation.", e);
- }
- } else {
- T annot = annotated.getAnnotation(repeatableAnnotation);
- if (annot != null) {
- result.add(annot);
- }
- }
- return result;
- }
-
- /**
- * Utility method to read out repeatable annotations.
- *
- * @param annotationType the annotation type.
- * @param objects the accessible objects to be looked up
- * @param <T> the repeatable annotation type
- * @return a list with the annotations found (could be empty, but never null).
- */
- public static <T extends Annotation> T getAnnotation(
- Class<T> annotationType, AnnotatedElement... objects) {
- for (AnnotatedElement obj : objects) {
- T annot = obj.getAnnotation(annotationType);
- if (annot != null) {
- return annot;
- }
- }
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/internal/package-info.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/package-info.java b/modules/injection/src/main/java/org/apache/tamaya/inject/internal/package-info.java
deleted file mode 100644
index 55e8cf6..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/internal/package-info.java
+++ /dev/null
@@ -1,22 +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.
- */
-/**
- * This package provides default implementation of a purely SE based injection mechanism.
- */
-package org.apache.tamaya.inject.internal;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/java/org/apache/tamaya/inject/package-info.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/java/org/apache/tamaya/inject/package-info.java b/modules/injection/src/main/java/org/apache/tamaya/inject/package-info.java
deleted file mode 100644
index 4119248..0000000
--- a/modules/injection/src/main/java/org/apache/tamaya/inject/package-info.java
+++ /dev/null
@@ -1,22 +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.
- */
-/**
- * Main SE based injection API.
- */
-package org.apache.tamaya.inject;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/main/resources/META-INF/services/org.apache.tamaya.inject.ConfigurationInjector
----------------------------------------------------------------------
diff --git a/modules/injection/src/main/resources/META-INF/services/org.apache.tamaya.inject.ConfigurationInjector b/modules/injection/src/main/resources/META-INF/services/org.apache.tamaya.inject.ConfigurationInjector
deleted file mode 100644
index 7204749..0000000
--- a/modules/injection/src/main/resources/META-INF/services/org.apache.tamaya.inject.ConfigurationInjector
+++ /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.internal.DefaultConfigurationInjector
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/test/java/annottext/AnnotatedConfigBean.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/test/java/annottext/AnnotatedConfigBean.java b/modules/injection/src/test/java/annottext/AnnotatedConfigBean.java
deleted file mode 100644
index 3420977..0000000
--- a/modules/injection/src/test/java/annottext/AnnotatedConfigBean.java
+++ /dev/null
@@ -1,78 +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 annottext;
-
-import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.NoConfig;
-import org.apache.tamaya.inject.api.Config;
-
-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.
- * Created by Anatole on 15.02.14.
- */
-public class AnnotatedConfigBean {
-
- @Config(value = {"foo.bar.myprop", "mp", "common.testdata.myProperty"}, defaultValue = "ET")
- // @ConfigLoadPolicy(listener = MyListener.class)
- public String myParameter;
-
- @Config("simple_value")
- public String simpleValue;
-
- @Config
- String anotherValue;
-
- @Config("host.name")
- private String hostName;
-
- @Config("host.name")
- private DynamicValue<String> dynamicHostname;
-
- @NoConfig
- public String javaVersion;
-
- public String getAnotherValue(){
- return anotherValue;
- }
-
- public String getHostName(){
- return hostName;
- }
-
- public DynamicValue<String> getDynamicValue(){
- return dynamicHostname;
- }
-
- @NoConfig
- private List<String> events = new ArrayList<>();
-
- // verify we don't try to inject final fields
- public static final String CONSTANT = "a constant";
-
-
- @Config("java.version")
- void setJavaVersion(String version){
- this.javaVersion = version;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/test/java/annottext/AnnotatedConfigTemplate.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/test/java/annottext/AnnotatedConfigTemplate.java b/modules/injection/src/test/java/annottext/AnnotatedConfigTemplate.java
deleted file mode 100644
index 8c6d692..0000000
--- a/modules/injection/src/test/java/annottext/AnnotatedConfigTemplate.java
+++ /dev/null
@@ -1,47 +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 annottext;
-
-import org.apache.tamaya.inject.api.DynamicValue;
-import org.apache.tamaya.inject.api.Config;
-
-/**
- * An example showing some basic annotations, using an interface to be proxied by the
- * configuration system.
- * Created by Anatole on 15.02.14.
- */
-public interface AnnotatedConfigTemplate {
-
- @Config(value = {"foo.bar.myprop", "mp","common.testdata.myProperty"}, defaultValue = "ET")
- // @ConfigLoadPolicy(listener = MyListener.class)
- String myParameter();
-
- @Config("simple_value")
- String simpleValue();
-
- @Config
- String simplestValue();
-
- @Config("host.name")
- String hostName();
-
- @Config("host.name")
- DynamicValue<String> getDynamicValue();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/test/java/annottext/NonAnnotatedConfigBean.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/test/java/annottext/NonAnnotatedConfigBean.java b/modules/injection/src/test/java/annottext/NonAnnotatedConfigBean.java
deleted file mode 100644
index 87f8be7..0000000
--- a/modules/injection/src/test/java/annottext/NonAnnotatedConfigBean.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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.
- * Created by Anatole on 15.02.14.
- */
-public class NonAnnotatedConfigBean {
-
- public String simple_value = "Should be overridden!";
-
- public String fieldKey;
-
- public String classFieldKey = "Foo";
-
- public String fullKey;
-
- public String test2 = "This is not set.";
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/test/java/org/apache/tamaya/inject/TamayaInjectionTest.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/test/java/org/apache/tamaya/inject/TamayaInjectionTest.java b/modules/injection/src/test/java/org/apache/tamaya/inject/TamayaInjectionTest.java
deleted file mode 100644
index d5a26c1..0000000
--- a/modules/injection/src/test/java/org/apache/tamaya/inject/TamayaInjectionTest.java
+++ /dev/null
@@ -1,87 +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 annottext.AnnotatedConfigBean;
-import annottext.AnnotatedConfigTemplate;
-import annottext.NonAnnotatedConfigBean;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Created by Anatole on 12.01.2015.
- */
-public class TamayaInjectionTest {
-
- @Test
- public void testInjectionNonAnnotatedClass(){
- assertNotNull(ConfigurationInjection.getConfigurationInjector());
- NonAnnotatedConfigBean testInstance = new NonAnnotatedConfigBean();
- assertEquals(testInstance.simple_value, "Should be overridden!");
- assertEquals(testInstance.classFieldKey, "Foo");
- assertEquals(testInstance.fieldKey, null);
- assertEquals(testInstance.fullKey, null);
- assertEquals(testInstance.test2, "This is not set.");
- ConfigurationInjection.getConfigurationInjector().configure(testInstance);
- assertEquals(testInstance.simple_value, "aSimpleValue");
- assertEquals(testInstance.classFieldKey, "Class-Field-Value");
- assertEquals(testInstance.fieldKey, "Field-Value");
- assertEquals(testInstance.fullKey, "Fullkey-Value");
- assertEquals(testInstance.test2, "This is not set.");
- }
-
- @Test
- public void testInjectionClass(){
- assertNotNull(ConfigurationInjection.getConfigurationInjector());
- AnnotatedConfigBean testInstance = new AnnotatedConfigBean();
- assertEquals(testInstance.getHostName(), null);
- assertEquals(testInstance.getAnotherValue(), null);
- assertEquals(testInstance.myParameter, null);
- assertEquals(testInstance.simpleValue, null);
- ConfigurationInjection.getConfigurationInjector().configure(testInstance);
- assertEquals(testInstance.getHostName(), "tamaya01.incubator.apache.org");
- assertEquals(testInstance.getAnotherValue(), "HALLO!");
- assertEquals(testInstance.myParameter, "ET");
- assertEquals(testInstance.simpleValue, "aSimpleValue");
- assertNotNull(testInstance.getDynamicValue());
- assertTrue(testInstance.getDynamicValue().isPresent());
- assertEquals(testInstance.getDynamicValue().get(), "tamaya01.incubator.apache.org");
- assertEquals(testInstance.getHostName(), testInstance.getDynamicValue().get());
- assertEquals(testInstance.javaVersion, System.getProperty("java.version"));
- }
-
- @Test
- public void testConfigTemplate(){
- assertNotNull(ConfigurationInjection.getConfigurationInjector());
- AnnotatedConfigTemplate testInstance = ConfigurationInjection.getConfigurationInjector()
- .createTemplate(AnnotatedConfigTemplate.class);
- assertEquals(testInstance.hostName(), "tamaya01.incubator.apache.org");
- assertEquals(testInstance.myParameter(), "ET");
- assertEquals(testInstance.simpleValue(), "aSimpleValue");
- assertNotNull(testInstance.getDynamicValue());
- assertTrue(testInstance.getDynamicValue().isPresent());
- assertEquals(testInstance.getDynamicValue().get(), "tamaya01.incubator.apache.org");
- assertEquals(testInstance.hostName(), testInstance.getDynamicValue().get());
-// assertEquals(testInstance.simplestValue(), "HALLO!");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/fe7cd8f1/modules/injection/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/injection/src/test/java/org/apache/tamaya/inject/TestPropertySource.java b/modules/injection/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
deleted file mode 100644
index 0853fd1..0000000
--- a/modules/injection/src/test/java/org/apache/tamaya/inject/TestPropertySource.java
+++ /dev/null
@@ -1,68 +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");
- }
-
- @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, String> getProperties() {
- return properties;
- }
-
- @Override
- public boolean isScannable() {
- return true;
- }
-}