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