/*
* Copyright 2014 Avanza Bank AB
*
* 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 com.avanza.astrix.config;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Map backed {@link DynamicConfigSource} useful in testing. <p>
*
* @author Elias Lindholm (elilin)
*
*/
public class MapConfigSource extends AbstractDynamicConfigSource implements MutableConfigSource {
private final ConcurrentMap<String, ListenableStringProperty> propertyValues = new ConcurrentHashMap<>();
@Override
public String get(String propertyName, DynamicPropertyListener<String> propertyChangeListener) {
ListenableStringProperty dynamicProperty = getProperty(propertyName);
dynamicProperty.listeners.add(propertyChangeListener);
return dynamicProperty.value;
}
public void set(String propertyName, String value) {
getProperty(propertyName).set(value);
}
@Override
public <T> void set(Setting<T> setting, T value) {
String stringRepresentation = value != null ? value.toString() : null;
getProperty(setting.name()).set(stringRepresentation);
}
@Override
public void set(LongSetting setting, long value) {
getProperty(setting.name()).set(Long.toString(value));
}
@Override
public void set(BooleanSetting setting, boolean value) {
getProperty(setting.name()).set(Boolean.toString(value));
}
private ListenableStringProperty getProperty(String propertyName) {
ListenableStringProperty result = propertyValues.get(propertyName);
if (result != null) {
return result;
}
propertyValues.putIfAbsent(propertyName, new ListenableStringProperty());
return propertyValues.get(propertyName);
}
public void setAll(MapConfigSource config) {
for (Map.Entry<String, ListenableStringProperty> entry : config.propertyValues.entrySet()) {
set(entry.getKey(), entry.getValue().value);
}
}
@Override
public String toString() {
return this.propertyValues.toString();
}
private static class ListenableStringProperty {
final List<DynamicPropertyListener<String>> listeners = new CopyOnWriteArrayList<>();
volatile String value;
void propertyChanged(String newValue) {
for (DynamicPropertyListener<String> l : listeners) {
l.propertyChanged(newValue);
}
}
void set(String value) {
this.value = value;
propertyChanged(value);
}
@Override
public String toString() {
return value;
}
}
}