View Javadoc
1   package fr.ifremer.quadrige3.core.dao.administration.user;
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  
26  import com.google.common.collect.Lists;
27  import fr.ifremer.quadrige3.core.dao.referential.Privilege;
28  import fr.ifremer.quadrige3.core.dao.referential.PrivilegeImpl;
29  import fr.ifremer.quadrige3.core.dao.referential.StatusCode;
30  import fr.ifremer.quadrige3.core.dao.referential.StatusImpl;
31  import fr.ifremer.quadrige3.core.dao.technical.Assert;
32  import fr.ifremer.quadrige3.core.dao.technical.hibernate.TemporaryDataHelper;
33  import fr.ifremer.quadrige3.core.vo.administration.user.DepartmentVO;
34  import fr.ifremer.quadrige3.core.vo.administration.user.LightQuserVO;
35  import fr.ifremer.quadrige3.core.vo.administration.user.PrivilegeVO;
36  import fr.ifremer.quadrige3.core.vo.administration.user.QuserVO;
37  import org.apache.commons.collections.CollectionUtils;
38  import org.apache.commons.lang3.ArrayUtils;
39  import org.apache.commons.lang3.StringUtils;
40  import org.hibernate.Query;
41  import org.hibernate.Session;
42  import org.hibernate.SessionFactory;
43  import org.hibernate.type.IntegerType;
44  import org.hibernate.type.StringType;
45  import org.springframework.beans.factory.annotation.Autowired;
46  import org.springframework.context.annotation.Lazy;
47  import org.springframework.dao.DataRetrievalFailureException;
48  import org.springframework.stereotype.Repository;
49  
50  import java.util.*;
51  
52  /**
53   * <p>
54   * QuserDaoImpl class.
55   * </p>
56   * 
57   * @see fr.ifremer.quadrige3.core.dao.administration.user.Quser
58   */
59  @Repository("quserDao")
60  @Lazy
61  public class QuserDaoImpl
62  		extends QuserDaoBase
63  		implements QuserExtendDao {
64  
65  	/**
66  	 * Constructor used by Spring
67  	 * 
68  	 * @param sessionFactory
69  	 *            a {@link org.hibernate.SessionFactory} object.
70  	 */
71  	@Autowired
72  	public QuserDaoImpl(SessionFactory sessionFactory) {
73  		super();
74  		setSessionFactory(sessionFactory);
75  	}
76  
77  	/** {@inheritDoc} */
78  	@Override
79  	public Quser createAsTemporary(String lastname, String firstname, Integer departmentId) {
80  		Session session = getSession();
81  
82  		Integer quserId = TemporaryDataHelper.getNewNegativeIdForTemporaryData(session, QuserImpl.class);
83  
84  		// Fill the quadrige3 entity
85  		Quser target = Quser.Factory.newInstance();
86  		target.setQuserId(quserId);
87  		target.setQuserLastNm(lastname);
88  		target.setQuserFirstNm(firstname);
89  		target.setDepartment(load(DepartmentImpl.class, departmentId));
90  		target.setQuserCreationDt(new Date());
91  		target.setStatus(load(StatusImpl.class, StatusCode.TEMPORARY.getValue()));
92  
93  		target = create(target);
94  
95  		return target;
96  	}
97  
98  	/** {@inheritDoc} */
99  	@Override
100 	public void save(QuserVO bean) {
101 		Assert.notNull(bean);
102 
103 		Quser entity = null;
104 		if (bean.getQuserId() != null) {
105 			entity = load(bean.getQuserId());
106 		}
107 
108 		// not exists on DB: create it
109 		if (entity == null) {
110 			entity = Quser.Factory.newInstance();
111 
112 			// Convert to entity
113 			toEntity(bean, entity);
114 
115 			// Update
116 			entity = create(entity);
117 
118 			// Update the Id
119 			bean.setQuserId(entity.getQuserId());
120 		}
121 
122 		// exists on DB: update it
123 		else {
124 
125 			// Convert to entity
126 			toEntity(bean, entity);
127 
128 			// Update
129 			update(entity);
130 		}
131 	}
132 
133 	/** {@inheritDoc} */
134 	@Override
135 	public Integer getDepartmentIdByUserId(int userId) {
136 		Integer recorderDepartmentId = queryUniqueTyped("departmentIdByQuserId",
137 				"quserId", IntegerType.INSTANCE, userId);
138 		if (recorderDepartmentId == null) {
139 			throw new DataRetrievalFailureException(String.format("Could not load departmentId from quser [quserId=%s]", userId));
140 		}
141 		return recorderDepartmentId;
142 	}
143 
144 	/** {@inheritDoc} */
145 	@Override
146 	public List<String> getPrivilegeCodesByUserId(int quserId) {
147 		return queryListTyped("privilegeCodesByQuserId", "quserId", IntegerType.INSTANCE, quserId);
148 	}
149 
150 	/** {@inheritDoc} */
151 	@Override
152 	public Boolean isLoginExtranet(String login) {
153 		Iterator<Boolean> resultIt = queryIteratorTyped("checkExtranetLogin", "login", StringType.INSTANCE, login);
154 		if (resultIt.hasNext()) {
155 			return resultIt.next();
156 		}
157 		// return null if login has not been found
158 		return null;
159 	}
160 
161 	/** {@inheritDoc} */
162 	@Override
163 	public boolean hasPassword(String login) {
164 		Long result = queryUniqueTyped("hasCryptPasswordByLogin", "login", StringType.INSTANCE, login);
165 
166 		return result != null && result > 0;
167 	}
168 
169 	/** {@inheritDoc} */
170 	@Override
171 	public boolean isLocalUserWithNoPassword(String login) {
172 		Long result = queryUniqueTyped("isLocalUserWithNoPasswordByLogin", "login", StringType.INSTANCE, login);
173 
174 		return result != null && result > 0;
175 	}
176 
177 	/** {@inheritDoc} */
178 	@Override
179 	public String getPasswordByUserId(int userId) {
180 		Quser p = get(userId);
181 		return p.getQuserCryptPassword();
182 	}
183 
184 	/** {@inheritDoc} */
185 	@Override
186 	public void updatePasswordByUserId(int userId, String cryptedPassword) {
187 		if (StringUtils.isNotBlank(cryptedPassword)) {
188 			Quser p = get(userId);
189 			p.setQuserCryptPassword(cryptedPassword);
190 			update(p);
191 			getSession().flush();
192 		}
193 	}
194 
195 	/** {@inheritDoc} */
196 	@Override
197 	public void resetPassword(String login) {
198 		Boolean isExtranet = isLoginExtranet(login);
199 		if (isExtranet == null) {
200 			return;
201 		}
202 
203 		Query query = createQuery(isExtranet ? "resetCryptPasswordByExtranetLogin" : "resetCryptPasswordByLogin",
204 				"login", StringType.INSTANCE, login);
205 		query.executeUpdate();
206 	}
207 
208 	/** {@inheritDoc} */
209 	@Override
210 	public void remove(Collection<Quser> entities) {
211 		if (entities == null)
212 		{
213 			throw new IllegalArgumentException(
214 					"Quser.remove - 'entities' can not be null");
215 		}
216 		for (Quser entity : entities) {
217 			remove(entity);
218 		}
219 	}
220 
221 	/** {@inheritDoc} */
222 	@Override
223 	public void remove(Quser entity) {
224 		if (entity == null)
225 		{
226 			throw new IllegalArgumentException(
227 					"Quser.remove - 'entity' can not be null");
228 		}
229 
230 		// User privileges
231 		if (CollectionUtils.isNotEmpty(entity.getPrivileges())) {
232 			entity.getPrivileges().clear();
233 		}
234 
235 		getSession().delete(entity);
236 	}
237 
238 	/** {@inheritDoc} */
239 	@Override
240 	public Quser lightQuserVOToEntity(LightQuserVO source) {
241 		Quser target;
242 		if (source.getId() > 0) {
243 			target = load(source.getId());
244 		}
245 		else {
246 			target = Quser.Factory.newInstance();
247 		}
248 		toEntity(source, target);
249 
250 		return target;
251 	}
252 
253 	/** {@inheritDoc} */
254 	@Override
255 	public Quser quserVOToEntity(QuserVO source) {
256 		Quser target;
257 		if (source.getQuserId() != null) {
258 			target = load(source.getQuserId());
259 		}
260 		else {
261 			target = Quser.Factory.newInstance();
262 		}
263 		toEntity(source, target);
264 
265 		return target;
266 	}
267 
268 	/* -- Internal methods -- */
269 
270 	/**
271 	 * <p>
272 	 * toEntity.
273 	 * </p>
274 	 * 
275 	 * @param source
276 	 *            a {@link fr.ifremer.quadrige3.core.vo.administration.user.QuserVO} object.
277 	 * @param target
278 	 *            a {@link fr.ifremer.quadrige3.core.dao.administration.user.Quser} object.
279 	 */
280 	protected void toEntity(QuserVO source, Quser target) {
281 
282 		target.setQuserId(source.getQuserId());
283 		target.setQuserLastNm(source.getQuserLastNm());
284 		target.setQuserFirstNm(source.getQuserFirstNm());
285 		target.setQuserIntranetLg(source.getQuserIntranetLg());
286 		target.setQuserExtranetLg(source.getQuserExtranetLg());
287 		target.setQuserCreationDt(source.getQuserCreationDt());
288 		target.setUpdateDt(source.getUpdateDt());
289 		target.setQuserEMail(source.getQuserEMail());
290 		target.setQuserAddress(source.getQuserAddress());
291 		target.setQuserPhone(source.getQuserPhone());
292 		target.setQuserOrgan(source.getQuserOrgan());
293 		target.setQuserAdminCenter(source.getQuserAdminCenter());
294 		target.setQuserSite(source.getQuserSite());
295 		target.setQuserLdapPresent(source.getQuserLdapPresent());
296 
297 		// Retrieve the source department id
298 		Integer sourceDepartmentId = source.getDepId();
299 		DepartmentVO sourceDepartment = source.getDepartment();
300 		if (sourceDepartmentId == null && sourceDepartment != null) {
301 			sourceDepartmentId = sourceDepartment.getDepId();
302 		}
303 
304 		// Set department
305 		if (sourceDepartmentId == null) {
306 			target.setDepartment(null);
307 		}
308 		else {
309 			target.setDepartment(load(DepartmentImpl.class, sourceDepartmentId));
310 		}
311 
312 		// Set status
313 		if (source.getStatusCd() == null) {
314 			target.setStatus(null);
315 		}
316 		else {
317 			target.setStatus(load(StatusImpl.class, source.getStatusCd()));
318 		}
319 
320 		// Set privileges
321 		PrivilegeVO[] sourcePrivileges = source.getPrivileges();
322 		if (ArrayUtils.isEmpty(sourcePrivileges)) {
323 			if (target.getPrivileges() != null) {
324 				target.getPrivileges().clear();
325 			}
326 		}
327 		else {
328 			// target had no privileges : add all as new privileges
329 			if (CollectionUtils.isEmpty(target.getPrivileges())) {
330 				if (target.getPrivileges() == null) {
331 					target.setPrivileges(new HashSet<>());
332 				}
333 				for (PrivilegeVO sourcePrivilege : sourcePrivileges) {
334 					Privilege privilege = load(PrivilegeImpl.class, sourcePrivilege.getPrivilegeCd());
335 					target.getPrivileges().add(privilege);
336 				}
337 			}
338 
339 			// target had some privileges : compare (add or remove)
340 			else {
341 				List<Privilege> privilegesToRemove = Lists.newArrayList(target.getPrivileges());
342 
343 				for (PrivilegeVO sourcePrivilege : sourcePrivileges) {
344 					boolean alreadyExist = false;
345 					for (Privilege existingPrivilege : target.getPrivileges()) {
346 
347 						// Privilege already affected to user
348 						if (Objects.equals(existingPrivilege.getPrivilegeCd(), sourcePrivilege.getPrivilegeCd())) {
349 							privilegesToRemove.remove(existingPrivilege);
350 							alreadyExist = true;
351 						}
352 					}
353 
354 					// Add new privilege
355 					if (!alreadyExist) {
356 						Privilege privilege = load(PrivilegeImpl.class, sourcePrivilege.getPrivilegeCd());
357 						target.getPrivileges().add(privilege);
358 					}
359 				}
360 
361 				// Remove privileges not found in source bean
362 				if (CollectionUtils.isNotEmpty(privilegesToRemove)) {
363 					target.getPrivileges().removeAll(privilegesToRemove);
364 				}
365 			}
366 		}
367 	}
368 
369 	/**
370 	 * <p>
371 	 * toEntity.
372 	 * </p>
373 	 * 
374 	 * @param source
375 	 *            a {@link fr.ifremer.quadrige3.core.vo.administration.user.LightQuserVO} object.
376 	 * @param target
377 	 *            a {@link fr.ifremer.quadrige3.core.dao.administration.user.Quser} object.
378 	 */
379 	protected void toEntity(LightQuserVO source, Quser target) {
380 
381 		target.setQuserId(source.getId());
382 		target.setQuserLastNm(source.getLastname());
383 		target.setQuserFirstNm(source.getFirstname());
384 
385 	}
386 }