import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/channel");
}
}
import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;
import com.xebia.chatroom.model.ChatMessage;
import com.xebia.chatroom.model.ChatMessage.MessageType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionConnectedEvent;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
@Component
public class WebSocketEventListener {
private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
@Autowired
private UserRoomsDao userRoomsDao;
@Autowired
private RoomsUserDao roomsUserDao;
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@EventListener
public void handleWebSocketConnectListener(SessionConnectedEvent event) {
logger.info("Received a new web socket connection.");
}
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String username = (String) headerAccessor.getSessionAttributes().get("username");
String roomId = (String) headerAccessor.getSessionAttributes().get("room_id");
if (username != null) {
logger.info("User Disconnected: " + username);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setType(MessageType.LEAVE);
chatMessage.setSender(username);
messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
userRoomsDao.removeRoom(chatMessage.getSender(), roomId);
roomsUserDao.removeUsername(roomId, chatMessage.getSender());
}
}
}
package com.xebia.chatroom.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;
@Controller
public class RoomsController {
@Autowired
private ChatRoomDao chatRoomDao;
@Autowired
private UserRoomsDao userRoomsDao;
@Autowired
private RoomsUserDao roomsUserDao;
@CrossOrigin
@GetMapping
@RequestMapping(value = "/all/room/list")
public ResponseEntity<Map<String, String>> roomList() {
return new ResponseEntity<Map<String, String>>(chatRoomDao.roomList(), HttpStatus.OK);
}
@CrossOrigin
@GetMapping
@RequestMapping(value = "/user/room/list")
public ResponseEntity<List<String>> userRoomList(@RequestParam("username") String username) {
return new ResponseEntity<List<String>>(userRoomsDao.userChatRooms(username), HttpStatus.OK);
}
@CrossOrigin
@GetMapping
@RequestMapping(value = "/room/user/list")
public ResponseEntity<List<String>> roomUserList(@RequestParam("chatroom") String chatroom) {
return new ResponseEntity<List<String>>(roomsUserDao.chatRoomsUsers(chatroom), HttpStatus.OK);
}
}
package com.xebia.chatroom.controller;
import static java.lang.String.format;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.stereotype.Controller;
import com.xebia.chatroom.dao.ChatRoomDao;
import com.xebia.chatroom.dao.RoomsUserDao;
import com.xebia.chatroom.dao.UserRoomsDao;
import com.xebia.chatroom.model.ChatMessage;
import com.xebia.chatroom.model.ChatMessage.MessageType;
@Controller
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(WebSocketEventListener.class);
@Autowired
private ChatRoomDao chatRoomDao;
@Autowired
private UserRoomsDao userRoomsDao;
@Autowired
private RoomsUserDao roomsUserDao;
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/chat/{roomId}/sendMessage")
public void sendMessage(@DestinationVariable String roomId, @Payload ChatMessage chatMessage) {
messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
}
@MessageMapping("/chat/{roomId}/addUser")
public void addUser(@DestinationVariable String roomId, @Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
String currentRoomId = (String) headerAccessor.getSessionAttributes().put("room_id", roomId);
if (currentRoomId != null) {
ChatMessage leaveMessage = new ChatMessage();
leaveMessage.setType(MessageType.LEAVE);
leaveMessage.setSender(chatMessage.getSender());
messagingTemplate.convertAndSend(format("/channel/%s", currentRoomId), leaveMessage);
userRoomsDao.removeRoom(chatMessage.getSender(), roomId);
roomsUserDao.removeUsername(roomId, chatMessage.getSender());
} else {
chatRoomDao.addRoom(chatMessage.getSender(), roomId);
userRoomsDao.addRoom(chatMessage.getSender(), roomId);
roomsUserDao.addRoom(roomId, chatMessage.getSender());
}
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
messagingTemplate.convertAndSend(format("/channel/%s", roomId), chatMessage);
}
}