1 package fr.ifremer.quadrige3.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.collect.ImmutableList;
26 import fr.ifremer.quadrige3.core.dao.administration.metaprogamme.Metaprogramme;
27 import fr.ifremer.quadrige3.core.dao.administration.metaprogamme.MetaprogrammeDao;
28 import fr.ifremer.quadrige3.core.dao.administration.strategy.Strategy;
29 import fr.ifremer.quadrige3.core.dao.administration.strategy.StrategyDao;
30 import fr.ifremer.quadrige3.core.dao.data.survey.Campaign;
31 import fr.ifremer.quadrige3.core.dao.referential.StatusImpl;
32 import fr.ifremer.quadrige3.core.dao.system.rule.RuleList;
33 import fr.ifremer.quadrige3.core.dao.system.rule.RuleListDao;
34 import fr.ifremer.quadrige3.core.dao.technical.Assert;
35 import fr.ifremer.quadrige3.core.dao.technical.Beans;
36 import fr.ifremer.quadrige3.core.dao.technical.Daos;
37 import fr.ifremer.quadrige3.core.vo.administration.program.MonLocProgVO;
38 import fr.ifremer.quadrige3.core.vo.administration.program.ProgramVO;
39 import fr.ifremer.quadrige3.core.vo.administration.strategy.StrategyVO;
40 import org.apache.commons.collections4.CollectionUtils;
41 import org.apache.commons.lang3.ArrayUtils;
42 import org.apache.commons.logging.Log;
43 import org.apache.commons.logging.LogFactory;
44 import org.hibernate.SQLQuery;
45 import org.hibernate.SessionFactory;
46 import org.hibernate.type.StringType;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.context.annotation.Lazy;
49 import org.springframework.stereotype.Repository;
50
51 import javax.annotation.Resource;
52 import java.sql.Timestamp;
53 import java.util.Collection;
54 import java.util.Iterator;
55 import java.util.List;
56
57
58
59
60
61
62
63
64 @Repository("programDao")
65 @Lazy
66 public class ProgramDaoImpl
67 extends ProgramDaoBase
68 {
69
70 private static final Log log =
71 LogFactory.getLog(ProgramDaoImpl.class);
72
73 @Resource
74 private ProgDepProgPrivDao progDepProgPrivDao;
75
76 @Resource
77 private ProgQuserProgPrivDao progQuserProgPrivDao;
78
79 @Resource
80 private MonLocProgDao monLocProgDao;
81
82 @Resource(name = "strategyDao")
83 private StrategyDao strategyDao;
84
85 @Resource
86 private MoratoriumDao moratoriumDao;
87
88 @Resource
89 private MetaprogrammeDao metaprogrammeDao;
90
91 @Resource
92 private RuleListDao ruleListDao;
93
94
95
96
97
98
99
100 @Autowired
101 public ProgramDaoImpl(SessionFactory sessionFactory) {
102 super();
103 setSessionFactory(sessionFactory);
104 }
105
106
107 @Override
108 public void remove(Collection<Program> entities) {
109 Assert.notEmpty(entities);
110
111 for (Program entity : entities) {
112 remove(entity);
113 }
114 }
115
116
117 @Override
118 public void remove(String progCd) {
119 Program entity = get(progCd);
120 if (entity != null) {
121 remove(entity);
122 }
123 }
124
125
126 @Override
127 public void remove(Program entity) {
128 Assert.notNull(entity);
129 Assert.notNull(entity.getProgCd());
130
131
132 Iterator<Moratorium> moratoriums = queryIteratorTyped("moratoriumsByProgCd", "progCd", StringType.INSTANCE, entity.getProgCd());
133 while (moratoriums.hasNext()) {
134 Moratorium moratorium = moratoriums.next();
135 moratoriumDao.remove(moratorium);
136 }
137
138
139 Iterator<Metaprogramme> metaprograms = queryIteratorTyped("metaprogramsByProgCd", "progCd", StringType.INSTANCE, entity.getProgCd());
140 while (metaprograms.hasNext()) {
141 Metaprogramme metaprogram = metaprograms.next();
142 metaprogrammeDao.remove(metaprogram);
143 }
144
145
146
147 Iterator<Campaign> campaigns = queryIteratorTyped("campaignsByProgCd", "progCd", StringType.INSTANCE, entity.getProgCd());
148 while (campaigns.hasNext()) {
149 Campaign campaign = campaigns.next();
150 campaign.getPrograms().remove(entity);
151 getSession().update(campaign);
152
153 }
154
155
156 Iterator<RuleList> ruleLists = queryIteratorTyped("ruleListsByProgCd", "progCd", StringType.INSTANCE, entity.getProgCd());
157 while (ruleLists.hasNext()) {
158 RuleList ruleList = ruleLists.next();
159 ruleList.getPrograms().remove(entity);
160
161 if (ruleList.getPrograms().isEmpty()) {
162 ruleListDao.remove(ruleList);
163 } else {
164 getSession().update(ruleList);
165 }
166 }
167
168
169 SQLQuery query = createSQLQuery("removeSurveyProg", "progCd", StringType.INSTANCE, entity.getProgCd());
170 int nbSurveyProgDeleted = query.executeUpdate();
171 if (nbSurveyProgDeleted > 0) {
172
173 log.warn(String.format("Deleting %s links to survey, while removing program '%s'. This should never occur.", nbSurveyProgDeleted,
174 entity.getProgCd()));
175 }
176
177
178 if (CollectionUtils.isNotEmpty(entity.getStrategies())) {
179 strategyDao.remove(ImmutableList.copyOf(entity.getStrategies()));
180 entity.getStrategies().clear();
181 }
182
183
184 if (CollectionUtils.isNotEmpty(entity.getProgQuserProgPrivs())) {
185 entity.getProgQuserProgPrivs().clear();
186 }
187 if (CollectionUtils.isNotEmpty(entity.getProgDepProgPrivs())) {
188 entity.getProgDepProgPrivs().clear();
189 }
190
191 super.remove(entity);
192 }
193
194
195 public void toProgramVO(
196 Program source,
197 ProgramVO target)
198 {
199
200 super.toProgramVO(source, target);
201
202
203 if (source.getStatus() == null) {
204 target.setStatusCd(null);
205 }
206 else {
207 target.setStatusCd(source.getStatus().getStatusCd());
208 }
209
210
211 if (CollectionUtils.isEmpty(source.getProgDepProgPrivs())) {
212 target.setProgDepProgPrivVOs(null);
213 }
214 else {
215 target.setProgDepProgPrivVOs(progDepProgPrivDao.toProgDepProgPrivVOArray(source.getProgDepProgPrivs()));
216 }
217
218
219 if (CollectionUtils.isEmpty(source.getProgQuserProgPrivs())) {
220 target.setProgQuserProgPrivVOs(null);
221 }
222 else {
223 target.setProgQuserProgPrivVOs(progQuserProgPrivDao.toProgQuserProgPrivVOArray(source.getProgQuserProgPrivs()));
224 }
225
226
227 if (CollectionUtils.isEmpty(source.getMonLocProgs())) {
228 target.setMonLocProgVOs(null);
229 }
230 else {
231 target.setMonLocProgVOs(monLocProgDao.toMonLocProgVOArray(source.getMonLocProgs()));
232 }
233
234
235 if (CollectionUtils.isEmpty(source.getStrategies())) {
236 target.setStrategyVOs(null);
237 }
238 else {
239 target.setStrategyVOs(strategyDao.toStrategyVOArray(source.getStrategies()));
240 }
241 }
242
243
244
245
246
247
248 private Program loadProgramFromProgramVO(ProgramVO programVO)
249 {
250 Program program = null;
251 if (programVO.getProgCd() != null) {
252 program = this.get(programVO.getProgCd());
253 }
254 if (program == null)
255 {
256 program = Program.Factory.newInstance();
257 }
258 return program;
259 }
260
261
262 public Program programVOToEntity(ProgramVO programVO)
263 {
264 Program entity = this.loadProgramFromProgramVO(programVO);
265 this.programVOToEntity(programVO, entity, true);
266 return entity;
267 }
268
269
270 @Override
271 public void programVOToEntity(
272 final ProgramVO source,
273 final Program target,
274 boolean copyIfNull)
275 {
276 programVOToEntity(source, target, copyIfNull, null, false);
277 }
278
279
280
281
282
283
284 @Override
285 protected ProgramVO handleSave(ProgramVO source) {
286 Assert.notNull(source.getProgCd());
287
288
289 Program entity = get(source.getProgCd());
290 boolean isNew = false;
291 if (entity == null) {
292 entity = Program.Factory.newInstance();
293 isNew = true;
294 }
295
296
297
298
299
300
301
302
303 programVOToEntity(source,
304 entity,
305 true ,
306 null ,
307 false
308 );
309
310
311 if (isNew) {
312 getSession().save(entity);
313 } else {
314 getSession().update(entity);
315 }
316
317 List<Integer> monLocProgIdsToRemove = Beans.collectProperties(entity.getMonLocProgs(), "monLocProgId");
318 List<Integer> strategiesIdsToRemove = Beans.collectProperties(entity.getStrategies(), "stratId");
319
320
321 if (ArrayUtils.isNotEmpty(source.getMonLocProgVOs())){
322 for (MonLocProgVO vo : source.getMonLocProgVOs()) {
323 vo.setProgCd(entity.getProgCd());
324 MonLocProg monLocProg = monLocProgDao.monLocProgVOToEntity(vo);
325 monLocProg.setProgram(entity);
326 if (monLocProg.getMonLocProgId() == null) {
327 monLocProg.setMonLocProgId(vo.getMonLocProgId());
328 getSession().save(monLocProg);
329 }
330 else {
331 getSession().update(monLocProg);
332 }
333 monLocProgIdsToRemove.remove(vo.getMonLocProgId());
334 }
335 }
336
337
338 if (ArrayUtils.isNotEmpty(source.getStrategyVOs())) {
339 for (StrategyVO strategyVO : source.getStrategyVOs()) {
340 strategyVO.setProgCd(entity.getProgCd());
341 strategyVO = strategyDao.save(strategyVO, null);
342
343 strategiesIdsToRemove.remove(strategyVO.getStratId());
344 }
345 }
346
347 getSession().flush();
348 getSession().clear();
349
350
351 if (CollectionUtils.isNotEmpty(monLocProgIdsToRemove)) {
352 monLocProgIdsToRemove.forEach(monLocProgDao::remove);
353 }
354
355 if (CollectionUtils.isNotEmpty(strategiesIdsToRemove)) {
356 strategiesIdsToRemove.forEach(strategyDao::remove);
357 }
358
359 return source;
360 }
361
362 @Override
363 protected void handleUpdateDate(String programCode) {
364
365 }
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383 protected void programVOToEntity(
384 ProgramVO source,
385 Program target,
386 boolean copyIfNull,
387 final Timestamp updateDt,
388 boolean withChildren)
389 {
390
391 super.programVOToEntity(source, target, copyIfNull);
392
393
394 if (copyIfNull || source.getProgCd() != null)
395 {
396 target.setProgCd(source.getProgCd());
397 }
398
399
400 if (copyIfNull || source.getStatusCd() != null)
401 {
402 if (source.getStatusCd() == null) {
403 target.setStatus(null);
404 }
405 else {
406 target.setStatus(load(StatusImpl.class, source.getStatusCd()));
407 }
408 }
409
410
411 if (copyIfNull || ArrayUtils.isNotEmpty(source.getProgDepProgPrivVOs()))
412 {
413 if (ArrayUtils.isEmpty(source.getProgDepProgPrivVOs())) {
414 target.getProgDepProgPrivs().clear();
415 }
416 else {
417 Daos.replaceEntities(target.getProgDepProgPrivs(),
418 source.getProgDepProgPrivVOs(),
419 vo -> {
420 ProgDepProgPriv entity = progDepProgPrivDao.progDepProgPrivVOToEntity(vo);
421 if (updateDt != null) {
422 entity.setUpdateDt(updateDt);
423 }
424 return entity;
425 });
426 }
427 }
428
429
430 if (copyIfNull || ArrayUtils.isNotEmpty(source.getProgQuserProgPrivVOs()))
431 {
432 if (ArrayUtils.isEmpty(source.getProgQuserProgPrivVOs())) {
433 target.getProgQuserProgPrivs().clear();
434 }
435 else {
436 Daos.replaceEntities(target.getProgQuserProgPrivs(),
437 source.getProgQuserProgPrivVOs(),
438 vo -> {
439 ProgQuserProgPriv entity = progQuserProgPrivDao.progQuserProgPrivVOToEntity(vo);
440 if (updateDt != null) {
441 entity.setUpdateDt(updateDt);
442 }
443 return entity;
444 });
445 }
446 }
447
448
449 if (withChildren)
450 {
451
452
453 if (copyIfNull || ArrayUtils.isNotEmpty(source.getMonLocProgVOs()))
454 {
455 if (ArrayUtils.isEmpty(source.getMonLocProgVOs())) {
456 target.getMonLocProgs().clear();
457 }
458 else {
459 Daos.replaceEntities(target.getMonLocProgs(),
460 source.getMonLocProgVOs(),
461 vo -> {
462 MonLocProg entity = monLocProgDao.monLocProgVOToEntity(vo);
463 entity.setProgram(target);
464 if (entity.getMonLocProgId() == null) {
465
466 entity.setMonLocProgId(vo.getMonLocProgId());
467 getSession().save(entity);
468 }
469 return entity;
470 });
471 }
472 }
473
474
475 if (copyIfNull || source.getStrategyVOs() != null) {
476 if (source.getStrategyVOs() == null) {
477 target.getStrategies().clear();
478 }
479 else {
480 Daos.replaceEntities(target.getStrategies(),
481 source.getStrategyVOs(),
482 vo -> {
483 Strategy strategy = strategyDao.strategyVOToEntity(vo);
484 strategy.setProgram(target);
485 return strategy;
486 });
487 }
488 }
489 }
490 }
491
492 }