View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.core.logic;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  import javax.validation.Validator;
24  import org.apache.logging.log4j.Level;
25  import org.apache.logging.log4j.LogManager;
26  import org.apache.logging.log4j.core.LoggerContext;
27  import org.apache.logging.log4j.core.config.LoggerConfig;
28  import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
29  import org.apache.syncope.common.lib.types.AuditLoggerName;
30  import org.apache.syncope.core.logic.audit.AuditAppender;
31  import org.apache.syncope.core.logic.audit.JdbcAuditAppender;
32  import org.apache.syncope.core.logic.init.AuditAccessor;
33  import org.apache.syncope.core.logic.init.AuditLoader;
34  import org.apache.syncope.core.logic.init.ClassPathScanImplementationLookup;
35  import org.apache.syncope.core.logic.init.EntitlementAccessor;
36  import org.apache.syncope.core.logic.init.IdRepoEntitlementLoader;
37  import org.apache.syncope.core.logic.init.IdRepoImplementationTypeLoader;
38  import org.apache.syncope.core.persistence.api.DomainHolder;
39  import org.apache.syncope.core.persistence.api.content.ContentExporter;
40  import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
41  import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
42  import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
43  import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
44  import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
45  import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
46  import org.apache.syncope.core.persistence.api.dao.AuditConfDAO;
47  import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
48  import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
49  import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
50  import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
51  import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
52  import org.apache.syncope.core.persistence.api.dao.FIQLQueryDAO;
53  import org.apache.syncope.core.persistence.api.dao.GroupDAO;
54  import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
55  import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
56  import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
57  import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
58  import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
59  import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
60  import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
61  import org.apache.syncope.core.persistence.api.dao.RealmDAO;
62  import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
63  import org.apache.syncope.core.persistence.api.dao.ReportDAO;
64  import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
65  import org.apache.syncope.core.persistence.api.dao.RoleDAO;
66  import org.apache.syncope.core.persistence.api.dao.SAML2SPClientAppDAO;
67  import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
68  import org.apache.syncope.core.persistence.api.dao.TaskDAO;
69  import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
70  import org.apache.syncope.core.persistence.api.dao.UserDAO;
71  import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
72  import org.apache.syncope.core.persistence.api.entity.EntityFactory;
73  import org.apache.syncope.core.persistence.api.entity.policy.PolicyUtilsFactory;
74  import org.apache.syncope.core.persistence.api.entity.task.TaskUtilsFactory;
75  import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
76  import org.apache.syncope.core.provisioning.api.AuditManager;
77  import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
78  import org.apache.syncope.core.provisioning.api.ImplementationLookup;
79  import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
80  import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder;
81  import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
82  import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
83  import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
84  import org.apache.syncope.core.provisioning.api.data.ApplicationDataBinder;
85  import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
86  import org.apache.syncope.core.provisioning.api.data.DelegationDataBinder;
87  import org.apache.syncope.core.provisioning.api.data.DynRealmDataBinder;
88  import org.apache.syncope.core.provisioning.api.data.FIQLQueryDataBinder;
89  import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
90  import org.apache.syncope.core.provisioning.api.data.ImplementationDataBinder;
91  import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder;
92  import org.apache.syncope.core.provisioning.api.data.PolicyDataBinder;
93  import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
94  import org.apache.syncope.core.provisioning.api.data.RelationshipTypeDataBinder;
95  import org.apache.syncope.core.provisioning.api.data.ReportDataBinder;
96  import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
97  import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
98  import org.apache.syncope.core.provisioning.api.data.SecurityQuestionDataBinder;
99  import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
100 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
101 import org.apache.syncope.core.provisioning.api.job.JobManager;
102 import org.apache.syncope.core.provisioning.api.notification.NotificationJobDelegate;
103 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
104 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
105 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
106 import org.apache.syncope.core.provisioning.api.rules.RuleEnforcer;
107 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
108 import org.apache.syncope.core.spring.security.SecurityProperties;
109 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
110 import org.springframework.boot.logging.LoggingSystem;
111 import org.springframework.context.annotation.Bean;
112 import org.springframework.context.annotation.Configuration;
113 import org.springframework.context.annotation.EnableAspectJAutoProxy;
114 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
115 
116 @EnableAspectJAutoProxy(proxyTargetClass = false)
117 @Configuration(proxyBeanMethods = false)
118 public class IdRepoLogicContext {
119 
120     @ConditionalOnMissingBean
121     @Bean
122     public LogicInvocationHandler logicInvocationHandler(
123             final NotificationManager notificationManager,
124             final AuditManager auditManager) {
125 
126         return new LogicInvocationHandler(notificationManager, auditManager);
127     }
128 
129     @ConditionalOnMissingBean
130     @Bean
131     public ImplementationLookup implementationLookup() {
132         return new ClassPathScanImplementationLookup();
133     }
134 
135     @ConditionalOnMissingBean
136     @Bean
137     public AuditAccessor auditAccessor(final AuditConfDAO auditConfDAO, final LoggingSystem loggingSystem) {
138         return new AuditAccessor(auditConfDAO, loggingSystem);
139     }
140 
141     @ConditionalOnMissingBean
142     @Bean
143     public AuditLoader auditLoader(
144             final AuditAccessor auditAccessor,
145             final List<AuditAppender> auditAppenders) {
146 
147         return new AuditLoader(auditAccessor, auditAppenders);
148     }
149 
150     @ConditionalOnMissingBean(name = "defaultAuditAppenders")
151     @Bean
152     public List<AuditAppender> defaultAuditAppenders(final DomainHolder domainHolder) {
153         List<AuditAppender> auditAppenders = new ArrayList<>();
154 
155         LoggerContext logCtx = (LoggerContext) LogManager.getContext(false);
156         domainHolder.getDomains().forEach((domain, dataSource) -> {
157             AuditAppender appender = new JdbcAuditAppender(domain, dataSource);
158 
159             LoggerConfig logConf = new LoggerConfig(AuditLoggerName.getAuditLoggerName(domain), null, false);
160             logConf.addAppender(appender.getTargetAppender(), Level.DEBUG, null);
161             logConf.setLevel(Level.DEBUG);
162             logCtx.getConfiguration().addLogger(logConf.getName(), logConf);
163 
164             auditAppenders.add(appender);
165         });
166 
167         return auditAppenders;
168     }
169 
170     @ConditionalOnMissingBean
171     @Bean
172     public EntitlementAccessor entitlementAccessor(final AnyTypeDAO anyTypeDAO) {
173         return new EntitlementAccessor(anyTypeDAO);
174     }
175 
176     @ConditionalOnMissingBean
177     @Bean
178     public IdRepoEntitlementLoader idRepoEntitlementLoader(final EntitlementAccessor entitlementAccessor) {
179         return new IdRepoEntitlementLoader(entitlementAccessor);
180     }
181 
182     @ConditionalOnMissingBean
183     @Bean
184     public IdRepoImplementationTypeLoader idRepoImplementationTypeLoader() {
185         return new IdRepoImplementationTypeLoader();
186     }
187 
188     @ConditionalOnMissingBean
189     @Bean
190     public AccessTokenLogic accessTokenLogic(
191             final AccessTokenDataBinder binder,
192             final AccessTokenDAO accessTokenDAO,
193             final SecurityProperties securityProperties) {
194 
195         return new AccessTokenLogic(securityProperties, binder, accessTokenDAO);
196     }
197 
198     @ConditionalOnMissingBean
199     @Bean
200     public AnyObjectLogic anyObjectLogic(
201             final AnyObjectDataBinder binder,
202             final TemplateUtils templateUtils,
203             final RealmDAO realmDAO,
204             final AnyTypeDAO anyTypeDAO,
205             final AnyObjectDAO anyObjectDAO,
206             final AnySearchDAO anySearchDAO,
207             final AnyObjectProvisioningManager provisioningManager) {
208 
209         return new AnyObjectLogic(
210                 realmDAO,
211                 anyTypeDAO,
212                 templateUtils,
213                 anyObjectDAO,
214                 anySearchDAO,
215                 binder,
216                 provisioningManager);
217     }
218 
219     @ConditionalOnMissingBean
220     @Bean
221     public AnyTypeClassLogic anyTypeClassLogic(
222             final AnyTypeClassDataBinder binder,
223             final AnyTypeClassDAO anyTypeClassDAO) {
224 
225         return new AnyTypeClassLogic(binder, anyTypeClassDAO);
226     }
227 
228     @ConditionalOnMissingBean
229     @Bean
230     public AnyTypeLogic anyTypeLogic(
231             final AnyTypeDataBinder binder,
232             final AnyTypeDAO anyTypeDAO,
233             final AnyObjectDAO anyObjectDAO) {
234 
235         return new AnyTypeLogic(binder, anyTypeDAO, anyObjectDAO);
236     }
237 
238     @ConditionalOnMissingBean
239     @Bean
240     public ApplicationLogic applicationLogic(
241             final ApplicationDataBinder binder,
242             final ApplicationDAO applicationDAO) {
243 
244         return new ApplicationLogic(binder, applicationDAO);
245     }
246 
247     @ConditionalOnMissingBean
248     @Bean
249     public AuditLogic auditLogic(
250             final AuditConfDAO auditConfDAO,
251             final ExternalResourceDAO externalResourceDAO,
252             final EntityFactory entityFactory,
253             final ImplementationLookup implementationLookup,
254             final AuditDataBinder binder,
255             final AuditManager auditManager,
256             final List<AuditAppender> auditAppenders,
257             final LoggingSystem loggingSystem) {
258 
259         return new AuditLogic(
260                 auditConfDAO,
261                 externalResourceDAO,
262                 entityFactory,
263                 implementationLookup,
264                 binder,
265                 auditManager,
266                 auditAppenders,
267                 loggingSystem);
268     }
269 
270     @ConditionalOnMissingBean
271     @Bean
272     public CommandLogic commandLogic(final ImplementationDAO implementationDAO, final Validator validator) {
273         return new CommandLogic(implementationDAO, validator);
274     }
275 
276     @ConditionalOnMissingBean
277     @Bean
278     public FIQLQueryLogic fiqlQueryLogic(
279             final FIQLQueryDataBinder binder,
280             final UserDAO userDAO,
281             final FIQLQueryDAO fiqlQueryDAO) {
282 
283         return new FIQLQueryLogic(binder, fiqlQueryDAO, userDAO);
284     }
285 
286     @ConditionalOnMissingBean
287     @Bean
288     public DelegationLogic delegationLogic(
289             final DelegationDataBinder binder,
290             final UserDAO userDAO,
291             final DelegationDAO delegationDAO) {
292 
293         return new DelegationLogic(binder, delegationDAO, userDAO);
294     }
295 
296     @ConditionalOnMissingBean
297     @Bean
298     public DynRealmLogic dynRealmLogic(
299             final DynRealmDataBinder binder,
300             final DynRealmDAO dynRealmDAO) {
301 
302         return new DynRealmLogic(binder, dynRealmDAO);
303     }
304 
305     @ConditionalOnMissingBean
306     @Bean
307     public GroupLogic groupLogic(
308             final GroupProvisioningManager provisioningManager,
309             final JobManager jobManager,
310             final TemplateUtils templateUtils,
311             final EntityFactory entityFactory,
312             final RealmDAO realmDAO,
313             final AnyTypeDAO anyTypeDAO,
314             final UserDAO userDAO,
315             final GroupDAO groupDAO,
316             final AnySearchDAO anySearchDAO,
317             final SchedulerFactoryBean scheduler,
318             final TaskDAO taskDAO,
319             final GroupDataBinder groupDataBinder,
320             final TaskDataBinder taskDataBinder,
321             final ImplementationDAO implementationDAO,
322             final SecurityProperties securityProperties) {
323 
324         return new GroupLogic(
325                 realmDAO,
326                 anyTypeDAO,
327                 templateUtils,
328                 userDAO,
329                 groupDAO,
330                 securityProperties,
331                 anySearchDAO,
332                 implementationDAO,
333                 taskDAO,
334                 groupDataBinder,
335                 provisioningManager,
336                 taskDataBinder,
337                 jobManager,
338                 scheduler,
339                 entityFactory);
340     }
341 
342     @ConditionalOnMissingBean
343     @Bean
344     public ImplementationLogic implementationLogic(
345             final ImplementationDataBinder binder,
346             final PlainSchemaDAO plainSchemaDAO,
347             final RealmDAO realmDAO,
348             final PolicyDAO policyDAO,
349             final ReportDAO reportDAO,
350             final TaskDAO taskDAO,
351             final ExternalResourceDAO externalResourceDAO,
352             final ImplementationDAO implementationDAO,
353             final NotificationDAO notificationDAO) {
354 
355         return new ImplementationLogic(
356                 binder,
357                 implementationDAO,
358                 reportDAO,
359                 policyDAO,
360                 externalResourceDAO,
361                 taskDAO,
362                 realmDAO,
363                 plainSchemaDAO,
364                 notificationDAO);
365     }
366 
367     @ConditionalOnMissingBean
368     @Bean
369     public MailTemplateLogic mailTemplateLogic(
370             final MailTemplateDAO mailTemplateDAO,
371             final EntityFactory entityFactory,
372             final NotificationDAO notificationDAO) {
373 
374         return new MailTemplateLogic(mailTemplateDAO, notificationDAO, entityFactory);
375     }
376 
377     @ConditionalOnMissingBean
378     @Bean
379     public NotificationLogic notificationLogic(
380             final NotificationDataBinder binder,
381             final JobManager jobManager,
382             final JobStatusDAO jobStatusDAO,
383             final SchedulerFactoryBean scheduler,
384             final NotificationDAO notificationDAO) {
385 
386         return new NotificationLogic(jobManager, scheduler, jobStatusDAO, notificationDAO, binder);
387     }
388 
389     @ConditionalOnMissingBean
390     @Bean
391     public PolicyLogic policyLogic(
392             final PolicyDataBinder binder,
393             final PolicyDAO policyDAO,
394             final PolicyUtilsFactory policyUtilsFactory) {
395 
396         return new PolicyLogic(policyDAO, binder, policyUtilsFactory);
397     }
398 
399     @ConditionalOnMissingBean
400     @Bean
401     public RealmLogic realmLogic(
402             final RealmDataBinder binder,
403             final RealmDAO realmDAO,
404             final AnySearchDAO anySearchDAO,
405             final TaskDAO taskDAO,
406             final CASSPClientAppDAO casSPClientAppDAO,
407             final OIDCRPClientAppDAO oidcRPClientAppDAO,
408             final SAML2SPClientAppDAO saml2SPClientAppDAO,
409             final PropagationManager propagationManager,
410             final PropagationTaskExecutor taskExecutor) {
411 
412         return new RealmLogic(
413                 realmDAO,
414                 anySearchDAO,
415                 taskDAO,
416                 casSPClientAppDAO,
417                 oidcRPClientAppDAO,
418                 saml2SPClientAppDAO,
419                 binder,
420                 propagationManager,
421                 taskExecutor);
422     }
423 
424     @ConditionalOnMissingBean
425     @Bean
426     public RelationshipTypeLogic relationshipTypeLogic(
427             final RelationshipTypeDataBinder binder,
428             final RelationshipTypeDAO relationshipTypeDAO) {
429 
430         return new RelationshipTypeLogic(binder, relationshipTypeDAO);
431     }
432 
433     @ConditionalOnMissingBean
434     @Bean
435     public ReportLogic reportLogic(
436             final JobManager jobManager,
437             final ReportDataBinder binder,
438             final SchedulerFactoryBean scheduler,
439             final JobStatusDAO jobStatusDAO,
440             final ReportDAO reportDAO,
441             final EntityFactory entityFactory,
442             final ReportExecDAO reportExecDAO) {
443 
444         return new ReportLogic(
445                 jobManager,
446                 scheduler,
447                 jobStatusDAO,
448                 reportDAO,
449                 reportExecDAO,
450                 binder,
451                 entityFactory);
452     }
453 
454     @ConditionalOnMissingBean
455     @Bean
456     public RoleLogic roleLogic(
457             final RoleDataBinder binder,
458             final RoleDAO roleDAO) {
459 
460         return new RoleLogic(binder, roleDAO);
461     }
462 
463     @ConditionalOnMissingBean
464     @Bean
465     public SchemaLogic schemaLogic(
466             final SchemaDataBinder binder,
467             final VirSchemaDAO virSchemaDAO,
468             final AnyTypeClassDAO anyTypeClassDAO,
469             final DerSchemaDAO derSchemaDAO,
470             final PlainSchemaDAO plainSchemaDAO) {
471 
472         return new SchemaLogic(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeClassDAO, binder);
473     }
474 
475     @ConditionalOnMissingBean
476     @Bean
477     public SecurityQuestionLogic securityQuestionLogic(
478             final SecurityQuestionDataBinder binder,
479             final UserDAO userDAO,
480             final SecurityQuestionDAO securityQuestionDAO) {
481 
482         return new SecurityQuestionLogic(securityQuestionDAO, userDAO, binder);
483     }
484 
485     @ConditionalOnMissingBean
486     @Bean
487     public SyncopeLogic syncopeLogic(
488             final RealmDAO realmDAO,
489             final AnyTypeDAO anyTypeDAO,
490             final GroupDAO groupDAO,
491             final AnySearchDAO anySearchDAO,
492             final GroupDataBinder groupDataBinder,
493             final ConfParamOps confParamOps,
494             final ContentExporter exporter) {
495 
496         return new SyncopeLogic(
497                 realmDAO,
498                 anyTypeDAO,
499                 groupDAO,
500                 anySearchDAO,
501                 groupDataBinder,
502                 confParamOps,
503                 exporter);
504     }
505 
506     @ConditionalOnMissingBean
507     @Bean
508     public TaskLogic taskLogic(
509             final JobManager jobManager,
510             final PropagationTaskExecutor taskExecutor,
511             final TaskExecDAO taskExecDAO,
512             final TaskDAO taskDAO,
513             final SchedulerFactoryBean scheduler,
514             final JobStatusDAO jobStatusDAO,
515             final ExternalResourceDAO externalResourceDAO,
516             final NotificationJobDelegate notificationJobDelegate,
517             final TaskDataBinder taskDataBinder,
518             final TaskUtilsFactory taskUtilsFactory,
519             final NotificationDAO notificationDAO) {
520 
521         return new TaskLogic(
522                 jobManager,
523                 scheduler,
524                 jobStatusDAO,
525                 taskDAO,
526                 taskExecDAO,
527                 externalResourceDAO,
528                 notificationDAO,
529                 taskDataBinder,
530                 taskExecutor,
531                 notificationJobDelegate,
532                 taskUtilsFactory);
533     }
534 
535     @ConditionalOnMissingBean
536     @Bean
537     public UserLogic userLogic(
538             final UserDataBinder binder,
539             final TemplateUtils templateUtils,
540             final RealmDAO realmDAO,
541             final AnyTypeDAO anyTypeDAO,
542             final UserDAO userDAO,
543             final GroupDAO groupDAO,
544             final AnySearchDAO anySearchDAO,
545             final ExternalResourceDAO resourceDAO,
546             final AccessTokenDAO accessTokenDAO,
547             final DelegationDAO delegationDAO,
548             final ConfParamOps confParamOps,
549             final UserProvisioningManager provisioningManager,
550             final SyncopeLogic syncopeLogic,
551             final RuleEnforcer ruleEnforcer) {
552 
553         return new UserLogic(
554                 realmDAO,
555                 anyTypeDAO,
556                 templateUtils,
557                 userDAO,
558                 groupDAO,
559                 anySearchDAO,
560                 resourceDAO,
561                 accessTokenDAO,
562                 delegationDAO,
563                 confParamOps,
564                 binder,
565                 provisioningManager,
566                 syncopeLogic,
567                 ruleEnforcer);
568     }
569 }