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.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 }