diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index c59d5395704787c3eff64536e919b290215e60bf..8165a526e946aaf7289bfb796a5b378bb3790211 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -801,7 +801,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware public Session updateSessionOwnerActivity(final Session session) { try { /* Do not clutter CouchDB. Only update once every 3 hours. */ - if (session.getLastOwnerActivity() > System.currentTimeMillis() - 3 * 3600000) { + if (session.getLastOwnerActivity() > System.currentTimeMillis() - 60 * 1000) { return session; } @@ -1677,11 +1677,32 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware public void deleteSession(final Session session) { try { deleteDocument(session.get_id()); + LOGGER.debug("Deleted session document {} and related data.", session.get_id()); } catch (final IOException e) { LOGGER.error("Could not delete session {}", session); } } + @Override + public boolean deleteInactiveGuestSessions(long lastActivityBefore) { + NovaView view = new NovaView("session/by_last_activity_for_guests"); + view.setEndKey(lastActivityBefore); + List<Document> results = this.getDatabase().view(view).getResults(); + + for (Document oldDoc : results) { + Session s = new Session(); + s.set_id(oldDoc.getId()); + s.set_rev(oldDoc.getJSONObject("value").getString("_rev")); + deleteSession(s); + } + + if (results.size() > 0) { + LOGGER.info("Deleted {} inactive guest sessions.", results.size()); + } + + return false; + } + @Cacheable("lecturequestions") @Override public List<Question> getLectureQuestionsForUsers(final Session session) { diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index f1ed738724e9378a729998e945de8277915a3054..c8ccf8c3c3aa95c3eefd7091cf591be2a9380252 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -146,6 +146,8 @@ public interface IDatabaseDao { void deleteSession(Session session); + boolean deleteInactiveGuestSessions(long lastActivityBefore); + List<Question> getLectureQuestionsForUsers(Session session); List<Question> getLectureQuestionsForTeachers(Session session); diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index 373f78d27b5ce813c0d374e0ca735ec17d954386..7b6c742068adb955a7e43845ac1ab90a88f7227d 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -91,6 +91,8 @@ public interface ISessionService { SessionFeature changeSessionFeatures(String sessionkey, SessionFeature features); boolean lockFeedbackInput(String sessionkey, Boolean lock); - + boolean flipFlashcards(String sessionkey, Boolean flip); + + void deleteInactiveSessions(); } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index e2c4b94a80392acbe452cfc880c0a1638c30a7bd..378684fc20720b154292d4547dc1e4eff10c96c1 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -47,6 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; @@ -98,6 +99,9 @@ public class SessionService implements ISessionService, ApplicationEventPublishe } } + private static final long SESSION_INACTIVITY_CHECK_INTERVAL_MS = 60 * 1000L; // 30 * 60 * 1000L; + private static final long SESSION_INACTIVITY_THRESHOLD_MS = 3 * 60 * 1000L; // 90 * 24 * 60 * 60 * 1000L; + @Autowired private IDatabaseDao databaseDao; @@ -123,6 +127,14 @@ public class SessionService implements ISessionService, ApplicationEventPublishe public static final Logger LOGGER = LoggerFactory.getLogger(SessionService.class); + @Scheduled(fixedDelay = SESSION_INACTIVITY_CHECK_INTERVAL_MS) + public void deleteInactiveSessions() { + LOGGER.info("Delete inactive sessions."); + long unixTime = System.currentTimeMillis(); + long lastActivityBefore = unixTime - SESSION_INACTIVITY_THRESHOLD_MS; + databaseDao.deleteInactiveGuestSessions(lastActivityBefore); + } + public void setDatabaseDao(final IDatabaseDao newDatabaseDao) { databaseDao = newDatabaseDao; } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 675efb8a5bedaa4647105aa1fc3a805abfbb820d..1a1c4c6688daa283a8b6f210d4309a6e1d5b69c7 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -345,6 +345,12 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub } + @Override + public boolean deleteInactiveGuestSessions(long lastActivityBefore) { + // TODO Auto-generated method stub + return false; + } + @Override public void deleteAllQuestionsWithAnswers(Session session) { // TODO Auto-generated method stub