diff --git a/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java b/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java index a54a912746fbc836bb833c71a0f0526c410df01f..581409fd5b398d5f0fdc62070f11c273361f07ac 100644 --- a/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java +++ b/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java @@ -5,26 +5,25 @@ import java.util.UUID; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import de.thm.arsnova.controller.SessionController; import de.thm.arsnova.entities.Session; +import de.thm.arsnova.events.Publisher; import de.thm.arsnova.services.IUserService; import de.thm.arsnova.services.UserSessionService; @Aspect public class UserSessionAspect { - public static final Logger LOGGER = LoggerFactory.getLogger(SessionController.class); - @Autowired private UserSessionService userSessionService; @Autowired private IUserService userService; + @Autowired + private Publisher publisher; + /** Sets current user and ARSnova session in session scoped UserSessionService * * @param jp diff --git a/src/main/java/de/thm/arsnova/controller/SocketController.java b/src/main/java/de/thm/arsnova/controller/SocketController.java index 5ec8b58843e0ab8300c0c7809a8b6343b10e2483..5a7eab5dad1ed569e01e5bf5bca71f3f04dcbaf1 100644 --- a/src/main/java/de/thm/arsnova/controller/SocketController.java +++ b/src/main/java/de/thm/arsnova/controller/SocketController.java @@ -35,6 +35,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import de.thm.arsnova.entities.User; import de.thm.arsnova.services.IUserService; +import de.thm.arsnova.services.UserSessionService; import de.thm.arsnova.socket.ARSnovaSocketIOServer; @Controller @@ -44,6 +45,9 @@ public class SocketController extends AbstractController { @Autowired private IUserService userService; + @Autowired + private UserSessionService userSessionService; + @Autowired private ARSnovaSocketIOServer server; @@ -57,6 +61,7 @@ public class SocketController extends AbstractController { response.setStatus(u != null ? HttpStatus.NO_CONTENT.value() : HttpStatus.UNAUTHORIZED.value()); if (u != null) { userService.putUser2SocketId(UUID.fromString(socketid), u); + userSessionService.setSocketId(UUID.fromString(socketid)); } } diff --git a/src/main/java/de/thm/arsnova/events/ARSnovaEvent.java b/src/main/java/de/thm/arsnova/events/ARSnovaEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..0b6e983ed7b4095b885ccf8c442135cdb5b9e914 --- /dev/null +++ b/src/main/java/de/thm/arsnova/events/ARSnovaEvent.java @@ -0,0 +1,31 @@ +package de.thm.arsnova.events; + +import org.springframework.context.ApplicationEvent; + +public class ARSnovaEvent extends ApplicationEvent { + + private static final long serialVersionUID = 1L; + + private String sessionKey; + private String eventName; + private Object data; + + public ARSnovaEvent(Object source, String sKey, String eName, Object d) { + super(source); + this.data = d; + this.eventName = eName; + this.sessionKey = sKey; + } + + public String getSessionKey() { + return sessionKey; + } + + public String getEventName() { + return eventName; + } + + public Object getData() { + return data; + } +} diff --git a/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java b/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java new file mode 100644 index 0000000000000000000000000000000000000000..9d124239e7b5605df0d648e6194935d5f5fbf211 --- /dev/null +++ b/src/main/java/de/thm/arsnova/events/ARSnovaEventListener.java @@ -0,0 +1,27 @@ +package de.thm.arsnova.events; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +import de.thm.arsnova.services.UserSessionService; +import de.thm.arsnova.socket.ARSnovaSocketIOServer; + +@Component +public class ARSnovaEventListener implements ApplicationListener<ARSnovaEvent> { + + public static final Logger LOGGER = LoggerFactory.getLogger(ARSnovaEventListener.class); + + @Autowired + private ARSnovaSocketIOServer socketIoServer; + + @Autowired + private UserSessionService userSessionService; + + @Override + public void onApplicationEvent(ARSnovaEvent event) { + userSessionService.sendEventViaWebSocket(socketIoServer, event); + } +} diff --git a/src/main/java/de/thm/arsnova/events/Publisher.java b/src/main/java/de/thm/arsnova/events/Publisher.java new file mode 100644 index 0000000000000000000000000000000000000000..17819a8148330191c54bc941035fe8251d9a5bb7 --- /dev/null +++ b/src/main/java/de/thm/arsnova/events/Publisher.java @@ -0,0 +1,23 @@ +package de.thm.arsnova.events; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Service; + +@Service +public class Publisher implements ApplicationContextAware { + + @Autowired + private ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext c) throws BeansException { + this.context = c; + } + + public void publish(ARSnovaEvent event) { + this.context.publishEvent(event); + } +} diff --git a/src/main/java/de/thm/arsnova/services/UserSessionService.java b/src/main/java/de/thm/arsnova/services/UserSessionService.java index d26a8f181cbf18e5d279c9ed0574958870c8bdf2..84f2885033b88772db4c74d34c4f831b6530982d 100644 --- a/src/main/java/de/thm/arsnova/services/UserSessionService.java +++ b/src/main/java/de/thm/arsnova/services/UserSessionService.java @@ -4,6 +4,8 @@ import java.util.UUID; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; +import de.thm.arsnova.events.ARSnovaEvent; +import de.thm.arsnova.socket.ARSnovaSocketIOServer; public interface UserSessionService { @@ -15,4 +17,6 @@ public interface UserSessionService { void setSocketId(UUID socketId); UUID getSocketId(); + + void sendEventViaWebSocket(ARSnovaSocketIOServer server, ARSnovaEvent event); } \ No newline at end of file diff --git a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java index 69a51cae619e7eefe773167e9e2af7a476c1924d..c40553642f10af313d222dc88eced5520c5e6dfd 100644 --- a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java @@ -8,6 +8,8 @@ import org.springframework.stereotype.Component; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; +import de.thm.arsnova.events.ARSnovaEvent; +import de.thm.arsnova.socket.ARSnovaSocketIOServer; @Component @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) @@ -46,4 +48,19 @@ public class UserSessionServiceImpl implements UserSessionService { public UUID getSocketId() { return this.socketId; } + + private boolean hasConnectedWebSocket() { + return getSocketId() != null; + } + + @Override + public void sendEventViaWebSocket(ARSnovaSocketIOServer server, ARSnovaEvent event) { + if ( + hasConnectedWebSocket() + && event != null && session != null + && event.getSessionKey().equals(session.getKeyword()) + ) { + server.sendToClient(getSocketId(), event); + } + } } diff --git a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java index 9524058daf8f39bebd0afdb697eb27409d393169..6b50cfbbe76d27eb4d46b303b5b1104cd31bc139 100644 --- a/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java +++ b/src/main/java/de/thm/arsnova/socket/ARSnovaSocketIOServer.java @@ -23,6 +23,7 @@ import com.corundumstudio.socketio.listener.DataListener; import com.corundumstudio.socketio.listener.DisconnectListener; import de.thm.arsnova.entities.User; +import de.thm.arsnova.events.ARSnovaEvent; import de.thm.arsnova.exceptions.NoContentException; import de.thm.arsnova.services.IFeedbackService; import de.thm.arsnova.services.IQuestionService; @@ -281,6 +282,20 @@ public class ARSnovaSocketIOServer { broadcastInSession(sessionKey, "lecQuestionAvail", lecturerQuestionId); } + /** Sends event to a websocket connection identified by UUID + * + * @param sessionId The UUID of the websocket ID + * @param event The event to be send to client + */ + public void sendToClient(UUID sessionId, ARSnovaEvent event) { + for (SocketIOClient c : server.getAllClients()) { + if (c.getSessionId().equals(sessionId)) { + System.out.println(sessionId); + break; + } + } + } + public void broadcastInSession(String sessionKey, String eventName, Object data) { /** * collect a list of users which are in the current session iterate over