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