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.persistence.jpa;
20  
21  import java.util.HashMap;
22  import java.util.Map;
23  import javax.persistence.ValidationMode;
24  import javax.validation.Validator;
25  import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
26  import org.apache.syncope.common.keymaster.client.api.DomainOps;
27  import org.apache.syncope.core.persistence.api.DomainHolder;
28  import org.apache.syncope.core.persistence.api.DomainRegistry;
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.AttrRepoDAO;
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.AuthProfileDAO;
41  import org.apache.syncope.core.persistence.api.dao.BatchDAO;
42  import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
43  import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
44  import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
45  import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
46  import org.apache.syncope.core.persistence.api.dao.DynRealmDAO;
47  import org.apache.syncope.core.persistence.api.dao.EntityCacheDAO;
48  import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
49  import org.apache.syncope.core.persistence.api.dao.FIQLQueryDAO;
50  import org.apache.syncope.core.persistence.api.dao.GroupDAO;
51  import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
52  import org.apache.syncope.core.persistence.api.dao.JobStatusDAO;
53  import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
54  import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
55  import org.apache.syncope.core.persistence.api.dao.OIDCJWKSDAO;
56  import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
57  import org.apache.syncope.core.persistence.api.dao.PersistenceInfoDAO;
58  import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
59  import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
60  import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
61  import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
62  import org.apache.syncope.core.persistence.api.dao.RealmDAO;
63  import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
64  import org.apache.syncope.core.persistence.api.dao.RemediationDAO;
65  import org.apache.syncope.core.persistence.api.dao.ReportDAO;
66  import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
67  import org.apache.syncope.core.persistence.api.dao.RoleDAO;
68  import org.apache.syncope.core.persistence.api.dao.SAML2IdPEntityDAO;
69  import org.apache.syncope.core.persistence.api.dao.SAML2SPClientAppDAO;
70  import org.apache.syncope.core.persistence.api.dao.SAML2SPEntityDAO;
71  import org.apache.syncope.core.persistence.api.dao.SRARouteDAO;
72  import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
73  import org.apache.syncope.core.persistence.api.dao.TaskDAO;
74  import org.apache.syncope.core.persistence.api.dao.TaskExecDAO;
75  import org.apache.syncope.core.persistence.api.dao.UserDAO;
76  import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
77  import org.apache.syncope.core.persistence.api.dao.WAConfigDAO;
78  import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
79  import org.apache.syncope.core.persistence.api.entity.EntityFactory;
80  import org.apache.syncope.core.persistence.api.entity.am.ClientAppUtilsFactory;
81  import org.apache.syncope.core.persistence.api.entity.policy.PolicyUtilsFactory;
82  import org.apache.syncope.core.persistence.api.entity.task.TaskUtilsFactory;
83  import org.apache.syncope.core.persistence.api.search.SearchCondVisitor;
84  import org.apache.syncope.core.persistence.jpa.attrvalue.validation.DefaultPlainAttrValidationManager;
85  import org.apache.syncope.core.persistence.jpa.content.KeymasterConfParamLoader;
86  import org.apache.syncope.core.persistence.jpa.content.XMLContentExporter;
87  import org.apache.syncope.core.persistence.jpa.content.XMLContentLoader;
88  import org.apache.syncope.core.persistence.jpa.dao.JPAAccessTokenDAO;
89  import org.apache.syncope.core.persistence.jpa.dao.JPAAnyMatchDAO;
90  import org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO;
91  import org.apache.syncope.core.persistence.jpa.dao.JPAAnySearchDAO;
92  import org.apache.syncope.core.persistence.jpa.dao.JPAAnyTypeClassDAO;
93  import org.apache.syncope.core.persistence.jpa.dao.JPAAnyTypeDAO;
94  import org.apache.syncope.core.persistence.jpa.dao.JPAApplicationDAO;
95  import org.apache.syncope.core.persistence.jpa.dao.JPAAttrRepoDAO;
96  import org.apache.syncope.core.persistence.jpa.dao.JPAAuditConfDAO;
97  import org.apache.syncope.core.persistence.jpa.dao.JPAAuthModuleDAO;
98  import org.apache.syncope.core.persistence.jpa.dao.JPAAuthProfileDAO;
99  import org.apache.syncope.core.persistence.jpa.dao.JPABatchDAO;
100 import org.apache.syncope.core.persistence.jpa.dao.JPACASSPClientAppDAO;
101 import org.apache.syncope.core.persistence.jpa.dao.JPAConnInstanceDAO;
102 import org.apache.syncope.core.persistence.jpa.dao.JPADelegationDAO;
103 import org.apache.syncope.core.persistence.jpa.dao.JPADerSchemaDAO;
104 import org.apache.syncope.core.persistence.jpa.dao.JPADynRealmDAO;
105 import org.apache.syncope.core.persistence.jpa.dao.JPAEntityCacheDAO;
106 import org.apache.syncope.core.persistence.jpa.dao.JPAExternalResourceDAO;
107 import org.apache.syncope.core.persistence.jpa.dao.JPAFIQLQueryDAO;
108 import org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO;
109 import org.apache.syncope.core.persistence.jpa.dao.JPAImplementationDAO;
110 import org.apache.syncope.core.persistence.jpa.dao.JPAJobStatusDAO;
111 import org.apache.syncope.core.persistence.jpa.dao.JPAMailTemplateDAO;
112 import org.apache.syncope.core.persistence.jpa.dao.JPANotificationDAO;
113 import org.apache.syncope.core.persistence.jpa.dao.JPAOIDCJWKSDAO;
114 import org.apache.syncope.core.persistence.jpa.dao.JPAOIDCRPClientAppDAO;
115 import org.apache.syncope.core.persistence.jpa.dao.JPAPersistenceInfoDAO;
116 import org.apache.syncope.core.persistence.jpa.dao.JPAPlainAttrDAO;
117 import org.apache.syncope.core.persistence.jpa.dao.JPAPlainAttrValueDAO;
118 import org.apache.syncope.core.persistence.jpa.dao.JPAPlainSchemaDAO;
119 import org.apache.syncope.core.persistence.jpa.dao.JPAPolicyDAO;
120 import org.apache.syncope.core.persistence.jpa.dao.JPARealmDAO;
121 import org.apache.syncope.core.persistence.jpa.dao.JPARelationshipTypeDAO;
122 import org.apache.syncope.core.persistence.jpa.dao.JPARemediationDAO;
123 import org.apache.syncope.core.persistence.jpa.dao.JPAReportDAO;
124 import org.apache.syncope.core.persistence.jpa.dao.JPAReportExecDAO;
125 import org.apache.syncope.core.persistence.jpa.dao.JPARoleDAO;
126 import org.apache.syncope.core.persistence.jpa.dao.JPASAML2IdPEntityDAO;
127 import org.apache.syncope.core.persistence.jpa.dao.JPASAML2SPClientAppDAO;
128 import org.apache.syncope.core.persistence.jpa.dao.JPASAML2SPEntityDAO;
129 import org.apache.syncope.core.persistence.jpa.dao.JPASRARouteDAO;
130 import org.apache.syncope.core.persistence.jpa.dao.JPASecurityQuestionDAO;
131 import org.apache.syncope.core.persistence.jpa.dao.JPATaskDAO;
132 import org.apache.syncope.core.persistence.jpa.dao.JPATaskExecDAO;
133 import org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO;
134 import org.apache.syncope.core.persistence.jpa.dao.JPAVirSchemaDAO;
135 import org.apache.syncope.core.persistence.jpa.dao.JPAWAConfigDAO;
136 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
137 import org.apache.syncope.core.persistence.jpa.entity.JPAEntityFactory;
138 import org.apache.syncope.core.persistence.jpa.entity.am.JPAClientAppUtilsFactory;
139 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPolicyUtilsFactory;
140 import org.apache.syncope.core.persistence.jpa.entity.task.JPATaskUtilsFactory;
141 import org.apache.syncope.core.persistence.jpa.spring.CommonEntityManagerFactoryConf;
142 import org.apache.syncope.core.persistence.jpa.spring.DomainTransactionInterceptorInjector;
143 import org.apache.syncope.core.persistence.jpa.spring.MultiJarAwarePersistenceUnitPostProcessor;
144 import org.apache.syncope.core.spring.security.SecurityProperties;
145 import org.slf4j.Logger;
146 import org.slf4j.LoggerFactory;
147 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
148 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
149 import org.springframework.boot.context.properties.EnableConfigurationProperties;
150 import org.springframework.context.ApplicationEventPublisher;
151 import org.springframework.context.ConfigurableApplicationContext;
152 import org.springframework.context.annotation.Bean;
153 import org.springframework.context.annotation.Configuration;
154 import org.springframework.context.annotation.Lazy;
155 import org.springframework.core.env.Environment;
156 import org.springframework.core.io.ResourceLoader;
157 import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
158 
159 @EnableConfigurationProperties(PersistenceProperties.class)
160 @Configuration(proxyBeanMethods = false)
161 public class PersistenceContext {
162 
163     private static final Logger OPENJPA_LOG = LoggerFactory.getLogger("org.apache.openjpa");
164 
165     @Bean
166     public static BeanFactoryPostProcessor domainTransactionInterceptorInjector() {
167         return new DomainTransactionInterceptorInjector();
168     }
169 
170     @ConditionalOnMissingBean
171     @Bean
172     public SearchCondVisitor searchCondVisitor() {
173         return new SearchCondVisitor();
174     }
175 
176     @Bean
177     public Validator localValidatorFactoryBean() {
178         return new LocalValidatorFactoryBean();
179     }
180 
181     @ConditionalOnMissingBean
182     @Bean
183     public PlainAttrValidationManager plainAttrValidationManager() {
184         return new DefaultPlainAttrValidationManager();
185     }
186 
187     @ConditionalOnMissingBean
188     @Bean
189     public CommonEntityManagerFactoryConf commonEMFConf(final PersistenceProperties persistenceProperties) {
190         CommonEntityManagerFactoryConf commonEMFConf = new CommonEntityManagerFactoryConf();
191         commonEMFConf.setPackagesToScan("org.apache.syncope.core.persistence.jpa.entity");
192         commonEMFConf.setValidationMode(ValidationMode.NONE);
193         commonEMFConf.setPersistenceUnitPostProcessors(new MultiJarAwarePersistenceUnitPostProcessor());
194         Map<String, Object> jpaPropertyMap = new HashMap<>();
195 
196         jpaPropertyMap.put("openjpa.Log", "slf4j");
197         if (OPENJPA_LOG.isDebugEnabled()) {
198             jpaPropertyMap.put("openjpa.Log", "SQL=TRACE");
199             jpaPropertyMap.put("openjpa.ConnectionFactoryProperties",
200                     "PrintParameters=true, PrettyPrint=true, PrettyPrintLineLength=120");
201         }
202 
203         jpaPropertyMap.put("openjpa.NontransactionalWrite", false);
204 
205         jpaPropertyMap.put("openjpa.jdbc.MappingDefaults",
206                 "ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict,"
207                 + "FieldStrategies='"
208                 + "java.util.Locale=org.apache.syncope.core.persistence.jpa.openjpa.LocaleValueHandler,"
209                 + "java.lang.Boolean=org.apache.syncope.core.persistence.jpa.openjpa.BooleanValueHandler'");
210 
211         jpaPropertyMap.put("openjpa.DataCache", "true");
212         jpaPropertyMap.put("openjpa.QueryCache", "true");
213 
214         jpaPropertyMap.put("openjpa.RemoteCommitProvider", persistenceProperties.getRemoteCommitProvider());
215 
216         commonEMFConf.setJpaPropertyMap(jpaPropertyMap);
217         return commonEMFConf;
218     }
219 
220     @ConditionalOnMissingBean
221     @Bean
222     public XMLContentLoader xmlContentLoader(
223             final PersistenceProperties persistenceProperties,
224             final ResourceLoader resourceLoader,
225             final Environment env) {
226 
227         return new XMLContentLoader(
228                 resourceLoader.getResource(persistenceProperties.getViewsXML()),
229                 resourceLoader.getResource(persistenceProperties.getIndexesXML()),
230                 env);
231     }
232 
233     @ConditionalOnMissingBean
234     @Bean
235     public XMLContentExporter xmlContentExporter(final DomainHolder domainHolder, final RealmDAO realmDAO) {
236         return new XMLContentExporter(domainHolder, realmDAO);
237     }
238 
239     @ConditionalOnMissingBean
240     @Bean
241     public KeymasterConfParamLoader keymasterConfParamLoader(final ConfParamOps confParamOps) {
242         return new KeymasterConfParamLoader(confParamOps);
243     }
244 
245     @ConditionalOnMissingBean
246     @Bean
247     public DomainRegistry domainRegistry(final ConfigurableApplicationContext ctx) {
248         return new DomainConfFactory(ctx);
249     }
250 
251     @ConditionalOnMissingBean
252     @Bean
253     public RuntimeDomainLoader runtimeDomainLoader(
254             final DomainHolder domainHolder,
255             final DomainRegistry domainRegistry,
256             final ConfigurableApplicationContext ctx) {
257 
258         return new RuntimeDomainLoader(domainHolder, domainRegistry, ctx);
259     }
260 
261     @ConditionalOnMissingBean
262     @Bean
263     public StartupDomainLoader startupDomainLoader(
264             final PersistenceProperties persistenceProperties,
265             final ResourceLoader resourceLoader,
266             final DomainOps domainOps,
267             final DomainHolder domainHolder,
268             final DomainRegistry domainRegistry) {
269 
270         return new StartupDomainLoader(domainOps, domainHolder, persistenceProperties, resourceLoader, domainRegistry);
271     }
272 
273     @ConditionalOnMissingBean
274     @Bean
275     public EntityFactory entityFactory() {
276         return new JPAEntityFactory();
277     }
278 
279     @ConditionalOnMissingBean
280     @Bean
281     public AnyUtilsFactory anyUtilsFactory(
282             final @Lazy UserDAO userDAO,
283             final @Lazy GroupDAO groupDAO,
284             final @Lazy AnyObjectDAO anyObjectDAO,
285             final @Lazy EntityFactory entityFactory) {
286 
287         return new JPAAnyUtilsFactory(userDAO, groupDAO, anyObjectDAO, entityFactory);
288     }
289 
290     @ConditionalOnMissingBean
291     @Bean
292     public ClientAppUtilsFactory clientAppUtilsFactory() {
293         return new JPAClientAppUtilsFactory();
294     }
295 
296     @ConditionalOnMissingBean
297     @Bean
298     public PolicyUtilsFactory policyUtilsFactory() {
299         return new JPAPolicyUtilsFactory();
300     }
301 
302     @ConditionalOnMissingBean
303     @Bean
304     public TaskUtilsFactory taskUtilsFactory() {
305         return new JPATaskUtilsFactory();
306     }
307 
308     @ConditionalOnMissingBean
309     @Bean
310     public EntityCacheDAO entityCacheDAO() {
311         return new JPAEntityCacheDAO();
312     }
313 
314     @ConditionalOnMissingBean
315     @Bean
316     public PersistenceInfoDAO persistenceInfoDAO() {
317         return new JPAPersistenceInfoDAO();
318     }
319 
320     @ConditionalOnMissingBean
321     @Bean
322     public AccessTokenDAO accessTokenDAO() {
323         return new JPAAccessTokenDAO();
324     }
325 
326     @ConditionalOnMissingBean
327     @Bean
328     public ApplicationDAO applicationDAO(final RoleDAO roleDAO, final @Lazy UserDAO userDAO) {
329         return new JPAApplicationDAO(roleDAO, userDAO);
330     }
331 
332     @ConditionalOnMissingBean
333     @Bean
334     public AnyMatchDAO anyMatchDAO(
335             final @Lazy UserDAO userDAO,
336             final @Lazy GroupDAO groupDAO,
337             final @Lazy AnyObjectDAO anyObjectDAO,
338             final RealmDAO realmDAO,
339             final PlainSchemaDAO plainSchemaDAO,
340             final AnyUtilsFactory anyUtilsFactory,
341             final PlainAttrValidationManager validator) {
342 
343         return new JPAAnyMatchDAO(
344                 userDAO,
345                 groupDAO,
346                 anyObjectDAO,
347                 realmDAO,
348                 plainSchemaDAO,
349                 anyUtilsFactory,
350                 validator);
351     }
352 
353     @ConditionalOnMissingBean
354     @Bean
355     public AnyObjectDAO anyObjectDAO(
356             final AnyUtilsFactory anyUtilsFactory,
357             final @Lazy PlainSchemaDAO plainSchemaDAO,
358             final @Lazy DerSchemaDAO derSchemaDAO,
359             final @Lazy DynRealmDAO dynRealmDAO,
360             final @Lazy UserDAO userDAO,
361             final @Lazy GroupDAO groupDAO) {
362 
363         return new JPAAnyObjectDAO(
364                 anyUtilsFactory,
365                 plainSchemaDAO,
366                 derSchemaDAO,
367                 dynRealmDAO,
368                 userDAO,
369                 groupDAO);
370     }
371 
372     @ConditionalOnMissingBean
373     @Bean
374     public AnySearchDAO anySearchDAO(
375             final RealmDAO realmDAO,
376             final @Lazy DynRealmDAO dynRealmDAO,
377             final @Lazy UserDAO userDAO,
378             final @Lazy GroupDAO groupDAO,
379             final @Lazy AnyObjectDAO anyObjectDAO,
380             final PlainSchemaDAO schemaDAO,
381             final EntityFactory entityFactory,
382             final AnyUtilsFactory anyUtilsFactory,
383             final PlainAttrValidationManager validator) {
384 
385         return new JPAAnySearchDAO(
386                 realmDAO,
387                 dynRealmDAO,
388                 userDAO,
389                 groupDAO,
390                 anyObjectDAO,
391                 schemaDAO,
392                 entityFactory,
393                 anyUtilsFactory,
394                 validator);
395     }
396 
397     @ConditionalOnMissingBean
398     @Bean
399     public AnyTypeDAO anyTypeDAO(final RemediationDAO remediationDAO) {
400         return new JPAAnyTypeDAO(remediationDAO);
401     }
402 
403     @ConditionalOnMissingBean
404     @Bean
405     public AnyTypeClassDAO anyTypeClassDAO(
406             final AnyTypeDAO anyTypeDAO,
407             final PlainSchemaDAO plainSchemaDAO,
408             final DerSchemaDAO derSchemaDAO,
409             final VirSchemaDAO virSchemaDAO,
410             final @Lazy GroupDAO groupDAO,
411             final ExternalResourceDAO resourceDAO) {
412 
413         return new JPAAnyTypeClassDAO(anyTypeDAO, plainSchemaDAO, derSchemaDAO, virSchemaDAO, groupDAO, resourceDAO);
414     }
415 
416     @ConditionalOnMissingBean
417     @Bean
418     public AuditConfDAO auditConfDAO() {
419         return new JPAAuditConfDAO();
420     }
421 
422     @ConditionalOnMissingBean
423     @Bean
424     public AuthModuleDAO authModuleDAO(final PolicyDAO policyDAO) {
425         return new JPAAuthModuleDAO(policyDAO);
426     }
427 
428     @ConditionalOnMissingBean
429     @Bean
430     public AttrRepoDAO attrRepoDAO() {
431         return new JPAAttrRepoDAO();
432     }
433 
434     @ConditionalOnMissingBean
435     @Bean
436     public AuthProfileDAO authProfileDAO() {
437         return new JPAAuthProfileDAO();
438     }
439 
440     @ConditionalOnMissingBean
441     @Bean
442     public BatchDAO batchDAO() {
443         return new JPABatchDAO();
444     }
445 
446     @ConditionalOnMissingBean
447     @Bean
448     public CASSPClientAppDAO casSPClientAppDAO() {
449         return new JPACASSPClientAppDAO();
450     }
451 
452     @ConditionalOnMissingBean
453     @Bean
454     public ConnInstanceDAO connInstanceDAO(final @Lazy ExternalResourceDAO resourceDAO) {
455         return new JPAConnInstanceDAO(resourceDAO);
456     }
457 
458     @ConditionalOnMissingBean
459     @Bean
460     public DelegationDAO delegationDAO() {
461         return new JPADelegationDAO();
462     }
463 
464     @ConditionalOnMissingBean
465     @Bean
466     public FIQLQueryDAO fiqlQueryDAO() {
467         return new JPAFIQLQueryDAO();
468     }
469 
470     @ConditionalOnMissingBean
471     @Bean
472     public DerSchemaDAO derSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
473         return new JPADerSchemaDAO(resourceDAO);
474     }
475 
476     @ConditionalOnMissingBean
477     @Bean
478     public DynRealmDAO dynRealmDAO(
479             final ApplicationEventPublisher publisher,
480             final @Lazy UserDAO userDAO,
481             final @Lazy GroupDAO groupDAO,
482             final @Lazy AnyObjectDAO anyObjectDAO,
483             final AnySearchDAO searchDAO,
484             final AnyMatchDAO anyMatchDAO,
485             final SearchCondVisitor searchCondVisitor) {
486 
487         return new JPADynRealmDAO(
488                 publisher,
489                 userDAO,
490                 groupDAO,
491                 anyObjectDAO,
492                 searchDAO,
493                 anyMatchDAO,
494                 searchCondVisitor);
495     }
496 
497     @ConditionalOnMissingBean
498     @Bean
499     public GroupDAO groupDAO(
500             final ApplicationEventPublisher publisher,
501             final AnyUtilsFactory anyUtilsFactory,
502             final @Lazy PlainSchemaDAO plainSchemaDAO,
503             final @Lazy DerSchemaDAO derSchemaDAO,
504             final @Lazy DynRealmDAO dynRealmDAO,
505             final AnyMatchDAO anyMatchDAO,
506             final PlainAttrDAO plainAttrDAO,
507             final @Lazy UserDAO userDAO,
508             final @Lazy AnyObjectDAO anyObjectDAO,
509             final AnySearchDAO anySearchDAO,
510             final SearchCondVisitor searchCondVisitor) {
511 
512         return new JPAGroupDAO(
513                 anyUtilsFactory,
514                 publisher,
515                 plainSchemaDAO,
516                 derSchemaDAO,
517                 dynRealmDAO,
518                 anyMatchDAO,
519                 plainAttrDAO,
520                 userDAO,
521                 anyObjectDAO,
522                 anySearchDAO,
523                 searchCondVisitor);
524     }
525 
526     @ConditionalOnMissingBean
527     @Bean
528     public ImplementationDAO implementationDAO(
529             final @Lazy ExternalResourceDAO resourceDAO,
530             final @Lazy EntityCacheDAO entityCacheDAO) {
531 
532         return new JPAImplementationDAO(resourceDAO, entityCacheDAO);
533     }
534 
535     @ConditionalOnMissingBean
536     @Bean
537     public JobStatusDAO jobStatusDAO() {
538         return new JPAJobStatusDAO();
539     }
540 
541     @ConditionalOnMissingBean
542     @Bean
543     public MailTemplateDAO mailTemplateDAO() {
544         return new JPAMailTemplateDAO();
545     }
546 
547     @ConditionalOnMissingBean
548     @Bean
549     public NotificationDAO notificationDAO(final TaskDAO taskDAO) {
550         return new JPANotificationDAO(taskDAO);
551     }
552 
553     @ConditionalOnMissingBean
554     @Bean
555     public OIDCJWKSDAO oidcJWKSDAO() {
556         return new JPAOIDCJWKSDAO();
557     }
558 
559     @ConditionalOnMissingBean
560     @Bean
561     public OIDCRPClientAppDAO oidcRPClientAppDAO() {
562         return new JPAOIDCRPClientAppDAO();
563     }
564 
565     @ConditionalOnMissingBean
566     @Bean
567     public PlainAttrDAO plainAttrDAO() {
568         return new JPAPlainAttrDAO();
569     }
570 
571     @ConditionalOnMissingBean
572     @Bean
573     public PlainAttrValueDAO plainAttrValueDAO() {
574         return new JPAPlainAttrValueDAO();
575     }
576 
577     @ConditionalOnMissingBean
578     @Bean
579     public PlainSchemaDAO plainSchemaDAO(
580             final AnyUtilsFactory anyUtilsFactory,
581             final PlainAttrDAO plainAttrDAO,
582             final @Lazy ExternalResourceDAO resourceDAO) {
583 
584         return new JPAPlainSchemaDAO(anyUtilsFactory, plainAttrDAO, resourceDAO);
585     }
586 
587     @ConditionalOnMissingBean
588     @Bean
589     public PolicyDAO policyDAO(
590             final @Lazy RealmDAO realmDAO,
591             final @Lazy ExternalResourceDAO resourceDAO,
592             final @Lazy CASSPClientAppDAO casSPClientAppDAO,
593             final @Lazy OIDCRPClientAppDAO oidcRPClientAppDAO,
594             final @Lazy SAML2SPClientAppDAO saml2SPClientAppDAO,
595             final @Lazy EntityCacheDAO entityCacheDAO) {
596 
597         return new JPAPolicyDAO(
598                 realmDAO,
599                 resourceDAO,
600                 casSPClientAppDAO,
601                 oidcRPClientAppDAO,
602                 saml2SPClientAppDAO,
603                 entityCacheDAO);
604     }
605 
606     @ConditionalOnMissingBean
607     @Bean
608     public RealmDAO realmDAO(final @Lazy RoleDAO roleDAO, final ApplicationEventPublisher publisher) {
609         return new JPARealmDAO(roleDAO, publisher);
610     }
611 
612     @ConditionalOnMissingBean
613     @Bean
614     public RelationshipTypeDAO relationshipTypeDAO() {
615         return new JPARelationshipTypeDAO();
616     }
617 
618     @ConditionalOnMissingBean
619     @Bean
620     public RemediationDAO remediationDAO() {
621         return new JPARemediationDAO();
622     }
623 
624     @ConditionalOnMissingBean
625     @Bean
626     public ReportDAO reportDAO() {
627         return new JPAReportDAO();
628     }
629 
630     @ConditionalOnMissingBean
631     @Bean
632     public ReportExecDAO reportExecDAO() {
633         return new JPAReportExecDAO();
634     }
635 
636     @ConditionalOnMissingBean
637     @Bean
638     public ExternalResourceDAO resourceDAO(
639             final TaskDAO taskDAO,
640             final AnyObjectDAO anyObjectDAO,
641             final UserDAO userDAO,
642             final GroupDAO groupDAO,
643             final PolicyDAO policyDAO,
644             final VirSchemaDAO virSchemaDAO,
645             final RealmDAO realmDAO) {
646 
647         return new JPAExternalResourceDAO(taskDAO, anyObjectDAO, userDAO, groupDAO, policyDAO, virSchemaDAO, realmDAO);
648     }
649 
650     @ConditionalOnMissingBean
651     @Bean
652     public RoleDAO roleDAO(
653             final ApplicationEventPublisher publisher,
654             final @Lazy AnyMatchDAO anyMatchDAO,
655             final @Lazy AnySearchDAO anySearchDAO,
656             final DelegationDAO delegationDAO,
657             final SearchCondVisitor searchCondVisitor) {
658 
659         return new JPARoleDAO(anyMatchDAO, publisher, anySearchDAO, delegationDAO, searchCondVisitor);
660     }
661 
662     @ConditionalOnMissingBean
663     @Bean
664     public SAML2SPClientAppDAO saml2SPClientAppDAO() {
665         return new JPASAML2SPClientAppDAO();
666     }
667 
668     @ConditionalOnMissingBean
669     @Bean
670     public SAML2IdPEntityDAO saml2IdPEntityDAO() {
671         return new JPASAML2IdPEntityDAO();
672     }
673 
674     @ConditionalOnMissingBean
675     @Bean
676     public SAML2SPEntityDAO saml2SPEntityDAO() {
677         return new JPASAML2SPEntityDAO();
678     }
679 
680     @ConditionalOnMissingBean
681     @Bean
682     public SecurityQuestionDAO securityQuestionDAO(final UserDAO userDAO) {
683         return new JPASecurityQuestionDAO(userDAO);
684     }
685 
686     @ConditionalOnMissingBean
687     @Bean
688     public SRARouteDAO sraRouteDAO() {
689         return new JPASRARouteDAO();
690     }
691 
692     @ConditionalOnMissingBean
693     @Bean
694     public TaskDAO taskDAO(
695             final RealmDAO realmDAO,
696             final RemediationDAO remediationDAO,
697             final TaskUtilsFactory taskUtilsFactory,
698             final SecurityProperties securityProperties) {
699 
700         return new JPATaskDAO(realmDAO, remediationDAO, taskUtilsFactory, securityProperties);
701     }
702 
703     @ConditionalOnMissingBean
704     @Bean
705     public TaskExecDAO taskExecDAO(final TaskDAO taskDAO, final TaskUtilsFactory taskUtilsFactory) {
706         return new JPATaskExecDAO(taskDAO, taskUtilsFactory);
707     }
708 
709     @ConditionalOnMissingBean
710     @Bean
711     public UserDAO userDAO(
712             final SecurityProperties securityProperties,
713             final AnyUtilsFactory anyUtilsFactory,
714             final @Lazy PlainSchemaDAO plainSchemaDAO,
715             final @Lazy DerSchemaDAO derSchemaDAO,
716             final @Lazy DynRealmDAO dynRealmDAO,
717             final RoleDAO roleDAO,
718             final AccessTokenDAO accessTokenDAO,
719             final @Lazy GroupDAO groupDAO,
720             final DelegationDAO delegationDAO,
721             final FIQLQueryDAO fiqlQueryDAO) {
722 
723         return new JPAUserDAO(
724                 anyUtilsFactory,
725                 plainSchemaDAO,
726                 derSchemaDAO,
727                 dynRealmDAO,
728                 roleDAO,
729                 accessTokenDAO,
730                 groupDAO,
731                 delegationDAO,
732                 fiqlQueryDAO,
733                 securityProperties);
734     }
735 
736     @ConditionalOnMissingBean
737     @Bean
738     public VirSchemaDAO virSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
739         return new JPAVirSchemaDAO(resourceDAO);
740     }
741 
742     @ConditionalOnMissingBean
743     @Bean
744     public WAConfigDAO waConfigDAO() {
745         return new JPAWAConfigDAO();
746     }
747 }