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 AuditDataBinder binder,
254             final AuditManager auditManager,
255             final List<AuditAppender> auditAppenders,
256             final LoggingSystem loggingSystem) {
257 
258         return new AuditLogic(
259                 auditConfDAO,
260                 externalResourceDAO,
261                 entityFactory,
262                 binder,
263                 auditManager,
264                 auditAppenders,
265                 loggingSystem);
266     }
267 
268     @ConditionalOnMissingBean
269     @Bean
270     public CommandLogic commandLogic(final ImplementationDAO implementationDAO, final Validator validator) {
271         return new CommandLogic(implementationDAO, validator);
272     }
273 
274     @ConditionalOnMissingBean
275     @Bean
276     public FIQLQueryLogic fiqlQueryLogic(
277             final FIQLQueryDataBinder binder,
278             final UserDAO userDAO,
279             final FIQLQueryDAO fiqlQueryDAO) {
280 
281         return new FIQLQueryLogic(binder, fiqlQueryDAO, userDAO);
282     }
283 
284     @ConditionalOnMissingBean
285     @Bean
286     public DelegationLogic delegationLogic(
287             final DelegationDataBinder binder,
288             final UserDAO userDAO,
289             final DelegationDAO delegationDAO) {
290 
291         return new DelegationLogic(binder, delegationDAO, userDAO);
292     }
293 
294     @ConditionalOnMissingBean
295     @Bean
296     public DynRealmLogic dynRealmLogic(
297             final DynRealmDataBinder binder,
298             final DynRealmDAO dynRealmDAO) {
299 
300         return new DynRealmLogic(binder, dynRealmDAO);
301     }
302 
303     @ConditionalOnMissingBean
304     @Bean
305     public GroupLogic groupLogic(
306             final GroupProvisioningManager provisioningManager,
307             final JobManager jobManager,
308             final TemplateUtils templateUtils,
309             final EntityFactory entityFactory,
310             final RealmDAO realmDAO,
311             final AnyTypeDAO anyTypeDAO,
312             final UserDAO userDAO,
313             final GroupDAO groupDAO,
314             final AnySearchDAO anySearchDAO,
315             final SchedulerFactoryBean scheduler,
316             final TaskDAO taskDAO,
317             final GroupDataBinder groupDataBinder,
318             final TaskDataBinder taskDataBinder,
319             final ImplementationDAO implementationDAO,
320             final SecurityProperties securityProperties) {
321 
322         return new GroupLogic(
323                 realmDAO,
324                 anyTypeDAO,
325                 templateUtils,
326                 userDAO,
327                 groupDAO,
328                 securityProperties,
329                 anySearchDAO,
330                 implementationDAO,
331                 taskDAO,
332                 groupDataBinder,
333                 provisioningManager,
334                 taskDataBinder,
335                 jobManager,
336                 scheduler,
337                 entityFactory);
338     }
339 
340     @ConditionalOnMissingBean
341     @Bean
342     public ImplementationLogic implementationLogic(
343             final ImplementationDataBinder binder,
344             final PlainSchemaDAO plainSchemaDAO,
345             final RealmDAO realmDAO,
346             final PolicyDAO policyDAO,
347             final ReportDAO reportDAO,
348             final TaskDAO taskDAO,
349             final ExternalResourceDAO externalResourceDAO,
350             final ImplementationDAO implementationDAO,
351             final NotificationDAO notificationDAO) {
352 
353         return new ImplementationLogic(
354                 binder,
355                 implementationDAO,
356                 reportDAO,
357                 policyDAO,
358                 externalResourceDAO,
359                 taskDAO,
360                 realmDAO,
361                 plainSchemaDAO,
362                 notificationDAO);
363     }
364 
365     @ConditionalOnMissingBean
366     @Bean
367     public MailTemplateLogic mailTemplateLogic(
368             final MailTemplateDAO mailTemplateDAO,
369             final EntityFactory entityFactory,
370             final NotificationDAO notificationDAO) {
371 
372         return new MailTemplateLogic(mailTemplateDAO, notificationDAO, entityFactory);
373     }
374 
375     @ConditionalOnMissingBean
376     @Bean
377     public NotificationLogic notificationLogic(
378             final NotificationDataBinder binder,
379             final JobManager jobManager,
380             final JobStatusDAO jobStatusDAO,
381             final SchedulerFactoryBean scheduler,
382             final NotificationDAO notificationDAO) {
383 
384         return new NotificationLogic(jobManager, scheduler, jobStatusDAO, notificationDAO, binder);
385     }
386 
387     @ConditionalOnMissingBean
388     @Bean
389     public PolicyLogic policyLogic(
390             final PolicyDataBinder binder,
391             final PolicyDAO policyDAO,
392             final PolicyUtilsFactory policyUtilsFactory) {
393 
394         return new PolicyLogic(policyDAO, binder, policyUtilsFactory);
395     }
396 
397     @ConditionalOnMissingBean
398     @Bean
399     public RealmLogic realmLogic(
400             final RealmDataBinder binder,
401             final RealmDAO realmDAO,
402             final AnySearchDAO anySearchDAO,
403             final TaskDAO taskDAO,
404             final CASSPClientAppDAO casSPClientAppDAO,
405             final OIDCRPClientAppDAO oidcRPClientAppDAO,
406             final SAML2SPClientAppDAO saml2SPClientAppDAO,
407             final PropagationManager propagationManager,
408             final PropagationTaskExecutor taskExecutor) {
409 
410         return new RealmLogic(
411                 realmDAO,
412                 anySearchDAO,
413                 taskDAO,
414                 casSPClientAppDAO,
415                 oidcRPClientAppDAO,
416                 saml2SPClientAppDAO,
417                 binder,
418                 propagationManager,
419                 taskExecutor);
420     }
421 
422     @ConditionalOnMissingBean
423     @Bean
424     public RelationshipTypeLogic relationshipTypeLogic(
425             final RelationshipTypeDataBinder binder,
426             final RelationshipTypeDAO relationshipTypeDAO) {
427 
428         return new RelationshipTypeLogic(binder, relationshipTypeDAO);
429     }
430 
431     @ConditionalOnMissingBean
432     @Bean
433     public ReportLogic reportLogic(
434             final JobManager jobManager,
435             final ReportDataBinder binder,
436             final SchedulerFactoryBean scheduler,
437             final JobStatusDAO jobStatusDAO,
438             final ReportDAO reportDAO,
439             final EntityFactory entityFactory,
440             final ReportExecDAO reportExecDAO) {
441 
442         return new ReportLogic(
443                 jobManager,
444                 scheduler,
445                 jobStatusDAO,
446                 reportDAO,
447                 reportExecDAO,
448                 binder,
449                 entityFactory);
450     }
451 
452     @ConditionalOnMissingBean
453     @Bean
454     public RoleLogic roleLogic(
455             final RoleDataBinder binder,
456             final RoleDAO roleDAO) {
457 
458         return new RoleLogic(binder, roleDAO);
459     }
460 
461     @ConditionalOnMissingBean
462     @Bean
463     public SchemaLogic schemaLogic(
464             final SchemaDataBinder binder,
465             final VirSchemaDAO virSchemaDAO,
466             final AnyTypeClassDAO anyTypeClassDAO,
467             final DerSchemaDAO derSchemaDAO,
468             final PlainSchemaDAO plainSchemaDAO) {
469 
470         return new SchemaLogic(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeClassDAO, binder);
471     }
472 
473     @ConditionalOnMissingBean
474     @Bean
475     public SecurityQuestionLogic securityQuestionLogic(
476             final SecurityQuestionDataBinder binder,
477             final UserDAO userDAO,
478             final SecurityQuestionDAO securityQuestionDAO) {
479 
480         return new SecurityQuestionLogic(securityQuestionDAO, userDAO, binder);
481     }
482 
483     @ConditionalOnMissingBean
484     @Bean
485     public SyncopeLogic syncopeLogic(
486             final RealmDAO realmDAO,
487             final AnyTypeDAO anyTypeDAO,
488             final GroupDAO groupDAO,
489             final AnySearchDAO anySearchDAO,
490             final GroupDataBinder groupDataBinder,
491             final ConfParamOps confParamOps,
492             final ContentExporter exporter) {
493 
494         return new SyncopeLogic(
495                 realmDAO,
496                 anyTypeDAO,
497                 groupDAO,
498                 anySearchDAO,
499                 groupDataBinder,
500                 confParamOps,
501                 exporter);
502     }
503 
504     @ConditionalOnMissingBean
505     @Bean
506     public TaskLogic taskLogic(
507             final JobManager jobManager,
508             final PropagationTaskExecutor taskExecutor,
509             final TaskExecDAO taskExecDAO,
510             final TaskDAO taskDAO,
511             final SchedulerFactoryBean scheduler,
512             final JobStatusDAO jobStatusDAO,
513             final ExternalResourceDAO externalResourceDAO,
514             final NotificationJobDelegate notificationJobDelegate,
515             final TaskDataBinder taskDataBinder,
516             final TaskUtilsFactory taskUtilsFactory,
517             final NotificationDAO notificationDAO) {
518 
519         return new TaskLogic(
520                 jobManager,
521                 scheduler,
522                 jobStatusDAO,
523                 taskDAO,
524                 taskExecDAO,
525                 externalResourceDAO,
526                 notificationDAO,
527                 taskDataBinder,
528                 taskExecutor,
529                 notificationJobDelegate,
530                 taskUtilsFactory);
531     }
532 
533     @ConditionalOnMissingBean
534     @Bean
535     public UserLogic userLogic(
536             final UserDataBinder binder,
537             final TemplateUtils templateUtils,
538             final RealmDAO realmDAO,
539             final AnyTypeDAO anyTypeDAO,
540             final UserDAO userDAO,
541             final GroupDAO groupDAO,
542             final AnySearchDAO anySearchDAO,
543             final ExternalResourceDAO resourceDAO,
544             final AccessTokenDAO accessTokenDAO,
545             final DelegationDAO delegationDAO,
546             final ConfParamOps confParamOps,
547             final UserProvisioningManager provisioningManager,
548             final SyncopeLogic syncopeLogic,
549             final RuleEnforcer ruleEnforcer) {
550 
551         return new UserLogic(
552                 realmDAO,
553                 anyTypeDAO,
554                 templateUtils,
555                 userDAO,
556                 groupDAO,
557                 anySearchDAO,
558                 resourceDAO,
559                 accessTokenDAO,
560                 delegationDAO,
561                 confParamOps,
562                 binder,
563                 provisioningManager,
564                 syncopeLogic,
565                 ruleEnforcer);
566     }
567 }