package com.sap.hana.cloud.samples.benefits.service;
import java.io.IOException;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import org.slf4j.*;
import com.sap.hana.cloud.samples.benefits.connectivity.ECAPIConnector;
import com.sap.hana.cloud.samples.benefits.connectivity.helper.SFUser;
import com.sap.hana.cloud.samples.benefits.connectivity.http.InvalidResponseException;
import com.sap.hana.cloud.samples.benefits.persistence.UserDAO;
import com.sap.hana.cloud.samples.benefits.persistence.model.User;
@SuppressWarnings("nls")
public class SessionCreateFilter implements Filter {
public static final String SF_USER_ID_ATTR_NAME = "sfUserId";
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String loggedInUser = httpRequest.getRemoteUser();
if (loggedInUser != null) {
initUserSession(loggedInUser, httpRequest);
}
filterChain.doFilter(request, response);
}
private void initUserSession(String loggedInUser, HttpServletRequest request) {
Object userLock = UserLock.getInstance().getUserLock(loggedInUser);
synchronized (userLock) { // Lock based on user prevents from concurrent
// // user session initialization
String initialFlag = (String) request.getSession().getAttribute(SessionListener.INITIAL_FLAG);
if (initialFlag != null) {
logger.info("User '{}' session is initialized.", loggedInUser);
UserDAO userDAO = getUserDAO();
User user = initSingleUserProfile(loggedInUser, userDAO, request.getSession());
if (request.isUserInRole(ApplicationRoles.ADMINISTRATOR_ROLE) && user != null) {
initManagedUsers(user, userDAO);
}
request.getSession().removeAttribute(SessionListener.INITIAL_FLAG);
}
}
}
private void initManagedUsers(User hrUser, UserDAO userDAO) {
try {
List<SFUser> managedSFUsers = ECAPIConnector.getInstance().getManagedEmployees(hrUser.getUserId());
// Check if users exists in database and create their profiles if it
// does not
for (SFUser managedSFUser : managedSFUsers) {
User appUser = userDAO.getByUserId(managedSFUser.userId);
if (appUser == null) { // Create new user profile
appUser = new User();
managedSFUser.write(appUser);
appUser.setHrManager(hrUser);
userDAO.saveNew(appUser);
} else {
managedSFUser.write(appUser);
appUser.setHrManager(hrUser);
userDAO.save(appUser);
}
}
} catch (IOException | InvalidResponseException ex) {
logger.error("User '{}' managed users could not be obtained from Success Factors.", hrUser.getUserId(), ex);
}
}
private UserDAO getUserDAO() {
return new UserDAO();
}
private User initSingleUserProfile(String userName, UserDAO userDAO, HttpSession session) {
try {
SFUser sfUser = ECAPIConnector.getInstance().getUserProfile(userName);
session.setAttribute(SF_USER_ID_ATTR_NAME, sfUser.userId);
User user = userDAO.getByUserId(sfUser.userId);
if (user == null) {
user = createNewUser(sfUser, userDAO);
}
boolean userHasHR = sfUser.hr != null;
if (userHasHR) {
User hrManager = userDAO.getByUserId(sfUser.hr.userId);
if (hrManager == null) {
hrManager = createNewUser(sfUser.hr, userDAO);
}
user.setHrManager(hrManager);
}
userDAO.save(user);
logger.info("User '{}' updated in database.", userName);
return user;
} catch (IOException | InvalidResponseException ex) {
logger.error("User '{}' could not be extracted from backend. The user will be initialized simply.", userName, ex);
return createUser(userName, userDAO);
}
}
private User createNewUser(SFUser sourceSfUser, UserDAO userDAO) {
User newUser = new User();
sourceSfUser.write(newUser);
userDAO.saveNew(newUser);
return newUser;
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
private User createUser(String userName, UserDAO userDAO) {
User user = userDAO.getByUserId(userName);
if (user == null) {
User newUser = new User(userName);
userDAO.saveNew(newUser);
return newUser;
} else {
return user;
}
}
}