From 5e8268a28167130bfdb48bc556a527c755e24fe2 Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Tue, 4 Jun 2013 18:13:18 +0200
Subject: [PATCH] Added simple session scoped bean to hold user and session

This bean holds user and session object of the current user after he
joins a session and could be used to access those objects within the
application.

Added two simple URIs to get a JSON representation of the referenced
objects.
---
 .../arsnova/controller/LoginController.java   | 17 +++++++++
 .../arsnova/controller/SessionController.java |  9 ++++-
 .../arsnova/services/UserSessionService.java  | 14 ++++++++
 .../services/UserSessionServiceImpl.java      | 35 +++++++++++++++++++
 src/test/resources/test-config.xml            | 10 ++++++
 5 files changed, 84 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/de/thm/arsnova/services/UserSessionService.java
 create mode 100644 src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java

diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java
index 9fd538ab..40e8b3bd 100644
--- a/src/main/java/de/thm/arsnova/controller/LoginController.java
+++ b/src/main/java/de/thm/arsnova/controller/LoginController.java
@@ -51,8 +51,10 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.View;
 import org.springframework.web.servlet.view.RedirectView;
 
+import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.services.IUserService;
+import de.thm.arsnova.services.UserSessionService;
 
 @Controller
 public class LoginController extends AbstractController {
@@ -73,6 +75,9 @@ public class LoginController extends AbstractController {
 
 	@Autowired
 	private IUserService userService;
+	
+	@Autowired
+	private UserSessionService userSessionService;
 
 	public static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
 
@@ -154,4 +159,16 @@ public class LoginController extends AbstractController {
 		}
 		return new RedirectView(request.getHeader("referer") != null ? request.getHeader("referer") : "/");
 	}
+	
+	@RequestMapping(value = { "/test/me" }, method = RequestMethod.GET)
+	@ResponseBody
+	public final User me() {
+		return userSessionService.getUser();		
+	}
+	
+	@RequestMapping(value = { "/test/mysession" }, method = RequestMethod.GET)
+	@ResponseBody
+	public final Session mysession() {
+		return userSessionService.getSession();		
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 6d46ace9..59b9e529 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -43,6 +43,7 @@ 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;
 
@@ -58,10 +59,16 @@ 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) {
-		return sessionService.joinSession(sessionkey);
+		Session session = sessionService.joinSession(sessionkey);
+		userSessionService.setUser(userService.getCurrentUser());
+		userSessionService.setSession(session);
+		return session;
 	}
 
 	@RequestMapping(value = "/{sessionkey}", method = RequestMethod.DELETE)
diff --git a/src/main/java/de/thm/arsnova/services/UserSessionService.java b/src/main/java/de/thm/arsnova/services/UserSessionService.java
new file mode 100644
index 00000000..ea5b0968
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/services/UserSessionService.java
@@ -0,0 +1,14 @@
+package de.thm.arsnova.services;
+
+import de.thm.arsnova.entities.Session;
+import de.thm.arsnova.entities.User;
+
+public interface UserSessionService {
+
+	void setUser(User user);
+	User getUser();
+	
+	void setSession(Session session);
+	Session getSession();
+	
+}
\ 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
new file mode 100644
index 00000000..cbc8bc20
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
@@ -0,0 +1,35 @@
+package de.thm.arsnova.services;
+
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import de.thm.arsnova.entities.Session;
+import de.thm.arsnova.entities.User;
+
+@Component
+@Scope("session")
+public class UserSessionServiceImpl implements UserSessionService {
+	
+	private User user;
+	private Session session;
+	
+	@Override
+	public void setUser(User u) {
+		this.user = u;
+	}
+	
+	@Override
+	public User getUser() {
+		return user;
+	}
+	
+	@Override
+	public void setSession(Session s) {
+		this.session = s;
+	}
+	
+	@Override
+	public Session getSession() {
+		return this.session;
+	}
+}
diff --git a/src/test/resources/test-config.xml b/src/test/resources/test-config.xml
index 1ef56bd0..1b6ae97a 100644
--- a/src/test/resources/test-config.xml
+++ b/src/test/resources/test-config.xml
@@ -17,4 +17,14 @@
 	</bean>
 
 	<bean id="userService" class="de.thm.arsnova.services.StubUserService" />
+	
+	<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
+    <property name="scopes">
+        <map>
+            <entry key="session">
+                <bean class="org.springframework.context.support.SimpleThreadScope"/>
+            </entry>
+        </map>
+    </property>
+	</bean>
 </beans>
-- 
GitLab