|
@@ -33,6 +33,7 @@ import java.io.Writer;
|
|
|
import java.net.InetSocketAddress;
|
|
|
import java.net.URL;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
|
import java.util.Enumeration;
|
|
@@ -269,10 +270,18 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* This is to be used only by the developers in order to add deprecation of
|
|
|
* keys, and attempts to call this method after loading resources once,
|
|
|
* would lead to <tt>UnsupportedOperationException</tt>
|
|
|
+ *
|
|
|
+ * If a key is deprecated in favor of multiple keys, they are all treated as
|
|
|
+ * aliases of each other, and setting any one of them resets all the others
|
|
|
+ * to the new value.
|
|
|
+ *
|
|
|
* @param key
|
|
|
* @param newKeys
|
|
|
* @param customMessage
|
|
|
+ * @deprecated use {@link addDeprecation(String key, String newKey,
|
|
|
+ String customMessage)} instead
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public synchronized static void addDeprecation(String key, String[] newKeys,
|
|
|
String customMessage) {
|
|
|
if (key == null || key.length() == 0 ||
|
|
@@ -288,6 +297,22 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Adds the deprecated key to the deprecation map.
|
|
|
+ * It does not override any existing entries in the deprecation map.
|
|
|
+ * This is to be used only by the developers in order to add deprecation of
|
|
|
+ * keys, and attempts to call this method after loading resources once,
|
|
|
+ * would lead to <tt>UnsupportedOperationException</tt>
|
|
|
+ *
|
|
|
+ * @param key
|
|
|
+ * @param newKey
|
|
|
+ * @param customMessage
|
|
|
+ */
|
|
|
+ public synchronized static void addDeprecation(String key, String newKey,
|
|
|
+ String customMessage) {
|
|
|
+ addDeprecation(key, new String[] {newKey}, customMessage);
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Adds the deprecated key to the deprecation map when no custom message
|
|
@@ -297,13 +322,34 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* keys, and attempts to call this method after loading resources once,
|
|
|
* would lead to <tt>UnsupportedOperationException</tt>
|
|
|
*
|
|
|
+ * If a key is deprecated in favor of multiple keys, they are all treated as
|
|
|
+ * aliases of each other, and setting any one of them resets all the others
|
|
|
+ * to the new value.
|
|
|
+ *
|
|
|
* @param key Key that is to be deprecated
|
|
|
* @param newKeys list of keys that take up the values of deprecated key
|
|
|
+ * @deprecated use {@link addDeprecation(String key, String newKey)} instead
|
|
|
*/
|
|
|
+ @Deprecated
|
|
|
public synchronized static void addDeprecation(String key, String[] newKeys) {
|
|
|
addDeprecation(key, newKeys, null);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Adds the deprecated key to the deprecation map when no custom message
|
|
|
+ * is provided.
|
|
|
+ * It does not override any existing entries in the deprecation map.
|
|
|
+ * This is to be used only by the developers in order to add deprecation of
|
|
|
+ * keys, and attempts to call this method after loading resources once,
|
|
|
+ * would lead to <tt>UnsupportedOperationException</tt>
|
|
|
+ *
|
|
|
+ * @param key Key that is to be deprecated
|
|
|
+ * @param newKey key that takes up the value of deprecated key
|
|
|
+ */
|
|
|
+ public synchronized static void addDeprecation(String key, String newKey) {
|
|
|
+ addDeprecation(key, new String[] {newKey}, null);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* checks whether the given <code>key</code> is deprecated.
|
|
|
*
|
|
@@ -322,16 +368,26 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* @param name property name.
|
|
|
* @return alternate name.
|
|
|
*/
|
|
|
- private String getAlternateName(String name) {
|
|
|
- String altName;
|
|
|
+ private String[] getAlternateNames(String name) {
|
|
|
+ String oldName, altNames[] = null;
|
|
|
DeprecatedKeyInfo keyInfo = deprecatedKeyMap.get(name);
|
|
|
- if (keyInfo != null) {
|
|
|
- altName = (keyInfo.newKeys.length > 0) ? keyInfo.newKeys[0] : null;
|
|
|
- }
|
|
|
- else {
|
|
|
- altName = reverseDeprecatedKeyMap.get(name);
|
|
|
+ if (keyInfo == null) {
|
|
|
+ altNames = (reverseDeprecatedKeyMap.get(name) != null ) ?
|
|
|
+ new String [] {reverseDeprecatedKeyMap.get(name)} : null;
|
|
|
+ if(altNames != null && altNames.length > 0) {
|
|
|
+ //To help look for other new configs for this deprecated config
|
|
|
+ keyInfo = deprecatedKeyMap.get(altNames[0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(keyInfo != null && keyInfo.newKeys.length > 0) {
|
|
|
+ List<String> list = new ArrayList<String>();
|
|
|
+ if(altNames != null) {
|
|
|
+ list.addAll(Arrays.asList(altNames));
|
|
|
+ }
|
|
|
+ list.addAll(Arrays.asList(keyInfo.newKeys));
|
|
|
+ altNames = list.toArray(new String[list.size()]);
|
|
|
}
|
|
|
- return altName;
|
|
|
+ return altNames;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -346,24 +402,29 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* @return the first property in the list of properties mapping
|
|
|
* the <code>name</code> or the <code>name</code> itself.
|
|
|
*/
|
|
|
- private String handleDeprecation(String name) {
|
|
|
- if (isDeprecated(name)) {
|
|
|
+ private String[] handleDeprecation(String name) {
|
|
|
+ ArrayList<String > names = new ArrayList<String>();
|
|
|
+ if (isDeprecated(name)) {
|
|
|
DeprecatedKeyInfo keyInfo = deprecatedKeyMap.get(name);
|
|
|
warnOnceIfDeprecated(name);
|
|
|
for (String newKey : keyInfo.newKeys) {
|
|
|
if(newKey != null) {
|
|
|
- name = newKey;
|
|
|
- break;
|
|
|
+ names.add(newKey);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- String deprecatedKey = reverseDeprecatedKeyMap.get(name);
|
|
|
- if (deprecatedKey != null && !getOverlay().containsKey(name) &&
|
|
|
- getOverlay().containsKey(deprecatedKey)) {
|
|
|
- getProps().setProperty(name, getOverlay().getProperty(deprecatedKey));
|
|
|
- getOverlay().setProperty(name, getOverlay().getProperty(deprecatedKey));
|
|
|
+ if(names.size() == 0) {
|
|
|
+ names.add(name);
|
|
|
}
|
|
|
- return name;
|
|
|
+ for(String n : names) {
|
|
|
+ String deprecatedKey = reverseDeprecatedKeyMap.get(n);
|
|
|
+ if (deprecatedKey != null && !getOverlay().containsKey(n) &&
|
|
|
+ getOverlay().containsKey(deprecatedKey)) {
|
|
|
+ getProps().setProperty(n, getOverlay().getProperty(deprecatedKey));
|
|
|
+ getOverlay().setProperty(n, getOverlay().getProperty(deprecatedKey));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return names.toArray(new String[names.size()]);
|
|
|
}
|
|
|
|
|
|
private void handleDeprecation() {
|
|
@@ -595,8 +656,12 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* or null if no such property exists.
|
|
|
*/
|
|
|
public String get(String name) {
|
|
|
- name = handleDeprecation(name);
|
|
|
- return substituteVars(getProps().getProperty(name));
|
|
|
+ String[] names = handleDeprecation(name);
|
|
|
+ String result = null;
|
|
|
+ for(String n : names) {
|
|
|
+ result = substituteVars(getProps().getProperty(n));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -633,8 +698,12 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* its replacing property and null if no such property exists.
|
|
|
*/
|
|
|
public String getRaw(String name) {
|
|
|
- name = handleDeprecation(name);
|
|
|
- return getProps().getProperty(name);
|
|
|
+ String[] names = handleDeprecation(name);
|
|
|
+ String result = null;
|
|
|
+ for(String n : names) {
|
|
|
+ result = getProps().getProperty(n);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -652,10 +721,12 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
getOverlay().setProperty(name, value);
|
|
|
getProps().setProperty(name, value);
|
|
|
updatingResource.put(name, UNKNOWN_RESOURCE);
|
|
|
- String altName = getAlternateName(name);
|
|
|
- if (altName != null) {
|
|
|
- getOverlay().setProperty(altName, value);
|
|
|
- getProps().setProperty(altName, value);
|
|
|
+ String[] altNames = getAlternateNames(name);
|
|
|
+ if (altNames != null && altNames.length > 0) {
|
|
|
+ for(String altName : altNames) {
|
|
|
+ getOverlay().setProperty(altName, value);
|
|
|
+ getProps().setProperty(altName, value);
|
|
|
+ }
|
|
|
}
|
|
|
warnOnceIfDeprecated(name);
|
|
|
}
|
|
@@ -671,12 +742,14 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* Unset a previously set property.
|
|
|
*/
|
|
|
public synchronized void unset(String name) {
|
|
|
- String altName = getAlternateName(name);
|
|
|
+ String[] altNames = getAlternateNames(name);
|
|
|
getOverlay().remove(name);
|
|
|
getProps().remove(name);
|
|
|
- if (altName !=null) {
|
|
|
- getOverlay().remove(altName);
|
|
|
- getProps().remove(altName);
|
|
|
+ if (altNames !=null && altNames.length > 0) {
|
|
|
+ for(String altName : altNames) {
|
|
|
+ getOverlay().remove(altName);
|
|
|
+ getProps().remove(altName);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -711,8 +784,12 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
* doesn't exist.
|
|
|
*/
|
|
|
public String get(String name, String defaultValue) {
|
|
|
- name = handleDeprecation(name);
|
|
|
- return substituteVars(getProps().getProperty(name, defaultValue));
|
|
|
+ String[] names = handleDeprecation(name);
|
|
|
+ String result = null;
|
|
|
+ for(String n : names) {
|
|
|
+ result = substituteVars(getProps().getProperty(n, defaultValue));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1236,6 +1313,29 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|
|
final String address = get(name, defaultAddress);
|
|
|
return NetUtils.createSocketAddr(address, defaultPort, name);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Set the socket address for the <code>name</code> property as
|
|
|
+ * a <code>host:port</code>.
|
|
|
+ */
|
|
|
+ public void setSocketAddr(String name, InetSocketAddress addr) {
|
|
|
+ set(name, NetUtils.getHostPortString(addr));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Set the socket address a client can use to connect for the
|
|
|
+ * <code>name</code> property as a <code>host:port</code>. The wildcard
|
|
|
+ * address is replaced with the local host's address.
|
|
|
+ * @param name property name.
|
|
|
+ * @param addr InetSocketAddress of a listener to store in the given property
|
|
|
+ * @return InetSocketAddress for clients to connect
|
|
|
+ */
|
|
|
+ public InetSocketAddress updateConnectAddr(String name,
|
|
|
+ InetSocketAddress addr) {
|
|
|
+ final InetSocketAddress connectAddr = NetUtils.getConnectAddress(addr);
|
|
|
+ setSocketAddr(name, connectAddr);
|
|
|
+ return connectAddr;
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Load a class by name.
|