blob: 6ef2cdfbc2c0198970f34555c973141349068639 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.core.logic;
import jakarta.validation.Validator;
import java.util.ArrayList;
import java.util.List;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
import org.apache.syncope.common.lib.types.AuditLoggerName;
import org.apache.syncope.core.logic.audit.AuditAppender;
import org.apache.syncope.core.logic.audit.JdbcAuditAppender;
import org.apache.syncope.core.logic.init.AuditAccessor;
import org.apache.syncope.core.logic.init.AuditLoader;
import org.apache.syncope.core.logic.init.ClassPathScanImplementationLookup;
import org.apache.syncope.core.logic.init.EntitlementAccessor;
import org.apache.syncope.core.logic.init.IdRepoEntitlementLoader;
import org.apache.syncope.core.logic.init.IdRepoImplementationTypeLoader;
import org.apache.syncope.core.persistence.api.DomainHolder;
import org.apache.syncope.core.persistence.api.content.ContentExporter;
import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
import org.apache.syncope.core.persistence.api.dao.AuditConfDAO;
import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
import org.apache.syncope.core.persistence.api.dao.FIQLQueryDAO;
import org.apache.syncope.core.persistence.api.dao.GroupDAO;
import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
import org.apache.syncope.core.persistence.api.dao.RealmDAO;
import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
import org.apache.syncope.core.persistence.api.dao.ReportDAO;
import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
import org.apache.syncope.core.persistence.api.dao.RoleDAO;
import org.apache.syncope.core.persistence.api.dao.SAML2SPClientAppDAO;
import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
import org.apache.syncope.core.persistence.api.dao.TaskDAO;
import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
import org.apache.syncope.core.persistence.api.dao.UserDAO;
import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
import org.apache.syncope.core.persistence.api.entity.EntityFactory;
import org.apache.syncope.core.persistence.api.entity.policy.PolicyUtilsFactory;
import org.apache.syncope.core.persistence.api.entity.task.TaskUtilsFactory;
import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
import org.apache.syncope.core.provisioning.api.AuditManager;
import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
import org.apache.syncope.core.provisioning.api.ImplementationLookup;
import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder;
import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
import org.apache.syncope.core.provisioning.api.data.ApplicationDataBinder;
import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
import org.apache.syncope.core.provisioning.api.data.DelegationDataBinder;
import org.apache.syncope.core.provisioning.api.data.DynRealmDataBinder;
import org.apache.syncope.core.provisioning.api.data.FIQLQueryDataBinder;
import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
import org.apache.syncope.core.provisioning.api.data.ImplementationDataBinder;
import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder;
import org.apache.syncope.core.provisioning.api.data.PolicyDataBinder;
import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
import org.apache.syncope.core.provisioning.api.data.RelationshipTypeDataBinder;
import org.apache.syncope.core.provisioning.api.data.ReportDataBinder;
import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
import org.apache.syncope.core.provisioning.api.data.SecurityQuestionDataBinder;
import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
import org.apache.syncope.core.provisioning.api.job.JobManager;
import org.apache.syncope.core.provisioning.api.notification.NotificationJobDelegate;
import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
import org.apache.syncope.core.provisioning.api.rules.RuleEnforcer;
import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
import org.apache.syncope.core.spring.security.SecurityProperties;
import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@EnableAspectJAutoProxy(proxyTargetClass = false)
@Configuration(proxyBeanMethods = false)
public class IdRepoLogicContext {
@ConditionalOnMissingBean
@Bean
public LogicInvocationHandler logicInvocationHandler(
final NotificationManager notificationManager,
final AuditManager auditManager) {
return new LogicInvocationHandler(notificationManager, auditManager);
}
@ConditionalOnMissingBean
@Bean
public ImplementationLookup implementationLookup() {
return new ClassPathScanImplementationLookup();
}
@ConditionalOnMissingBean
@Bean
public AuditAccessor auditAccessor(final AuditConfDAO auditConfDAO) {
return new AuditAccessor(auditConfDAO);
}
@ConditionalOnMissingBean
@Bean
public AuditLoader auditLoader(
final AuditAccessor auditAccessor,
final List<AuditAppender> auditAppenders) {
return new AuditLoader(auditAccessor, auditAppenders);
}
@ConditionalOnMissingBean(name = "defaultAuditAppenders")
@Bean
public List<AuditAppender> defaultAuditAppenders(final DomainHolder domainHolder) {
List<AuditAppender> auditAppenders = new ArrayList<>();
LoggerContext logCtx = (LoggerContext) LogManager.getContext(false);
domainHolder.getDomains().forEach((domain, dataSource) -> {
AuditAppender appender = new JdbcAuditAppender(domain, dataSource);
LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(domain), null, false);
logConf.addAppender(appender.getTargetAppender(), Level.DEBUG, null);
logConf.setLevel(Level.DEBUG);
logCtx.getConfiguration().addLogger(logConf.getName(), logConf);
auditAppenders.add(appender);
});
return auditAppenders;
}
@ConditionalOnMissingBean
@Bean
public EntitlementAccessor entitlementAccessor(final AnyTypeDAO anyTypeDAO) {
return new EntitlementAccessor(anyTypeDAO);
}
@ConditionalOnMissingBean
@Bean
public IdRepoEntitlementLoader idRepoEntitlementLoader(final EntitlementAccessor entitlementAccessor) {
return new IdRepoEntitlementLoader(entitlementAccessor);
}
@ConditionalOnMissingBean
@Bean
public IdRepoImplementationTypeLoader idRepoImplementationTypeLoader() {
return new IdRepoImplementationTypeLoader();
}
@ConditionalOnMissingBean
@Bean
public AccessTokenLogic accessTokenLogic(
final AccessTokenDataBinder binder,
final AccessTokenDAO accessTokenDAO,
final SecurityProperties securityProperties) {
return new AccessTokenLogic(securityProperties, binder, accessTokenDAO);
}
@ConditionalOnMissingBean
@Bean
public AnyObjectLogic anyObjectLogic(
final AnyObjectDataBinder binder,
final TemplateUtils templateUtils,
final RealmDAO realmDAO,
final AnyTypeDAO anyTypeDAO,
final AnyObjectDAO anyObjectDAO,
final AnySearchDAO anySearchDAO,
final AnyObjectProvisioningManager provisioningManager) {
return new AnyObjectLogic(
realmDAO,
anyTypeDAO,
templateUtils,
anyObjectDAO,
anySearchDAO,
binder,
provisioningManager);
}
@ConditionalOnMissingBean
@Bean
public AnyTypeClassLogic anyTypeClassLogic(
final AnyTypeClassDataBinder binder,
final AnyTypeClassDAO anyTypeClassDAO) {
return new AnyTypeClassLogic(binder, anyTypeClassDAO);
}
@ConditionalOnMissingBean
@Bean
public AnyTypeLogic anyTypeLogic(
final AnyTypeDataBinder binder,
final AnyTypeDAO anyTypeDAO,
final AnyObjectDAO anyObjectDAO) {
return new AnyTypeLogic(binder, anyTypeDAO, anyObjectDAO);
}
@ConditionalOnMissingBean
@Bean
public ApplicationLogic applicationLogic(
final ApplicationDataBinder binder,
final ApplicationDAO applicationDAO) {
return new ApplicationLogic(binder, applicationDAO);
}
@ConditionalOnMissingBean
@Bean
public AuditLogic auditLogic(
final AuditConfDAO auditConfDAO,
final ExternalResourceDAO externalResourceDAO,
final EntityFactory entityFactory,
final AuditDataBinder binder,
final AuditManager auditManager,
final List<AuditAppender> auditAppenders) {
return new AuditLogic(
auditConfDAO,
externalResourceDAO,
entityFactory,
binder,
auditManager,
auditAppenders);
}
@ConditionalOnMissingBean
@Bean
public CommandLogic commandLogic(final ImplementationDAO implementationDAO, final Validator validator) {
return new CommandLogic(implementationDAO, validator);
}
@ConditionalOnMissingBean
@Bean
public FIQLQueryLogic fiqlQueryLogic(
final FIQLQueryDataBinder binder,
final UserDAO userDAO,
final FIQLQueryDAO fiqlQueryDAO) {
return new FIQLQueryLogic(binder, fiqlQueryDAO, userDAO);
}
@ConditionalOnMissingBean
@Bean
public DelegationLogic delegationLogic(
final DelegationDataBinder binder,
final UserDAO userDAO,
final DelegationDAO delegationDAO) {
return new DelegationLogic(binder, delegationDAO, userDAO);
}
@ConditionalOnMissingBean
@Bean
public DynRealmLogic dynRealmLogic(
final DynRealmDataBinder binder,
final DynRealmDAO dynRealmDAO) {
return new DynRealmLogic(binder, dynRealmDAO);
}
@ConditionalOnMissingBean
@Bean
public GroupLogic groupLogic(
final GroupProvisioningManager provisioningManager,
final JobManager jobManager,
final TemplateUtils templateUtils,
final EntityFactory entityFactory,
final RealmDAO realmDAO,
final AnyTypeDAO anyTypeDAO,
final UserDAO userDAO,
final GroupDAO groupDAO,
final AnySearchDAO anySearchDAO,
final SchedulerFactoryBean scheduler,
final TaskDAO taskDAO,
final GroupDataBinder groupDataBinder,
final TaskDataBinder taskDataBinder,
final ImplementationDAO implementationDAO,
final SecurityProperties securityProperties) {
return new GroupLogic(
realmDAO,
anyTypeDAO,
templateUtils,
userDAO,
groupDAO,
securityProperties,
anySearchDAO,
implementationDAO,
taskDAO,
groupDataBinder,
provisioningManager,
taskDataBinder,
jobManager,
scheduler,
entityFactory);
}
@ConditionalOnMissingBean
@Bean
public ImplementationLogic implementationLogic(
final ImplementationDataBinder binder,
final PlainSchemaDAO plainSchemaDAO,
final RealmDAO realmDAO,
final PolicyDAO policyDAO,
final ReportDAO reportDAO,
final TaskDAO taskDAO,
final ExternalResourceDAO externalResourceDAO,
final ImplementationDAO implementationDAO,
final NotificationDAO notificationDAO) {
return new ImplementationLogic(
binder,
implementationDAO,
reportDAO,
policyDAO,
externalResourceDAO,
taskDAO,
realmDAO,
plainSchemaDAO,
notificationDAO);
}
@ConditionalOnMissingBean
@Bean
public MailTemplateLogic mailTemplateLogic(
final MailTemplateDAO mailTemplateDAO,
final EntityFactory entityFactory,
final NotificationDAO notificationDAO) {
return new MailTemplateLogic(mailTemplateDAO, notificationDAO, entityFactory);
}
@ConditionalOnMissingBean
@Bean
public NotificationLogic notificationLogic(
final NotificationDataBinder binder,
final JobManager jobManager,
final JobStatusDAO jobStatusDAO,
final SchedulerFactoryBean scheduler,
final NotificationDAO notificationDAO) {
return new NotificationLogic(jobManager, scheduler, jobStatusDAO, notificationDAO, binder);
}
@ConditionalOnMissingBean
@Bean
public PolicyLogic policyLogic(
final PolicyDataBinder binder,
final PolicyDAO policyDAO,
final PolicyUtilsFactory policyUtilsFactory) {
return new PolicyLogic(policyDAO, binder, policyUtilsFactory);
}
@ConditionalOnMissingBean
@Bean
public RealmLogic realmLogic(
final RealmDataBinder binder,
final RealmDAO realmDAO,
final AnySearchDAO anySearchDAO,
final TaskDAO taskDAO,
final CASSPClientAppDAO casSPClientAppDAO,
final OIDCRPClientAppDAO oidcRPClientAppDAO,
final SAML2SPClientAppDAO saml2SPClientAppDAO,
final PropagationManager propagationManager,
final PropagationTaskExecutor taskExecutor) {
return new RealmLogic(
realmDAO,
anySearchDAO,
taskDAO,
casSPClientAppDAO,
oidcRPClientAppDAO,
saml2SPClientAppDAO,
binder,
propagationManager,
taskExecutor);
}
@ConditionalOnMissingBean
@Bean
public RelationshipTypeLogic relationshipTypeLogic(
final RelationshipTypeDataBinder binder,
final RelationshipTypeDAO relationshipTypeDAO) {
return new RelationshipTypeLogic(binder, relationshipTypeDAO);
}
@ConditionalOnMissingBean
@Bean
public ReportLogic reportLogic(
final JobManager jobManager,
final ReportDataBinder binder,
final SchedulerFactoryBean scheduler,
final JobStatusDAO jobStatusDAO,
final ReportDAO reportDAO,
final EntityFactory entityFactory,
final ReportExecDAO reportExecDAO) {
return new ReportLogic(
jobManager,
scheduler,
jobStatusDAO,
reportDAO,
reportExecDAO,
binder,
entityFactory);
}
@ConditionalOnMissingBean
@Bean
public RoleLogic roleLogic(
final RoleDataBinder binder,
final RoleDAO roleDAO) {
return new RoleLogic(binder, roleDAO);
}
@ConditionalOnMissingBean
@Bean
public SchemaLogic schemaLogic(
final SchemaDataBinder binder,
final VirSchemaDAO virSchemaDAO,
final AnyTypeClassDAO anyTypeClassDAO,
final DerSchemaDAO derSchemaDAO,
final PlainSchemaDAO plainSchemaDAO) {
return new SchemaLogic(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeClassDAO, binder);
}
@ConditionalOnMissingBean
@Bean
public SecurityQuestionLogic securityQuestionLogic(
final SecurityQuestionDataBinder binder,
final UserDAO userDAO,
final SecurityQuestionDAO securityQuestionDAO) {
return new SecurityQuestionLogic(securityQuestionDAO, userDAO, binder);
}
@ConditionalOnMissingBean
@Bean
public SyncopeLogic syncopeLogic(
final ContentExporter exporter,
final UserWorkflowAdapter uwfAdapter,
final RealmDAO realmDAO,
final AnyTypeDAO anyTypeDAO,
final GroupDAO groupDAO,
final ConfParamOps confParamOps,
final GroupDataBinder groupDataBinder,
final AnySearchDAO anySearchDAO,
final GroupWorkflowAdapter gwfAdapter,
final AnyObjectWorkflowAdapter awfAdapter) {
return new SyncopeLogic(
realmDAO,
anyTypeDAO,
groupDAO,
anySearchDAO,
groupDataBinder,
confParamOps,
exporter,
uwfAdapter,
gwfAdapter,
awfAdapter);
}
@ConditionalOnMissingBean
@Bean
public TaskLogic taskLogic(
final JobManager jobManager,
final PropagationTaskExecutor taskExecutor,
final TaskExecDAO taskExecDAO,
final TaskDAO taskDAO,
final SchedulerFactoryBean scheduler,
final JobStatusDAO jobStatusDAO,
final ExternalResourceDAO externalResourceDAO,
final NotificationJobDelegate notificationJobDelegate,
final TaskDataBinder taskDataBinder,
final TaskUtilsFactory taskUtilsFactory,
final NotificationDAO notificationDAO) {
return new TaskLogic(
jobManager,
scheduler,
jobStatusDAO,
taskDAO,
taskExecDAO,
externalResourceDAO,
notificationDAO,
taskDataBinder,
taskExecutor,
notificationJobDelegate,
taskUtilsFactory);
}
@ConditionalOnMissingBean
@Bean
public UserLogic userLogic(
final UserDataBinder binder,
final TemplateUtils templateUtils,
final RealmDAO realmDAO,
final AnyTypeDAO anyTypeDAO,
final UserDAO userDAO,
final GroupDAO groupDAO,
final AnySearchDAO anySearchDAO,
final ExternalResourceDAO resourceDAO,
final AccessTokenDAO accessTokenDAO,
final DelegationDAO delegationDAO,
final ConfParamOps confParamOps,
final UserProvisioningManager provisioningManager,
final SyncopeLogic syncopeLogic,
final RuleEnforcer ruleEnforcer) {
return new UserLogic(
realmDAO,
anyTypeDAO,
templateUtils,
userDAO,
groupDAO,
anySearchDAO,
resourceDAO,
accessTokenDAO,
delegationDAO,
confParamOps,
binder,
provisioningManager,
syncopeLogic,
ruleEnforcer);
}
}