View Javadoc
1   package fr.ifremer.quadrige3.core.dao.administration.strategy;
2   
3   /*-
4    * #%L
5    * Quadrige3 Core :: Quadrige3 Client Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2017 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
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   * <p>
50   * PmfmStrategyDaoImpl class.
51   * </p>
52   * 
53   * @see PmfmStrategy
54   */
55  @Repository("pmfmStrategyDao")
56  @Lazy
57  public class PmfmStrategyDaoImpl
58  		extends PmfmStrategyDaoBase
59  {
60  	/**
61  	 * Constructor used by Spring
62  	 * 
63  	 * @param sessionFactory
64  	 *            a {@link org.hibernate.SessionFactory} object.
65  	 */
66  	@Autowired
67  	public PmfmStrategyDaoImpl(SessionFactory sessionFactory) {
68  		super();
69  		setSessionFactory(sessionFactory);
70  	}
71  
72  	/** {@inheritDoc} */
73  	public void toPmfmStrategyVO(
74  			PmfmStrategy source,
75  			PmfmStrategyVO target)
76  	{
77  		super.toPmfmStrategyVO(source, target);
78  
79  		// Strategy
80  		if (source.getStrategy() == null) {
81  			target.setStratId(null);
82  		}
83  		else {
84  			target.setStratId(source.getStrategy().getStratId());
85  		}
86  
87  		// Pmfm
88  		if (source.getPmfm() == null) {
89  			target.setPmfmId(null);
90  		}
91  		else {
92  			target.setPmfmId(source.getPmfm().getPmfmId());
93  		}
94  
95  		// Precision type
96  		if (source.getPrecisionType() == null) {
97  			target.setPrecTypeId(null);
98  		}
99  		else {
100 			target.setPrecTypeId(source.getPrecisionType().getPrecTypeId());
101 		}
102 
103 		// Acquisition levels
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 		// UI functions
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 		// Qualitative values
120 		target.setQualValueIds(getQualitativeValueIds(target.getPmfmStratId()).toArray(new Integer[0]));
121 	}
122 
123 	/**
124 	 * Retrieves the entity object that is associated with the specified value object
125 	 * from the object store. If no such entity object exists in the object store,
126 	 * a new, blank entity is created
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 	/** {@inheritDoc} */
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 	/** {@inheritDoc} */
150 	@Override
151 	public void pmfmStrategyVOToEntity(
152 			PmfmStrategyVO source,
153 			PmfmStrategy target,
154 			boolean copyIfNull)
155 	{
156 		super.pmfmStrategyVOToEntity(source, target, copyIfNull);
157 
158 		// Strategy
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 		// Pmfm
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 		// Precision type
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 		// Acquisition levels
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 		// UI functions
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 	/** {@inheritDoc} */
235 	@Override
236 	protected PmfmStrategyVO handleSave(PmfmStrategyVO source, Timestamp updateDt) {
237 		Assert.notNull(source);
238 		Assert.notNull(source.getStratId());
239 
240 		// Load parent
241 		Strategy parent = get(StrategyImpl.class, source.getStratId());
242 
243 		// Load entity
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()); // assigned id
254 			isNew = true;
255 		}
256 
257 		// update update_dt
258 		// NOT NEED on a client database
259 
260 		// VO -> Entity
261 		pmfmStrategyVOToEntity(source, entity, true);
262 
263 		// Save entity
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 		// save qualitative values
274 		saveQualitativeValues(source);
275 
276 		return source;
277 	}
278 
279 	@Override
280 	public void remove(PmfmStrategy pmfmStrategy) {
281 
282 		// Remove PMFM_APPLIED_STRATEGY by query
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 		// Delete first
320 		deleteQualitativeValues(pmfmStrategy.getPmfmStratId());
321 		// then insert
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 }