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.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         // page starts from 1, while setFirtResult() starts from 0
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 }