View Javadoc
1   package fr.ifremer.quadrige2.core.service.administration.user;
2   
3   /*-
4    * #%L
5    * Quadrige2 Core :: Quadrige2 Server 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.base.Preconditions;
27  import fr.ifremer.quadrige2.core.config.Quadrige2Configuration;
28  import fr.ifremer.quadrige2.core.dao.administration.user.DepartmentExtendDao;
29  import fr.ifremer.quadrige2.core.dao.administration.user.DepartmentJdbcDao;
30  import fr.ifremer.quadrige2.core.dao.administration.user.QuserExtendDao;
31  import fr.ifremer.quadrige2.core.dao.administration.user.QuserJdbcDao;
32  import fr.ifremer.quadrige2.core.dao.referential.*;
33  import fr.ifremer.quadrige2.core.vo.administration.user.DepartmentVO;
34  import fr.ifremer.quadrige2.core.vo.administration.user.LightQuserVO;
35  import fr.ifremer.quadrige2.core.vo.administration.user.PrivilegeVO;
36  import fr.ifremer.quadrige2.core.vo.administration.user.QuserVO;
37  import org.apache.commons.collections4.CollectionUtils;
38  import org.apache.commons.lang3.ArrayUtils;
39  import org.apache.commons.lang3.StringUtils;
40  import org.springframework.beans.factory.annotation.Autowired;
41  import org.springframework.context.annotation.Lazy;
42  import org.springframework.stereotype.Service;
43  
44  import javax.annotation.Resource;
45  import java.util.List;
46  
47  /**
48   * <p>
49   * UserServiceImpl class.
50   * </p>
51   * 
52   */
53  @Service("userService")
54  @Lazy
55  public class UserServiceImpl implements UserService {
56  
57  	// NOTE : some beans are set to 'not required'.
58  	// This is because quadrige2-synchro-server not have it
59  	@Autowired(required = false)
60  	protected QuserExtendDao quserDao;
61  
62  	@Autowired(required = false)
63  	protected DepartmentExtendDao departmentDao;
64  
65  	@Autowired(required = false)
66  	protected StatusDao statusDao;
67  
68  	@Autowired(required = false)
69  	protected PrivilegeDao privilegeDao;
70  
71  	@Resource
72  	protected QuserJdbcDao quserJdbcDao;
73  
74  	@Resource
75  	protected DepartmentJdbcDao departmentJdbcDao;
76  
77  	@Resource
78  	protected Quadrige2Configuration config;
79  
80  	/** {@inheritDoc} */
81  	@Override
82  	public QuserVO getUserById(int userId) {
83  		return quserJdbcDao.getUserById(userId);
84  	}
85  
86  	/** {@inheritDoc} */
87  	@Override
88  	public QuserVO getUserWithDepartmentAndPrivilegesById(int userId) {
89  		QuserVO user = quserJdbcDao.getUserById(userId);
90  
91  		// Load user's department
92  		if (user.getDepId() != null && user.getDepartment() == null) {
93  			DepartmentVO department = departmentJdbcDao.getDepartmentById(user.getDepId());
94  			user.setDepartment(department);
95  		}
96  
97  		// Load user's privileges
98  		List<PrivilegeVO> userPrivileges = quserJdbcDao.getPrivilegesByUserId(userId);
99  		if (CollectionUtils.isNotEmpty(userPrivileges)) {
100 			user.setPrivileges(userPrivileges.toArray(new PrivilegeVO[userPrivileges.size()]));
101 		}
102 
103 		return user;
104 	}
105 
106 	/** {@inheritDoc} */
107 	@Override
108 	public LightQuserVO getLightUserById(int quserId) {
109 		return quserJdbcDao.getLightUserById(quserId);
110 	}
111 
112 	/** {@inheritDoc} */
113 	@Override
114 	public QuserVO save(QuserVO user, boolean saveOtherLinkedEntities) {
115 		Preconditions.checkNotNull(user);
116 
117 		// make sure the user status exists
118 		if (saveOtherLinkedEntities && user.getStatusCd() != null) {
119 			makeSureStatusExists(user.getStatusCd());
120 		}
121 
122 		// Save the department if exists
123 		if (saveOtherLinkedEntities && user.getDepartment() != null) {
124 			DepartmentVO department = user.getDepartment();
125 
126 			// make sure the department status exists
127 			if (department.getStatusCd() != null) {
128 				makeSureStatusExists(department.getStatusCd());
129 			}
130 
131 			// Update the department
132 			department = departmentDao.save(department);
133 
134 			// Refresh the user's department
135 			user.setDepartment(department);
136 			if (department != null) {
137 				user.setDepId(department.getDepId());
138 			} else {
139 				user.setDepId(null);
140 			}
141 		}
142 
143 		// Make sure all privileges exists
144 		if (saveOtherLinkedEntities && ArrayUtils.isNotEmpty(user.getPrivileges())) {
145 			for (PrivilegeVO privilegeVO : user.getPrivileges()) {
146 				makeSurePrivilegeExists(privilegeVO);
147 			}
148 		}
149 
150 		// Save the user
151 		user = quserDao.save(user);
152 
153 		return user;
154 	}
155 
156 	/* -- protected methods -- */
157 
158 	/**
159 	 * <p>
160 	 * makeSureStatusExists.
161 	 * </p>
162 	 * 
163 	 * @param statusCode
164 	 *            a {@link java.lang.String} object.
165 	 */
166 	protected void makeSureStatusExists(String statusCode) {
167 		getStatusAndMakeSureExists(statusCode);
168 	}
169 
170 	/**
171 	 * <p>
172 	 * getStatusAndMakeSureExists.
173 	 * </p>
174 	 * 
175 	 * @param statusCode
176 	 *            a {@link java.lang.String} object.
177 	 * @return a {@link fr.ifremer.quadrige2.core.dao.referential.Status} object.
178 	 */
179 	protected Status getStatusAndMakeSureExists(String statusCode) {
180 		Status status = statusDao.load(statusCode);
181 
182 		// Status exists: fine !
183 		if (status != null) {
184 			return status;
185 		}
186 
187 		// Create a new entity
188 		status = Status.Factory.newInstance();
189 
190 		// code
191 		status.setStatusCd(statusCode);
192 
193 		// name (from the enum, if exists)
194 		StatusCode statusEnum = StatusCode.valueOf(statusCode);
195 		if (statusEnum != null) {
196 			status.setStatusNm(statusEnum.name());
197 		} else {
198 			status.setStatusNm("Status " + statusCode);
199 		}
200 
201 		// Create the entity
202 		return statusDao.create(status);
203 	}
204 
205 	/**
206 	 * <p>
207 	 * makeSurePrivilegeExists.
208 	 * </p>
209 	 * 
210 	 * @param privilegeVO
211 	 *            a {@link fr.ifremer.quadrige2.core.vo.administration.user.PrivilegeVO} object.
212 	 */
213 	protected void makeSurePrivilegeExists(PrivilegeVO privilegeVO) {
214 		Preconditions.checkNotNull(privilegeVO);
215 		Preconditions.checkNotNull(privilegeVO.getPrivilegeCd());
216 
217 		Privilege privilege = privilegeDao.load(privilegeVO.getPrivilegeCd());
218 
219 		// Privilege exists: fine !
220 		if (privilege != null) {
221 			return;
222 		}
223 
224 		// Create a new entity
225 		privilege = Privilege.Factory.newInstance();
226 
227 		// code
228 		privilege.setPrivilegeCd(privilegeVO.getPrivilegeCd());
229 
230 		// name
231 		if (StringUtils.isNotBlank(privilegeVO.getPrivilegeNm())) {
232 			privilege.setPrivilegeNm(privilegeVO.getPrivilegeNm());
233 		} else {
234 			privilege.setPrivilegeNm(privilegeVO.getPrivilegeCd());
235 		}
236 
237 		// status
238 		String statusCode = privilegeVO.getStatusCd();
239 		if (StringUtils.isBlank(statusCode)) {
240 			statusCode = StatusCode.ENABLE.value();
241 		}
242 		Status status = getStatusAndMakeSureExists(statusCode);
243 		privilege.setStatus(status);
244 
245 		// Create the entity
246 		privilegeDao.create(privilege);
247 	}
248 
249 }