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 PlainAttrDAO plainAttrDAO,
286             final @Lazy PlainAttrValueDAO plainAttrValueDAO,
287             final @Lazy EntityFactory entityFactory) {
288 
289         return new JPAAnyUtilsFactory(userDAO, groupDAO, anyObjectDAO, plainAttrDAO, plainAttrValueDAO, entityFactory);
290     }
291 
292     @ConditionalOnMissingBean
293     @Bean
294     public ClientAppUtilsFactory clientAppUtilsFactory() {
295         return new JPAClientAppUtilsFactory();
296     }
297 
298     @ConditionalOnMissingBean
299     @Bean
300     public PolicyUtilsFactory policyUtilsFactory() {
301         return new JPAPolicyUtilsFactory();
302     }
303 
304     @ConditionalOnMissingBean
305     @Bean
306     public TaskUtilsFactory taskUtilsFactory() {
307         return new JPATaskUtilsFactory();
308     }
309 
310     @ConditionalOnMissingBean
311     @Bean
312     public EntityCacheDAO entityCacheDAO() {
313         return new JPAEntityCacheDAO();
314     }
315 
316     @ConditionalOnMissingBean
317     @Bean
318     public PersistenceInfoDAO persistenceInfoDAO() {
319         return new JPAPersistenceInfoDAO();
320     }
321 
322     @ConditionalOnMissingBean
323     @Bean
324     public AccessTokenDAO accessTokenDAO() {
325         return new JPAAccessTokenDAO();
326     }
327 
328     @ConditionalOnMissingBean
329     @Bean
330     public ApplicationDAO applicationDAO(final RoleDAO roleDAO, final @Lazy UserDAO userDAO) {
331         return new JPAApplicationDAO(roleDAO, userDAO);
332     }
333 
334     @ConditionalOnMissingBean
335     @Bean
336     public AnyMatchDAO anyMatchDAO(
337             final @Lazy UserDAO userDAO,
338             final @Lazy GroupDAO groupDAO,
339             final @Lazy AnyObjectDAO anyObjectDAO,
340             final RealmDAO realmDAO,
341             final PlainSchemaDAO plainSchemaDAO,
342             final AnyUtilsFactory anyUtilsFactory,
343             final PlainAttrValidationManager validator) {
344 
345         return new JPAAnyMatchDAO(
346                 userDAO,
347                 groupDAO,
348                 anyObjectDAO,
349                 realmDAO,
350                 plainSchemaDAO,
351                 anyUtilsFactory,
352                 validator);
353     }
354 
355     @ConditionalOnMissingBean
356     @Bean
357     public AnyObjectDAO anyObjectDAO(
358             final AnyUtilsFactory anyUtilsFactory,
359             final @Lazy PlainSchemaDAO plainSchemaDAO,
360             final @Lazy DerSchemaDAO derSchemaDAO,
361             final @Lazy DynRealmDAO dynRealmDAO,
362             final @Lazy UserDAO userDAO,
363             final @Lazy GroupDAO groupDAO) {
364 
365         return new JPAAnyObjectDAO(
366                 anyUtilsFactory,
367                 plainSchemaDAO,
368                 derSchemaDAO,
369                 dynRealmDAO,
370                 userDAO,
371                 groupDAO);
372     }
373 
374     @ConditionalOnMissingBean
375     @Bean
376     public AnySearchDAO anySearchDAO(
377             final RealmDAO realmDAO,
378             final @Lazy DynRealmDAO dynRealmDAO,
379             final @Lazy UserDAO userDAO,
380             final @Lazy GroupDAO groupDAO,
381             final @Lazy AnyObjectDAO anyObjectDAO,
382             final PlainSchemaDAO schemaDAO,
383             final EntityFactory entityFactory,
384             final AnyUtilsFactory anyUtilsFactory,
385             final PlainAttrValidationManager validator) {
386 
387         return new JPAAnySearchDAO(
388                 realmDAO,
389                 dynRealmDAO,
390                 userDAO,
391                 groupDAO,
392                 anyObjectDAO,
393                 schemaDAO,
394                 entityFactory,
395                 anyUtilsFactory,
396                 validator);
397     }
398 
399     @ConditionalOnMissingBean
400     @Bean
401     public AnyTypeDAO anyTypeDAO(final RemediationDAO remediationDAO) {
402         return new JPAAnyTypeDAO(remediationDAO);
403     }
404 
405     @ConditionalOnMissingBean
406     @Bean
407     public AnyTypeClassDAO anyTypeClassDAO(
408             final AnyTypeDAO anyTypeDAO,
409             final PlainSchemaDAO plainSchemaDAO,
410             final DerSchemaDAO derSchemaDAO,
411             final VirSchemaDAO virSchemaDAO,
412             final @Lazy GroupDAO groupDAO,
413             final ExternalResourceDAO resourceDAO) {
414 
415         return new JPAAnyTypeClassDAO(anyTypeDAO, plainSchemaDAO, derSchemaDAO, virSchemaDAO, groupDAO, resourceDAO);
416     }
417 
418     @ConditionalOnMissingBean
419     @Bean
420     public AuditConfDAO auditConfDAO() {
421         return new JPAAuditConfDAO();
422     }
423 
424     @ConditionalOnMissingBean
425     @Bean
426     public AuthModuleDAO authModuleDAO(final PolicyDAO policyDAO) {
427         return new JPAAuthModuleDAO(policyDAO);
428     }
429 
430     @ConditionalOnMissingBean
431     @Bean
432     public AttrRepoDAO attrRepoDAO() {
433         return new JPAAttrRepoDAO();
434     }
435 
436     @ConditionalOnMissingBean
437     @Bean
438     public AuthProfileDAO authProfileDAO() {
439         return new JPAAuthProfileDAO();
440     }
441 
442     @ConditionalOnMissingBean
443     @Bean
444     public BatchDAO batchDAO() {
445         return new JPABatchDAO();
446     }
447 
448     @ConditionalOnMissingBean
449     @Bean
450     public CASSPClientAppDAO casSPClientAppDAO() {
451         return new JPACASSPClientAppDAO();
452     }
453 
454     @ConditionalOnMissingBean
455     @Bean
456     public ConnInstanceDAO connInstanceDAO(final @Lazy ExternalResourceDAO resourceDAO) {
457         return new JPAConnInstanceDAO(resourceDAO);
458     }
459 
460     @ConditionalOnMissingBean
461     @Bean
462     public DelegationDAO delegationDAO() {
463         return new JPADelegationDAO();
464     }
465 
466     @ConditionalOnMissingBean
467     @Bean
468     public FIQLQueryDAO fiqlQueryDAO() {
469         return new JPAFIQLQueryDAO();
470     }
471 
472     @ConditionalOnMissingBean
473     @Bean
474     public DerSchemaDAO derSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
475         return new JPADerSchemaDAO(resourceDAO);
476     }
477 
478     @ConditionalOnMissingBean
479     @Bean
480     public DynRealmDAO dynRealmDAO(
481             final ApplicationEventPublisher publisher,
482             final @Lazy UserDAO userDAO,
483             final @Lazy GroupDAO groupDAO,
484             final @Lazy AnyObjectDAO anyObjectDAO,
485             final AnySearchDAO searchDAO,
486             final AnyMatchDAO anyMatchDAO,
487             final SearchCondVisitor searchCondVisitor) {
488 
489         return new JPADynRealmDAO(
490                 publisher,
491                 userDAO,
492                 groupDAO,
493                 anyObjectDAO,
494                 searchDAO,
495                 anyMatchDAO,
496                 searchCondVisitor);
497     }
498 
499     @ConditionalOnMissingBean
500     @Bean
501     public GroupDAO groupDAO(
502             final ApplicationEventPublisher publisher,
503             final AnyUtilsFactory anyUtilsFactory,
504             final @Lazy PlainSchemaDAO plainSchemaDAO,
505             final @Lazy DerSchemaDAO derSchemaDAO,
506             final @Lazy DynRealmDAO dynRealmDAO,
507             final AnyMatchDAO anyMatchDAO,
508             final PlainAttrDAO plainAttrDAO,
509             final @Lazy UserDAO userDAO,
510             final @Lazy AnyObjectDAO anyObjectDAO,
511             final AnySearchDAO anySearchDAO,
512             final SearchCondVisitor searchCondVisitor) {
513 
514         return new JPAGroupDAO(
515                 anyUtilsFactory,
516                 publisher,
517                 plainSchemaDAO,
518                 derSchemaDAO,
519                 dynRealmDAO,
520                 anyMatchDAO,
521                 plainAttrDAO,
522                 userDAO,
523                 anyObjectDAO,
524                 anySearchDAO,
525                 searchCondVisitor);
526     }
527 
528     @ConditionalOnMissingBean
529     @Bean
530     public ImplementationDAO implementationDAO(
531             final @Lazy ExternalResourceDAO resourceDAO,
532             final @Lazy EntityCacheDAO entityCacheDAO) {
533 
534         return new JPAImplementationDAO(resourceDAO, entityCacheDAO);
535     }
536 
537     @ConditionalOnMissingBean
538     @Bean
539     public JobStatusDAO jobStatusDAO() {
540         return new JPAJobStatusDAO();
541     }
542 
543     @ConditionalOnMissingBean
544     @Bean
545     public MailTemplateDAO mailTemplateDAO() {
546         return new JPAMailTemplateDAO();
547     }
548 
549     @ConditionalOnMissingBean
550     @Bean
551     public NotificationDAO notificationDAO(final TaskDAO taskDAO) {
552         return new JPANotificationDAO(taskDAO);
553     }
554 
555     @ConditionalOnMissingBean
556     @Bean
557     public OIDCJWKSDAO oidcJWKSDAO() {
558         return new JPAOIDCJWKSDAO();
559     }
560 
561     @ConditionalOnMissingBean
562     @Bean
563     public OIDCRPClientAppDAO oidcRPClientAppDAO() {
564         return new JPAOIDCRPClientAppDAO();
565     }
566 
567     @ConditionalOnMissingBean
568     @Bean
569     public PlainAttrDAO plainAttrDAO() {
570         return new JPAPlainAttrDAO();
571     }
572 
573     @ConditionalOnMissingBean
574     @Bean
575     public PlainAttrValueDAO plainAttrValueDAO() {
576         return new JPAPlainAttrValueDAO();
577     }
578 
579     @ConditionalOnMissingBean
580     @Bean
581     public PlainSchemaDAO plainSchemaDAO(
582             final AnyUtilsFactory anyUtilsFactory,
583             final PlainAttrDAO plainAttrDAO,
584             final @Lazy ExternalResourceDAO resourceDAO) {
585 
586         return new JPAPlainSchemaDAO(anyUtilsFactory, plainAttrDAO, resourceDAO);
587     }
588 
589     @ConditionalOnMissingBean
590     @Bean
591     public PolicyDAO policyDAO(
592             final @Lazy RealmDAO realmDAO,
593             final @Lazy ExternalResourceDAO resourceDAO,
594             final @Lazy CASSPClientAppDAO casSPClientAppDAO,
595             final @Lazy OIDCRPClientAppDAO oidcRPClientAppDAO,
596             final @Lazy SAML2SPClientAppDAO saml2SPClientAppDAO,
597             final @Lazy EntityCacheDAO entityCacheDAO) {
598 
599         return new JPAPolicyDAO(
600                 realmDAO,
601                 resourceDAO,
602                 casSPClientAppDAO,
603                 oidcRPClientAppDAO,
604                 saml2SPClientAppDAO,
605                 entityCacheDAO);
606     }
607 
608     @ConditionalOnMissingBean
609     @Bean
610     public RealmDAO realmDAO(final @Lazy RoleDAO roleDAO, final ApplicationEventPublisher publisher) {
611         return new JPARealmDAO(roleDAO, publisher);
612     }
613 
614     @ConditionalOnMissingBean
615     @Bean
616     public RelationshipTypeDAO relationshipTypeDAO() {
617         return new JPARelationshipTypeDAO();
618     }
619 
620     @ConditionalOnMissingBean
621     @Bean
622     public RemediationDAO remediationDAO() {
623         return new JPARemediationDAO();
624     }
625 
626     @ConditionalOnMissingBean
627     @Bean
628     public ReportDAO reportDAO() {
629         return new JPAReportDAO();
630     }
631 
632     @ConditionalOnMissingBean
633     @Bean
634     public ReportExecDAO reportExecDAO() {
635         return new JPAReportExecDAO();
636     }
637 
638     @ConditionalOnMissingBean
639     @Bean
640     public ExternalResourceDAO resourceDAO(
641             final TaskDAO taskDAO,
642             final AnyObjectDAO anyObjectDAO,
643             final UserDAO userDAO,
644             final GroupDAO groupDAO,
645             final PolicyDAO policyDAO,
646             final VirSchemaDAO virSchemaDAO,
647             final RealmDAO realmDAO) {
648 
649         return new JPAExternalResourceDAO(taskDAO, anyObjectDAO, userDAO, groupDAO, policyDAO, virSchemaDAO, realmDAO);
650     }
651 
652     @ConditionalOnMissingBean
653     @Bean
654     public RoleDAO roleDAO(
655             final ApplicationEventPublisher publisher,
656             final @Lazy AnyMatchDAO anyMatchDAO,
657             final @Lazy AnySearchDAO anySearchDAO,
658             final DelegationDAO delegationDAO,
659             final SearchCondVisitor searchCondVisitor) {
660 
661         return new JPARoleDAO(anyMatchDAO, publisher, anySearchDAO, delegationDAO, searchCondVisitor);
662     }
663 
664     @ConditionalOnMissingBean
665     @Bean
666     public SAML2SPClientAppDAO saml2SPClientAppDAO() {
667         return new JPASAML2SPClientAppDAO();
668     }
669 
670     @ConditionalOnMissingBean
671     @Bean
672     public SAML2IdPEntityDAO saml2IdPEntityDAO() {
673         return new JPASAML2IdPEntityDAO();
674     }
675 
676     @ConditionalOnMissingBean
677     @Bean
678     public SAML2SPEntityDAO saml2SPEntityDAO() {
679         return new JPASAML2SPEntityDAO();
680     }
681 
682     @ConditionalOnMissingBean
683     @Bean
684     public SecurityQuestionDAO securityQuestionDAO(final UserDAO userDAO) {
685         return new JPASecurityQuestionDAO(userDAO);
686     }
687 
688     @ConditionalOnMissingBean
689     @Bean
690     public SRARouteDAO sraRouteDAO() {
691         return new JPASRARouteDAO();
692     }
693 
694     @ConditionalOnMissingBean
695     @Bean
696     public TaskDAO taskDAO(
697             final RealmDAO realmDAO,
698             final RemediationDAO remediationDAO,
699             final TaskUtilsFactory taskUtilsFactory,
700             final SecurityProperties securityProperties) {
701 
702         return new JPATaskDAO(realmDAO, remediationDAO, taskUtilsFactory, securityProperties);
703     }
704 
705     @ConditionalOnMissingBean
706     @Bean
707     public TaskExecDAO taskExecDAO(final TaskDAO taskDAO, final TaskUtilsFactory taskUtilsFactory) {
708         return new JPATaskExecDAO(taskDAO, taskUtilsFactory);
709     }
710 
711     @ConditionalOnMissingBean
712     @Bean
713     public UserDAO userDAO(
714             final SecurityProperties securityProperties,
715             final AnyUtilsFactory anyUtilsFactory,
716             final @Lazy PlainSchemaDAO plainSchemaDAO,
717             final @Lazy DerSchemaDAO derSchemaDAO,
718             final @Lazy DynRealmDAO dynRealmDAO,
719             final RoleDAO roleDAO,
720             final AccessTokenDAO accessTokenDAO,
721             final @Lazy GroupDAO groupDAO,
722             final DelegationDAO delegationDAO,
723             final FIQLQueryDAO fiqlQueryDAO) {
724 
725         return new JPAUserDAO(
726                 anyUtilsFactory,
727                 plainSchemaDAO,
728                 derSchemaDAO,
729                 dynRealmDAO,
730                 roleDAO,
731                 accessTokenDAO,
732                 groupDAO,
733                 delegationDAO,
734                 fiqlQueryDAO,
735                 securityProperties);
736     }
737 
738     @ConditionalOnMissingBean
739     @Bean
740     public VirSchemaDAO virSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
741         return new JPAVirSchemaDAO(resourceDAO);
742     }
743 
744     @ConditionalOnMissingBean
745     @Bean
746     public WAConfigDAO waConfigDAO() {
747         return new JPAWAConfigDAO();
748     }
749 }