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.lang.reflect.Field;
22  import java.time.OffsetDateTime;
23  import java.util.List;
24  import javax.persistence.Query;
25  import javax.persistence.TypedQuery;
26  import org.apache.syncope.core.persistence.api.dao.RemediationDAO;
27  import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
28  import org.apache.syncope.core.persistence.api.entity.AnyType;
29  import org.apache.syncope.core.persistence.api.entity.Remediation;
30  import org.apache.syncope.core.persistence.api.entity.task.PullTask;
31  import org.apache.syncope.core.persistence.jpa.entity.JPARemediation;
32  import org.springframework.transaction.annotation.Transactional;
33  import org.springframework.util.ReflectionUtils;
34  
35  public class JPARemediationDAO extends AbstractDAO<Remediation> implements RemediationDAO {
36  
37      @Transactional(readOnly = true)
38      @Override
39      public Remediation find(final String key) {
40          return entityManager().find(JPARemediation.class, key);
41      }
42  
43      @Override
44      public List<Remediation> findByAnyType(final AnyType anyType) {
45          TypedQuery<Remediation> query = entityManager().createQuery(
46                  "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e WHERE e.anyType=:anyType",
47                  Remediation.class);
48          query.setParameter("anyType", anyType);
49          return query.getResultList();
50      }
51  
52      @Override
53      public List<Remediation> findByPullTask(final PullTask pullTask) {
54          TypedQuery<Remediation> query = entityManager().createQuery(
55                  "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e WHERE e.pullTask=:pullTask",
56                  Remediation.class);
57          query.setParameter("pullTask", pullTask);
58          return query.getResultList();
59      }
60  
61      protected StringBuilder query(
62              final StringBuilder select,
63              final OffsetDateTime before,
64              final OffsetDateTime after) {
65  
66          StringBuilder query = select.
67                  append(JPARemediation.class.getSimpleName()).
68                  append(" e WHERE 1=1 ");
69          if (before != null) {
70              query.append("AND e.instant <= :before ");
71          }
72          if (after != null) {
73              query.append("AND e.instant >= :after ");
74          }
75          return query;
76      }
77  
78      @Override
79      public int count(final OffsetDateTime before, final OffsetDateTime after) {
80          StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), before, after);
81  
82          Query query = entityManager().createQuery(queryString.toString());
83          if (before != null) {
84              query.setParameter("before", before);
85          }
86          if (after != null) {
87              query.setParameter("after", after);
88          }
89  
90          return ((Number) query.getSingleResult()).intValue();
91      }
92  
93      @Override
94      public List<Remediation> findAll(
95              final OffsetDateTime before,
96              final OffsetDateTime after,
97              final int page,
98              final int itemsPerPage,
99              final List<OrderByClause> orderByClauses) {
100 
101         StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after);
102 
103         if (!orderByClauses.isEmpty()) {
104             queryString.append(" ORDER BY ");
105             orderByClauses.forEach(clause -> {
106                 String field = clause.getField().trim();
107                 boolean ack = true;
108                 if ("resource".equals(field)) {
109                     queryString.append("e.pullTask.resource.id");
110                 } else {
111                     Field beanField = ReflectionUtils.findField(JPARemediation.class, field);
112                     if (beanField == null) {
113                         ack = false;
114                         LOG.warn("Remediation sort request by {}: unsupported, ignoring", field);
115                     } else {
116                         queryString.append("e.").append(field);
117                     }
118                 }
119                 if (ack) {
120                     if (clause.getDirection() == OrderByClause.Direction.ASC) {
121                         queryString.append(" ASC");
122                     } else {
123                         queryString.append(" DESC");
124                     }
125                     queryString.append(',');
126                 }
127             });
128 
129             queryString.deleteCharAt(queryString.length() - 1);
130         }
131 
132         TypedQuery<Remediation> query = entityManager().createQuery(queryString.toString(), Remediation.class);
133         if (before != null) {
134             query.setParameter("before", before);
135         }
136         if (after != null) {
137             query.setParameter("after", after);
138         }
139         query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
140 
141         if (itemsPerPage > 0) {
142             query.setMaxResults(itemsPerPage);
143         }
144 
145         return query.getResultList();
146     }
147 
148     @Override
149     public Remediation save(final Remediation remediation) {
150         return entityManager().merge(remediation);
151     }
152 
153     @Override
154     public void delete(final Remediation remediation) {
155         entityManager().remove(remediation);
156     }
157 
158     @Transactional
159     @Override
160     public void delete(final String key) {
161         Remediation remediation = find(key);
162         if (remediation == null) {
163             return;
164         }
165 
166         delete(remediation);
167     }
168 }