@@ -186,6 +186,7 @@ protected List<Realm> initRealms() throws Exception {
186
186
List <Realm > realms = new ArrayList <>();
187
187
List <String > kerberosRealmNames = new ArrayList <>();
188
188
Map <String , Set <String >> nameToRealmIdentifier = new HashMap <>();
189
+ Map <Integer , Set <String >> orderToRealmName = new HashMap <>();
189
190
for (RealmConfig .RealmIdentifier identifier : realmsSettings .keySet ()) {
190
191
Realm .Factory factory = factories .get (identifier .getType ());
191
192
if (factory == null ) {
@@ -218,9 +219,13 @@ protected List<Realm> initRealms() throws Exception {
218
219
Realm realm = factory .create (config );
219
220
nameToRealmIdentifier .computeIfAbsent (realm .name (), k ->
220
221
new HashSet <>()).add (RealmSettings .realmSettingPrefix (realm .type ()) + realm .name ());
222
+ orderToRealmName .computeIfAbsent (realm .order (), k -> new HashSet <>())
223
+ .add (realm .name ());
221
224
realms .add (realm );
222
225
}
223
226
227
+ checkUniqueOrders (orderToRealmName );
228
+
224
229
if (!realms .isEmpty ()) {
225
230
Collections .sort (realms );
226
231
} else {
@@ -305,15 +310,34 @@ public void usageStats(ActionListener<Map<String, Object>> listener) {
305
310
private void addNativeRealms (List <Realm > realms ) throws Exception {
306
311
Realm .Factory fileRealm = factories .get (FileRealmSettings .TYPE );
307
312
if (fileRealm != null ) {
313
+ var realmIdentifier = new RealmConfig .RealmIdentifier (FileRealmSettings .TYPE , "default_" + FileRealmSettings .TYPE );
308
314
realms .add (fileRealm .create (new RealmConfig (
309
- new RealmConfig .RealmIdentifier (FileRealmSettings .TYPE , "default_" + FileRealmSettings .TYPE ),
310
- settings , env , threadContext )));
315
+ realmIdentifier ,
316
+ ensureOrderSetting (settings , realmIdentifier , Integer .MIN_VALUE + 1 ),
317
+ env , threadContext )));
311
318
}
312
319
Realm .Factory indexRealmFactory = factories .get (NativeRealmSettings .TYPE );
313
320
if (indexRealmFactory != null ) {
321
+ var realmIdentifier = new RealmConfig .RealmIdentifier (NativeRealmSettings .TYPE , "default_" + NativeRealmSettings .TYPE );
314
322
realms .add (indexRealmFactory .create (new RealmConfig (
315
- new RealmConfig .RealmIdentifier (NativeRealmSettings .TYPE , "default_" + NativeRealmSettings .TYPE ),
316
- settings , env , threadContext )));
323
+ realmIdentifier ,
324
+ ensureOrderSetting (settings , realmIdentifier , Integer .MIN_VALUE + 2 ),
325
+ env , threadContext )));
326
+ }
327
+ }
328
+
329
+ private Settings ensureOrderSetting (Settings settings , RealmConfig .RealmIdentifier realmIdentifier , int order ) {
330
+ String orderSettingKey = RealmSettings .realmSettingPrefix (realmIdentifier ) + "order" ;
331
+ return Settings .builder ().put (settings ).put (orderSettingKey , order ).build ();
332
+ }
333
+
334
+ private void checkUniqueOrders (Map <Integer , Set <String >> orderToRealmName ) {
335
+ String duplicateOrders = orderToRealmName .entrySet ().stream ()
336
+ .filter (entry -> entry .getValue ().size () > 1 )
337
+ .map (entry -> entry .getKey () + ": " + entry .getValue ())
338
+ .collect (Collectors .joining ("; " ));
339
+ if (Strings .hasText (duplicateOrders )) {
340
+ throw new IllegalArgumentException ("Found multiple realms configured with the same order: " + duplicateOrders );
317
341
}
318
342
}
319
343
0 commit comments