package com.cajp.giros.web.websocket; import com.cajp.giros.security.SecurityUtils; import com.cajp.giros.web.websocket.dto.ActivityDTO; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; import org.springframework.messaging.Message; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.stereotype.Controller; import org.springframework.web.socket.messaging.SessionDisconnectEvent; import javax.inject.Inject; import java.security.Principal; import java.util.Calendar; import static com.cajp.giros.config.WebsocketConfiguration.IP_ADDRESS; @Controller public class ActivityService implements ApplicationListener<SessionDisconnectEvent> { private static final Logger log = LoggerFactory.getLogger(ActivityService.class); private DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); @Inject SimpMessageSendingOperations messagingTemplate; @MessageMapping("/websocket/activity") @SendTo("/topic/activity") public ActivityDTO sendActivity(@Payload ActivityDTO activityDTO, StompHeaderAccessor stompHeaderAccessor, Principal principal) { activityDTO.setUserLogin(SecurityUtils.getCurrentLogin()); activityDTO.setUserLogin(principal.getName()); activityDTO.setSessionId(stompHeaderAccessor.getSessionId()); activityDTO.setIpAddress(stompHeaderAccessor.getSessionAttributes().get(IP_ADDRESS).toString()); activityDTO.setTime(dateTimeFormatter.print(Calendar.getInstance().getTimeInMillis())); log.debug("Sending user tracking data {}", activityDTO); return activityDTO; } @MessageMapping("/websocket/tracker") public ActivityDTO receiveActivity(@Payload ActivityDTO activityDTO) { return activityDTO; } @Override public void onApplicationEvent(SessionDisconnectEvent event) { ActivityDTO activityDTO = new ActivityDTO(); Message message = event.getMessage(); activityDTO.setSessionId(event.getSessionId()); activityDTO.setPage("logout"); messagingTemplate.convertAndSend("/topic/activity", activityDTO); } }