From ba4d587fbcf171d77d40e0962e47d6273ff0dfbc Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Thu, 1 Nov 2012 13:03:55 +0100
Subject: [PATCH] Issue #4058: Fetch active users count from CouchDB

---
 .../arsnova/controller/SessionController.java |  9 ++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 30 ++++++++++++++-----
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  4 ++-
 .../thm/arsnova/services/ISessionService.java |  2 ++
 .../thm/arsnova/services/SessionService.java  |  9 ++++++
 .../arsnova/services/StatisticsService.java   |  2 +-
 .../de/thm/arsnova/dao/StubDatabaseDao.java   |  2 +-
 7 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 5df0665e..26d2300c 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -92,6 +92,15 @@ public class SessionController extends AbstractController {
 		return null;
 	}
 
+	@RequestMapping(value = "/session/{sessionkey}/activeusercount", method = RequestMethod.GET)
+	@ResponseBody
+	public final int countActiveUsers(
+			@PathVariable final String sessionkey,
+			final HttpServletResponse response
+	) {
+		return sessionService.countActiveUsers(sessionkey);
+	}
+
 	@RequestMapping(value = "/session", method = RequestMethod.POST)
 	@ResponseBody
 	public final Session postNewSession(@RequestBody final Session session, final HttpServletResponse response) {
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 77f5e5a1..a9f6dbe7 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -857,17 +857,13 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 
 	@Override
-	public final int getActiveUsers(final long since) {
+	public final int countActiveUsers(final long since) {
 		try {
 			View view = new View("statistic/count_active_users");
 			view.setStartKey(String.valueOf(since));
 			ViewResults results = this.getDatabase().view(view);
 			LOGGER.info("getActiveUsers() {}", results);
-			if (
-					results == null
-					|| results.getResults().isEmpty()
-					|| results.getJSONArray("rows").size() == 0
-			) {
+			if (isEmptyResults(results)) {
 				return 0;
 			}
 			return results.getJSONArray("rows").optJSONObject(0).getInt("value");
@@ -876,7 +872,27 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return 0;
 	}
-	
+
+	@Override
+	public final int countActiveUsers(Session session, long since) {
+		try {
+			View view = new View("logged_in/count");
+			view.setStartKey(URLEncoder.encode("[\"" + session.get_id() + "\", " + String.valueOf(since) + "]", "UTF-8"));
+			view.setEndKey(URLEncoder.encode("[\"" + session.get_id() + "\", {}]", "UTF-8"));
+			ViewResults results = this.getDatabase().view(view);
+			if (isEmptyResults(results)) {
+				return 0;
+			}
+			return results.getJSONArray("rows").optJSONObject(0).getInt("value");
+		} catch (UnsupportedEncodingException e) {
+			return 0;
+		}
+	}
+
+	private boolean isEmptyResults(ViewResults results) {
+		return results == null || results.getResults().isEmpty() || results.getJSONArray("rows").size() == 0;
+	}
+
 	@Override
 	public List<Answer> getFreetextAnswers(String sessionKey, String questionId) {
 		Session s = this.getSessionFromKeyword(sessionKey);
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index dc5f7ebd..8d8f5870 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -73,5 +73,7 @@ public interface IDatabaseDao {
 
 	List<Answer> getFreetextAnswers(String sessionKey, String questionId);
 
-	int getActiveUsers(long since);
+	int countActiveUsers(long since);
+
+	int countActiveUsers(Session session, long since);
 }
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index a25be2df..865fc2fc 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -37,4 +37,6 @@ public interface ISessionService {
 	List<Session> getMySessions(String username);
 
 	LoggedIn registerAsOnlineUser(User user, String sessionkey);
+
+	int countActiveUsers(String sessionkey);
 }
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index d7e2a3ac..2d0c6507 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -33,6 +33,8 @@ import de.thm.arsnova.entities.User;
 @Service
 public class SessionService implements ISessionService {
 
+	private static final int DURATION_IN_MILLIS = 3 * 60 * 1000;
+	
 	@Autowired
 	private IDatabaseDao databaseDao;
 
@@ -92,4 +94,11 @@ public class SessionService implements ISessionService {
 
 		return databaseDao.registerAsOnlineUser(user, session);
 	}
+
+	@Override
+	public int countActiveUsers(String sessionkey) {
+		final long since = System.currentTimeMillis() - DURATION_IN_MILLIS;
+		Session session = databaseDao.getSessionFromKeyword(sessionkey);
+		return databaseDao.countActiveUsers(session, since);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/services/StatisticsService.java b/src/main/java/de/thm/arsnova/services/StatisticsService.java
index 87c2e942..8b35fbf5 100644
--- a/src/main/java/de/thm/arsnova/services/StatisticsService.java
+++ b/src/main/java/de/thm/arsnova/services/StatisticsService.java
@@ -16,6 +16,6 @@ public class StatisticsService implements IStatisticsService {
 	@Override
 	public final int countActiveUsers() {
 		long since = System.currentTimeMillis() - SINCEDURATION;
-		return databaseDao.getActiveUsers(since);
+		return databaseDao.countActiveUsers(since);
 	}
 }
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index 76b4f2b3..817b4e78 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -236,7 +236,7 @@ public class StubDatabaseDao implements IDatabaseDao {
 	}
 	
 	@Override
-	public int getActiveUsers(long since) {
+	public int countActiveUsers(long since) {
 		return stubUsers.size();
 	}
 
-- 
GitLab