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