diff --git a/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java b/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..a54a912746fbc836bb833c71a0f0526c410df01f --- /dev/null +++ b/src/main/java/de/thm/arsnova/aop/UserSessionAspect.java @@ -0,0 +1,59 @@ +package de.thm.arsnova.aop; + +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.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; + + /** Sets current user and ARSnova session in session scoped UserSessionService + * + * @param jp + * @param keyword + * @param session + */ + @AfterReturning( + pointcut="execution(public * de.thm.arsnova.services.SessionService.joinSession(..)) && args(keyword)", + returning="session" + ) + public final void joinSessionAdvice(final JoinPoint jp, final String keyword, final Session session) { + userSessionService.setUser(userService.getCurrentUser()); + userSessionService.setSession(session); + } + + /** Sets current user, ARSnova session and websocket session ID in session scoped UserSessionService + * + * @param jp + * @param keyword + * @param socketId + * @param session + */ + @AfterReturning( + pointcut="execution(public * de.thm.arsnova.services.SessionService.joinSession(..)) && args(keyword, socketId)", + returning="session" + ) + public final void joinSessionAdviceWithWebsocket(final JoinPoint jp, final String keyword, final UUID socketId, final Session session) { + userSessionService.setUser(userService.getCurrentUser()); + userSessionService.setSession(session); + userSessionService.setSocketId(socketId); + } +} diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 59b9e529b7edc209bbfa2ad541e6a6a21aabfa0f..ecdb8b5f77a42980993451b6b5c001153d521bbb 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -43,7 +43,6 @@ import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; import de.thm.arsnova.services.ISessionService; import de.thm.arsnova.services.IUserService; -import de.thm.arsnova.services.UserSessionService; import de.thm.arsnova.services.SessionService.SessionNameComperator; import de.thm.arsnova.services.SessionService.SessionShortNameComperator; @@ -59,15 +58,10 @@ public class SessionController extends AbstractController { @Autowired private IUserService userService; - @Autowired - private UserSessionService userSessionService; - @RequestMapping(value = "/{sessionkey}", method = RequestMethod.GET) @ResponseBody public final Session joinSession(@PathVariable final String sessionkey) { Session session = sessionService.joinSession(sessionkey); - userSessionService.setUser(userService.getCurrentUser()); - userSessionService.setSession(session); return session; } diff --git a/src/main/java/de/thm/arsnova/services/UserSessionService.java b/src/main/java/de/thm/arsnova/services/UserSessionService.java index ea5b096836602038cb602d2288c71d13f6272682..d26a8f181cbf18e5d279c9ed0574958870c8bdf2 100644 --- a/src/main/java/de/thm/arsnova/services/UserSessionService.java +++ b/src/main/java/de/thm/arsnova/services/UserSessionService.java @@ -1,5 +1,7 @@ package de.thm.arsnova.services; +import java.util.UUID; + import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; @@ -11,4 +13,6 @@ public interface UserSessionService { void setSession(Session session); Session getSession(); + void setSocketId(UUID socketId); + UUID getSocketId(); } \ 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 a340bfb723cea256302ef7ba78fbb925c1a9f1fc..69a51cae619e7eefe773167e9e2af7a476c1924d 100644 --- a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java @@ -1,5 +1,7 @@ package de.thm.arsnova.services; +import java.util.UUID; + import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.stereotype.Component; @@ -13,6 +15,7 @@ public class UserSessionServiceImpl implements UserSessionService { private User user; private Session session; + private UUID socketId; @Override public void setUser(User u) { @@ -33,4 +36,14 @@ public class UserSessionServiceImpl implements UserSessionService { public Session getSession() { return this.session; } + + @Override + public void setSocketId(UUID sId) { + this.socketId = sId; + } + + @Override + public UUID getSocketId() { + return this.socketId; + } } diff --git a/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml b/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml index 0026ff2470c7f87a991ab1df943470672f0e50ad..e0e455c07fa09db1ab3df50a02006185dea988e1 100644 --- a/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml +++ b/src/main/webapp/WEB-INF/spring/arsnova-servlet.xml @@ -24,10 +24,6 @@ </value> </property> </bean> - - <aop:aspectj-autoproxy> - <aop:include name="authorizationAdviser" /> - </aop:aspectj-autoproxy> <mvc:annotation-driven /> <mvc:resources mapping="/**" location="/" /> diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml index d97cf9c9b46f5bf3c504ad6b131fb06bbbe66ab7..410ed279551709734157bd4478cafd261261919a 100644 --- a/src/main/webapp/WEB-INF/spring/spring-main.xml +++ b/src/main/webapp/WEB-INF/spring/spring-main.xml @@ -33,6 +33,11 @@ <context:annotation-config /> <task:annotation-driven /> + + <aop:aspectj-autoproxy> + <aop:include name="authorizationAdviser" /> + <aop:include name="userSessionAspect" /> + </aop:aspectj-autoproxy> <bean id="socketServer" class="de.thm.arsnova.socket.ARSnovaSocketIOServer" init-method="startServer" destroy-method="stopServer" scope="singleton" @@ -42,6 +47,8 @@ <bean id="authorizationAdviser" class="de.thm.arsnova.aop.AuthorizationAdviser"> <property name="userService" ref="userService" /> </bean> + + <bean id="userSessionAspect" class="de.thm.arsnova.aop.UserSessionAspect" /> <bean id="userService" scope="singleton" class="de.thm.arsnova.services.UserService" />