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