1 package fr.ifremer.dali.dao.data.survey;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import com.google.common.collect.ImmutableList;
27 import fr.ifremer.dali.dao.administration.user.DaliDepartmentDao;
28 import fr.ifremer.dali.dao.administration.user.DaliQuserDao;
29 import fr.ifremer.dali.dao.technical.Daos;
30 import fr.ifremer.dali.dto.DaliBeanFactory;
31 import fr.ifremer.dali.dto.data.survey.CampaignDTO;
32 import fr.ifremer.dali.dto.data.survey.OccasionDTO;
33 import fr.ifremer.dali.service.DaliDataContext;
34 import fr.ifremer.quadrige3.core.dao.administration.user.QuserImpl;
35 import fr.ifremer.quadrige3.core.dao.data.survey.Campaign;
36 import fr.ifremer.quadrige3.core.dao.data.survey.CampaignDaoImpl;
37 import fr.ifremer.quadrige3.core.dao.technical.Assert;
38 import fr.ifremer.quadrige3.core.dao.technical.hibernate.TemporaryDataHelper;
39 import org.apache.commons.collections4.CollectionUtils;
40 import org.hibernate.Query;
41 import org.hibernate.SessionFactory;
42 import org.hibernate.type.StringType;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.stereotype.Repository;
45
46 import javax.annotation.Resource;
47 import java.util.*;
48
49
50
51
52
53
54 @Repository("daliCampaignDao")
55 public class DaliCampaignDaoImpl extends CampaignDaoImpl implements DaliCampaignDao {
56
57 @Resource(name = "daliQuserDao")
58 private DaliQuserDao quserDao;
59
60 @Resource(name = "daliDepartmentDao")
61 private DaliDepartmentDao departmentDao;
62
63 @Resource(name = "daliDataContext")
64 private DaliDataContext dataContext;
65
66
67
68
69
70
71 @Autowired
72 public DaliCampaignDaoImpl(SessionFactory sessionFactory) {
73 super(sessionFactory);
74 }
75
76
77
78
79 @Override
80 public List<CampaignDTO> getAllCampaigns() {
81 Iterator<Object[]> it = queryIterator("allCampaigns");
82
83 List<CampaignDTO> result = new ArrayList<>();
84 while (it.hasNext()) {
85 result.add(toCampaignDTO(Arrays.asList(it.next()).iterator()));
86 }
87
88 return ImmutableList.copyOf(result);
89 }
90
91 @Override
92 @SuppressWarnings("unchecked")
93 public List<CampaignDTO> getCampaignsByIds(List<Integer> campaignIds) {
94 List<CampaignDTO> result = new ArrayList<>();
95 if (CollectionUtils.isNotEmpty(campaignIds)) {
96 Query query = createQuery("campaignsByIds").setParameterList("campaignIds", campaignIds);
97 Iterator<Object[]> it = query.iterate();
98 while (it.hasNext()) {
99 result.add(toCampaignDTO(Arrays.asList(it.next()).iterator()));
100 }
101 }
102 return result;
103 }
104
105 @Override
106 @SuppressWarnings("unchecked")
107 public List<CampaignDTO> getCampaignsByCriteria(String name,
108 Date startDate1, Date startDate2, boolean strictStartDate,
109 Date endDate1, Date endDate2, boolean strictEndDate, boolean canEndDateBeNull) {
110
111
112 StringBuilder queryString = new StringBuilder(getSession().getNamedQuery("campaignsByCriteria").getQueryString());
113
114
115 StringBuilder startDateString = new StringBuilder();
116 if (startDate1 != null && startDate2 != null) {
117 if (startDate1 == startDate2) {
118
119 startDateString.append("campaignStartDt = ").append(Daos.convertDateOnlyToSQLString(startDate1));
120 } else {
121
122 startDateString.append("campaignStartDt >= ").append(Daos.convertDateOnlyToSQLString(startDate1));
123 startDateString.append("AND campaignStartDt <= ").append(Daos.convertDateOnlyToSQLString(startDate2));
124 }
125 } else if (startDate1 != null) {
126
127 startDateString.append("campaignStartDt ").append((strictStartDate ? "> " : ">= ")).append(Daos.convertDateOnlyToSQLString(startDate1));
128 } else if (startDate2 != null) {
129
130 startDateString.append("campaignStartDt ").append((strictStartDate ? "< " : "<= ")).append(Daos.convertDateOnlyToSQLString(startDate2));
131 }
132 if (startDateString.length() > 0) {
133 queryString.append(System.lineSeparator()).append(" AND ").append(startDateString);
134 }
135
136
137 StringBuilder endDateString = new StringBuilder();
138 if (endDate1 != null && endDate2 != null) {
139 if (endDate1 == endDate2) {
140
141 endDateString.append("campaignEndDt = ").append(Daos.convertDateOnlyToSQLString(endDate1));
142 } else {
143
144 endDateString.append("campaignEndDt >= ").append(Daos.convertDateOnlyToSQLString(endDate1));
145 endDateString.append("AND campaignEndDt <= ").append(Daos.convertDateOnlyToSQLString(endDate2));
146 }
147 } else if (endDate1 != null) {
148
149 endDateString.append("campaignEndDt ").append((strictEndDate ? "> " : ">= ")).append(Daos.convertDateOnlyToSQLString(endDate1));
150 } else if (endDate2 != null) {
151
152 endDateString.append("campaignEndDt ").append((strictEndDate ? "< " : "<= ")).append(Daos.convertDateOnlyToSQLString(endDate2));
153 }
154 if (endDateString.length() > 0) {
155 queryString.append(System.lineSeparator()).append(" AND ");
156 if (canEndDateBeNull) {
157 queryString.append("(campaignEndDt is null OR (").append(endDateString).append("))");
158 }
159 else {
160 queryString.append(endDateString);
161 }
162 }
163
164
165 Query q = getSession().createQuery(queryString.toString());
166 setQueryParams(q, "campaignsByCriteria",
167 "name", StringType.INSTANCE, name);
168
169 Iterator<Object[]> it = q.iterate();
170
171 List<CampaignDTO> result = new ArrayList<>();
172 while (it.hasNext()) {
173 Object[] row = it.next();
174 result.add(toCampaignDTO(Arrays.asList(row).iterator()));
175 }
176
177 return result;
178 }
179
180 @Override
181 public List<CampaignDTO> getCampaignsByName(String name) {
182
183 Iterator<Object[]> it = queryIterator("campaignsByName",
184 "name", StringType.INSTANCE, name);
185
186 List<CampaignDTO> result = new ArrayList<>();
187 while (it.hasNext()) {
188 Object[] row = it.next();
189 result.add(toCampaignDTO(Arrays.asList(row).iterator()));
190 }
191 return result;
192 }
193
194
195
196
197 @Override
198 public List<OccasionDTO> getAllOccasions() {
199
200 Iterator<Object[]> it = queryIterator("allOccasions");
201
202 List<OccasionDTO> result = new ArrayList<>();
203 while (it.hasNext()) {
204 Object[] row = it.next();
205 result.add(toOccasionDTO(Arrays.asList(row).iterator()));
206 }
207
208 return result;
209 }
210
211 @Override
212 public void saveCampaign(CampaignDTO campaign) {
213
214 Assert.notNull(campaign);
215
216 Campaign target = null;
217 boolean isNew = false;
218 if (campaign.getId() != null) {
219 target = get(campaign.getId());
220 }
221 if (target == null) {
222 target = Campaign.Factory.newInstance();
223 target.setCampaignId(TemporaryDataHelper.getNewNegativeIdForTemporaryData(getSession(), target.getClass()));
224 isNew = true;
225 }
226
227 beanToEntity(campaign, target);
228
229 if (isNew) {
230 getSession().save(target);
231 campaign.setId(target.getCampaignId());
232 } else {
233 getSession().update(target);
234 }
235 }
236
237
238
239 private void beanToEntity(CampaignDTO source, Campaign target) {
240
241 target.setCampaignNm(source.getName());
242 target.setCampaignStartDt(source.getStartDate());
243 target.setCampaignEndDt(source.getEndDate());
244 target.setCampaignSismerLk(source.getSismerLink());
245 target.setCampaignCm(source.getComment());
246
247 target.setQuser(load(QuserImpl.class, source.getManager().getId()));
248
249
250 if (target.getRecorderDepartment() == null) {
251 Assert.notNull(dataContext.getRecorderDepartmentId());
252 target.setRecorderDepartment(departmentDao.get(dataContext.getRecorderDepartmentId()));
253 }
254
255 }
256
257 private CampaignDTO toCampaignDTO(Iterator<Object> iterator) {
258 CampaignDTO result = DaliBeanFactory.newCampaignDTO();
259 result.setId((Integer) iterator.next());
260 result.setName((String) iterator.next());
261 result.setStartDate(Daos.convertToDate(iterator.next()));
262 result.setEndDate(Daos.convertToDate(iterator.next()));
263 result.setSismerLink((String) iterator.next());
264 result.setComment((String) iterator.next());
265 result.setManager(quserDao.getUserById((Integer) iterator.next()));
266 result.setRecorderDepartment(departmentDao.getDepartmentById((Integer) iterator.next()));
267 result.setUpdateDate(Daos.convertToDate(iterator.next()));
268 return result;
269 }
270
271 private OccasionDTO toOccasionDTO(Iterator<Object> iterator) {
272 OccasionDTO result = DaliBeanFactory.newOccasionDTO();
273 result.setId((Integer) iterator.next());
274 result.setName((String) iterator.next());
275 return result;
276 }
277 }