public void load()

in core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/ClassPathScanImplementationLookup.java [114:244]


    public void load() {
        classNames = new HashMap<>();
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
        ImplementationTypesHolder.getInstance().getValues().forEach((typeName, typeInterface) -> {
            classNames.put(typeName, new HashSet<>());
            try {
                scanner.addIncludeFilter(new AssignableTypeFilter(
                        ClassUtils.resolveClassName(typeInterface, ClassUtils.getDefaultClassLoader())));
            } catch (IllegalArgumentException e) {
                LOG.error("Could not find class, ignoring...", e);
            }
        });

        Map<String, String> extImplTypes = ImplementationTypesHolder.getInstance().getValues().entrySet().stream().
                filter(e -> !IdRepoImplementationType.values().containsKey(e.getKey())
                && !IdMImplementationType.values().containsKey(e.getKey())).
                collect(Collectors.toMap(Entry::getKey, Entry::getValue));

        reportJobDelegateClasses = new HashMap<>();
        accountRuleClasses = new HashMap<>();
        passwordRuleClasses = new HashMap<>();
        inboundCRClasses = new HashMap<>();
        pushCRClasses = new HashMap<>();

        for (BeanDefinition bd : scanner.findCandidateComponents(getBasePackage())) {
            try {
                Class<?> clazz = ClassUtils.resolveClassName(
                        Objects.requireNonNull(bd.getBeanClassName()), ClassUtils.getDefaultClassLoader());
                if (Modifier.isAbstract(clazz.getModifiers())) {
                    continue;
                }

                if (AccountRule.class.isAssignableFrom(clazz)) {
                    AccountRuleConfClass annotation = clazz.getAnnotation(AccountRuleConfClass.class);
                    if (annotation == null) {
                        LOG.warn("Found account policy rule {} without declared configuration", clazz.getName());
                    } else {
                        classNames.get(IdRepoImplementationType.ACCOUNT_RULE).add(clazz.getName());
                        accountRuleClasses.put(annotation.value(), (Class<? extends AccountRule>) clazz);
                    }
                } else if (PasswordRule.class.isAssignableFrom(clazz)) {
                    PasswordRuleConfClass annotation = clazz.getAnnotation(PasswordRuleConfClass.class);
                    if (annotation == null) {
                        LOG.warn("Found password policy rule {} without declared configuration", clazz.getName());
                    } else {
                        classNames.get(IdRepoImplementationType.PASSWORD_RULE).add(clazz.getName());
                        passwordRuleClasses.put(annotation.value(), (Class<? extends PasswordRule>) clazz);
                    }
                } else if (SchedTaskJobDelegate.class.isAssignableFrom(clazz)
                        && !PullJobDelegate.class.isAssignableFrom(clazz)
                        && !PushJobDelegate.class.isAssignableFrom(clazz)
                        && !GroupMemberProvisionTaskJobDelegate.class.isAssignableFrom(clazz)
                        && !MacroJobDelegate.class.isAssignableFrom(clazz)
                        && !LiveSyncJobDelegate.class.isAssignableFrom(clazz)) {

                    classNames.get(IdRepoImplementationType.TASKJOB_DELEGATE).add(bd.getBeanClassName());
                } else if (ReportJobDelegate.class.isAssignableFrom(clazz)) {
                    ReportConfClass annotation = clazz.getAnnotation(ReportConfClass.class);
                    if (annotation == null) {
                        LOG.warn("Found Report {} without declared configuration", clazz.getName());
                    } else {
                        classNames.get(IdRepoImplementationType.REPORT_DELEGATE).add(clazz.getName());
                        reportJobDelegateClasses.put(annotation.value(), (Class<? extends ReportJobDelegate>) clazz);
                    }
                } else if (LogicActions.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.LOGIC_ACTIONS).add(bd.getBeanClassName());
                } else if (MacroActions.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.MACRO_ACTIONS).add(bd.getBeanClassName());
                } else if (PlainAttrValueValidator.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.ATTR_VALUE_VALIDATOR).add(bd.getBeanClassName());
                } else if (DropdownValueProvider.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.DROPDOWN_VALUE_PROVIDER).add(bd.getBeanClassName());
                } else if (Command.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.COMMAND).add(bd.getBeanClassName());
                } else if (RecipientsProvider.class.isAssignableFrom(clazz)) {
                    classNames.get(IdRepoImplementationType.RECIPIENTS_PROVIDER).add(bd.getBeanClassName());
                } else if (ItemTransformer.class.isAssignableFrom(clazz)
                        && !clazz.equals(JEXLItemTransformerImpl.class)) {

                    classNames.get(IdRepoImplementationType.ITEM_TRANSFORMER).add(clazz.getName());
                } else if (ReconFilterBuilder.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.RECON_FILTER_BUILDER).add(bd.getBeanClassName());
                } else if (PropagationActions.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.PROPAGATION_ACTIONS).add(bd.getBeanClassName());
                } else if (InboundActions.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.INBOUND_ACTIONS).add(bd.getBeanClassName());
                } else if (PushActions.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.PUSH_ACTIONS).add(bd.getBeanClassName());
                } else if (InboundCorrelationRule.class.isAssignableFrom(clazz)) {
                    InboundCorrelationRuleConfClass annotation = clazz.getAnnotation(
                            InboundCorrelationRuleConfClass.class);
                    if (annotation == null) {
                        LOG.warn("Found pull correlation rule {} without declared configuration", clazz.getName());
                    } else {
                        classNames.get(IdMImplementationType.INBOUND_CORRELATION_RULE).add(clazz.getName());
                        inboundCRClasses.put(annotation.value(), (Class<? extends InboundCorrelationRule>) clazz);
                    }
                } else if (PushCorrelationRule.class.isAssignableFrom(clazz)) {
                    PushCorrelationRuleConfClass annotation = clazz.getAnnotation(PushCorrelationRuleConfClass.class);
                    if (annotation == null) {
                        LOG.warn("Found push correlation rule {} without declared configuration", clazz.getName());
                    } else {
                        classNames.get(IdMImplementationType.PUSH_CORRELATION_RULE).add(clazz.getName());
                        pushCRClasses.put(annotation.value(), (Class<? extends PushCorrelationRule>) clazz);
                    }
                } else if (ProvisionSorter.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.PROVISION_SORTER).add(bd.getBeanClassName());
                } else if (LiveSyncDeltaMapper.class.isAssignableFrom(clazz)) {
                    classNames.get(IdMImplementationType.LIVE_SYNC_DELTA_MAPPER).add(bd.getBeanClassName());
                } else {
                    extImplTypes.forEach((typeName, typeInterface) -> {
                        Class<?> tic = ClassUtils.resolveClassName(typeInterface, ClassUtils.getDefaultClassLoader());
                        if (tic.isAssignableFrom(clazz)) {
                            classNames.get(typeName).add(bd.getBeanClassName());
                        }
                    });
                }
            } catch (Throwable t) {
                LOG.warn("Could not inspect class {}", bd.getBeanClassName(), t);
            }
        }

        classNames = Collections.unmodifiableMap(classNames);
        LOG.debug("Implementation classes found: {}", classNames);

        reportJobDelegateClasses = Collections.unmodifiableMap(reportJobDelegateClasses);
        accountRuleClasses = Collections.unmodifiableMap(accountRuleClasses);
        passwordRuleClasses = Collections.unmodifiableMap(passwordRuleClasses);
        inboundCRClasses = Collections.unmodifiableMap(inboundCRClasses);
        pushCRClasses = Collections.unmodifiableMap(pushCRClasses);
    }