in core/container/src/main/java/org/wildfly/swarm/container/runtime/ConfigurableManager.java [323:387]
protected void scan(ConfigKey prefix, Object instance, Class<?> curClass, boolean implicit) throws Exception {
if (curClass == null || curClass == Object.class || isBlacklisted(curClass)) {
return;
}
Field[] fields = curClass.getDeclaredFields();
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
if (isBlacklisted(field)) {
continue;
}
if (implicit || field.getAnnotation(Configurable.class) != null || field.getAnnotation(Configurables.class) != null) {
if (isConfigurableType(field.getType())) {
List<ConfigKey> names = namesFor(prefix, field);
boolean configured = false;
for (ConfigKey name : names) {
if (!seen(name)) {
ConfigurableHandle configurable = new ObjectBackedConfigurableHandle(name, instance, field);
this.configurables.add(configurable);
configured = configure(configurable);
}
if (configured) {
break;
}
}
}
}
}
}
if (!rescanning) {
Method[] methods = curClass.getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Configurable.class)) {
ConfigKey subPrefix = prefix.append(nameFor(method));
if (method.getParameterCount() == 1) {
// If doesn't exist, only create it if there's some
// configuration keys that imply we want it.
if (this.configView.hasKeyOrSubkeys(subPrefix)) {
Object lambda = createLambda(subPrefix, method);
if (lambda != null) {
method.invoke(instance, lambda);
}
}
} else if (method.getParameterCount() == 2) {
List<SimpleKey> keysWithConfiguration = this.configView.simpleSubkeys(subPrefix);
if (!keysWithConfiguration.isEmpty()) {
for (SimpleKey key : keysWithConfiguration) {
ConfigKey itemPrefix = subPrefix.append(key);
Object lambda = createLambda(itemPrefix, method);
if (lambda != null) {
method.invoke(instance, key.name(), lambda);
}
}
}
}
}
}
}
scan(prefix, instance, curClass.getSuperclass(), implicit);
}