You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by st...@apache.org on 2018/05/08 14:37:16 UTC
svn commit: r1831191 - in
/geronimo/components/config/branches/ConfigJSR/impl: ./
src/main/java/org/apache/geronimo/config/
src/main/java/org/apache/geronimo/config/configsource/
Author: struberg
Date: Tue May 8 14:37:16 2018
New Revision: 1831191
URL: http://svn.apache.org/viewvc?rev=1831191&view=rev
Log:
implement ConfigValue and lastChanged behaviour
Modified:
geronimo/components/config/branches/ConfigJSR/impl/debug-suite.xml
geronimo/components/config/branches/ConfigJSR/impl/pom.xml
geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigImpl.java
geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigValueImpl.java
geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/configsource/SystemEnvConfigSource.java
Modified: geronimo/components/config/branches/ConfigJSR/impl/debug-suite.xml
URL: http://svn.apache.org/viewvc/geronimo/components/config/branches/ConfigJSR/impl/debug-suite.xml?rev=1831191&r1=1831190&r2=1831191&view=diff
==============================================================================
--- geronimo/components/config/branches/ConfigJSR/impl/debug-suite.xml (original)
+++ geronimo/components/config/branches/ConfigJSR/impl/debug-suite.xml Tue May 8 14:37:16 2018
@@ -23,7 +23,7 @@
<classes>
<!-- Issues in the spec -->
- <class name="org.eclipse.configjsr.CustomConfigSourceTest">
+ <class name="org.eclipse.configjsr.ConfigValueTest">
<methods>
<include name=".*"/>
</methods>
Modified: geronimo/components/config/branches/ConfigJSR/impl/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/components/config/branches/ConfigJSR/impl/pom.xml?rev=1831191&r1=1831190&r2=1831191&view=diff
==============================================================================
--- geronimo/components/config/branches/ConfigJSR/impl/pom.xml (original)
+++ geronimo/components/config/branches/ConfigJSR/impl/pom.xml Tue May 8 14:37:16 2018
@@ -98,6 +98,10 @@
<HISTTIMEFORMAT>value-for-tck-since-we-ignore-empty</HISTTIMEFORMAT>
<INSTANCE>value-for-tck-since-we-ignore-empty</INSTANCE>
<UPSTART_INSTANCE>value-for-tck-since-we-ignore-empty</UPSTART_INSTANCE>
+ <envconfig_my_int_property>45</envconfig_my_int_property>
+ <ENVCONFIG_MY_BOOLEAN_PROPERTY>true</ENVCONFIG_MY_BOOLEAN_PROPERTY>
+ <ENVCONFIG_MY_STRING_PROPERTY>woohoo</ENVCONFIG_MY_STRING_PROPERTY>
+ <envconfig_my_string_property>haha</envconfig_my_string_property>
</environmentVariables>
<systemPropertyVariables>
<!-- TCKs assume it but this is not really a good option for prod -->
Modified: geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigImpl.java
URL: http://svn.apache.org/viewvc/geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigImpl.java?rev=1831191&r1=1831190&r2=1831191&view=diff
==============================================================================
--- geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigImpl.java (original)
+++ geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigImpl.java Tue May 8 14:37:16 2018
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -42,6 +43,8 @@ import org.apache.geronimo.config.conver
import org.apache.geronimo.config.converters.StringConverter;
import org.apache.geronimo.config.converters.URLConverter;
import javax.config.Config;
+import javax.config.ConfigSnapshot;
+import javax.config.ConfigValue;
import javax.config.spi.ConfigSource;
import javax.config.spi.Converter;
@@ -62,6 +65,9 @@ public class ConfigImpl implements Confi
protected Map<Type, Converter> converters = new HashMap<>();
protected Map<Type, Converter> implicitConverters = new ConcurrentHashMap<>();
+ // volatile to a.) make the read/write behave atomic and b.) guarantee multi-thread safety
+ private volatile long lastChanged = 0;
+
public ConfigImpl() {
registerDefaultConverter();
@@ -97,6 +103,30 @@ public class ConfigImpl implements Confi
}
@Override
+ public ConfigSnapshot snapshotFor(ConfigValue<?>... configValues) {
+ // we implement kind of optimistic Locking
+ // Means we try multiple time to resolve all the given values
+ // until the config didn't change inbetween.
+ for (int tries = 1; tries < 5; tries++)
+ {
+ Map<ConfigValue<?>, Object> resolved = new HashMap<>();
+ long startReadLastChanged = lastChanged;
+ for (ConfigValue configValue : configValues)
+ {
+ resolved.put(configValue, configValue.getValue());
+ }
+
+ if (startReadLastChanged == lastChanged)
+ {
+ return new ConfigSnapshotImpl(resolved);
+ }
+ }
+
+ throw new IllegalStateException(
+ "Could not resolve ConfigTransaction as underlying values are permanently changing!");
+ }
+
+ @Override
public <T> T getValue(String propertyName, Class<T> propertyType) {
String value = getValue(propertyName);
if (value == null) {
@@ -188,7 +218,10 @@ public class ConfigImpl implements Confi
public synchronized void addConfigSources(List<ConfigSource> configSourcesToAdd) {
List<ConfigSource> allConfigSources = new ArrayList<>(configSources);
- allConfigSources.addAll(configSourcesToAdd);
+ for (ConfigSource configSource : configSourcesToAdd) {
+ configSource.setOnAttributeChange(this::onAttributeChange);
+ allConfigSources.add(configSource);
+ }
// finally put all the configSources back into the map
configSources = sortDescending(allConfigSources);
@@ -305,4 +338,20 @@ public class ConfigImpl implements Confi
return getTypeOfConverter(clazz.getSuperclass());
}
+ public void onAttributeChange(Set<String> attributesChanged)
+ {
+ // this is to force an incremented lastChanged even on time glitches and fast updates
+ long newLastChanged = System.nanoTime();
+ lastChanged = lastChanged >= newLastChanged ? lastChanged++ : newLastChanged;
+ }
+
+ /**
+ * @return the nanoTime when the last change got reported by a ConfigSource
+ */
+ public long getLastChanged()
+ {
+ return lastChanged;
+ }
+
+
}
\ No newline at end of file
Modified: geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigValueImpl.java
URL: http://svn.apache.org/viewvc/geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigValueImpl.java?rev=1831191&r1=1831190&r2=1831191&view=diff
==============================================================================
--- geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigValueImpl.java (original)
+++ geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/ConfigValueImpl.java Tue May 8 14:37:16 2018
@@ -52,8 +52,10 @@ public class ConfigValueImpl<T> implemen
private long cacheTimeNs = -1;
private volatile long reloadAfter = -1;
+ private long lastReloadedAt = -1;
+
private T lastValue = null;
- private ConfigChanged valueChangeListener;
+ //X will later get added again private ConfigChanged valueChangeListener;
private boolean isList;
private boolean isSet;
@@ -161,11 +163,13 @@ public class ConfigValueImpl<T> implemen
return Optional.ofNullable(get());
}
- @Override
+ //X will later get added again @Override
+ /*X
public ConfigValueImpl<T> onChange(ConfigChanged valueChangeListener) {
this.valueChangeListener = valueChangeListener;
return this;
}
+ */
//X @Override
public List<T> getValueList() {
@@ -242,23 +246,32 @@ public class ConfigValueImpl<T> implemen
now = System.nanoTime();
if (now <= reloadAfter)
{
- return lastValue;
+ // now check if anything in the underlying Config got changed
+ long lastCfgChange = config.getLastChanged();
+ if (lastCfgChange < lastReloadedAt)
+ {
+ return lastValue;
+ }
}
}
String valueStr = resolveStringValue();
T value = convert ? convert(valueStr) : (T) valueStr;
+ //X will later get added again
+ /*X
if (valueChangeListener != null && (value != null && !value.equals(lastValue) || (value == null && lastValue != null)) )
{
valueChangeListener.onValueChange(keyOriginal, lastValue, value);
}
+ */
lastValue = value;
if (cacheTimeNs > 0)
{
reloadAfter = now + cacheTimeNs;
+ lastReloadedAt = now;
}
return value;
Modified: geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/configsource/SystemEnvConfigSource.java
URL: http://svn.apache.org/viewvc/geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/configsource/SystemEnvConfigSource.java?rev=1831191&r1=1831190&r2=1831191&view=diff
==============================================================================
--- geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/configsource/SystemEnvConfigSource.java (original)
+++ geronimo/components/config/branches/ConfigJSR/impl/src/main/java/org/apache/geronimo/config/configsource/SystemEnvConfigSource.java Tue May 8 14:37:16 2018
@@ -58,9 +58,13 @@ public class SystemEnvConfigSource exten
public String getValue(String key) {
String val = configValues.get(key);
if (val == null) {
- val = configValues.get(key.replace('.', '_'));
+ key = key.replace('.', '_');
+ val = configValues.get(key);
+ }
+ if (val == null) {
+ key = key.toUpperCase();
+ val = configValues.get(key);
}
-
return val;
}
}