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 2017/11/19 22:23:59 UTC
[1/3] incubator-tamaya-extensions git commit: Removed useless blank.
Repository: incubator-tamaya-extensions
Updated Branches:
refs/heads/master ee1ca56eb -> 14a0b9b8a
Removed useless blank.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/14a0b9b8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/14a0b9b8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/14a0b9b8
Branch: refs/heads/master
Commit: 14a0b9b8a80190a3152d5c646e1a61408b2aaf81
Parents: 9c8e358
Author: Anatole Tresch <an...@apache.org>
Authored: Sun Nov 19 23:22:52 2017 +0100
Committer: Anatole Tresch <an...@apache.org>
Committed: Sun Nov 19 23:23:42 2017 +0100
----------------------------------------------------------------------
.../META-INF/services/org.apache.tamaya.spi.PropertySourceProvider | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/14a0b9b8/examples/04-events-example/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
----------------------------------------------------------------------
diff --git a/examples/04-events-example/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider b/examples/04-events-example/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
index 69b2a3b..a0d95fb 100644
--- a/examples/04-events-example/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
+++ b/examples/04-events-example/src/main/resources/META-INF/services/org.apache.tamaya.spi.PropertySourceProvider
@@ -16,5 +16,5 @@
# specific language governing permissions and limitations
# under the License.
#
- org.apache.tamaya.ext.examples.events.FilePropertySourceProvider
+org.apache.tamaya.ext.examples.events.FilePropertySourceProvider
[2/3] incubator-tamaya-extensions git commit: Added Spring example.
Posted by an...@apache.org.
Added Spring example.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/9c8e3581
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/9c8e3581
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/9c8e3581
Branch: refs/heads/master
Commit: 9c8e3581c98cb0d6663807b2b0e446fbd4345c6d
Parents: 7c071ca
Author: Anatole Tresch <an...@apache.org>
Authored: Sun Nov 19 23:22:26 2017 +0100
Committer: Anatole Tresch <an...@apache.org>
Committed: Sun Nov 19 23:23:42 2017 +0100
----------------------------------------------------------------------
examples/05-spring-example/pom.xml | 128 +++++++++++++++++++
.../SampleWebFreeMarkerApplication.java | 31 +++++
.../tamaya/springexample/WelcomeController.java | 50 ++++++++
.../META-INF/javaconfiguration.properties | 21 +++
.../src/main/resources/templates/error.ftl | 26 ++++
.../src/main/resources/templates/welcome.ftl | 32 +++++
examples/pom.xml | 1 +
7 files changed, 289 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/pom.xml
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/pom.xml b/examples/05-spring-example/pom.xml
new file mode 100644
index 0000000..93c600c
--- /dev/null
+++ b/examples/05-spring-example/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>1.5.6.RELEASE</version>
+ </parent>
+
+ <artifactId>05-spring-example</artifactId>
+ <version>0.4-incubating-SNAPSHOT</version>
+
+ <properties>
+ <spring.version>4.3.10.RELEASE</spring.version>
+ <spring.boot.version>1.5.8.RELEASE</spring.boot.version>
+ <tamaya-apicore.version>0.4-incubating-SNAPSHOT</tamaya-apicore.version>
+ </properties>
+
+ <name>Apache Tamaya Spring Example</name>
+
+ <description>
+ This project contains a simple example demonstrating the usage
+ of the Tamaya Spring module.
+ </description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-freemarker</artifactId>
+ </dependency>
+ <!--<dependency>-->
+ <!--<groupId>org.apache.tamaya.ext</groupId>-->
+ <!--<artifactId>tamaya-mutable-config</artifactId>-->
+ <!--<version>${tamaya-apicore.version}</version>-->
+ <!--</dependency>-->
+ <dependency>
+ <groupId>org.apache.tamaya</groupId>
+ <artifactId>tamaya-core</artifactId>
+ <version>${tamaya-apicore.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-events</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <!--<dependency>-->
+ <!--<groupId>org.apache.tamaya.ext</groupId>-->
+ <!--<artifactId>tamaya-etcd_beta</artifactId>-->
+ <!--<version>${project.version}</version>-->
+ <!--</dependency>-->
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-spring</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tamaya.ext</groupId>
+ <artifactId>tamaya-injection</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>java-hamcrest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+ <!-- Test -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.pitest</groupId>
+ <artifactId>pitest-maven</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <configuration>
+ <executable>true</executable>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <useSystemClassLoader>false</useSystemClassLoader>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+
+</project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/SampleWebFreeMarkerApplication.java
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/SampleWebFreeMarkerApplication.java b/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/SampleWebFreeMarkerApplication.java
new file mode 100644
index 0000000..3092a1d
--- /dev/null
+++ b/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/SampleWebFreeMarkerApplication.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2012-2014 the original author or authors.
+ *
+ * Licensed 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.springexample;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+
+@SpringBootApplication
+@ComponentScan({"org.apache.tamaya.integration.spring", "org.apache.tamaya.springexample"})
+public class SampleWebFreeMarkerApplication {
+
+ public static void main(String[] args) throws Exception {
+ SpringApplication.run(SampleWebFreeMarkerApplication.class, args);
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/WelcomeController.java
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/WelcomeController.java b/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/WelcomeController.java
new file mode 100644
index 0000000..bbe921f
--- /dev/null
+++ b/examples/05-spring-example/src/main/java/org/apache/tamaya/springexample/WelcomeController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012-2016 the original author or authors.
+ *
+ * Licensed 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.springexample;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.tamaya.inject.api.Config;
+import org.apache.tamaya.inject.api.DynamicValue;
+import org.apache.tamaya.inject.api.UpdatePolicy;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class WelcomeController {
+
+ @Value("${application.message:Hello World}")
+ private String message = "Hello World";
+
+ @Config(value = "background.color", required = false)
+ private String backgroundColor = "#BBBBBB";
+
+ @Config(value = "foreground.color", required = false, defaultValue = "#DDDDDD")
+ private DynamicValue<String> foregroundColor;
+
+ @GetMapping("/")
+ public String welcome(Map<String, Object> model) {
+ foregroundColor.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
+ model.put("time", new Date());
+ model.put("message", this.message);
+ model.put("background", this.backgroundColor);
+ model.put("foreground", this.foregroundColor.get());
+ return "welcome";
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/src/main/resources/META-INF/javaconfiguration.properties
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/src/main/resources/META-INF/javaconfiguration.properties b/examples/05-spring-example/src/main/resources/META-INF/javaconfiguration.properties
new file mode 100644
index 0000000..b2d9136
--- /dev/null
+++ b/examples/05-spring-example/src/main/resources/META-INF/javaconfiguration.properties
@@ -0,0 +1,21 @@
+#
+# 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.
+#
+application.message=Hallo by Tamaya!
+background.color=#123456
+foreground.color=#FFDDDD
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/src/main/resources/templates/error.ftl
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/src/main/resources/templates/error.ftl b/examples/05-spring-example/src/main/resources/templates/error.ftl
new file mode 100644
index 0000000..808cc91
--- /dev/null
+++ b/examples/05-spring-example/src/main/resources/templates/error.ftl
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<!--
+# 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.
+-->
+<html lang="en">
+
+<body>
+ Something went wrong: ${status} ${error}
+</body>
+
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/05-spring-example/src/main/resources/templates/welcome.ftl
----------------------------------------------------------------------
diff --git a/examples/05-spring-example/src/main/resources/templates/welcome.ftl b/examples/05-spring-example/src/main/resources/templates/welcome.ftl
new file mode 100644
index 0000000..696e4bc
--- /dev/null
+++ b/examples/05-spring-example/src/main/resources/templates/welcome.ftl
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<!--
+# 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.
+-->
+<html lang="en">
+
+<body bgcolor="${background}">
+ <font color="${foreground}}">
+ Date: ${time?date}
+ <br>
+ Time: ${time?time}
+ <br>
+ Message: ${message}
+ </font>
+</body>
+
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/9c8e3581/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index 7a1c73f..0023a0f 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -41,6 +41,7 @@ under the License.
<module>02-resolver-example</module>
<module>03-injection-example</module>
<module>04-events-example</module>
+ <module>05-spring-example</module>
</modules>
</project>
\ No newline at end of file
[3/3] incubator-tamaya-extensions git commit: TAMAYA-318 Fixed
failing CDI tests and refactored dynamic value.
Posted by an...@apache.org.
TAMAYA-318 Fixed failing CDI tests and refactored dynamic value.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/7c071caf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/7c071caf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/7c071caf
Branch: refs/heads/master
Commit: 7c071cafd73fe957f92c5cb1ea79fe272e4b4f91
Parents: ee1ca56
Author: Anatole Tresch <an...@apache.org>
Authored: Sun Nov 19 23:18:40 2017 +0100
Committer: Anatole Tresch <an...@apache.org>
Committed: Sun Nov 19 23:23:42 2017 +0100
----------------------------------------------------------------------
.../tamaya/cdi/ConfigurationProducer.java | 4 +-
.../apache/tamaya/cdi/DefaultDynamicValue.java | 380 +++----------------
.../apache/tamaya/inject/api/DynamicValue.java | 8 +
.../tamaya/inject/spi/BaseDynamicValue.java | 262 +++++++++++--
.../tamaya/inject/spi/BaseDynamicValueTest.java | 2 +-
.../ConfigTemplateInvocationHandler.java | 2 +-
.../inject/internal/ConfiguredFieldImpl.java | 10 +-
.../inject/internal/DefaultDynamicValue.java | 266 ++-----------
.../internal/DefaultDynamicValueTest.java | 27 +-
.../SpringConfigInjectionPostProcessor.java | 5 +
.../integration/spring/TamayaSpringConfig.java | 5 +
11 files changed, 346 insertions(+), 625 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/ConfigurationProducer.java
----------------------------------------------------------------------
diff --git a/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/ConfigurationProducer.java b/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/ConfigurationProducer.java
index 279f04b..2dfef7c 100644
--- a/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/ConfigurationProducer.java
+++ b/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/ConfigurationProducer.java
@@ -45,9 +45,9 @@ public class ConfigurationProducer {
private DynamicValue createDynamicValue(final InjectionPoint injectionPoint) {
Member member = injectionPoint.getMember();
if (member instanceof Field) {
- return DefaultDynamicValue.of((Field) member, ConfigurationProvider.getConfiguration());
+ return DefaultDynamicValue.of(injectionPoint.getBean(), (Field) member, ConfigurationProvider.getConfiguration());
} else if (member instanceof Method) {
- return DefaultDynamicValue.of((Method) member, ConfigurationProvider.getConfiguration());
+ return DefaultDynamicValue.of(injectionPoint.getBean(), (Method) member, ConfigurationProvider.getConfiguration());
}
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/DefaultDynamicValue.java
----------------------------------------------------------------------
diff --git a/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/DefaultDynamicValue.java b/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/DefaultDynamicValue.java
index 5a3c807..8c6dfee 100644
--- a/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/DefaultDynamicValue.java
+++ b/modules/injection/cdi/src/main/java/org/apache/tamaya/cdi/DefaultDynamicValue.java
@@ -27,21 +27,13 @@ import org.apache.tamaya.inject.api.UpdatePolicy;
import org.apache.tamaya.inject.api.WithPropertyConverter;
import org.apache.tamaya.inject.spi.BaseDynamicValue;
import org.apache.tamaya.inject.spi.InjectionUtils;
-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.*;
-import java.util.logging.Logger;
/**
* A accessor for a single configured value. This can be used to support values that may change during runtime,
@@ -59,90 +51,56 @@ import java.util.logging.Logger;
*/
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;
+ private final PropertyConverter<T> customConverter;
/**
* 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.
+ * @param customConverter the optional converter to be used.
*/
- private DefaultDynamicValue(String propertyName, Configuration configuration, TypeLiteral<T> targetType,
- PropertyConverter<T> propertyConverter, List<String> keys, LoadPolicy loadPolicy,
+ private DefaultDynamicValue(Object owner, String propertyName, Configuration configuration, TypeLiteral<T> targetType,
+ PropertyConverter<T> customConverter, List<String> keys, LoadPolicy loadPolicy,
UpdatePolicy updatePolicy) {
- this.propertyName = Objects.requireNonNull(propertyName);
- this.keys = keys.toArray(new String[keys.size()]);
+ super(owner, propertyName, targetType, keys);
this.configuration = Objects.requireNonNull(configuration);
- this.propertyConverter = propertyConverter;
- this.targetType = targetType;
+ this.customConverter = customConverter;
this.loadPolicy = Objects.requireNonNull(loadPolicy);
- this.updatePolicy = Objects.requireNonNull(updatePolicy);
+ setUpdatePolicy(updatePolicy);
if(loadPolicy == LoadPolicy.INITIAL){
- this.value = evaluateValue();
+ updateValue();
}
}
- public static DynamicValue of(Field annotatedField, Configuration configuration) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue of(Object owner, Field annotatedField, Configuration configuration) {
+ return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue of(Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
- return of(annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
+ return of(owner, annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue of(Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
+ public static DynamicValue of(Object owner, Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
+ return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
- public static DynamicValue of(Field annotatedField, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = annotatedField.getGenericType();
if (targetType == null) {
@@ -170,23 +128,23 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
}
List<String> keys = InjectionUtils.getKeys(annotatedField);
- return new DefaultDynamicValue(annotatedField.getName(), configuration,
+ return new DefaultDynamicValue(owner, 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.IMMEDIATE);
+ public static DynamicValue of(Object owner, Method method, Configuration configuration) {
+ return of(owner, method, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue of(Method method, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(method, configuration, LoadPolicy.ALWAYS, updatePolicy);
+ public static DynamicValue of(Object owner, Method method, Configuration configuration, UpdatePolicy updatePolicy) {
+ return of(owner, method, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
- public static DynamicValue of(Method method, Configuration configuration, LoadPolicy loadPolicy) {
- return of(method, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy) {
+ return of(owner, method, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue of(Method method, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = method.getGenericReturnType();
if (targetType == null) {
@@ -213,285 +171,35 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
+ '.' + method.getName(), e);
}
}
- return new DefaultDynamicValue<>(method.getName(),
+ return new DefaultDynamicValue<>(owner, 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;
+ @Override
+ protected Configuration getConfiguration() {
+ return configuration;
}
- /**
- * 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);
+ @Override
+ protected PropertyConverter<T> getCustomConverter() {
+ return customConverter;
}
- /**
- * 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);
- }
+ @Override
+ public String toString() {
+ return "DefaultDynamicValue{" +
+ "configuration=" + configuration +
+ ", customConverter=" + customConverter +
+ ", loadPolicy=" + loadPolicy +
+ ", value=" + value +
+ ", newValue=" + newValue +
+ ", defaultValue=" + getDefaultValue() +
+ ", discarded=" + discarded +
+ ", keys=" + getKeys() +
+ ", updatePolicy=" + getUpdatePolicy() +
+ '}';
}
-
- /**
- * 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:
- case IMMEDIATE:
- commit();
- break;
- case EXPLCIT:
- case EXPLICIT:
- 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) {
- if (propertyConverter == null) {
- value = configuration.get(key, targetType);
- } else {
- String source = configuration.get(key);
- ConversionContext ctx = new ConversionContext.Builder(configuration,
- configuration.getContext(), key, targetType).build();
- 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/7c071caf/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/api/DynamicValue.java
----------------------------------------------------------------------
diff --git a/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/api/DynamicValue.java b/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/api/DynamicValue.java
index 54ab10a..ef249ac 100644
--- a/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/api/DynamicValue.java
+++ b/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/api/DynamicValue.java
@@ -59,6 +59,14 @@ public interface DynamicValue<T> {
void commit();
/**
+ * Discards a new value that has been published and ignore all future evaluations to the last discarded
+ * value. If a different new value than the discarded value will be evaluated a value change
+ * will be flagged and handled as defined by the {@link UpdatePolicy}.
+ * No listeners will be triggered.
+ */
+ void discard();
+
+ /**
* Access the {@link UpdatePolicy} used for updating this value.
* @return the update policy, never null.
*/
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/spi/BaseDynamicValue.java
----------------------------------------------------------------------
diff --git a/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/spi/BaseDynamicValue.java b/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/spi/BaseDynamicValue.java
index 59e7683..d886d45 100644
--- a/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/spi/BaseDynamicValue.java
+++ b/modules/injection/injection-api/src/main/java/org/apache/tamaya/inject/spi/BaseDynamicValue.java
@@ -23,15 +23,15 @@ import org.apache.tamaya.Configuration;
import org.apache.tamaya.TypeLiteral;
import org.apache.tamaya.inject.api.DynamicValue;
import org.apache.tamaya.inject.api.UpdatePolicy;
+import org.apache.tamaya.spi.ConversionContext;
+import org.apache.tamaya.spi.PropertyConverter;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
-import java.lang.reflect.Member;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.lang.ref.WeakReference;
+import java.util.*;
+import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -53,27 +53,72 @@ import java.util.logging.Logger;
*
* @param <T> The type of the value.
*/
-public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializable {
+public abstract class BaseDynamicValue<T> implements DynamicValue<T> {
private static final long serialVersionUID = 1L;
private static final Logger LOG = Logger.getLogger(DynamicValue.class.getName());
+ /** The value owner used for PropertyChangeEvents. */
+ private Object owner;
+ /**
+ * The property name of the entry.
+ */
+ private String propertyName;
+
+ /**
+ * Policy that defines how new values are applied, be default it is applied initially once, but never updated
+ * anymore.
+ */
private UpdatePolicy updatePolicy = UpdatePolicy.NEVER;
+ /** The targe type. */
private TypeLiteral<T> targetType;
- private T currentValue;
- private T newValue;
+ /**
+ * The current value, never null.
+ */
+ protected transient T value;
+ /** The last discarded value. */
+ protected transient T discarded;
+ /** Any new value, not yet applied. */
+ protected transient T newValue;
+ /** The configured default value, before type conversion. */
+ private String defaultValue;
+ /** The list of candidate keys to be used. */
private List<String> keys = new ArrayList<>();
- private List<PropertyChangeListener> listeners = Collections.synchronizedList(new ArrayList<>());
-
+ /** The registered listeners. */
+ private WeakList<PropertyChangeListener> listeners = new WeakList<>();
- public BaseDynamicValue(TypeLiteral targetType, List<String> keys){
+ /**
+ * Creates a new instance.
+ * @param owner the owner, not null.
+ * @param propertyName the property name, not null.
+ * @param targetType the target type.
+ * @param keys the candidate keys.
+ */
+ public BaseDynamicValue(Object owner, String propertyName, TypeLiteral targetType, List<String> keys){
if(keys == null || keys.isEmpty()){
throw new ConfigException("At least one key is required.");
}
+ this.owner = owner;
+ this.propertyName = Objects.requireNonNull(propertyName);
this.targetType = Objects.requireNonNull(targetType);
this.keys.addAll(keys);
- this.currentValue = evaluateValue();
+ }
+
+ /**
+ * Get the default value, used if no value could be evaluated.
+ * @return the default value, or null.
+ */
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ * Set the default value to be used.
+ * @param defaultValue the default value.
+ */
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
}
/**
@@ -83,16 +128,20 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
protected abstract Configuration getConfiguration();
/**
- * Get the owner of this dynamic value instance.
- * @return the owner, never null.
+ * Get the corresponding property name.
+ * @return
*/
- protected abstract Object getOwner();
+ protected String getPropertyName(){
+ return propertyName;
+ }
/**
- * Get the corresponding property name.
- * @return
+ * Get the owner of this dynamic value instance.
+ * @return the owner, never null.
*/
- protected abstract String getPropertyName();
+ protected Object getOwner(){
+ return owner;
+ }
/**
* Get the targeted keys, in evaluation order.
@@ -112,11 +161,21 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
@Override
public void commit() {
- if(!Objects.equals(newValue, currentValue)) {
- T oldValue = this.currentValue;
- currentValue = newValue;
- publishChangeEvent(this.currentValue, newValue);
+ if(!Objects.equals(newValue, value)) {
+ T oldValue = this.value;
+ value = newValue;
+ discarded = null;
+ publishChangeEvent(this.value, newValue);
+ newValue = null;
+ }
+ }
+
+ @Override
+ public void discard() {
+ if(newValue!=null){
+ discarded = newValue;
}
+ newValue = null;
}
@Override
@@ -142,21 +201,32 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
@Override
public T get() {
- return currentValue;
+ updateValue();
+ return value;
}
@Override
public boolean updateValue() {
Configuration config = getConfiguration();
T val = evaluateValue();
- if(!Objects.equals(val, currentValue)){
+ if(value == null){
+ value = val;
+ return true;
+ }else if(discarded!=null && discarded.equals(val)){
+ // the evaluated value has been discarded and will be flagged out.
+ return false;
+ }else{
+ // Reset discarded state for a new value.
+ discarded = null;
+ }
+ if(!Objects.equals(val, value)){
switch (updatePolicy){
case EXPLICIT:
newValue = val;
break;
case IMMEDIATE:
- this.currentValue = val;
- publishChangeEvent(this.currentValue, val);
+ this.value = val;
+ publishChangeEvent(this.value, val);
break;
case LOG_ONLY:
LOG.info("New config value for keys " + keys + " detected, but not yet applied.");
@@ -178,7 +248,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
protected void publishChangeEvent(T oldValue, T newValue) {
PropertyChangeEvent evt = new PropertyChangeEvent(getOwner(), getPropertyName(),oldValue, newValue);
synchronized (listeners){
- listeners.parallelStream().forEach(l -> {
+ listeners.forEach(l -> {
try{
l.propertyChange(evt);
}catch(Exception e){
@@ -188,16 +258,56 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
}
}
+ /**
+ * Allows to customize type conversion if needed, e.g. based on some annotations defined.
+ * @return the custom converter, which replaces the default converters, ot null.
+ */
+ protected PropertyConverter<T> getCustomConverter(){
+ return null;
+ }
+
@Override
public T evaluateValue() {
- Configuration config = getConfiguration();
- for(String key:getKeys()){
- T val = config.getOrDefault(key, targetType, null);
- if(val!=null){
- return val;
- }
+ T value = null;
+ List<PropertyConverter<T>> converters = new ArrayList<>();
+ if (this.getCustomConverter() != null) {
+ converters.add(this.getCustomConverter());
}
- return null;
+ converters.addAll(getConfiguration().getContext().getPropertyConverters(targetType));
+
+ for (String key : keys) {
+ ConversionContext ctx = new ConversionContext.Builder(key, targetType).build();
+ String stringVal = getConfiguration().getOrDefault(key, String.class, null);
+ if(stringVal!=null) {
+ if(String.class.equals(targetType.getType())){
+ value = (T)stringVal;
+ }
+ for(PropertyConverter<T> conv:converters){
+ try{
+ value = conv.convert(stringVal, ctx);
+ if(value!=null){
+ break;
+ }
+ }catch(Exception e){
+ LOG.warning("failed to convert: " + ctx);
+ }
+ }
+ }
+ }
+ if(value == null && defaultValue!=null){
+ ConversionContext ctx = new ConversionContext.Builder("<defaultValue>", targetType).build();
+ for(PropertyConverter<T> conv:converters){
+ try{
+ value = conv.convert(defaultValue, ctx);
+ if(value!=null){
+ break;
+ }
+ }catch(Exception e){
+ LOG.warning("failed to convert: " + ctx);
+ }
+ }
+ }
+ return value;
}
@Override
@@ -217,6 +327,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
* @throws org.apache.tamaya.ConfigException if there is no value present
* @see DynamicValue#isPresent()
*/
+ @Override
public T commitAndGet() {
commit();
return get();
@@ -227,6 +338,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
*
* @return {@code true} if there is a value present, otherwise {@code false}
*/
+ @Override
public boolean isPresent() {
return get() != null;
}
@@ -239,6 +351,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
* be null
* @return the value, if present, otherwise {@code other}
*/
+ @Override
public T orElse(T other) {
T value = get();
if (value == null) {
@@ -257,6 +370,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
* @throws NullPointerException if value is not present and {@code other} is
* null
*/
+ @Override
public T orElseGet(Supplier<? extends T> other) {
T value = get();
if (value == null) {
@@ -281,6 +395,7 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
* @throws NullPointerException if no value is present and
* {@code exceptionSupplier} is null
*/
+ @Override
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
T value = get();
if (value == null) {
@@ -289,4 +404,83 @@ public abstract class BaseDynamicValue<T> implements DynamicValue<T>, Serializab
return value;
}
+
+
+ /**
+ * 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<>();
+
+ boolean contains(I item){
+ for(WeakReference<I> t:refs){
+ if(item.equals(t.get())){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void forEach(Consumer<I> consumer){
+ refs.parallelStream().forEach(ref -> {
+ I t = ref.get();
+ if(t!=null){
+ consumer.accept(t);
+ }
+ });
+ }
+
+ /**
+ * 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/7c071caf/modules/injection/injection-api/src/test/java/org/apache/tamaya/inject/spi/BaseDynamicValueTest.java
----------------------------------------------------------------------
diff --git a/modules/injection/injection-api/src/test/java/org/apache/tamaya/inject/spi/BaseDynamicValueTest.java b/modules/injection/injection-api/src/test/java/org/apache/tamaya/inject/spi/BaseDynamicValueTest.java
index 3f8720e..bb568a5 100644
--- a/modules/injection/injection-api/src/test/java/org/apache/tamaya/inject/spi/BaseDynamicValueTest.java
+++ b/modules/injection/injection-api/src/test/java/org/apache/tamaya/inject/spi/BaseDynamicValueTest.java
@@ -79,7 +79,7 @@ public class BaseDynamicValueTest {
private static final class MyDynamicValue extends BaseDynamicValue{
public MyDynamicValue(String... keys){
- super(TypeLiteral.of(String.class), Arrays.asList(keys));
+ super(null, "test", TypeLiteral.of(String.class), Arrays.asList(keys));
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfigTemplateInvocationHandler.java
----------------------------------------------------------------------
diff --git a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfigTemplateInvocationHandler.java b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfigTemplateInvocationHandler.java
index 5d634e1..fd9f7be 100644
--- a/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfigTemplateInvocationHandler.java
+++ b/modules/injection/standalone/src/main/java/org/apache/tamaya/inject/internal/ConfigTemplateInvocationHandler.java
@@ -64,7 +64,7 @@ public final class ConfigTemplateInvocationHandler implements InvocationHandler
return config;
}
if (method.getReturnType() == DynamicValue.class) {
- return DefaultDynamicValue.of(method, config);
+ return DefaultDynamicValue.of(proxy, method, config);
}
String[] retKey = new String[1];
String configValue = InjectionHelper.getConfigValue(method, retKey, config);
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/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 7ccaecc..e39b070 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
@@ -82,11 +82,11 @@ public class ConfiguredFieldImpl implements ConfiguredField{
@Override
public Object run() throws Exception {
annotatedField.setAccessible(true);
+ annotatedField.set(target,
+ DefaultDynamicValue.of(target, annotatedField, ConfigurationProvider.getConfiguration()));
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);
@@ -118,12 +118,12 @@ public class ConfiguredFieldImpl implements ConfiguredField{
@Override
public Object run() throws Exception {
annotatedField.setAccessible(true);
+ if(value!=null) {
+ annotatedField.set(target, value);
+ }
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);
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/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 621399d..ac7e977 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
@@ -67,51 +67,21 @@ 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 reevaluate 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.
@@ -120,35 +90,33 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
* @param targetType the target type, not null.
* @param propertyConverter the optional converter to be used.
*/
- private DefaultDynamicValue(String propertyName, Configuration configuration, TypeLiteral<T> targetType,
+ private DefaultDynamicValue(Object owner, 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()]);
+ super(owner, propertyName, targetType, keys);
this.configuration = Objects.requireNonNull(configuration);
this.propertyConverter = propertyConverter;
- this.targetType = targetType;
this.loadPolicy = Objects.requireNonNull(loadPolicy);
- this.updatePolicy = Objects.requireNonNull(updatePolicy);
+ setUpdatePolicy(updatePolicy);
if(loadPolicy == LoadPolicy.INITIAL){
this.value = evaluateValue();
}
}
- public static DynamicValue<?> of(Field annotatedField, Configuration configuration) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration) {
+ return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
- return of(annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy) {
+ return of(owner, annotatedField, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, UpdatePolicy updatePolicy) {
+ return of(owner, annotatedField, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
- public static DynamicValue<?> of(Field annotatedField, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Field annotatedField, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = annotatedField.getGenericType();
if (targetType == null) {
@@ -176,24 +144,24 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
}
List<String> keys = InjectionUtils.getKeys(annotatedField);
- return new DefaultDynamicValue(annotatedField.getName(), configuration,
+ return new DefaultDynamicValue(owner, 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.IMMEDIATE);
+ public static DynamicValue<?> of(Object owner, Method method, Configuration configuration) {
+ return of(owner, method, configuration, LoadPolicy.ALWAYS, UpdatePolicy.IMMEDIATE);
}
- public static DynamicValue<?> of(Method method, Configuration configuration, UpdatePolicy updatePolicy) {
- return of(method, configuration, LoadPolicy.ALWAYS, updatePolicy);
+ public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, UpdatePolicy updatePolicy) {
+ return of(owner, method, configuration, LoadPolicy.ALWAYS, updatePolicy);
}
- public static DynamicValue<?> of(Method method, Configuration configuration, LoadPolicy loadPolicy) {
- return of(method, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
+ public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy) {
+ return of(owner, method, configuration, loadPolicy, UpdatePolicy.IMMEDIATE);
}
@SuppressWarnings("unchecked")
- public static DynamicValue<?> of(Method method, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
+ public static DynamicValue<?> of(Object owner, Method method, Configuration configuration, LoadPolicy loadPolicy, UpdatePolicy updatePolicy) {
// Check for adapter/filter
Type targetType = method.getGenericReturnType();
if (targetType == null) {
@@ -220,82 +188,18 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
+ '.' + method.getName(), e);
}
}
- return new DefaultDynamicValue<>(method.getName(),
+ return new DefaultDynamicValue<>(owner, 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.
- */
- @SuppressWarnings("unchecked")
- 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);
+ protected PropertyConverter getCustomConverter(){
+ return this.propertyConverter;
}
- /**
- * Removes a listener to be called, when this value has been changed.
- *
- * @param l the listener to be removed, not null
- */
- public void removeListener(PropertyChangeListener l) {
- if (listeners != null) {
- listeners.remove(l);
- }
+ @Override
+ protected Configuration getConfiguration() {
+ return configuration;
}
/**
@@ -314,17 +218,17 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
this.value = newLocalValue;
}
if(!Objects.equals(this.value, newLocalValue)){
- switch (updatePolicy){
+ switch (getUpdatePolicy()){
case IMMEDEATE:
case IMMEDIATE:
commit();
break;
case EXPLCIT:
case EXPLICIT:
- this.newValue = new Object[]{newLocalValue};
+ this.newValue = newLocalValue;
break;
case LOG_ONLY:
- informListeners(this.value, newLocalValue);
+ publishChangeEvent(this.value, newLocalValue);
this.newValue = null;
break;
case NEVER:
@@ -355,10 +259,10 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
if (Objects.equals(newValue, this.value)) {
return false;
}
- switch (this.updatePolicy) {
+ switch (getUpdatePolicy()) {
case LOG_ONLY:
Logger.getLogger(getClass().getName()).info("Discard change on " + this + ", newValue=" + newValue);
- informListeners(value, newValue);
+ publishChangeEvent(value, newValue);
this.newValue = null;
break;
case NEVER:
@@ -367,7 +271,7 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
case EXPLCIT:
case IMMEDEATE:
default:
- this.newValue = new Object[]{newValue};
+ this.newValue = newValue;
commit();
break;
}
@@ -375,60 +279,16 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
}
/**
- * 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() {
@SuppressWarnings("unchecked")
- T nv = newValue==null?null:(T)newValue[0];
+ T nv = newValue==null?null:(T)newValue;
return nv;
}
- @Override
- public T orElseGet(Supplier<? extends T> other) {
- T t = evaluateValue();
- if(t==null){
- return other.get();
- }
- return t;
- }
-
- @Override
- public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
- T t = evaluateValue();
- if(t==null){
- throw exceptionSupplier.get();
- }
- return t;
- }
-
-
/**
* Serialization implementation that strips away the non serializable Optional part.
*
@@ -449,71 +309,11 @@ final class DefaultDynamicValue<T> extends BaseDynamicValue<T> {
*/
@SuppressWarnings("unchecked")
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- this.updatePolicy = (UpdatePolicy) ois.readObject();
+ setUpdatePolicy((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/7c071caf/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 3ee690d..a071584 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
@@ -95,14 +95,14 @@ public class DefaultDynamicValueTest {
@Test
public void testOf_Field() throws Exception {
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
ConfigurationProvider.getConfiguration());
assertNotNull(val);
}
@Test
public void testOf_Method() throws Exception {
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredMethod("setterMethod", String.class),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredMethod("setterMethod", String.class),
config);
assertNotNull(val);
}
@@ -110,7 +110,7 @@ public class DefaultDynamicValueTest {
@Test
public void testCommitAndGet() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
assertNotNull(val);
assertEquals("aValue",val.evaluateValue());
@@ -119,7 +119,7 @@ public class DefaultDynamicValueTest {
@Test
public void testCommitAndGets() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
assertNotNull(val);
@@ -134,7 +134,7 @@ public class DefaultDynamicValueTest {
@Test
public void testCommit() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
assertNotNull(val);
@@ -150,7 +150,7 @@ public class DefaultDynamicValueTest {
@Test
public void testGetSetUpdatePolicy() throws Exception {
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
for(UpdatePolicy pol: UpdatePolicy.values()) {
val.setUpdatePolicy(pol);
@@ -161,7 +161,7 @@ public class DefaultDynamicValueTest {
@Test
public void testAddRemoveListener() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
val.addListener(consumer);
@@ -180,7 +180,7 @@ public class DefaultDynamicValueTest {
@Test
public void testGet() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
properties.put("a",PropertyValue.of("a","aValue2","test"));
@@ -191,7 +191,7 @@ public class DefaultDynamicValueTest {
@Test
public void testUpdateValue() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
assertNotNull(val.get());
@@ -206,7 +206,7 @@ public class DefaultDynamicValueTest {
@Test
public void testEvaluateValue() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
assertNotNull(val.get());
@@ -218,7 +218,7 @@ public class DefaultDynamicValueTest {
@Test
public void testGetNewValue() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.EXPLICIT);
val.get();
@@ -228,6 +228,7 @@ public class DefaultDynamicValueTest {
assertNotNull(val.getNewValue());
assertEquals("aValue2", val.getNewValue());
val.commit();
+ assertEquals("aValue2", val.get());
assertNull(val.getNewValue());
}
@@ -239,7 +240,7 @@ public class DefaultDynamicValueTest {
@Test
public void testIfPresent() throws Exception {
properties.put("a",PropertyValue.of("a","aValue","test"));
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
assertTrue(val.isPresent());
@@ -250,7 +251,7 @@ public class DefaultDynamicValueTest {
@Test
public void testOrElse() throws Exception {
- DynamicValue val = DefaultDynamicValue.of(getClass().getDeclaredField("myValue"),
+ DynamicValue val = DefaultDynamicValue.of(this, getClass().getDeclaredField("myValue"),
config);
val.setUpdatePolicy(UpdatePolicy.IMMEDIATE);
assertEquals("bla", val.orElse("bla"));
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/spring/src/main/java/org/apache/tamaya/integration/spring/SpringConfigInjectionPostProcessor.java
----------------------------------------------------------------------
diff --git a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/SpringConfigInjectionPostProcessor.java b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/SpringConfigInjectionPostProcessor.java
index e25b230..0bcc5c3 100644
--- a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/SpringConfigInjectionPostProcessor.java
+++ b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/SpringConfigInjectionPostProcessor.java
@@ -21,8 +21,13 @@ package org.apache.tamaya.integration.spring;
import org.apache.tamaya.inject.ConfigurationInjection;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.cglib.core.ReflectUtils;
+import org.springframework.cglib.proxy.Enhancer;
import org.springframework.stereotype.Component;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
/**
* PostProcessor that performs injection of configured values using Tamaya {@link ConfigurationInjection}.
*/
http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/7c071caf/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringConfig.java
----------------------------------------------------------------------
diff --git a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringConfig.java b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringConfig.java
index cacab20..7c9966b 100644
--- a/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringConfig.java
+++ b/modules/spring/src/main/java/org/apache/tamaya/integration/spring/TamayaSpringConfig.java
@@ -53,4 +53,9 @@ public class TamayaSpringConfig {
cfgBean.setPropertySources(sources);
return cfgBean;
}
+
+ @Bean
+ public static SpringConfigInjectionPostProcessor tamayaConfigPostProcessor(){
+ return new SpringConfigInjectionPostProcessor();
+ }
}
\ No newline at end of file