1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.persistence.jpa.dao;
20
21 import java.util.List;
22 import javax.persistence.TypedQuery;
23 import org.apache.syncope.core.persistence.api.dao.CASSPClientAppDAO;
24 import org.apache.syncope.core.persistence.api.dao.EntityCacheDAO;
25 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
26 import org.apache.syncope.core.persistence.api.dao.OIDCRPClientAppDAO;
27 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
28 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
29 import org.apache.syncope.core.persistence.api.dao.SAML2SPClientAppDAO;
30 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
31 import org.apache.syncope.core.persistence.api.entity.Implementation;
32 import org.apache.syncope.core.persistence.api.entity.policy.AccessPolicy;
33 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
34 import org.apache.syncope.core.persistence.api.entity.policy.AttrReleasePolicy;
35 import org.apache.syncope.core.persistence.api.entity.policy.AuthPolicy;
36 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
37 import org.apache.syncope.core.persistence.api.entity.policy.Policy;
38 import org.apache.syncope.core.persistence.api.entity.policy.PropagationPolicy;
39 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
40 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
41 import org.apache.syncope.core.persistence.api.entity.policy.TicketExpirationPolicy;
42 import org.apache.syncope.core.persistence.jpa.entity.JPAExternalResource;
43 import org.apache.syncope.core.persistence.jpa.entity.policy.AbstractPolicy;
44 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccessPolicy;
45 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
46 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAttrReleasePolicy;
47 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAuthPolicy;
48 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
49 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPropagationPolicy;
50 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullCorrelationRuleEntity;
51 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy;
52 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushCorrelationRuleEntity;
53 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushPolicy;
54 import org.apache.syncope.core.persistence.jpa.entity.policy.JPATicketExpirationPolicy;
55
56 public class JPAPolicyDAO extends AbstractDAO<Policy> implements PolicyDAO {
57
58 protected static <T extends Policy> Class<? extends AbstractPolicy> getEntityReference(final Class<T> reference) {
59 return AccountPolicy.class.isAssignableFrom(reference)
60 ? JPAAccountPolicy.class
61 : PasswordPolicy.class.isAssignableFrom(reference)
62 ? JPAPasswordPolicy.class
63 : PropagationPolicy.class.isAssignableFrom(reference)
64 ? JPAPropagationPolicy.class
65 : PullPolicy.class.isAssignableFrom(reference)
66 ? JPAPullPolicy.class
67 : PushPolicy.class.isAssignableFrom(reference)
68 ? JPAPushPolicy.class
69 : AuthPolicy.class.isAssignableFrom(reference)
70 ? JPAAuthPolicy.class
71 : AccessPolicy.class.isAssignableFrom(reference)
72 ? JPAAccessPolicy.class
73 : AttrReleasePolicy.class.isAssignableFrom(reference)
74 ? JPAAttrReleasePolicy.class
75 : TicketExpirationPolicy.class.isAssignableFrom(reference)
76 ? JPATicketExpirationPolicy.class
77 : null;
78 }
79
80 protected final RealmDAO realmDAO;
81
82 protected final ExternalResourceDAO resourceDAO;
83
84 protected final CASSPClientAppDAO casSPClientAppDAO;
85
86 protected final OIDCRPClientAppDAO oidcRPClientAppDAO;
87
88 protected final SAML2SPClientAppDAO saml2SPClientAppDAO;
89
90 protected final EntityCacheDAO entityCacheDAO;
91
92 public JPAPolicyDAO(
93 final RealmDAO realmDAO,
94 final ExternalResourceDAO resourceDAO,
95 final CASSPClientAppDAO casSPClientAppDAO,
96 final OIDCRPClientAppDAO oidcRPClientAppDAO,
97 final SAML2SPClientAppDAO saml2SPClientAppDAO,
98 final EntityCacheDAO entityCacheDAO) {
99
100 this.realmDAO = realmDAO;
101 this.resourceDAO = resourceDAO;
102 this.casSPClientAppDAO = casSPClientAppDAO;
103 this.oidcRPClientAppDAO = oidcRPClientAppDAO;
104 this.saml2SPClientAppDAO = saml2SPClientAppDAO;
105 this.entityCacheDAO = entityCacheDAO;
106 }
107
108 @SuppressWarnings("unchecked")
109 @Override
110 public <T extends Policy> T find(final String key) {
111 return (T) entityManager().find(AbstractPolicy.class, key);
112 }
113
114 @Override
115 public <T extends Policy> List<T> find(final Class<T> reference) {
116 TypedQuery<T> query = entityManager().createQuery(
117 "SELECT e FROM " + getEntityReference(reference).getSimpleName() + " e", reference);
118
119 return query.getResultList();
120 }
121
122 @Override
123 public List<AccountPolicy> findByAccountRule(final Implementation accountRule) {
124 TypedQuery<AccountPolicy> query = entityManager().createQuery(
125 "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
126 + "WHERE :accountRule MEMBER OF e.rules", AccountPolicy.class);
127 query.setParameter("accountRule", accountRule);
128
129 return query.getResultList();
130 }
131
132 @Override
133 public List<PasswordPolicy> findByPasswordRule(final Implementation passwordRule) {
134 TypedQuery<PasswordPolicy> query = entityManager().createQuery(
135 "SELECT e FROM " + JPAPasswordPolicy.class.getSimpleName() + " e "
136 + "WHERE :passwordRule MEMBER OF e.rules", PasswordPolicy.class);
137 query.setParameter("passwordRule", passwordRule);
138
139 return query.getResultList();
140 }
141
142 @Override
143 public List<PullPolicy> findByPullCorrelationRule(final Implementation correlationRule) {
144 TypedQuery<PullPolicy> query = entityManager().createQuery(
145 "SELECT DISTINCT e.pullPolicy FROM " + JPAPullCorrelationRuleEntity.class.getSimpleName() + " e "
146 + "WHERE e.implementation=:correlationRule", PullPolicy.class);
147 query.setParameter("correlationRule", correlationRule);
148
149 return query.getResultList();
150 }
151
152 @Override
153 public List<PushPolicy> findByPushCorrelationRule(final Implementation correlationRule) {
154 TypedQuery<PushPolicy> query = entityManager().createQuery(
155 "SELECT DISTINCT e.pushPolicy FROM " + JPAPushCorrelationRuleEntity.class.getSimpleName() + " e "
156 + "WHERE e.implementation=:correlationRule", PushPolicy.class);
157 query.setParameter("correlationRule", correlationRule);
158
159 return query.getResultList();
160 }
161
162 @Override
163 public List<AccountPolicy> findByResource(final ExternalResource resource) {
164 TypedQuery<AccountPolicy> query = entityManager().createQuery(
165 "SELECT e FROM " + JPAAccountPolicy.class.getSimpleName() + " e "
166 + "WHERE :resource MEMBER OF e.resources", AccountPolicy.class);
167 query.setParameter("resource", resource);
168
169 return query.getResultList();
170 }
171
172 @Override
173 public List<Policy> findAll() {
174 TypedQuery<Policy> query = entityManager().createQuery(
175 "SELECT e FROM " + AbstractPolicy.class.getSimpleName() + " e", Policy.class);
176 return query.getResultList();
177 }
178
179 @Override
180 public <T extends Policy> T save(final T policy) {
181 T merged = entityManager().merge(policy);
182
183 if (policy instanceof AccountPolicy
184 || policy instanceof PasswordPolicy
185 || policy instanceof PropagationPolicy
186 || policy instanceof PullPolicy
187 || policy instanceof PushPolicy) {
188
189 resourceDAO.findByPolicy(policy).
190 forEach(resource -> entityCacheDAO.evict(JPAExternalResource.class, resource.getKey()));
191 }
192
193 return merged;
194 }
195
196 @Override
197 public <T extends Policy> void delete(final T policy) {
198 if (policy instanceof AccountPolicy) {
199 realmDAO.findByPolicy(policy).forEach(realm -> realm.setAccountPolicy(null));
200 resourceDAO.findByPolicy(policy).forEach(resource -> resource.setAccountPolicy(null));
201 } else if (policy instanceof PasswordPolicy) {
202 realmDAO.findByPolicy(policy).forEach(realm -> realm.setPasswordPolicy(null));
203 resourceDAO.findByPolicy(policy).forEach(resource -> resource.setPasswordPolicy(null));
204 } else if (policy instanceof PropagationPolicy) {
205 resourceDAO.findByPolicy(policy).forEach(resource -> resource.setPropagationPolicy(null));
206 } else if (policy instanceof PullPolicy) {
207 resourceDAO.findByPolicy(policy).forEach(resource -> resource.setPullPolicy(null));
208 } else if (policy instanceof PushPolicy) {
209 resourceDAO.findByPolicy(policy).forEach(resource -> resource.setPushPolicy(null));
210 } else if (policy instanceof AuthPolicy) {
211 realmDAO.findByPolicy(policy).forEach(realm -> realm.setAuthPolicy(null));
212 casSPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAuthPolicy(null));
213 oidcRPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAuthPolicy(null));
214 saml2SPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAuthPolicy(null));
215 } else if (policy instanceof AccessPolicy) {
216 realmDAO.findByPolicy(policy).forEach(realm -> realm.setAccessPolicy(null));
217 casSPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAccessPolicy(null));
218 oidcRPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAccessPolicy(null));
219 saml2SPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAccessPolicy(null));
220 } else if (policy instanceof AttrReleasePolicy) {
221 realmDAO.findByPolicy(policy).forEach(realm -> realm.setAttrReleasePolicy(null));
222 casSPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAttrReleasePolicy(null));
223 oidcRPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAttrReleasePolicy(null));
224 saml2SPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setAttrReleasePolicy(null));
225 } else if (policy instanceof TicketExpirationPolicy) {
226 realmDAO.findByPolicy(policy).forEach(realm -> realm.setTicketExpirationPolicy(null));
227 casSPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setTicketExpirationPolicy(null));
228 oidcRPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setTicketExpirationPolicy(null));
229 saml2SPClientAppDAO.findByPolicy(policy).forEach(clientApp -> clientApp.setTicketExpirationPolicy(null));
230 }
231
232 entityManager().remove(policy);
233 }
234 }