diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 5df0665e61218101681e171b1ecf2c1c7a4c6508..26d2300cf503c1298c0452720a7afbe04aac7f3d 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 0273a70b7854a7100881e5e8e550b8c425d07cc7..a9f6dbe791ca64373851f8b183592573c633a935 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -99,13 +99,13 @@ public class CouchDBDao implements IDatabaseDao { public final void setDatabaseName(final String newDatabaseName) { this.databaseName = newDatabaseName; } - - public void setSessionService(ISessionService sessionService) { - this.sessionService = sessionService; + + public final void setSessionService(final ISessionService service) { + this.sessionService = service; } - - public void setUserService(IUserService userService) { - this.userService = userService; + + public final void setUserService(final IUserService service) { + this.userService = service; } /** @@ -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); @@ -899,11 +915,9 @@ public class CouchDBDao implements IDatabaseDao { answers.add(a); } return answers; - } catch (UnsupportedEncodingException e) { LOGGER.error("Error while retrieving freetext answers", e); } - return null; } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index dc5f7ebd245de090b819951ea719f5971871f85a..8d8f5870916f1c0b716322818151a79f2e20a0a3 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 a25be2df53ac2772e2d1c6668d47ecbb0c9b4cd8..865fc2fcba651a786505d545ae484e56a2f8ed3b 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 d7e2a3ac45e13a51a91d4b8e1c90f5fb670c4b1c..c99377734bd47ae2a6dadfd3812f839244d94075 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 87c2e942eccbf9d384dafca9f4133776a53dd055..8b35fbf5598639e2fd7d31fcbd140f5c727b44af 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 76b4f2b39b149536bec98667ff332588eefd2e02..817b4e7857f1abf4b875804bbe33d838fac0b29a 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(); }