/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ngrinder.infra.spring;
import javax.servlet.http.Cookie;
import org.apache.commons.lang.StringUtils;
import org.ngrinder.model.Permission;
import org.ngrinder.model.User;
import org.ngrinder.user.service.UserContext;
import org.ngrinder.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* {@link HandlerMethodArgumentResolver} for {@link User} argument.
*
* It passes the current user instance on {@link User} argument.
*
* @author JunHo Yoon
* @since 3.0
*/
public class UserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
private UserContext userContext;
@Autowired
private UserService userService;
/*
* (non-Javadoc)
*
* @see
* org.springframework.web.method.support.HandlerMethodArgumentResolver#
* supportsParameter(org .springframework.core.MethodParameter)
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterIndex() == 0 && parameter.getParameterType().equals(User.class);
}
/*
* (non-Javadoc)
*
* @see
* org.springframework.web.method.support.HandlerMethodArgumentResolver#
* resolveArgument(org. springframework.core.MethodParameter,
* org.springframework.web.method.support.ModelAndViewContainer,
* org.springframework.web.context.request.NativeWebRequest,
* org.springframework.web.bind.support.WebDataBinderFactory)
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
User currentUser = getUserContext().getCurrentUser();
String userParam = webRequest.getParameter("ownerId");
if (StringUtils.isNotBlank(userParam) && currentUser.getRole().hasPermission(Permission.SWITCH_TO_ANYONE)) {
return getUserService().getOne(userParam);
}
// User want to do something through other User status and this
// switchUser is other user Id
String switchUser = null;
Cookie[] cookies = getCookies(webRequest);
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("switchUser".equals(cookie.getName()) && cookie.getMaxAge() != 0) {
switchUser = cookie.getValue();
}
}
}
// Let this can be done with parameter as well.
switchUser = StringUtils.defaultIfBlank(webRequest.getParameter("switchUser"), switchUser);
if (currentUser.getUserId().equals(switchUser)) {
currentUser.setOwnerUser(null);
} else if (StringUtils.isNotEmpty(switchUser)) {
User ownerUser = getUserService().getOne(switchUser);
// CurrentUser should remember whose status he used
if (currentUser.getRole().hasPermission(Permission.SWITCH_TO_ANYONE)
|| (ownerUser.getFollowers() != null && ownerUser.getFollowers().contains(currentUser))) {
currentUser.setOwnerUser(ownerUser);
return ownerUser;
}
} else if (StringUtils.isEmpty(switchUser)) {
currentUser.setOwnerUser(null);
}
return currentUser.getFactualUser();
}
Cookie[] getCookies(NativeWebRequest webRequest) {
return ((ServletWebRequest) webRequest).getRequest().getCookies();
}
/**
* Get current user context.<br/>
* This method is provided for XML based spring bean injection.
*
* @return user context
*/
public UserContext getUserContext() {
return userContext;
}
/**
* Set the current user context.<br/>
* This method is provided for XML based spring bean injection.
*
* @param userContext
* user context.
*/
public void setUserContext(UserContext userContext) {
this.userContext = userContext;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}