protected void scan()

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);
    }