1 package fr.ifremer.quadrige2.core.dao.administration.program;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.base.Function;
26 import com.google.common.base.Preconditions;
27 import fr.ifremer.quadrige2.core.config.Quadrige2Configuration;
28 import fr.ifremer.quadrige2.core.dao.administration.strategy.Strategy;
29 import fr.ifremer.quadrige2.core.dao.administration.strategy.StrategyDao;
30 import fr.ifremer.quadrige2.core.dao.referential.StatusImpl;
31 import fr.ifremer.quadrige2.core.dao.system.synchronization.DeletedItemHistoryExtendDao;
32 import fr.ifremer.quadrige2.core.dao.technical.*;
33 import fr.ifremer.quadrige2.core.exception.BadUpdateDtException;
34 import fr.ifremer.quadrige2.core.exception.DataLockedException;
35 import fr.ifremer.quadrige2.core.vo.administration.program.MonLocProgVO;
36 import fr.ifremer.quadrige2.core.vo.administration.program.ProgDepProgPrivVO;
37 import fr.ifremer.quadrige2.core.vo.administration.program.ProgQuserProgPrivVO;
38 import fr.ifremer.quadrige2.core.vo.administration.program.ProgramVO;
39 import fr.ifremer.quadrige2.core.vo.administration.strategy.StrategyVO;
40 import org.apache.commons.collections4.CollectionUtils;
41 import org.apache.commons.lang3.ArrayUtils;
42 import org.hibernate.LockMode;
43 import org.hibernate.LockOptions;
44 import org.hibernate.Session;
45 import org.hibernate.SessionFactory;
46 import org.hibernate.exception.LockTimeoutException;
47 import org.nuiton.i18n.I18n;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.context.annotation.Lazy;
50 import org.springframework.stereotype.Repository;
51
52 import javax.annotation.Nullable;
53 import javax.annotation.Resource;
54 import java.sql.Timestamp;
55 import java.util.Collection;
56 import java.util.List;
57 import java.util.Objects;
58
59
60
61
62
63
64
65
66 @Repository("programDao")
67 @Lazy
68 public class ProgramDaoImpl
69 extends ProgramDaoBase
70 {
71
72 @Resource
73 private ProgDepProgPrivDao progDepProgPrivDao;
74
75 @Resource
76 private ProgQuserProgPrivDao progQuserProgPrivDao;
77
78 @Resource
79 private MonLocProgDao monLocProgDao;
80
81 @Resource(name = "strategyDao")
82 private StrategyDao strategyDao;
83
84 @Resource
85 private Quadrige2Configuration config;
86
87 @Resource(name = "deletedItemHistoryDao")
88 private DeletedItemHistoryExtendDao deletedItemHistoryDao;
89
90
91
92
93
94
95
96 @Autowired
97 public ProgramDaoImpl(SessionFactory sessionFactory) {
98 super();
99 setSessionFactory(sessionFactory);
100 }
101
102
103 @Override
104 public void remove(Collection<Program> entities) {
105 Preconditions.checkNotNull(entities);
106 Preconditions.checkArgument(entities.size() > 0);
107
108 for (Program entity : entities) {
109 remove(entity);
110 }
111 }
112
113
114 @Override
115 public void remove(String progCd) {
116 Program entity = get(progCd);
117 if (entity != null) {
118 remove(entity);
119 }
120 }
121
122
123 @Override
124 public void remove(Program entity) {
125
126
127 if (CollectionUtils.isNotEmpty(entity.getStrategies())) {
128 strategyDao.remove(entity.getStrategies());
129 entity.getStrategies().clear();
130 }
131
132
133 if (CollectionUtils.isNotEmpty(entity.getProgQuserProgPrivs())) {
134 entity.getProgQuserProgPrivs().clear();
135 }
136 if (CollectionUtils.isNotEmpty(entity.getProgDepProgPrivs())) {
137 entity.getProgDepProgPrivs().clear();
138 }
139
140
141 deletedItemHistoryDao.insertDeletedItem(ProgramImpl.class, entity);
142
143 super.remove(entity);
144 }
145
146
147 public void toProgramVO(
148 Program source,
149 ProgramVO target)
150 {
151
152 super.toProgramVO(source, target);
153
154
155 if (source.getStatus() == null) {
156 target.setStatusCd(null);
157 }
158 else {
159 target.setStatusCd(source.getStatus().getStatusCd());
160 }
161
162
163 if (CollectionUtils.isEmpty(source.getProgDepProgPrivs())) {
164 target.setProgDepProgPrivVOs(null);
165 }
166 else {
167 target.setProgDepProgPrivVOs(progDepProgPrivDao.toProgDepProgPrivVOArray(source.getProgDepProgPrivs()));
168 }
169
170
171 if (CollectionUtils.isEmpty(source.getProgQuserProgPrivs())) {
172 target.setProgQuserProgPrivVOs(null);
173 }
174 else {
175 target.setProgQuserProgPrivVOs(progQuserProgPrivDao.toProgQuserProgPrivVOArray(source.getProgQuserProgPrivs()));
176 }
177
178
179 if (CollectionUtils.isEmpty(source.getMonLocProgs())) {
180 target.setMonLocProgVOs(null);
181 }
182 else {
183 target.setMonLocProgVOs(monLocProgDao.toMonLocProgVOArray(source.getMonLocProgs()));
184 }
185
186
187 if (CollectionUtils.isEmpty(source.getStrategies())) {
188 target.setStrategyVOs(null);
189 }
190 else {
191 target.setStrategyVOs(strategyDao.toStrategyVOArray(source.getStrategies()));
192 }
193 }
194
195
196
197
198
199
200 private Program loadProgramFromProgramVO(ProgramVO programVO)
201 {
202 Program program = null;
203 if (programVO.getProgCd() != null) {
204 program = this.get(programVO.getProgCd());
205 }
206 if (program == null)
207 {
208 program = Program.Factory.newInstance();
209 }
210 return program;
211 }
212
213
214 public Program programVOToEntity(ProgramVO programVO)
215 {
216 Program entity = this.loadProgramFromProgramVO(programVO);
217 this.programVOToEntity(programVO, entity, true);
218 return entity;
219 }
220
221
222 @Override
223 public void programVOToEntity(
224 ProgramVO source,
225 Program target,
226 boolean copyIfNull)
227 {
228 programVOToEntity(source, target, copyIfNull, null, false);
229 }
230
231
232 @Override
233 public ProgramVO save(final ProgramVO program)
234 {
235 if (program == null)
236 {
237 throw new IllegalArgumentException(
238 "fr.ifremer.quadrige2.core.dao.administration.program.ProgramDao.save(ProgramVO program) - 'program' can not be null");
239 }
240
241 return this.handleSave(program);
242 }
243
244
245
246
247
248
249 @Override
250 protected ProgramVO handleSave(ProgramVO source) {
251 Preconditions.checkNotNull(source.getProgCd());
252
253
254 Program entity = get(source.getProgCd());
255
256 boolean isNew = false;
257 if (entity == null) {
258 entity = Program.Factory.newInstance();
259 isNew = true;
260 }
261
262 if (!isNew) {
263
264 if (entity.getUpdateDt() != null) {
265 Timestamp serverUpdateDtNoMillisecond = Dates.resetMillisecond(entity.getUpdateDt());
266 Timestamp sourceUpdateDtNoMillisecond = Dates.resetMillisecond(source.getUpdateDt());
267 if (!Objects.equals(sourceUpdateDtNoMillisecond, serverUpdateDtNoMillisecond)) {
268 throw new BadUpdateDtException(I18n.t("quadrige2.dao.program.badUpdateDt", source.getProgCd(), serverUpdateDtNoMillisecond,
269 sourceUpdateDtNoMillisecond));
270 }
271 }
272
273
274 try {
275 Session.LockRequest lockRequest = getSession().buildLockRequest(LockOptions.UPGRADE);
276 lockRequest.setLockMode(LockMode.UPGRADE_NOWAIT);
277 lockRequest.setScope(true);
278 lockRequest.lock(entity);
279 } catch (LockTimeoutException e) {
280 throw new DataLockedException(I18n.t("quadrige2.dao.program.locked", source.getProgCd()), e);
281 }
282 }
283
284
285 Timestamp newUpdateDt = getDatabaseCurrentTimestamp();
286
287 newUpdateDt = Dates.addSeconds(newUpdateDt, config.getExportDataUpdateDateShortDelayInSecond());
288 source.setUpdateDt(newUpdateDt);
289
290
291 programVOToEntity(source, entity, true, newUpdateDt, false);
292
293
294 if (isNew) {
295 getSession().save(entity);
296 } else {
297 getSession().update(entity);
298 }
299
300 List<Integer> strategiesIdsToRemove = Beans.collectProperties(entity.getStrategies(), "stratId");
301
302
303 if (ArrayUtils.isNotEmpty(source.getStrategyVOs())) {
304 for (StrategyVO strategyVO : source.getStrategyVOs()) {
305 strategyVO.setProgCd(entity.getProgCd());
306 strategyVO = strategyDao.save(strategyVO, newUpdateDt);
307
308 strategiesIdsToRemove.remove(strategyVO.getStratId());
309 }
310 }
311
312 getSession().flush();
313 getSession().clear();
314
315
316 if (CollectionUtils.isNotEmpty(strategiesIdsToRemove)) {
317 strategyDao.removeByIds(strategiesIdsToRemove);
318 }
319
320 return source;
321 }
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339 protected void programVOToEntity(
340 final ProgramVO source,
341 Program target,
342 boolean copyIfNull,
343 final Timestamp updateDt,
344 boolean withStrategies)
345 {
346
347 super.programVOToEntity(source, target, copyIfNull);
348
349
350 if (copyIfNull || source.getProgCd() != null)
351 {
352 target.setProgCd(source.getProgCd());
353 }
354
355
356 if (copyIfNull || source.getStatusCd() != null)
357 {
358 if (source.getStatusCd() == null) {
359 target.setStatus(null);
360 }
361 else {
362 target.setStatus(load(StatusImpl.class, source.getStatusCd()));
363 }
364 }
365
366
367 if (copyIfNull || ArrayUtils.isNotEmpty(source.getProgDepProgPrivVOs()))
368 {
369 if (ArrayUtils.isEmpty(source.getProgDepProgPrivVOs())) {
370 target.getProgDepProgPrivs().clear();
371 }
372 else {
373 Daos.replaceEntities(target.getProgDepProgPrivs(),
374 source.getProgDepProgPrivVOs(),
375 vo -> {
376 ProgDepProgPriv entity = progDepProgPrivDao.progDepProgPrivVOToEntity(vo);
377 if (updateDt != null) {
378 entity.setUpdateDt(updateDt);
379 }
380 return entity;
381 });
382 }
383 }
384
385
386 if (copyIfNull || ArrayUtils.isNotEmpty(source.getProgQuserProgPrivVOs()))
387 {
388 if (ArrayUtils.isEmpty(source.getProgQuserProgPrivVOs())) {
389 target.getProgQuserProgPrivs().clear();
390 }
391 else {
392 Daos.replaceEntities(target.getProgQuserProgPrivs(),
393 source.getProgQuserProgPrivVOs(),
394 vo -> {
395 ProgQuserProgPriv entity = progQuserProgPrivDao.progQuserProgPrivVOToEntity(vo);
396 if (updateDt != null) {
397 entity.setUpdateDt(updateDt);
398 }
399 return entity;
400 });
401 }
402 }
403
404
405 if (copyIfNull || ArrayUtils.isNotEmpty(source.getMonLocProgVOs()))
406 {
407 if (ArrayUtils.isEmpty(source.getMonLocProgVOs())) {
408 target.getMonLocProgs().clear();
409 } else {
410 Daos.replaceEntities(target.getMonLocProgs(),
411 source.getMonLocProgVOs(),
412 vo -> {
413 vo.setProgCd(source.getProgCd());
414 MonLocProg entity = monLocProgDao.monLocProgVOToEntity(vo);
415 if (updateDt != null) {
416 entity.setUpdateDt(updateDt);
417 }
418 if (entity.getMonLocProgId() == null) {
419 getSession().save(entity);
420 vo.setMonLocProgId(entity.getMonLocProgId());
421 }
422 else {
423 getSession().update(entity);
424 }
425 return entity;
426 });
427 }
428 }
429
430
431 if (withStrategies) {
432 if (copyIfNull || source.getStrategyVOs() != null) {
433 if (source.getStrategyVOs() == null) {
434 target.getStrategies().clear();
435 } else {
436 Daos.replaceEntities(target.getStrategies(),
437 source.getStrategyVOs(),
438 vo -> {
439 Strategy strategy = strategyDao.strategyVOToEntity(vo);
440 strategy.setProgram(target);
441 return strategy;
442 });
443 }
444 }
445 }
446 }
447
448 }