1 package fr.ifremer.quadrige3.core.dao.administration.strategy;
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 fr.ifremer.quadrige3.core.dao.referential.AcquisitionLevel;
27 import fr.ifremer.quadrige3.core.dao.referential.AcquisitionLevelImpl;
28 import fr.ifremer.quadrige3.core.dao.referential.PrecisionTypeImpl;
29 import fr.ifremer.quadrige3.core.dao.referential.pmfm.PmfmImpl;
30 import fr.ifremer.quadrige3.core.dao.technical.Assert;
31 import fr.ifremer.quadrige3.core.dao.technical.Daos;
32 import fr.ifremer.quadrige3.core.vo.administration.strategy.PmfmStrategyVO;
33 import org.apache.commons.collections4.CollectionUtils;
34 import org.apache.commons.lang3.ArrayUtils;
35 import org.hibernate.Query;
36 import org.hibernate.SessionFactory;
37 import org.hibernate.type.IntegerType;
38 import org.springframework.beans.factory.annotation.Autowired;
39 import org.springframework.context.annotation.Lazy;
40 import org.springframework.stereotype.Repository;
41
42 import javax.annotation.Nullable;
43 import java.sql.Timestamp;
44 import java.util.Arrays;
45 import java.util.Collection;
46 import java.util.List;
47
48
49
50
51
52
53
54
55 @Repository("pmfmStrategyDao")
56 @Lazy
57 public class PmfmStrategyDaoImpl
58 extends PmfmStrategyDaoBase
59 {
60
61
62
63
64
65
66 @Autowired
67 public PmfmStrategyDaoImpl(SessionFactory sessionFactory) {
68 super();
69 setSessionFactory(sessionFactory);
70 }
71
72
73 public void toPmfmStrategyVO(
74 PmfmStrategy source,
75 PmfmStrategyVO target)
76 {
77 super.toPmfmStrategyVO(source, target);
78
79
80 if (source.getStrategy() == null) {
81 target.setStratId(null);
82 }
83 else {
84 target.setStratId(source.getStrategy().getStratId());
85 }
86
87
88 if (source.getPmfm() == null) {
89 target.setPmfmId(null);
90 }
91 else {
92 target.setPmfmId(source.getPmfm().getPmfmId());
93 }
94
95
96 if (source.getPrecisionType() == null) {
97 target.setPrecTypeId(null);
98 }
99 else {
100 target.setPrecTypeId(source.getPrecisionType().getPrecTypeId());
101 }
102
103
104 if (CollectionUtils.isEmpty(source.getAcquisitionLevels())) {
105 target.setAcquisLevelCds(null);
106 }
107 else {
108 target.setAcquisLevelCds(source.getAcquisitionLevels().stream().map(AcquisitionLevel::getAcquisLevelCd).toArray(String[]::new));
109 }
110
111
112 if (CollectionUtils.isEmpty(source.getUiFunctions())) {
113 target.setUiFunctionCds(null);
114 }
115 else {
116 target.setUiFunctionCds(source.getUiFunctions().stream().map(UiFunction::getUiFunctionCd).toArray(String[]::new));
117 }
118
119
120 target.setQualValueIds(getQualitativeValueIds(target.getPmfmStratId()).toArray(new Integer[0]));
121 }
122
123
124
125
126
127
128 private PmfmStrategy loadPmfmStrategyFromPmfmStrategyVO(PmfmStrategyVO pmfmStrategyVO)
129 {
130 PmfmStrategy pmfmStrategy = null;
131 if (pmfmStrategyVO.getPmfmStratId() != null) {
132 pmfmStrategy = this.get(pmfmStrategyVO.getPmfmStratId());
133 }
134 if (pmfmStrategy == null)
135 {
136 pmfmStrategy = PmfmStrategy.Factory.newInstance();
137 }
138 return pmfmStrategy;
139 }
140
141
142 public PmfmStrategy pmfmStrategyVOToEntity(PmfmStrategyVO pmfmStrategyVO)
143 {
144 PmfmStrategy entity = this.loadPmfmStrategyFromPmfmStrategyVO(pmfmStrategyVO);
145 this.pmfmStrategyVOToEntity(pmfmStrategyVO, entity, true);
146 return entity;
147 }
148
149
150 @Override
151 public void pmfmStrategyVOToEntity(
152 PmfmStrategyVO source,
153 PmfmStrategy target,
154 boolean copyIfNull)
155 {
156 super.pmfmStrategyVOToEntity(source, target, copyIfNull);
157
158
159 if (copyIfNull || source.getStratId() != null || source.getStrategyVO() != null) {
160 if (source.getStratId() == null && source.getStrategyVO() == null) {
161 target.setStrategy(null);
162 }
163 else {
164 Integer stratId = source.getStratId();
165 if (stratId == null) {
166 stratId = source.getStrategyVO().getStratId();
167 }
168 target.setStrategy(load(StrategyImpl.class, stratId));
169 }
170 }
171
172
173 if (copyIfNull || source.getPmfmId() != null) {
174 if (source.getPmfmId() == null) {
175 target.setPmfm(null);
176 }
177 else {
178 target.setPmfm(load(PmfmImpl.class, source.getPmfmId()));
179 }
180 }
181
182
183 if (copyIfNull || source.getPrecTypeId() != null) {
184 if (source.getPrecTypeId() == null) {
185 target.setPrecisionType(null);
186 }
187 else {
188 target.setPrecisionType(load(PrecisionTypeImpl.class, source.getPrecTypeId()));
189 }
190 }
191
192
193 if (copyIfNull || ArrayUtils.isNotEmpty(source.getAcquisLevelCds())) {
194 if (ArrayUtils.isEmpty(source.getAcquisLevelCds())) {
195 target.getAcquisitionLevels().clear();
196 }
197 else {
198 Daos.replaceEntities(
199 target.getAcquisitionLevels(),
200 source.getAcquisLevelCds(),
201 new Function<String, AcquisitionLevel>() {
202 @Nullable
203 @Override
204 public AcquisitionLevel apply(@Nullable String acquisLevelCd) {
205 return load(AcquisitionLevelImpl.class, acquisLevelCd);
206 }
207 }
208 );
209 }
210 }
211
212
213 if (copyIfNull || ArrayUtils.isNotEmpty(source.getUiFunctionCds())) {
214 if (ArrayUtils.isEmpty(source.getUiFunctionCds())) {
215 target.getUiFunctions().clear();
216 }
217 else {
218 Daos.replaceEntities(
219 target.getUiFunctions(),
220 source.getUiFunctionCds(),
221 new Function<String, UiFunction>() {
222 @Nullable
223 @Override
224 public UiFunction apply(@Nullable String uiFunctionCd) {
225 return load(UiFunctionImpl.class, uiFunctionCd);
226 }
227 }
228 );
229 }
230 }
231
232 }
233
234
235 @Override
236 protected PmfmStrategyVO handleSave(PmfmStrategyVO source, Timestamp updateDt) {
237 Assert.notNull(source);
238 Assert.notNull(source.getStratId());
239
240
241 Strategy parent = get(StrategyImpl.class, source.getStratId());
242
243
244 PmfmStrategy entity = null;
245 boolean isNew = false;
246 if (source.getPmfmStratId() != null) {
247 entity = get(source.getPmfmStratId());
248 }
249 if (entity == null) {
250 entity = PmfmStrategy.Factory.newInstance();
251 parent.addPmfmStrategies(entity);
252 entity.setStrategy(parent);
253 entity.setPmfmStratId(source.getPmfmStratId());
254 isNew = true;
255 }
256
257
258
259
260
261 pmfmStrategyVOToEntity(source, entity, true);
262
263
264 if (isNew) {
265 Integer pmfmStratId = (Integer) getSession().save(entity);
266 source.setPmfmStratId(pmfmStratId);
267 } else {
268 getSession().update(entity);
269 }
270
271 getSession().flush();
272
273
274 saveQualitativeValues(source);
275
276 return source;
277 }
278
279 @Override
280 public void remove(PmfmStrategy pmfmStrategy) {
281
282
283 queryUpdate("deletePmfmAppliedStrategiesByPmfmStrategyId",
284 "pmfmStrategyId", IntegerType.INSTANCE, pmfmStrategy.getPmfmStratId());
285
286 deleteQualitativeValues(pmfmStrategy.getPmfmStratId());
287 super.remove(pmfmStrategy);
288 }
289
290 @Override
291 public void remove(Collection<PmfmStrategy> entities) {
292 entities.forEach(pmfmStrategy -> deleteQualitativeValues(pmfmStrategy.getPmfmStratId()));
293 super.remove(entities);
294 }
295
296 @Override
297 public void remove(Integer pmfmStratId) {
298 deleteQualitativeValues(pmfmStratId);
299 super.remove(pmfmStratId);
300 }
301
302 public List<Integer> getQualitativeValueIds(int pmfmStrategyId) {
303 return queryListTyped("qualitativeValueIdsByPmfmStrategyId", "pmfmStrategyId", IntegerType.INSTANCE, pmfmStrategyId);
304 }
305
306 public void deleteQualitativeValues(int pmfmStrategyId) {
307 Query query = createSQLQuery("deleteQualitativeValuesByPmfmStrategyId");
308 query.setParameter("pmfmStrategyId", pmfmStrategyId);
309 query.executeUpdate();
310 }
311
312 public void deleteQualitativeValues(Collection<Integer> pmfmStrategyIds) {
313 Query query = createSQLQuery("deleteQualitativeValuesByPmfmStrategyIds");
314 query.setParameterList("pmfmStrategyIds", pmfmStrategyIds);
315 query.executeUpdate();
316 }
317
318 private void saveQualitativeValues(PmfmStrategyVO pmfmStrategy) {
319
320 deleteQualitativeValues(pmfmStrategy.getPmfmStratId());
321
322 if (ArrayUtils.isNotEmpty(pmfmStrategy.getQualValueIds())) {
323 Arrays.stream(pmfmStrategy.getQualValueIds())
324 .forEach(qualitativeValueId -> saveQualitativeValue(pmfmStrategy.getPmfmStratId(), pmfmStrategy.getPmfmId(), qualitativeValueId));
325 }
326 }
327
328 public void saveQualitativeValue(int pmfmStrategyId, int pmfmId, int qualitativeValueId) {
329 Query query = createSQLQuery("addQualitativeValueByPmfmStrategyId");
330 query.setParameter("pmfmStrategyId", pmfmStrategyId);
331 query.setParameter("pmfmId", pmfmId);
332 query.setParameter("qualitativeValueId", qualitativeValueId);
333 query.executeUpdate();
334 }
335 }