in core/container/src/main/java/org/wildfly/swarm/container/runtime/ConfigurableManager.java [521:594]
protected void scanSubresources(ConfigKey prefix, Object instance) throws Exception {
Method method = getSubresourcesMethod(instance);
if (method == null) {
return;
}
Object subresources = method.invoke(instance);
Field[] fields = subresources.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getAnnotation(SubresourceInfo.class) == null && List.class.isAssignableFrom(field.getType())) {
continue;
}
field.setAccessible(true);
Object value = field.get(subresources);
ConfigKey subPrefix = prefix.append(nameFor(field));
if (seen(subPrefix)) {
continue;
}
if (value != null && value instanceof List) {
int index = 0;
Set<SimpleKey> seenKeys = new HashSet<>();
for (Object each : ((List) value)) {
SimpleKey key = getKey(each);
ConfigKey itemPrefix = null;
if (key != null) {
seenKeys.add(key);
itemPrefix = subPrefix.append(key);
} else {
itemPrefix = subPrefix.append("" + index);
}
scan(itemPrefix, each, true);
++index;
}
List<SimpleKey> keysWithConfiguration = this.configView.simpleSubkeys(subPrefix);
keysWithConfiguration.removeAll(seenKeys);
if (!keysWithConfiguration.isEmpty()) {
Method factoryMethod = getKeyedFactoryMethod(instance, field);
if (factoryMethod != null) {
for (SimpleKey key : keysWithConfiguration) {
ConfigKey itemPrefix = subPrefix.append(key);
Object lambda = createLambda(itemPrefix, factoryMethod);
if (lambda != null) {
factoryMethod.invoke(instance, key.name(), lambda);
}
}
}
}
} else {
// Singleton resources, without key
if (value == null) {
// If doesn't exist, only create it if there's some
// configuration keys that imply we want it.
if (this.configView.hasKeyOrSubkeys(subPrefix)) {
Method factoryMethod = getNonKeyedFactoryMethod(instance, field);
if (factoryMethod != null) {
Object lambda = createLambda(subPrefix, factoryMethod);
if (lambda != null) {
factoryMethod.invoke(instance, lambda);
}
}
}
} else {
scan(subPrefix, value, true);
}
}
}
}