package io.lumify.web; import com.google.inject.Inject; import io.lumify.core.bootstrap.InjectHelper; import io.lumify.core.model.user.UserRepository; import io.lumify.core.model.user.UserSessionCounterRepository; import io.lumify.core.model.workQueue.WorkQueueRepository; import io.lumify.core.user.User; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import io.lumify.web.clientapi.model.UserStatus; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import java.io.Serializable; public class SessionUser implements HttpSessionBindingListener, Serializable { private static final long serialVersionUID = -4886360466524045992L; private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(SessionUser.class); private String userId; public SessionUser(String userId) { this.userId = userId; } public String getUserId() { return userId; } @Override public void valueBound(HttpSessionBindingEvent event) { // do nothing } @Override public void valueUnbound(HttpSessionBindingEvent event) { try { UserSessionCounterRepository userSessionCounterRepository = InjectHelper.getInstance(UserSessionCounterRepository.class); WorkQueueRepository workQueueRepository = InjectHelper.getInstance(WorkQueueRepository.class); int sessionCount = userSessionCounterRepository.decrementAndGet(userId); if (sessionCount < 1) { UserStatus status = UserStatus.OFFLINE; LOGGER.info("setting userId %s status to %s", userId, status); UserRepository userRepository = InjectHelper.getInstance(UserRepository.class); User user = userRepository.setStatus(userId, status); workQueueRepository.pushUserStatusChange(user, status); } else { workQueueRepository.pushSessionExpiration(userId, event.getSession().getId()); } } catch (Exception ex) { LOGGER.error("exception while unbinding user session for userId:%s", userId, ex); } } }