@@ -366,12 +366,25 @@ public T getDefault(Settings settings) {
366366 }
367367
368368 /**
369- * Returns <code>true</code> iff this setting is present in the given settings object. Otherwise <code>false</code>
369+ * Returns true if and only if this setting is present in the given settings instance. Note that fallback settings are excluded.
370+ *
371+ * @param settings the settings
372+ * @return true if the setting is present in the given settings instance, otherwise false
370373 */
371- public boolean exists (Settings settings ) {
374+ public boolean exists (final Settings settings ) {
372375 return settings .keySet ().contains (getKey ());
373376 }
374377
378+ /**
379+ * Returns true if and only if this setting including fallback settings is present in the given settings instance.
380+ *
381+ * @param settings the settings
382+ * @return true if the setting including fallback settings is present in the given settings instance, otherwise false
383+ */
384+ public boolean existsOrFallbackExists (final Settings settings ) {
385+ return settings .keySet ().contains (getKey ()) || (fallbackSetting != null && fallbackSetting .existsOrFallbackExists (settings ));
386+ }
387+
375388 /**
376389 * Returns the settings value. If the setting is not present in the given settings object the default value is returned
377390 * instead.
@@ -511,7 +524,7 @@ public Setting<T> getConcreteSetting(String key) {
511524 * Returns a set of settings that are required at validation time. Unless all of the dependencies are present in the settings
512525 * object validation of setting must fail.
513526 */
514- public Set <String > getSettingsDependencies (String key ) {
527+ public Set <Setting <?> > getSettingsDependencies (String key ) {
515528 return Collections .emptySet ();
516529 }
517530
@@ -634,12 +647,12 @@ private Stream<String> matchStream(Settings settings) {
634647 return settings .keySet ().stream ().filter (this ::match ).map (key ::getConcreteString );
635648 }
636649
637- public Set <String > getSettingsDependencies (String settingsKey ) {
650+ public Set <Setting <?> > getSettingsDependencies (String settingsKey ) {
638651 if (dependencies .isEmpty ()) {
639652 return Collections .emptySet ();
640653 } else {
641654 String namespace = key .getNamespace (settingsKey );
642- return dependencies .stream ().map (s -> s . key . toConcreteKey (namespace ). key ).collect (Collectors .toSet ());
655+ return dependencies .stream ().map (s -> ( Setting <?>) s . getConcreteSettingForNamespace (namespace )).collect (Collectors .toSet ());
643656 }
644657 }
645658
@@ -914,40 +927,6 @@ public String toString() {
914927 }
915928 }
916929
917- private static class ListSetting <T > extends Setting <List <T >> {
918- private final Function <Settings , List <String >> defaultStringValue ;
919-
920- private ListSetting (String key , Function <Settings , List <String >> defaultStringValue , Function <String , List <T >> parser ,
921- Property ... properties ) {
922- super (new ListKey (key ), (s ) -> Setting .arrayToParsableString (defaultStringValue .apply (s )), parser ,
923- properties );
924- this .defaultStringValue = defaultStringValue ;
925- }
926-
927- @ Override
928- String innerGetRaw (final Settings settings ) {
929- List <String > array = settings .getAsList (getKey (), null );
930- return array == null ? defaultValue .apply (settings ) : arrayToParsableString (array );
931- }
932-
933- @ Override
934- boolean hasComplexMatcher () {
935- return true ;
936- }
937-
938- @ Override
939- public void diff (Settings .Builder builder , Settings source , Settings defaultSettings ) {
940- if (exists (source ) == false ) {
941- List <String > asList = defaultSettings .getAsList (getKey (), null );
942- if (asList == null ) {
943- builder .putList (getKey (), defaultStringValue .apply (defaultSettings ));
944- } else {
945- builder .putList (getKey (), asList );
946- }
947- }
948- }
949- }
950-
951930 private final class Updater implements AbstractScopedSettings .SettingUpdater <T > {
952931 private final Consumer <T > consumer ;
953932 private final Logger logger ;
@@ -1209,26 +1188,44 @@ public static Setting<ByteSizeValue> memorySizeSetting(String key, String defaul
12091188 return new Setting <>(key , (s ) -> defaultPercentage , (s ) -> MemorySizeValue .parseBytesSizeValueOrHeapRatio (s , key ), properties );
12101189 }
12111190
1212- public static <T > Setting <List <T >> listSetting (String key , List <String > defaultStringValue , Function <String , T > singleValueParser ,
1213- Property ... properties ) {
1214- return listSetting (key , (s ) -> defaultStringValue , singleValueParser , properties );
1191+ public static <T > Setting <List <T >> listSetting (
1192+ final String key ,
1193+ final List <String > defaultStringValue ,
1194+ final Function <String , T > singleValueParser ,
1195+ final Property ... properties ) {
1196+ return listSetting (key , null , singleValueParser , (s ) -> defaultStringValue , properties );
12151197 }
12161198
12171199 // TODO this one's two argument get is still broken
1218- public static <T > Setting <List <T >> listSetting (String key , Setting <List <T >> fallbackSetting , Function <String , T > singleValueParser ,
1219- Property ... properties ) {
1220- return listSetting (key , (s ) -> parseableStringToList (fallbackSetting .getRaw (s )), singleValueParser , properties );
1200+ public static <T > Setting <List <T >> listSetting (
1201+ final String key ,
1202+ final Setting <List <T >> fallbackSetting ,
1203+ final Function <String , T > singleValueParser ,
1204+ final Property ... properties ) {
1205+ return listSetting (key , fallbackSetting , singleValueParser , (s ) -> parseableStringToList (fallbackSetting .getRaw (s )), properties );
1206+ }
1207+
1208+ public static <T > Setting <List <T >> listSetting (
1209+ final String key ,
1210+ final Function <String , T > singleValueParser ,
1211+ final Function <Settings , List <String >> defaultStringValue ,
1212+ final Property ... properties ) {
1213+ return listSetting (key , null , singleValueParser , defaultStringValue , properties );
12211214 }
12221215
1223- public static <T > Setting <List <T >> listSetting (String key , Function <Settings , List <String >> defaultStringValue ,
1224- Function <String , T > singleValueParser , Property ... properties ) {
1216+ public static <T > Setting <List <T >> listSetting (
1217+ final String key ,
1218+ final @ Nullable Setting <List <T >> fallbackSetting ,
1219+ final Function <String , T > singleValueParser ,
1220+ final Function <Settings , List <String >> defaultStringValue ,
1221+ final Property ... properties ) {
12251222 if (defaultStringValue .apply (Settings .EMPTY ) == null ) {
12261223 throw new IllegalArgumentException ("default value function must not return null" );
12271224 }
12281225 Function <String , List <T >> parser = (s ) ->
12291226 parseableStringToList (s ).stream ().map (singleValueParser ).collect (Collectors .toList ());
12301227
1231- return new ListSetting <>(key , defaultStringValue , parser , properties );
1228+ return new ListSetting <>(key , fallbackSetting , defaultStringValue , parser , properties );
12321229 }
12331230
12341231 private static List <String > parseableStringToList (String parsableString ) {
@@ -1266,6 +1263,51 @@ private static String arrayToParsableString(List<String> array) {
12661263 }
12671264 }
12681265
1266+ private static class ListSetting <T > extends Setting <List <T >> {
1267+
1268+ private final Function <Settings , List <String >> defaultStringValue ;
1269+
1270+ private ListSetting (
1271+ final String key ,
1272+ final @ Nullable Setting <List <T >> fallbackSetting ,
1273+ final Function <Settings , List <String >> defaultStringValue ,
1274+ final Function <String , List <T >> parser ,
1275+ final Property ... properties ) {
1276+ super (
1277+ new ListKey (key ),
1278+ fallbackSetting ,
1279+ (s ) -> Setting .arrayToParsableString (defaultStringValue .apply (s )),
1280+ parser ,
1281+ (v ,s ) -> {},
1282+ properties );
1283+ this .defaultStringValue = defaultStringValue ;
1284+ }
1285+
1286+ @ Override
1287+ String innerGetRaw (final Settings settings ) {
1288+ List <String > array = settings .getAsList (getKey (), null );
1289+ return array == null ? defaultValue .apply (settings ) : arrayToParsableString (array );
1290+ }
1291+
1292+ @ Override
1293+ boolean hasComplexMatcher () {
1294+ return true ;
1295+ }
1296+
1297+ @ Override
1298+ public void diff (Settings .Builder builder , Settings source , Settings defaultSettings ) {
1299+ if (exists (source ) == false ) {
1300+ List <String > asList = defaultSettings .getAsList (getKey (), null );
1301+ if (asList == null ) {
1302+ builder .putList (getKey (), defaultStringValue .apply (defaultSettings ));
1303+ } else {
1304+ builder .putList (getKey (), asList );
1305+ }
1306+ }
1307+ }
1308+
1309+ }
1310+
12691311 static void logSettingUpdate (Setting setting , Settings current , Settings previous , Logger logger ) {
12701312 if (logger .isInfoEnabled ()) {
12711313 if (setting .isFiltered ()) {
0 commit comments