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.provisioning.java;
20  
21  import java.nio.charset.StandardCharsets;
22  import java.util.Properties;
23  import java.util.concurrent.Executor;
24  import java.util.concurrent.Executors;
25  import java.util.concurrent.ThreadPoolExecutor;
26  import javax.sql.DataSource;
27  import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
28  import org.apache.syncope.core.persistence.api.DomainHolder;
29  import org.apache.syncope.core.persistence.api.attrvalue.validation.PlainAttrValidationManager;
30  import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
31  import org.apache.syncope.core.persistence.api.dao.AnyMatchDAO;
32  import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
33  import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
34  import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
35  import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
36  import org.apache.syncope.core.persistence.api.dao.ApplicationDAO;
37  import org.apache.syncope.core.persistence.api.dao.AuditConfDAO;
38  import org.apache.syncope.core.persistence.api.dao.AuthModuleDAO;
39  import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
40  import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
41  import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
42  import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
43  import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
44  import org.apache.syncope.core.persistence.api.dao.GroupDAO;
45  import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
46  import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
47  import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
48  import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
49  import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
50  import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
51  import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
52  import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
53  import org.apache.syncope.core.persistence.api.dao.RealmDAO;
54  import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
55  import org.apache.syncope.core.persistence.api.dao.ReportDAO;
56  import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
57  import org.apache.syncope.core.persistence.api.dao.RoleDAO;
58  import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
59  import org.apache.syncope.core.persistence.api.dao.TaskDAO;
60  import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
61  import org.apache.syncope.core.persistence.api.dao.UserDAO;
62  import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
63  import org.apache.syncope.core.persistence.api.dao.WAConfigDAO;
64  import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
65  import org.apache.syncope.core.persistence.api.entity.EntityFactory;
66  import org.apache.syncope.core.persistence.api.entity.task.TaskUtilsFactory;
67  import org.apache.syncope.core.persistence.api.search.SearchCondVisitor;
68  import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
69  import org.apache.syncope.core.provisioning.api.AuditManager;
70  import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
71  import org.apache.syncope.core.provisioning.api.ConnectorManager;
72  import org.apache.syncope.core.provisioning.api.DerAttrHandler;
73  import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
74  import org.apache.syncope.core.provisioning.api.IntAttrNameParser;
75  import org.apache.syncope.core.provisioning.api.MappingManager;
76  import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
77  import org.apache.syncope.core.provisioning.api.VirAttrHandler;
78  import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
79  import org.apache.syncope.core.provisioning.api.data.AccessTokenDataBinder;
80  import org.apache.syncope.core.provisioning.api.data.AnyObjectDataBinder;
81  import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
82  import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
83  import org.apache.syncope.core.provisioning.api.data.ApplicationDataBinder;
84  import org.apache.syncope.core.provisioning.api.data.AttrRepoDataBinder;
85  import org.apache.syncope.core.provisioning.api.data.AuditDataBinder;
86  import org.apache.syncope.core.provisioning.api.data.AuthModuleDataBinder;
87  import org.apache.syncope.core.provisioning.api.data.AuthProfileDataBinder;
88  import org.apache.syncope.core.provisioning.api.data.ClientAppDataBinder;
89  import org.apache.syncope.core.provisioning.api.data.ConnInstanceDataBinder;
90  import org.apache.syncope.core.provisioning.api.data.DelegationDataBinder;
91  import org.apache.syncope.core.provisioning.api.data.DynRealmDataBinder;
92  import org.apache.syncope.core.provisioning.api.data.FIQLQueryDataBinder;
93  import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
94  import org.apache.syncope.core.provisioning.api.data.ImplementationDataBinder;
95  import org.apache.syncope.core.provisioning.api.data.NotificationDataBinder;
96  import org.apache.syncope.core.provisioning.api.data.OIDCJWKSDataBinder;
97  import org.apache.syncope.core.provisioning.api.data.PolicyDataBinder;
98  import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
99  import org.apache.syncope.core.provisioning.api.data.RelationshipTypeDataBinder;
100 import org.apache.syncope.core.provisioning.api.data.RemediationDataBinder;
101 import org.apache.syncope.core.provisioning.api.data.ReportDataBinder;
102 import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
103 import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
104 import org.apache.syncope.core.provisioning.api.data.SAML2IdPEntityDataBinder;
105 import org.apache.syncope.core.provisioning.api.data.SAML2SPEntityDataBinder;
106 import org.apache.syncope.core.provisioning.api.data.SRARouteDataBinder;
107 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
108 import org.apache.syncope.core.provisioning.api.data.SecurityQuestionDataBinder;
109 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
110 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
111 import org.apache.syncope.core.provisioning.api.data.WAConfigDataBinder;
112 import org.apache.syncope.core.provisioning.api.data.wa.WAClientAppDataBinder;
113 import org.apache.syncope.core.provisioning.api.job.JobManager;
114 import org.apache.syncope.core.provisioning.api.notification.NotificationJobDelegate;
115 import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
116 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
117 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
118 import org.apache.syncope.core.provisioning.java.cache.CaffeineVirAttrCache;
119 import org.apache.syncope.core.provisioning.java.data.AccessTokenDataBinderImpl;
120 import org.apache.syncope.core.provisioning.java.data.AnyObjectDataBinderImpl;
121 import org.apache.syncope.core.provisioning.java.data.AnyTypeClassDataBinderImpl;
122 import org.apache.syncope.core.provisioning.java.data.AnyTypeDataBinderImpl;
123 import org.apache.syncope.core.provisioning.java.data.ApplicationDataBinderImpl;
124 import org.apache.syncope.core.provisioning.java.data.AttrRepoDataBinderImpl;
125 import org.apache.syncope.core.provisioning.java.data.AuditDataBinderImpl;
126 import org.apache.syncope.core.provisioning.java.data.AuthModuleDataBinderImpl;
127 import org.apache.syncope.core.provisioning.java.data.AuthProfileDataBinderImpl;
128 import org.apache.syncope.core.provisioning.java.data.ClientAppDataBinderImpl;
129 import org.apache.syncope.core.provisioning.java.data.ConnInstanceDataBinderImpl;
130 import org.apache.syncope.core.provisioning.java.data.DelegationDataBinderImpl;
131 import org.apache.syncope.core.provisioning.java.data.DynRealmDataBinderImpl;
132 import org.apache.syncope.core.provisioning.java.data.FIQLQueryDataBinderImpl;
133 import org.apache.syncope.core.provisioning.java.data.GroupDataBinderImpl;
134 import org.apache.syncope.core.provisioning.java.data.ImplementationDataBinderImpl;
135 import org.apache.syncope.core.provisioning.java.data.NotificationDataBinderImpl;
136 import org.apache.syncope.core.provisioning.java.data.OIDCJWKSDataBinderImpl;
137 import org.apache.syncope.core.provisioning.java.data.PolicyDataBinderImpl;
138 import org.apache.syncope.core.provisioning.java.data.RealmDataBinderImpl;
139 import org.apache.syncope.core.provisioning.java.data.RelationshipTypeDataBinderImpl;
140 import org.apache.syncope.core.provisioning.java.data.RemediationDataBinderImpl;
141 import org.apache.syncope.core.provisioning.java.data.ReportDataBinderImpl;
142 import org.apache.syncope.core.provisioning.java.data.ResourceDataBinderImpl;
143 import org.apache.syncope.core.provisioning.java.data.RoleDataBinderImpl;
144 import org.apache.syncope.core.provisioning.java.data.SAML2IdPEntityDataBinderImpl;
145 import org.apache.syncope.core.provisioning.java.data.SAML2SPEntityDataBinderImpl;
146 import org.apache.syncope.core.provisioning.java.data.SRARouteDataBinderImpl;
147 import org.apache.syncope.core.provisioning.java.data.SchemaDataBinderImpl;
148 import org.apache.syncope.core.provisioning.java.data.SecurityQuestionDataBinderImpl;
149 import org.apache.syncope.core.provisioning.java.data.TaskDataBinderImpl;
150 import org.apache.syncope.core.provisioning.java.data.UserDataBinderImpl;
151 import org.apache.syncope.core.provisioning.java.data.WAConfigDataBinderImpl;
152 import org.apache.syncope.core.provisioning.java.data.wa.WAClientAppDataBinderImpl;
153 import org.apache.syncope.core.provisioning.java.job.DefaultJobManager;
154 import org.apache.syncope.core.provisioning.java.job.JobStatusUpdater;
155 import org.apache.syncope.core.provisioning.java.job.SchedulerDBInit;
156 import org.apache.syncope.core.provisioning.java.job.SyncopeSpringBeanJobFactory;
157 import org.apache.syncope.core.provisioning.java.job.SystemLoadReporterJob;
158 import org.apache.syncope.core.provisioning.java.job.notification.MailNotificationJobDelegate;
159 import org.apache.syncope.core.provisioning.java.job.notification.NotificationJob;
160 import org.apache.syncope.core.provisioning.java.notification.DefaultNotificationManager;
161 import org.apache.syncope.core.provisioning.java.propagation.DefaultPropagationManager;
162 import org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor;
163 import org.apache.syncope.core.provisioning.java.pushpull.InboundMatcher;
164 import org.apache.syncope.core.provisioning.java.pushpull.OutboundMatcher;
165 import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
166 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
167 import org.apache.syncope.core.spring.security.DefaultCredentialChecker;
168 import org.apache.syncope.core.spring.security.PasswordGenerator;
169 import org.apache.syncope.core.spring.security.SecurityProperties;
170 import org.apache.syncope.core.spring.security.jws.AccessTokenJWSSigner;
171 import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
172 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
173 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
174 import org.springframework.beans.factory.annotation.Qualifier;
175 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
176 import org.springframework.boot.context.properties.EnableConfigurationProperties;
177 import org.springframework.context.ApplicationContext;
178 import org.springframework.context.ApplicationEventPublisher;
179 import org.springframework.context.annotation.Bean;
180 import org.springframework.context.annotation.Configuration;
181 import org.springframework.context.annotation.DependsOn;
182 import org.springframework.context.annotation.Lazy;
183 import org.springframework.context.annotation.Primary;
184 import org.springframework.core.io.ClassPathResource;
185 import org.springframework.core.task.AsyncTaskExecutor;
186 import org.springframework.core.task.support.TaskExecutorAdapter;
187 import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
188 import org.springframework.mail.javamail.JavaMailSender;
189 import org.springframework.scheduling.annotation.AsyncConfigurer;
190 import org.springframework.scheduling.annotation.EnableAsync;
191 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
192 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
193 import org.springframework.transaction.PlatformTransactionManager;
194 
195 @EnableAsync
196 @EnableConfigurationProperties(ProvisioningProperties.class)
197 @Configuration(proxyBeanMethods = false)
198 public class ProvisioningContext {
199 
200     @ConditionalOnMissingBean
201     @Bean
202     public AsyncConnectorFacade asyncConnectorFacade() {
203         return new AsyncConnectorFacade();
204     }
205 
206     /**
207      * Annotated as {@code @Primary} because it will be used by {@code @Async} in {@link AsyncConnectorFacade}.
208      *
209      * @param props configuration properties
210      * @return executor
211      */
212     @Bean
213     @Primary
214     public ThreadPoolTaskExecutor asyncConnectorFacadeExecutor(final ProvisioningProperties props) {
215         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
216         executor.setCorePoolSize(props.getAsyncConnectorFacadeExecutor().getCorePoolSize());
217         executor.setMaxPoolSize(props.getAsyncConnectorFacadeExecutor().getMaxPoolSize());
218         executor.setQueueCapacity(props.getAsyncConnectorFacadeExecutor().getQueueCapacity());
219         executor.setAwaitTerminationSeconds(props.getAsyncConnectorFacadeExecutor().getAwaitTerminationSeconds());
220         executor.setWaitForTasksToCompleteOnShutdown(true);
221         executor.setThreadNamePrefix("AsyncConnectorFacadeExecutor-");
222         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
223         executor.initialize();
224         return executor;
225     }
226 
227     @Bean
228     public AsyncConfigurer asyncConfigurer(
229             @Qualifier("asyncConnectorFacadeExecutor")
230             final ThreadPoolTaskExecutor asyncConnectorFacadeExecutor) {
231 
232         return new AsyncConfigurer() {
233 
234             @Override
235             public Executor getAsyncExecutor() {
236                 return asyncConnectorFacadeExecutor;
237             }
238         };
239     }
240 
241     /**
242      * This is a special thread executor that only created a single worker thread.
243      * This is necessary to allow job status update operations to queue up serially
244      * and not via multiple threads to avoid the "lost update" problem.
245      *
246      * @return the async task executor
247      */
248     @Bean
249     public AsyncTaskExecutor jobStatusUpdaterThreadExecutor() {
250         return new TaskExecutorAdapter(Executors.newSingleThreadExecutor());
251     }
252 
253     /**
254      * Used by {@link org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor}.
255      *
256      * @param props the provisioning properties
257      * @return executor thread pool task executor
258      */
259     @Bean
260     public ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor(final ProvisioningProperties props) {
261         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
262         executor.setCorePoolSize(props.getPropagationTaskExecutorAsyncExecutor().getCorePoolSize());
263         executor.setMaxPoolSize(props.getPropagationTaskExecutorAsyncExecutor().getMaxPoolSize());
264         executor.setQueueCapacity(props.getPropagationTaskExecutorAsyncExecutor().getQueueCapacity());
265         executor.setWaitForTasksToCompleteOnShutdown(true);
266         executor.setAwaitTerminationSeconds(
267                 props.getPropagationTaskExecutorAsyncExecutor().getAwaitTerminationSeconds());
268         executor.setThreadNamePrefix("PropagationTaskExecutor-");
269         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
270         executor.initialize();
271         return executor;
272     }
273 
274     @Bean
275     public SchedulerDBInit quartzDataSourceInit(
276             @Qualifier("MasterDataSource")
277             final DataSource masterDataSource,
278             final ProvisioningProperties props) {
279 
280         SchedulerDBInit init = new SchedulerDBInit();
281         init.setDataSource(masterDataSource);
282 
283         ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
284         databasePopulator.setContinueOnError(true);
285         databasePopulator.setIgnoreFailedDrops(true);
286         databasePopulator.setSqlScriptEncoding(StandardCharsets.UTF_8.name());
287         databasePopulator.setScripts(new ClassPathResource("/quartz/" + props.getQuartz().getSql()));
288         init.setDatabasePopulator(databasePopulator);
289 
290         return init;
291     }
292 
293     @DependsOn("quartzDataSourceInit")
294     @Lazy(false)
295     @Bean
296     public SchedulerFactoryBean scheduler(
297             @Qualifier("MasterDataSource")
298             final DataSource masterDataSource,
299             @Qualifier("MasterTransactionManager")
300             final PlatformTransactionManager masterTransactionManager,
301             final ProvisioningProperties props,
302             final ApplicationContext ctx) {
303 
304         SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
305         scheduler.setAutoStartup(true);
306         scheduler.setApplicationContext(ctx);
307         scheduler.setWaitForJobsToCompleteOnShutdown(props.getQuartz().isWaitForJobsToCompleteOnShutdown());
308         scheduler.setOverwriteExistingJobs(true);
309         scheduler.setDataSource(masterDataSource);
310         scheduler.setTransactionManager(masterTransactionManager);
311         scheduler.setJobFactory(new SyncopeSpringBeanJobFactory());
312 
313         Properties quartzProperties = new Properties();
314         quartzProperties.setProperty(
315                 "org.quartz.scheduler.idleWaitTime",
316                 String.valueOf(props.getQuartz().getIdleWaitTime()));
317         quartzProperties.setProperty(
318                 "org.quartz.jobStore.misfireThreshold",
319                 String.valueOf(props.getQuartz().getMisfireThreshold()));
320         quartzProperties.setProperty(
321                 "org.quartz.jobStore.driverDelegateClass",
322                 props.getQuartz().getDelegate().getName());
323         quartzProperties.setProperty(
324                 "org.quartz.jobStore.class",
325                 "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
326         quartzProperties.setProperty("org.quartz.threadPool.makeThreadsDaemons", "true");
327         quartzProperties.setProperty("org.quartz.scheduler.makeSchedulerThreadDaemon", "true");
328         quartzProperties.setProperty("org.quartz.jobStore.isClustered", "true");
329         quartzProperties.setProperty("org.quartz.jobStore.clusterCheckinInterval", "20000");
330         quartzProperties.setProperty("org.quartz.scheduler.instanceName", "SyncopeClusteredScheduler");
331         quartzProperties.setProperty("org.quartz.scheduler.instanceId", "AUTO");
332         quartzProperties.setProperty("org.quartz.scheduler.jmx.export", "true");
333         scheduler.setQuartzProperties(quartzProperties);
334 
335         return scheduler;
336     }
337 
338     @ConditionalOnMissingBean
339     @Bean
340     public JobManager jobManager(
341             final ProvisioningProperties props,
342             final DomainHolder domainHolder,
343             final SecurityProperties securityProperties,
344             final SchedulerFactoryBean scheduler,
345             final TaskDAO taskDAO,
346             final ReportDAO reportDAO,
347             final ImplementationDAO implementationDAO,
348             final TaskUtilsFactory taskUtilsFactory,
349             final ConfParamOps confParamOps) {
350 
351         DefaultJobManager jobManager = new DefaultJobManager(
352                 domainHolder,
353                 scheduler,
354                 taskDAO,
355                 reportDAO,
356                 implementationDAO,
357                 taskUtilsFactory,
358                 confParamOps,
359                 securityProperties);
360         jobManager.setDisableQuartzInstance(props.getQuartz().isDisableInstance());
361         return jobManager;
362     }
363 
364     @ConditionalOnMissingBean
365     @Bean
366     public JobStatusUpdater jobStatusUpdater(final JobStatusDAO jobStatusDAO, final EntityFactory entityFactory) {
367         return new JobStatusUpdater(jobStatusDAO, entityFactory);
368     }
369 
370     @ConditionalOnMissingBean
371     @Bean
372     public ConnectorManager connectorManager(
373             final EntityFactory entityFactory,
374             final ConnIdBundleManager connIdBundleManager,
375             final RealmDAO realmDAO,
376             final ExternalResourceDAO resourceDAO,
377             final ConnInstanceDataBinder connInstanceDataBinder,
378             final AsyncConnectorFacade asyncConnectorFacade) {
379 
380         return new DefaultConnectorManager(
381                 connIdBundleManager,
382                 realmDAO,
383                 resourceDAO,
384                 connInstanceDataBinder,
385                 asyncConnectorFacade,
386                 entityFactory);
387     }
388 
389     @ConditionalOnMissingBean
390     @Bean
391     public ConnectorLoader connectorLoader(final ConnectorManager connectorManager) {
392         return new ConnectorLoader(connectorManager);
393     }
394 
395     @ConditionalOnMissingBean
396     @Bean
397     public InboundMatcher inboundMatcher(
398             final AnyUtilsFactory anyUtilsFactory,
399             final UserDAO userDAO,
400             final AnyObjectDAO anyObjectDAO,
401             final GroupDAO groupDAO,
402             final AnySearchDAO anySearchDAO,
403             final RealmDAO realmDAO,
404             final VirSchemaDAO virSchemaDAO,
405             final ImplementationDAO implementationDAO,
406             final VirAttrHandler virAttrHandler,
407             final IntAttrNameParser intAttrNameParser) {
408 
409         return new InboundMatcher(
410                 userDAO,
411                 anyObjectDAO,
412                 groupDAO,
413                 anySearchDAO,
414                 realmDAO,
415                 virSchemaDAO,
416                 implementationDAO,
417                 virAttrHandler,
418                 intAttrNameParser,
419                 anyUtilsFactory);
420     }
421 
422     @ConditionalOnMissingBean
423     @Bean
424     public OutboundMatcher outboundMatcher(
425             final AnyUtilsFactory anyUtilsFactory,
426             final MappingManager mappingManager,
427             final UserDAO userDAO,
428             final VirSchemaDAO virSchemaDAO,
429             final VirAttrHandler virAttrHandler) {
430 
431         return new OutboundMatcher(mappingManager, userDAO, anyUtilsFactory, virSchemaDAO, virAttrHandler);
432     }
433 
434     @ConditionalOnMissingBean
435     @Bean
436     public DerAttrHandler derAttrHandler(final AnyUtilsFactory anyUtilsFactory) {
437         return new DefaultDerAttrHandler(anyUtilsFactory);
438     }
439 
440     @ConditionalOnMissingBean
441     @Bean
442     public VirAttrHandler virAttrHandler(
443             final AnyUtilsFactory anyUtilsFactory,
444             final ConnectorManager connectorManager,
445             final VirAttrCache virAttrCache,
446             @Lazy final OutboundMatcher outboundMatcher) {
447 
448         return new DefaultVirAttrHandler(connectorManager, virAttrCache, outboundMatcher, anyUtilsFactory);
449     }
450 
451     @ConditionalOnMissingBean
452     @Bean
453     public MappingManager mappingManager(
454             final AnyUtilsFactory anyUtilsFactory,
455             final AnyTypeDAO anyTypeDAO,
456             final UserDAO userDAO,
457             final AnyObjectDAO anyObjectDAO,
458             final GroupDAO groupDAO,
459             final RelationshipTypeDAO relationshipTypeDAO,
460             final RealmDAO realmDAO,
461             final ApplicationDAO applicationDAO,
462             final ImplementationDAO implementationDAO,
463             final DerAttrHandler derAttrHandler,
464             final VirAttrHandler virAttrHandler,
465             final VirAttrCache virAttrCache,
466             final IntAttrNameParser intAttrNameParser) {
467 
468         return new DefaultMappingManager(
469                 anyTypeDAO,
470                 userDAO,
471                 anyObjectDAO,
472                 groupDAO,
473                 relationshipTypeDAO,
474                 realmDAO,
475                 applicationDAO,
476                 implementationDAO,
477                 derAttrHandler,
478                 virAttrHandler,
479                 virAttrCache,
480                 anyUtilsFactory,
481                 intAttrNameParser);
482     }
483 
484     @ConditionalOnMissingBean
485     @Bean
486     public TemplateUtils templateUtils(final UserDAO userDAO, final GroupDAO groupDAO) {
487         return new TemplateUtils(userDAO, groupDAO);
488     }
489 
490     @ConditionalOnMissingBean
491     @Bean
492     public ConnObjectUtils connObjectUtils(
493             final PasswordGenerator passwordGenerator,
494             final AnyUtilsFactory anyUtilsFactory,
495             final MappingManager mappingManager,
496             final TemplateUtils templateUtils,
497             final RealmDAO realmDAO,
498             final UserDAO userDAO,
499             final ExternalResourceDAO resourceDAO) {
500 
501         return new ConnObjectUtils(
502                 templateUtils,
503                 realmDAO,
504                 userDAO,
505                 resourceDAO,
506                 passwordGenerator,
507                 mappingManager,
508                 anyUtilsFactory);
509     }
510 
511     @ConditionalOnMissingBean
512     @Bean
513     public PropagationManager propagationManager(
514             final EntityFactory entityFactory,
515             final AnyUtilsFactory anyUtilsFactory,
516             final VirSchemaDAO virSchemaDAO,
517             final ExternalResourceDAO resourceDAO,
518             final ConnObjectUtils connObjectUtils,
519             final MappingManager mappingManager,
520             final DerAttrHandler derAttrHandler) {
521 
522         return new DefaultPropagationManager(
523                 virSchemaDAO,
524                 resourceDAO,
525                 entityFactory,
526                 connObjectUtils,
527                 mappingManager,
528                 derAttrHandler,
529                 anyUtilsFactory);
530     }
531 
532     @ConditionalOnMissingBean
533     @Bean
534     public ConnIdBundleManager connIdBundleManager(final ProvisioningProperties props) {
535         return new DefaultConnIdBundleManager(props.getConnIdLocation());
536     }
537 
538     @ConditionalOnMissingBean
539     @Bean
540     public IntAttrNameParser intAttrNameParser(
541             final AnyUtilsFactory anyUtilsFactory,
542             final PlainSchemaDAO plainSchemaDAO,
543             final DerSchemaDAO derSchemaDAO,
544             final VirSchemaDAO virSchemaDAO) {
545 
546         return new IntAttrNameParser(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyUtilsFactory);
547     }
548 
549     @ConditionalOnMissingBean
550     @Bean
551     public PropagationTaskExecutor propagationTaskExecutor(
552             @Qualifier("propagationTaskExecutorAsyncExecutor")
553             final ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor,
554             final TaskUtilsFactory taskUtilsFactory,
555             final AnyUtilsFactory anyUtilsFactory,
556             final ConnectorManager connectorManager,
557             final ConnObjectUtils connObjectUtils,
558             final TaskDAO taskDAO,
559             final ExternalResourceDAO resourceDAO,
560             final PlainSchemaDAO plainSchemaDAO,
561             final NotificationManager notificationManager,
562             final AuditManager auditManager,
563             final TaskDataBinder taskDataBinder,
564             final OutboundMatcher outboundMatcher,
565             final PlainAttrValidationManager validator,
566             final ApplicationEventPublisher publisher) {
567 
568         return new PriorityPropagationTaskExecutor(
569                 connectorManager,
570                 connObjectUtils,
571                 taskDAO,
572                 resourceDAO,
573                 plainSchemaDAO,
574                 notificationManager,
575                 auditManager,
576                 taskDataBinder,
577                 anyUtilsFactory,
578                 taskUtilsFactory,
579                 outboundMatcher,
580                 validator,
581                 publisher,
582                 propagationTaskExecutorAsyncExecutor);
583     }
584 
585     @ConditionalOnMissingBean
586     @Bean
587     public UserProvisioningManager userProvisioningManager(
588             final UserWorkflowAdapter uwfAdapter,
589             final PropagationManager propagationManager,
590             final PropagationTaskExecutor taskExecutor,
591             final UserDAO userDAO,
592             final VirAttrHandler virtAttrHandler) {
593 
594         return new DefaultUserProvisioningManager(
595                 uwfAdapter,
596                 propagationManager,
597                 taskExecutor,
598                 userDAO,
599                 virtAttrHandler);
600     }
601 
602     @ConditionalOnMissingBean
603     @Bean
604     public GroupProvisioningManager groupProvisioningManager(
605             final GroupWorkflowAdapter gwfAdapter,
606             final PropagationManager propagationManager,
607             final PropagationTaskExecutor taskExecutor,
608             final GroupDataBinder groupDataBinder,
609             final GroupDAO groupDAO,
610             final VirAttrHandler virtAttrHandler) {
611 
612         return new DefaultGroupProvisioningManager(
613                 gwfAdapter,
614                 propagationManager,
615                 taskExecutor,
616                 groupDataBinder,
617                 groupDAO,
618                 virtAttrHandler);
619     }
620 
621     @ConditionalOnMissingBean
622     @Bean
623     public AnyObjectProvisioningManager anyObjectProvisioningManager(
624             final AnyObjectWorkflowAdapter awfAdapter,
625             final PropagationManager propagationManager,
626             final PropagationTaskExecutor taskExecutor,
627             final AnyObjectDAO anyObjectDAO,
628             final VirAttrHandler virtAttrHandler) {
629 
630         return new DefaultAnyObjectProvisioningManager(
631                 awfAdapter,
632                 propagationManager,
633                 taskExecutor,
634                 anyObjectDAO,
635                 virtAttrHandler);
636     }
637 
638     @ConditionalOnMissingBean
639     @Bean
640     public VirAttrCache virAttrCache(final ProvisioningProperties props) {
641         VirAttrCache virAttrCache = new CaffeineVirAttrCache();
642         virAttrCache.setCacheSpec(props.getVirAttrCacheSpec());
643         return virAttrCache;
644     }
645 
646     @ConditionalOnMissingBean
647     @Bean
648     public NotificationManager notificationManager(
649             final EntityFactory entityFactory,
650             final SearchCondVisitor searchCondVisitor,
651             final DerSchemaDAO derSchemaDAO,
652             final VirSchemaDAO virSchemaDAO,
653             final NotificationDAO notificationDAO,
654             final AnyObjectDAO anyObjectDAO,
655             final UserDAO userDAO,
656             final GroupDAO groupDAO,
657             final AnySearchDAO anySearchDAO,
658             final AnyMatchDAO anyMatchDAO,
659             final TaskDAO taskDAO,
660             final UserDataBinder userDataBinder,
661             final GroupDataBinder groupDataBinder,
662             final AnyObjectDataBinder anyObjectDataBinder,
663             final ConfParamOps confParamOps,
664             final DerAttrHandler derAttrHandler,
665             final VirAttrHandler virAttrHandler,
666             final IntAttrNameParser intAttrNameParser) {
667 
668         return new DefaultNotificationManager(
669                 derSchemaDAO,
670                 virSchemaDAO,
671                 notificationDAO,
672                 anyObjectDAO,
673                 userDAO,
674                 groupDAO,
675                 anySearchDAO,
676                 anyMatchDAO,
677                 taskDAO,
678                 derAttrHandler,
679                 virAttrHandler,
680                 userDataBinder,
681                 groupDataBinder,
682                 anyObjectDataBinder,
683                 confParamOps,
684                 entityFactory,
685                 intAttrNameParser,
686                 searchCondVisitor);
687     }
688 
689     @ConditionalOnMissingBean
690     @Bean
691     public AuditManager auditManager(final AuditConfDAO auditConfDAO) {
692         return new DefaultAuditManager(auditConfDAO);
693     }
694 
695     @ConditionalOnMissingBean
696     @Bean
697     public SystemLoadReporterJob systemLoadReporterJob(final ApplicationContext ctx) {
698         return new SystemLoadReporterJob(ctx);
699     }
700 
701     @ConditionalOnMissingBean
702     @Bean
703     public NotificationJobDelegate notificationJobDelegate(
704             final TaskUtilsFactory taskUtilsFactory,
705             final TaskDAO taskDAO,
706             final AuditManager auditManager,
707             final NotificationManager notificationManager,
708             final ApplicationEventPublisher publisher,
709             final JavaMailSender mailSender) {
710 
711         return new MailNotificationJobDelegate(
712                 taskDAO,
713                 taskUtilsFactory,
714                 auditManager,
715                 notificationManager,
716                 publisher,
717                 mailSender);
718     }
719 
720     @ConditionalOnMissingBean
721     @Bean
722     public NotificationJob notificationJob(
723             final NotificationJobDelegate delegate,
724             final DomainHolder domainHolder,
725             final SecurityProperties securityProperties) {
726 
727         return new NotificationJob(securityProperties, domainHolder, delegate);
728     }
729 
730     @ConditionalOnMissingBean
731     @Bean
732     public AccessTokenDataBinder accessTokenDataBinder(
733             final EntityFactory entityFactory,
734             final SecurityProperties securityProperties,
735             final AccessTokenJWSSigner jwsSigner,
736             final AccessTokenDAO accessTokenDAO,
737             final ConfParamOps confParamOps,
738             final DefaultCredentialChecker credentialChecker) {
739 
740         return new AccessTokenDataBinderImpl(
741                 securityProperties,
742                 jwsSigner,
743                 accessTokenDAO,
744                 confParamOps,
745                 entityFactory,
746                 credentialChecker);
747     }
748 
749     @ConditionalOnMissingBean
750     @Bean
751     public AnyObjectDataBinder anyObjectDataBinder(
752             final EntityFactory entityFactory,
753             final AnyUtilsFactory anyUtilsFactory,
754             final AnyTypeDAO anyTypeDAO,
755             final RealmDAO realmDAO,
756             final AnyTypeClassDAO anyTypeClassDAO,
757             final AnyObjectDAO anyObjectDAO,
758             final UserDAO userDAO,
759             final GroupDAO groupDAO,
760             final PlainSchemaDAO plainSchemaDAO,
761             final PlainAttrDAO plainAttrDAO,
762             final PlainAttrValueDAO plainAttrValueDAO,
763             final ExternalResourceDAO resourceDAO,
764             final RelationshipTypeDAO relationshipTypeDAO,
765             final DerAttrHandler derAttrHandler,
766             final VirAttrHandler virAttrHandler,
767             final MappingManager mappingManager,
768             final IntAttrNameParser intAttrNameParser,
769             final OutboundMatcher outboundMatcher,
770             final PlainAttrValidationManager validator) {
771 
772         return new AnyObjectDataBinderImpl(
773                 anyTypeDAO,
774                 realmDAO,
775                 anyTypeClassDAO,
776                 anyObjectDAO,
777                 userDAO,
778                 groupDAO,
779                 plainSchemaDAO,
780                 plainAttrDAO,
781                 plainAttrValueDAO,
782                 resourceDAO,
783                 relationshipTypeDAO,
784                 entityFactory,
785                 anyUtilsFactory,
786                 derAttrHandler,
787                 virAttrHandler,
788                 mappingManager,
789                 intAttrNameParser,
790                 outboundMatcher,
791                 validator);
792     }
793 
794     @ConditionalOnMissingBean
795     @Bean
796     public AnyTypeClassDataBinder anyTypeClassDataBinder(
797             final EntityFactory entityFactory,
798             final PlainSchemaDAO plainSchemaDAO,
799             final DerSchemaDAO derSchemaDAO,
800             final VirSchemaDAO virSchemaDAO,
801             final AnyTypeDAO anyTypeDAO) {
802 
803         return new AnyTypeClassDataBinderImpl(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeDAO, entityFactory);
804     }
805 
806     @ConditionalOnMissingBean
807     @Bean
808     public AnyTypeDataBinder anyTypeDataBinder(
809             final EntityFactory entityFactory,
810             final SecurityProperties securityProperties,
811             final AnyTypeDAO anyTypeDAO,
812             final AnyTypeClassDAO anyTypeClassDAO,
813             final AccessTokenDAO accessTokenDAO) {
814 
815         return new AnyTypeDataBinderImpl(
816                 securityProperties,
817                 anyTypeDAO,
818                 anyTypeClassDAO,
819                 accessTokenDAO,
820                 entityFactory);
821     }
822 
823     @ConditionalOnMissingBean
824     @Bean
825     public ApplicationDataBinder applicationDataBinder(
826             final ApplicationDAO applicationDAO,
827             final EntityFactory entityFactory) {
828 
829         return new ApplicationDataBinderImpl(applicationDAO, entityFactory);
830     }
831 
832     @ConditionalOnMissingBean
833     @Bean
834     public AuditDataBinder auditDataBinder() {
835         return new AuditDataBinderImpl();
836     }
837 
838     @ConditionalOnMissingBean
839     @Bean
840     public AuthModuleDataBinder authModuleDataBinder(final EntityFactory entityFactory) {
841         return new AuthModuleDataBinderImpl(entityFactory);
842     }
843 
844     @ConditionalOnMissingBean
845     @Bean
846     public AttrRepoDataBinder attrRepoDataBinder(final EntityFactory entityFactory) {
847         return new AttrRepoDataBinderImpl(entityFactory);
848     }
849 
850     @ConditionalOnMissingBean
851     @Bean
852     public AuthProfileDataBinder authProfileDataBinder(final EntityFactory entityFactory) {
853         return new AuthProfileDataBinderImpl(entityFactory);
854     }
855 
856     @ConditionalOnMissingBean
857     @Bean
858     public ClientAppDataBinder clientAppDataBinder(
859             final PolicyDAO policyDAO,
860             final RealmDAO realmDAO,
861             final EntityFactory entityFactory) {
862 
863         return new ClientAppDataBinderImpl(policyDAO, realmDAO, entityFactory);
864     }
865 
866     @ConditionalOnMissingBean
867     @Bean
868     public ConnInstanceDataBinder connInstanceDataBinder(
869             final EntityFactory entityFactory,
870             final ConnIdBundleManager connIdBundleManager,
871             final ConnInstanceDAO connInstanceDAO,
872             final RealmDAO realmDAO) {
873 
874         return new ConnInstanceDataBinderImpl(connIdBundleManager, connInstanceDAO, realmDAO, entityFactory);
875     }
876 
877     @ConditionalOnMissingBean
878     @Bean
879     public DelegationDataBinder delegationDataBinder(
880             final UserDAO userDAO,
881             final RoleDAO roleDAO,
882             final EntityFactory entityFactory) {
883 
884         return new DelegationDataBinderImpl(userDAO, roleDAO, entityFactory);
885     }
886 
887     @ConditionalOnMissingBean
888     @Bean
889     public FIQLQueryDataBinder fiqlQueryDataBinder(
890             final SearchCondVisitor searchCondVisitor,
891             final UserDAO userDAO,
892             final EntityFactory entityFactory) {
893 
894         return new FIQLQueryDataBinderImpl(searchCondVisitor, userDAO, entityFactory);
895     }
896 
897     @ConditionalOnMissingBean
898     @Bean
899     public DynRealmDataBinder dynRealmDataBinder(
900             final AnyTypeDAO anyTypeDAO,
901             final DynRealmDAO dynRealmDAO,
902             final SearchCondVisitor searchCondVisitor,
903             final EntityFactory entityFactory) {
904 
905         return new DynRealmDataBinderImpl(anyTypeDAO, dynRealmDAO, entityFactory, searchCondVisitor);
906     }
907 
908     @ConditionalOnMissingBean
909     @Bean
910     public GroupDataBinder groupDataBinder(
911             final EntityFactory entityFactory,
912             final SearchCondVisitor searchCondVisitor,
913             final AnyUtilsFactory anyUtilsFactory,
914             final AnyTypeDAO anyTypeDAO,
915             final RealmDAO realmDAO,
916             final AnyTypeClassDAO anyTypeClassDAO,
917             final AnyObjectDAO anyObjectDAO,
918             final UserDAO userDAO,
919             final GroupDAO groupDAO,
920             final PlainSchemaDAO plainSchemaDAO,
921             final PlainAttrDAO plainAttrDAO,
922             final PlainAttrValueDAO plainAttrValueDAO,
923             final ExternalResourceDAO resourceDAO,
924             final RelationshipTypeDAO relationshipTypeDAO,
925             final DerAttrHandler derAttrHandler,
926             final VirAttrHandler virAttrHandler,
927             final MappingManager mappingManager,
928             final IntAttrNameParser intAttrNameParser,
929             final OutboundMatcher outboundMatcher,
930             final PlainAttrValidationManager validator) {
931 
932         return new GroupDataBinderImpl(
933                 anyTypeDAO,
934                 realmDAO,
935                 anyTypeClassDAO,
936                 anyObjectDAO,
937                 userDAO,
938                 groupDAO,
939                 plainSchemaDAO,
940                 plainAttrDAO,
941                 plainAttrValueDAO,
942                 resourceDAO,
943                 relationshipTypeDAO,
944                 entityFactory,
945                 anyUtilsFactory,
946                 derAttrHandler,
947                 virAttrHandler,
948                 mappingManager,
949                 intAttrNameParser,
950                 outboundMatcher,
951                 searchCondVisitor,
952                 validator);
953     }
954 
955     @ConditionalOnMissingBean
956     @Bean
957     public ImplementationDataBinder implementationDataBinder(final EntityFactory entityFactory) {
958         return new ImplementationDataBinderImpl(entityFactory);
959     }
960 
961     @ConditionalOnMissingBean
962     @Bean
963     public NotificationDataBinder notificationDataBinder(
964             final EntityFactory entityFactory,
965             final MailTemplateDAO mailTemplateDAO,
966             final AnyTypeDAO anyTypeDAO,
967             final ImplementationDAO implementationDAO,
968             final IntAttrNameParser intAttrNameParser) {
969 
970         return new NotificationDataBinderImpl(
971                 mailTemplateDAO,
972                 anyTypeDAO,
973                 implementationDAO,
974                 entityFactory,
975                 intAttrNameParser);
976 
977     }
978 
979     @ConditionalOnMissingBean
980     @Bean
981     public OIDCJWKSDataBinder oidcJWKSDataBinder(final EntityFactory entityFactory) {
982         return new OIDCJWKSDataBinderImpl(entityFactory);
983     }
984 
985     @ConditionalOnMissingBean
986     @Bean
987     public PolicyDataBinder policyDataBinder(
988             final EntityFactory entityFactory,
989             final ExternalResourceDAO resourceDAO,
990             final RealmDAO realmDAO,
991             final AnyTypeDAO anyTypeDAO,
992             final ImplementationDAO implementationDAO) {
993 
994         return new PolicyDataBinderImpl(resourceDAO, realmDAO, anyTypeDAO, implementationDAO, entityFactory);
995     }
996 
997     @ConditionalOnMissingBean
998     @Bean
999     public RealmDataBinder realmDataBinder(
1000             final EntityFactory entityFactory,
1001             final AnyTypeDAO anyTypeDAO,
1002             final ImplementationDAO implementationDAO,
1003             final RealmDAO realmDAO,
1004             final PolicyDAO policyDAO,
1005             final ExternalResourceDAO resourceDAO) {
1006 
1007         return new RealmDataBinderImpl(
1008                 anyTypeDAO,
1009                 implementationDAO,
1010                 realmDAO,
1011                 policyDAO,
1012                 resourceDAO,
1013                 entityFactory);
1014     }
1015 
1016     @ConditionalOnMissingBean
1017     @Bean
1018     public RelationshipTypeDataBinder relationshipTypeDataBinder(final EntityFactory entityFactory) {
1019         return new RelationshipTypeDataBinderImpl(entityFactory);
1020     }
1021 
1022     @ConditionalOnMissingBean
1023     @Bean
1024     public RemediationDataBinder remediationDataBinder() {
1025         return new RemediationDataBinderImpl();
1026     }
1027 
1028     @ConditionalOnMissingBean
1029     @Bean
1030     public ReportDataBinder reportDataBinder(
1031             final ReportExecDAO reportExecDAO,
1032             final ImplementationDAO implementationDAO,
1033             final SchedulerFactoryBean scheduler) {
1034 
1035         return new ReportDataBinderImpl(reportExecDAO, implementationDAO, scheduler);
1036     }
1037 
1038     @ConditionalOnMissingBean
1039     @Bean
1040     public ResourceDataBinder resourceDataBinder(
1041             final EntityFactory entityFactory,
1042             final AnyTypeDAO anyTypeDAO,
1043             final ConnInstanceDAO connInstanceDAO,
1044             final PolicyDAO policyDAO,
1045             final VirSchemaDAO virSchemaDAO,
1046             final AnyTypeClassDAO anyTypeClassDAO,
1047             final ImplementationDAO implementationDAO,
1048             final PlainSchemaDAO plainSchemaDAO,
1049             final IntAttrNameParser intAttrNameParser,
1050             final PropagationTaskExecutor propagationTaskExecutor) {
1051 
1052         return new ResourceDataBinderImpl(
1053                 anyTypeDAO,
1054                 connInstanceDAO,
1055                 policyDAO,
1056                 virSchemaDAO,
1057                 anyTypeClassDAO,
1058                 implementationDAO,
1059                 plainSchemaDAO,
1060                 entityFactory,
1061                 intAttrNameParser,
1062                 propagationTaskExecutor);
1063     }
1064 
1065     @ConditionalOnMissingBean
1066     @Bean
1067     public RoleDataBinder roleDataBinder(
1068             final EntityFactory entityFactory,
1069             final SearchCondVisitor searchCondVisitor,
1070             final RealmDAO realmDAO,
1071             final DynRealmDAO dynRealmDAO,
1072             final RoleDAO roleDAO,
1073             final ApplicationDAO applicationDAO) {
1074 
1075         return new RoleDataBinderImpl(realmDAO, dynRealmDAO, roleDAO, applicationDAO, entityFactory, searchCondVisitor);
1076     }
1077 
1078     @ConditionalOnMissingBean
1079     @Bean
1080     public SAML2IdPEntityDataBinder saml2IdPEntityDataBinder(final EntityFactory entityFactory) {
1081         return new SAML2IdPEntityDataBinderImpl(entityFactory);
1082     }
1083 
1084     @ConditionalOnMissingBean
1085     @Bean
1086     public SAML2SPEntityDataBinder saml2SPEntityDataBinder(final EntityFactory entityFactory) {
1087         return new SAML2SPEntityDataBinderImpl(entityFactory);
1088     }
1089 
1090     @ConditionalOnMissingBean
1091     @Bean
1092     public SRARouteDataBinder sraRouteDataBinder() {
1093         return new SRARouteDataBinderImpl();
1094     }
1095 
1096     @ConditionalOnMissingBean
1097     @Bean
1098     public SchemaDataBinder schemaDataBinder(
1099             final EntityFactory entityFactory,
1100             final AnyUtilsFactory anyUtilsFactory,
1101             final AnyTypeClassDAO anyTypeClassDAO,
1102             final PlainSchemaDAO plainSchemaDAO,
1103             final DerSchemaDAO derSchemaDAO,
1104             final VirSchemaDAO virSchemaDAO,
1105             final ExternalResourceDAO resourceDAO,
1106             final AnyTypeDAO anyTypeDAO,
1107             final ImplementationDAO implementationDAO) {
1108 
1109         return new SchemaDataBinderImpl(
1110                 anyTypeClassDAO,
1111                 plainSchemaDAO,
1112                 derSchemaDAO,
1113                 virSchemaDAO,
1114                 resourceDAO,
1115                 anyTypeDAO,
1116                 implementationDAO,
1117                 entityFactory,
1118                 anyUtilsFactory);
1119     }
1120 
1121     @ConditionalOnMissingBean
1122     @Bean
1123     public SecurityQuestionDataBinder securityQuestionDataBinder(final EntityFactory entityFactory) {
1124         return new SecurityQuestionDataBinderImpl(entityFactory);
1125     }
1126 
1127     @ConditionalOnMissingBean
1128     @Bean
1129     public TaskDataBinder taskDataBinder(
1130             final EntityFactory entityFactory,
1131             final TaskUtilsFactory taskUtilsFactory,
1132             final RealmDAO realmDAO,
1133             final ExternalResourceDAO resourceDAO,
1134             final TaskExecDAO taskExecDAO,
1135             final AnyTypeDAO anyTypeDAO,
1136             final ImplementationDAO implementationDAO,
1137             final SchedulerFactoryBean scheduler) {
1138 
1139         return new TaskDataBinderImpl(
1140                 realmDAO,
1141                 resourceDAO,
1142                 taskExecDAO,
1143                 anyTypeDAO,
1144                 implementationDAO,
1145                 entityFactory,
1146                 scheduler,
1147                 taskUtilsFactory);
1148     }
1149 
1150     @ConditionalOnMissingBean
1151     @Bean
1152     public UserDataBinder userDataBinder(
1153             final EntityFactory entityFactory,
1154             final AnyUtilsFactory anyUtilsFactory,
1155             final SecurityProperties securityProperties,
1156             final AnyTypeDAO anyTypeDAO,
1157             final RealmDAO realmDAO,
1158             final AnyTypeClassDAO anyTypeClassDAO,
1159             final AnyObjectDAO anyObjectDAO,
1160             final UserDAO userDAO,
1161             final GroupDAO groupDAO,
1162             final PlainSchemaDAO plainSchemaDAO,
1163             final PlainAttrDAO plainAttrDAO,
1164             final PlainAttrValueDAO plainAttrValueDAO,
1165             final ExternalResourceDAO resourceDAO,
1166             final RelationshipTypeDAO relationshipTypeDAO,
1167             final DerAttrHandler derAttrHandler,
1168             final VirAttrHandler virAttrHandler,
1169             final MappingManager mappingManager,
1170             final IntAttrNameParser intAttrNameParser,
1171             final OutboundMatcher outboundMatcher,
1172             final PlainAttrValidationManager validator,
1173             final RoleDAO roleDAO,
1174             final SecurityQuestionDAO securityQuestionDAO,
1175             final ApplicationDAO applicationDAO,
1176             final AccessTokenDAO accessTokenDAO,
1177             final DelegationDAO delegationDAO,
1178             final ConfParamOps confParamOps) {
1179 
1180         return new UserDataBinderImpl(
1181                 anyTypeDAO,
1182                 realmDAO,
1183                 anyTypeClassDAO,
1184                 anyObjectDAO,
1185                 userDAO,
1186                 groupDAO,
1187                 plainSchemaDAO,
1188                 plainAttrDAO,
1189                 plainAttrValueDAO,
1190                 resourceDAO,
1191                 relationshipTypeDAO,
1192                 entityFactory,
1193                 anyUtilsFactory,
1194                 derAttrHandler,
1195                 virAttrHandler,
1196                 mappingManager,
1197                 intAttrNameParser,
1198                 outboundMatcher,
1199                 validator,
1200                 roleDAO,
1201                 securityQuestionDAO,
1202                 applicationDAO,
1203                 accessTokenDAO,
1204                 delegationDAO,
1205                 confParamOps,
1206                 securityProperties);
1207     }
1208 
1209     @ConditionalOnMissingBean
1210     @Bean
1211     public WAConfigDataBinder waConfigDataBinder(
1212             final WAConfigDAO waConfigDAO,
1213             final EntityFactory entityFactory) {
1214 
1215         return new WAConfigDataBinderImpl(waConfigDAO, entityFactory);
1216     }
1217 
1218     @ConditionalOnMissingBean
1219     @Bean
1220     public WAClientAppDataBinder waClientAppDataBinder(
1221             final ClientAppDataBinder clientAppDataBinder,
1222             final PolicyDataBinder policyDataBinder,
1223             final AuthModuleDataBinder authModuleDataBinder,
1224             final AuthModuleDAO authModuleDAO) {
1225 
1226         return new WAClientAppDataBinderImpl(
1227                 clientAppDataBinder,
1228                 policyDataBinder,
1229                 authModuleDataBinder,
1230                 authModuleDAO);
1231     }
1232 }