Skip to content
Snippets Groups Projects
Commit 94888c17 authored by Paul-Christian Volkmer's avatar Paul-Christian Volkmer
Browse files

Add UserSessionAspect aspect

This sets current user and ARSnova session information in a session
scoped service bean. If the user connects with a websocket, the
websocket session ID will be set in addition to the user and session
object.

The aspects methods pointcut after returning from joinSession() method
in SessionService. So the UserSessionService will be set with all needed
data after a user successfully joins a session.

With this service available, it can be used to replace some usage of
Array/Map based application wide data structures that cause some trouble
when stopping or redeploying the application.
parent 3a25f55b
No related merge requests found
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);
}
}
......@@ -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;
}
......
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
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;
}
}
......@@ -24,10 +24,6 @@
</value>
</property>
</bean>
<aop:aspectj-autoproxy>
<aop:include name="authorizationAdviser" />
</aop:aspectj-autoproxy>
<mvc:annotation-driven />
<mvc:resources mapping="/**" location="/" />
......
......@@ -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" />
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment