Copyright 2014 Netflix, Inc. 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.
/** * Copyright 2014 Netflix, Inc. * * 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.netflix.config; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException;
This class delegates property read/write to an another configuration but is also attached with a dynamic configuration source and polling scheduler so that its properties can be changed dynamically at runtime. In other words, if the same property is defined in both the original configuration and the dynamic configuration source, the value in the original configuration will be overridden.

This class can be served as a decorator to an existing configuration to make the property values dynamic.

Author:awang
/** * This class delegates property read/write to an another configuration but is also attached with * a dynamic configuration source and polling scheduler so that its properties can be changed dynamically * at runtime. In other words, if the same property is defined in both the original configuration * and the dynamic configuration source, the value in the original configuration will be overridden. * <p> * This class can be served as a decorator to an existing configuration to make the property values * dynamic. * * @author awang * */
public class ConfigurationWithPollingSource implements Configuration { private final Configuration config; private final AbstractPollingScheduler scheduler;
Create an instance and start polling the configuration source
Params:
  • config – Configuration to delegate to
  • source – PolledConfigurationSource to poll get new/changed properties
  • scheduler – AbstractPollingScheduler to provide the polling schedule
/** * Create an instance and start polling the configuration source * * @param config Configuration to delegate to * @param source {@link PolledConfigurationSource} to poll get new/changed properties * @param scheduler AbstractPollingScheduler to provide the polling schedule */
public ConfigurationWithPollingSource(Configuration config, PolledConfigurationSource source, AbstractPollingScheduler scheduler) { this.config = config; this.scheduler = scheduler; scheduler.startPolling(source, this); } public final Configuration getConfiguration() { return config; } public final void stopPolling() { scheduler.stop(); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public void addProperty(String key, Object value) { config.addProperty(key, value); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public void clear() { config.clear(); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public void clearProperty(String key) { config.clearProperty(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public boolean containsKey(String arg0) { return config.containsKey(arg0); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) { return config.getBigDecimal(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public BigDecimal getBigDecimal(String key) { return config.getBigDecimal(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public BigInteger getBigInteger(String key, BigInteger defaultValue) { return config.getBigInteger(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public BigInteger getBigInteger(String key) { return config.getBigInteger(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public boolean getBoolean(String key, boolean defaultValue) { return config.getBoolean(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Boolean getBoolean(String key, Boolean defaultValue) { return config.getBoolean(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public boolean getBoolean(String key) { return config.getBoolean(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public byte getByte(String key, byte defaultValue) { return config.getByte(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Byte getByte(String key, Byte defaultValue) { return config.getByte(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public byte getByte(String key) { return config.getByte(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public double getDouble(String key, double defaultValue) { return config.getDouble(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Double getDouble(String key, Double defaultValue) { return config.getDouble(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public double getDouble(String key) { return config.getDouble(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public float getFloat(String key, float defaultValue) { return config.getFloat(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Float getFloat(String key, Float defaultValue) { return config.getFloat(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public float getFloat(String key) { return config.getFloat(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public int getInt(String key, int defaultValue) { return config.getInt(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public int getInt(String key) { return config.getInt(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Integer getInteger(String key, Integer defaultValue) { return config.getInteger(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Iterator getKeys() { return config.getKeys(); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Iterator getKeys(String prefix) { return config.getKeys(prefix); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public List getList(String key, List defaultValue) { return config.getList(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public List getList(String key) { return config.getList(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public long getLong(String key, long defaultValue) { return config.getLong(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Long getLong(String key, Long defaultValue) { return config.getLong(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public long getLong(String key) { return config.getLong(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Properties getProperties(String key) { return config.getProperties(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Object getProperty(String arg0) { return config.getProperty(arg0); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public short getShort(String key, short defaultValue) { return config.getShort(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Short getShort(String key, Short defaultValue) { return config.getShort(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public short getShort(String key) { return config.getShort(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public String getString(String key, String defaultValue) { return config.getString(key, defaultValue); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public String getString(String key) { return config.getString(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public String[] getStringArray(String key) { return config.getStringArray(key); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public boolean isEmpty() { return config.isEmpty(); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public void setProperty(String key, Object value) { config.setProperty(key, value); }
Delegates to the underlying configuration.
/** * Delegates to the underlying configuration. */
@Override public Configuration subset(String prefix) { return config.subset(prefix); } }