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.time.OffsetDateTime;
22 import java.util.List;
23 import javax.persistence.Query;
24 import javax.persistence.TypedQuery;
25 import org.apache.syncope.core.persistence.api.dao.ReportExecDAO;
26 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
27 import org.apache.syncope.core.persistence.api.entity.Report;
28 import org.apache.syncope.core.persistence.api.entity.ReportExec;
29 import org.apache.syncope.core.persistence.jpa.entity.JPAReportExec;
30 import org.springframework.transaction.annotation.Transactional;
31 import org.springframework.util.ReflectionUtils;
32
33 public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportExecDAO {
34
35 @Override
36 public ReportExec find(final String key) {
37 return entityManager().find(JPAReportExec.class, key);
38 }
39
40 @Override
41 public List<ReportExec> findRecent(final int max) {
42 TypedQuery<ReportExec> query = entityManager().createQuery(
43 "SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e "
44 + "WHERE e.end IS NOT NULL ORDER BY e.end DESC", ReportExec.class);
45 query.setMaxResults(max);
46
47 return query.getResultList();
48 }
49
50 protected ReportExec findLatest(final Report report, final String field) {
51 TypedQuery<ReportExec> query = entityManager().createQuery(
52 "SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e "
53 + "WHERE e.report=:report ORDER BY e." + field + " DESC", ReportExec.class);
54 query.setParameter("report", report);
55 query.setMaxResults(1);
56
57 List<ReportExec> result = query.getResultList();
58 return result == null || result.isEmpty()
59 ? null
60 : result.iterator().next();
61 }
62
63 @Override
64 public ReportExec findLatestStarted(final Report report) {
65 return findLatest(report, "start");
66 }
67
68 @Override
69 public ReportExec findLatestEnded(final Report report) {
70 return findLatest(report, "end");
71 }
72
73 protected StringBuilder query(
74 final StringBuilder select,
75 final OffsetDateTime before,
76 final OffsetDateTime after) {
77
78 StringBuilder query = select.
79 append(JPAReportExec.class.getSimpleName()).
80 append(" e WHERE e.report=:report ");
81 if (before != null) {
82 query.append("AND e.start <= :before ");
83 }
84 if (after != null) {
85 query.append("AND e.start >= :after ");
86 }
87 return query;
88 }
89
90 @Override
91 public int count(
92 final Report report,
93 final OffsetDateTime before,
94 final OffsetDateTime after) {
95
96 StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), before, after);
97
98 Query query = entityManager().createQuery(queryString.toString());
99 query.setParameter("report", report);
100 if (before != null) {
101 query.setParameter("before", before);
102 }
103 if (after != null) {
104 query.setParameter("after", after);
105 }
106
107 return ((Number) query.getSingleResult()).intValue();
108 }
109
110 protected String toOrderByStatement(final List<OrderByClause> orderByClauses) {
111 StringBuilder statement = new StringBuilder();
112
113 for (OrderByClause clause : orderByClauses) {
114 String field = clause.getField().trim();
115 if (ReflectionUtils.findField(JPAReportExec.class, field) != null) {
116 statement.append("e.").append(field).append(' ').append(clause.getDirection().name());
117 }
118 }
119
120 if (statement.length() == 0) {
121 statement.append(" ORDER BY e.id DESC");
122 } else {
123 statement.insert(0, " ORDER BY ");
124 }
125 return statement.toString();
126 }
127
128 @Override
129 public List<ReportExec> findAll(
130 final Report report,
131 final OffsetDateTime before,
132 final OffsetDateTime after,
133 final int page,
134 final int itemsPerPage,
135 final List<OrderByClause> orderByClauses) {
136
137 StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after).
138 append(toOrderByStatement(orderByClauses));
139
140 TypedQuery<ReportExec> query = entityManager().createQuery(queryString.toString(), ReportExec.class);
141 query.setParameter("report", report);
142 if (before != null) {
143 query.setParameter("before", before);
144 }
145 if (after != null) {
146 query.setParameter("after", after);
147 }
148
149
150 query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
151
152 if (itemsPerPage >= 0) {
153 query.setMaxResults(itemsPerPage);
154 }
155
156 return query.getResultList();
157 }
158
159 @Transactional(rollbackFor = Throwable.class)
160 @Override
161 public ReportExec save(final ReportExec execution) {
162 return entityManager().merge(execution);
163 }
164
165 @Override
166 public void delete(final String key) {
167 ReportExec execution = find(key);
168 if (execution == null) {
169 return;
170 }
171
172 delete(execution);
173 }
174
175 @Override
176 public void delete(final ReportExec execution) {
177 if (execution.getReport() != null) {
178 execution.getReport().getExecs().remove(execution);
179 }
180
181 entityManager().remove(execution);
182 }
183 }