feat(DevWeb): Add WebSocket in MainMenu to display user list dynamically

This commit is contained in:
Lucàs
2024-04-15 13:10:01 +02:00
parent 30163840d8
commit 7966217125
8 changed files with 125 additions and 12 deletions
@@ -0,0 +1,24 @@
package uppa.project.pojo.json.websocket;
public class Message {
private final String type;
private final String data;
public Message(String type, String data) {
this.type = type;
this.data = data;
}
public String getType() {
return type;
}
public String getData() {
return data;
}
@Override
public String toString() {
return "Message{" + "type=" + type + ", data=" + data + '}';
}
}
@@ -49,7 +49,6 @@ public class MainMenuServlet extends HttpServlet {
}
for(HttpSession session : loginsSessions) {
User connectedUser = (User) session.getAttribute("user");
System.out.println(connectedUser.toString());
if(session.getServletContext().getContextPath().equals(request.getServletContext().getContextPath()) && connectedUser != null && !connectedUser.equals(sessionUser)) {
connectedUsers.add(connectedUser);
}
@@ -6,14 +6,12 @@
package uppa.project.servlet;
import jakarta.persistence.EntityManager;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import uppa.project.provider.EntityManagerProvider;
@WebServlet(name = "registerServlet", value = "/register")
public class RegisterServlet extends HttpServlet {
@@ -18,7 +18,6 @@ import java.io.PrintWriter;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.Locale;
import uppa.project.dao.DAO;
import uppa.project.dao.DAOException;
import uppa.project.pojo.User;
@@ -0,0 +1,72 @@
package uppa.project.websocket;
import com.google.gson.Gson;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.RemoteEndpoint;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import uppa.project.pojo.User;
import uppa.project.pojo.json.websocket.Message;
@ServerEndpoint(value = "/main-menu")
public class MainMenuWS {
private static final HashMap<Session, User> connections = new HashMap<>();
@OnOpen
public void onOpen(Session session) {
System.out.println("Connexion WebSocket ouverte : " + session.getId());
}
private void broadcastConnectedUsers() {
Gson gson = new Gson();
User[] connectedUsers = connections.values().toArray(new User[0]);
Message websocketObject = new Message("userList", gson.toJson(connectedUsers));
String message = gson.toJson(websocketObject);
System.out.println("Broadcasting connected users : " + message);
for (Session session : connections.keySet()) {
RemoteEndpoint.Basic remote = session.getBasicRemote();
try {
remote.sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@OnClose
public void onClose(Session session) {
System.out.println("Connexion WebSocket fermée : " + session.getId());
connections.remove(session);
}
@OnError
public void onError(Throwable throwable) {
System.out.println("Erreur WebSocket : " + throwable.getMessage());
throwable.printStackTrace();
}
@OnMessage
public void onMessage(String message, Session session) {
Gson gson = new Gson();
Message websocketMessage = gson.fromJson(message, Message.class);
System.out.println("Message reçu : " + websocketMessage);
if (websocketMessage.getType().equals("linkUserSession")) {
User user = gson.fromJson(websocketMessage.getData(), User.class);
System.out.println(user);
connections.put(session, user);
broadcastConnectedUsers();
}
}
}