diff --git a/src/main/java/de/thm/arsnova/FeedbackStorage.java b/src/main/java/de/thm/arsnova/FeedbackStorage.java new file mode 100644 index 0000000000000000000000000000000000000000..3ac11f5535786d30535041c504873c4f4f908f9c --- /dev/null +++ b/src/main/java/de/thm/arsnova/FeedbackStorage.java @@ -0,0 +1,128 @@ +package de.thm.arsnova; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import de.thm.arsnova.dao.IDatabaseDao; +import de.thm.arsnova.entities.Feedback; +import de.thm.arsnova.entities.User; +import de.thm.arsnova.exceptions.NotFoundException; + +public class FeedbackStorage { + private static class FeedbackStorageObject { + private int value; + private Date timestamp; + private User user; + + public FeedbackStorageObject(int initValue, User u) { + this.value = initValue; + this.timestamp = new Date(); + this.user = u; + } + + public int getValue() { + return value; + } + public Date getTimestamp() { + return timestamp; + } + public boolean fromUser(User u) { + return u.getUsername().equals(user.getUsername()); + } + } + + private Map<String, Map<String, FeedbackStorageObject>> data; + + private IDatabaseDao dao; + + public FeedbackStorage(IDatabaseDao newDao) { + this.data = new HashMap<String, Map<String,FeedbackStorageObject>>(); + this.dao = newDao; + } + + public Feedback getFeedback(String keyword) { + int a = 0; + int b = 0; + int c = 0; + int d = 0; + + if (dao.getSession(keyword) == null) { + throw new NotFoundException(); + } + + if (data.get(keyword) == null) { + return new Feedback(0, 0, 0, 0); + } + + for (FeedbackStorageObject fso : data.get(keyword).values()) { + switch (fso.getValue()) { + case Feedback.FEEDBACK_FASTER: + a++; + break; + case Feedback.FEEDBACK_OK: + b++; + break; + case Feedback.FEEDBACK_SLOWER: + c++; + break; + case Feedback.FEEDBACK_AWAY: + d++; + break; + default: + break; + } + } + return new Feedback(a, b, c, d); + } + + public Integer getMyFeedback(String keyword, User u) { + if (data.get(keyword) == null) { + return null; + } + + for (FeedbackStorageObject fso : data.get(keyword).values()) { + if (fso.fromUser(u)) { + return fso.getValue(); + } + } + + return null; + } + + public boolean saveFeedback(String keyword, int value, User user) { + if (dao.getSession(keyword) == null) { + throw new NotFoundException(); + } + + if (data.get(keyword) == null) { + data.put(keyword, new HashMap<String, FeedbackStorageObject>()); + } + + System.out.println(user.getUsername()); + + data.get(keyword).put(user.getUsername(), new FeedbackStorageObject(value, user)); + return true; + } + + public void cleanFeedbackVotes(int cleanupFeedbackDelay) { + for (String keyword : data.keySet()) { + this.cleanSessionFeedbackVotes(keyword, cleanupFeedbackDelay); + } + } + + private void cleanSessionFeedbackVotes(String keyword, int cleanupFeedbackDelay) { + final long timelimitInMillis = 60000 * (long) cleanupFeedbackDelay; + final long maxAllowedTimeInMillis = System.currentTimeMillis() - timelimitInMillis; + + Map<String, FeedbackStorageObject> sessionFeedbacks = data.get(keyword); + + for (Map.Entry<String, FeedbackStorageObject> entry : sessionFeedbacks.entrySet()) { + if ( + entry.getValue().getTimestamp().getTime() < maxAllowedTimeInMillis + ) { + sessionFeedbacks.remove(entry.getKey()); + } + } + } +} diff --git a/src/main/java/de/thm/arsnova/services/FeedbackService.java b/src/main/java/de/thm/arsnova/services/FeedbackService.java index 3523b64ce0a0fb07b2b59ca0cfeac624083079a8..db7bff304020fdb69d818c6af8156e2f233034c5 100644 --- a/src/main/java/de/thm/arsnova/services/FeedbackService.java +++ b/src/main/java/de/thm/arsnova/services/FeedbackService.java @@ -19,17 +19,18 @@ package de.thm.arsnova.services; -import java.util.Date; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import de.thm.arsnova.FeedbackStorage; import de.thm.arsnova.dao.IDatabaseDao; import de.thm.arsnova.entities.Feedback; import de.thm.arsnova.entities.User; @@ -55,25 +56,32 @@ public class FeedbackService implements IFeedbackService { @Autowired private IUserService userService; + + private FeedbackStorage feedbackStorage; public final void setDatabaseDao(final IDatabaseDao newDatabaseDao) { this.databaseDao = newDatabaseDao; } + @PostConstruct + public void init() { + this.feedbackStorage = new FeedbackStorage(databaseDao); + } + @Override @Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY) public final void cleanFeedbackVotes() { - databaseDao.cleanFeedbackVotes(cleanupFeedbackDelay); + feedbackStorage.cleanFeedbackVotes(cleanupFeedbackDelay); } @Override public final Feedback getFeedback(final String keyword) { - return databaseDao.getFeedback(keyword); + return feedbackStorage.getFeedback(keyword); } @Override public final int getFeedbackCount(final String keyword) { - Feedback feedback = databaseDao.getFeedback(keyword); + Feedback feedback = feedbackStorage.getFeedback(keyword); List<Integer> values = feedback.getValues(); return values.get(Feedback.FEEDBACK_FASTER) + values.get(Feedback.FEEDBACK_OK) + values.get(Feedback.FEEDBACK_SLOWER) + values.get(Feedback.FEEDBACK_AWAY); @@ -81,7 +89,7 @@ public class FeedbackService implements IFeedbackService { @Override public final double getAverageFeedback(final String sessionkey) { - Feedback feedback = databaseDao.getFeedback(sessionkey); + Feedback feedback = feedbackStorage.getFeedback(sessionkey); List<Integer> values = feedback.getValues(); double count = values.get(Feedback.FEEDBACK_FASTER) + values.get(Feedback.FEEDBACK_OK) + values.get(Feedback.FEEDBACK_SLOWER) + values.get(Feedback.FEEDBACK_AWAY); @@ -101,7 +109,7 @@ public class FeedbackService implements IFeedbackService { @Override public final boolean saveFeedback(final String keyword, final int value, final User user) { - boolean result = databaseDao.saveFeedback(keyword, value, user); + boolean result = feedbackStorage.saveFeedback(keyword, value, user); if (result) { this.server.reportUpdatedFeedbackForSession(keyword); } @@ -136,91 +144,6 @@ public class FeedbackService implements IFeedbackService { @Override public final Integer getMyFeedback(final String keyword, final User user) { - return this.databaseDao.getMyFeedback(keyword, user); - } - - private static class FeedbackStorageObject { - private int value; - private Date timestamp; - - public FeedbackStorageObject(int initValue) { - this.value = initValue; - this.timestamp = new Date(); - } - - public int getValue() { - return value; - } - public Date getTimestamp() { - return timestamp; - } - } - - private static class FeedbackStorage { - private Map<String, Map<String, FeedbackStorageObject>> data; - - public FeedbackStorage() { - this.data = new HashMap<String, Map<String,FeedbackStorageObject>>(); - } - - public Feedback getFeedback(String keyword) { - int a = 0; - int b = 0; - int c = 0; - int d = 0; - - if (data.get(keyword) == null) { - return new Feedback(0, 0, 0, 0); - } - - for (FeedbackStorageObject fso : data.get(keyword).values()) { - switch (fso.getValue()) { - case Feedback.FEEDBACK_FASTER: - a++; - break; - case Feedback.FEEDBACK_OK: - b++; - break; - case Feedback.FEEDBACK_SLOWER: - c++; - break; - case Feedback.FEEDBACK_AWAY: - d++; - break; - default: - break; - } - } - return new Feedback(a, b, c, d); - } - - public boolean saveFeedback(String keyword, int value, User user) { - if (data.get(keyword) == null) { - data.put(keyword, new HashMap<String, FeedbackStorageObject>()); - } - data.get(keyword).put(user.getUsername(), new FeedbackStorageObject(value)); - return true; - } - - public void cleanFeedbackVotes(int cleanupFeedbackDelay) { - for (String keyword : data.keySet()) { - this.cleanSessionFeedbackVotes(keyword, cleanupFeedbackDelay); - } - } - - private void cleanSessionFeedbackVotes(String keyword, int cleanupFeedbackDelay) { - final long timelimitInMillis = 60000 * (long) cleanupFeedbackDelay; - final long maxAllowedTimeInMillis = System.currentTimeMillis() - timelimitInMillis; - - Map<String, FeedbackStorageObject> sessionFeedbacks = data.get(keyword); - - for (Map.Entry<String, FeedbackStorageObject> entry : sessionFeedbacks.entrySet()) { - if ( - entry.getValue().getTimestamp().getTime() < maxAllowedTimeInMillis - ) { - sessionFeedbacks.remove(entry.getKey()); - } - } - } + return this.feedbackStorage.getMyFeedback(keyword, user); } } diff --git a/src/test/java/de/thm/arsnova/controller/FeedbackControllerTest.java b/src/test/java/de/thm/arsnova/controller/FeedbackControllerTest.java index d0b8997bcac3b8d60fad34d7d06f6c214073eb3f..662f1f82341e2b4aef8e27fd59cfdd8d1b8dc0b3 100644 --- a/src/test/java/de/thm/arsnova/controller/FeedbackControllerTest.java +++ b/src/test/java/de/thm/arsnova/controller/FeedbackControllerTest.java @@ -20,6 +20,7 @@ import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; +import de.thm.arsnova.FeedbackStorage; import de.thm.arsnova.dao.StubDatabaseDao; import de.thm.arsnova.exceptions.NoContentException; import de.thm.arsnova.exceptions.NotFoundException; @@ -47,6 +48,8 @@ public class FeedbackControllerTest { @Autowired private StubDatabaseDao databaseDao; + + private FeedbackStorage feedbackStorage; @After public final void cleanup() { @@ -58,6 +61,7 @@ public class FeedbackControllerTest { this.request = new MockHttpServletRequest(); this.response = new MockHttpServletResponse(); handlerAdapter = applicationContext.getBean(AnnotationMethodHandlerAdapter.class); + this.feedbackStorage = new FeedbackStorage(databaseDao); } @Test(expected = NotFoundException.class) @@ -105,6 +109,6 @@ public class FeedbackControllerTest { handlerAdapter.handle(request, response, feedbackController); assertTrue(response.getStatus() == 200); - assertEquals("{\"values\":[2,3,5,7]}", response.getContentAsString()); + assertEquals("{\"values\":[0,0,0,0]}", response.getContentAsString()); } } diff --git a/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java b/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java index 2882e4b3c1e223a399daf8ca9e57ff9a47180631..63fcbcd0bc271b89c926688f3bbc8fc09b7a0fb9 100644 --- a/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java +++ b/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java @@ -55,7 +55,7 @@ public class StatisticsControllerTest { request.setRequestURI("/statistics/sessioncount"); handlerAdapter.handle(request, response, statisticsController); - assertEquals("2", response.getContentAsString()); + assertEquals("3", response.getContentAsString()); } @Test @@ -64,7 +64,7 @@ public class StatisticsControllerTest { request.setRequestURI("/statistics/"); handlerAdapter.handle(request, response, statisticsController); - String expected = "{\"answers\":0,\"questions\":0,\"openSessions\":2,\"closedSessions\":0,\"activeUsers\":0}"; + String expected = "{\"answers\":0,\"questions\":0,\"openSessions\":3,\"closedSessions\":0,\"activeUsers\":0}"; assertEquals(expected, response.getContentAsString()); } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index d9212d1341be9c569e0eea34c601712500437ed8..ef4e0c5e687fd96588f3943d95f3b71b1cb4cdb0 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -86,6 +86,15 @@ public class StubDatabaseDao implements IDatabaseDao { session.setShortName("TS2"); stubSessions.put("87654321", session); + + session = new Session(); + session.setActive(true); + session.setCreator("ptsr00"); + session.setKeyword("18273645"); + session.setName("TestSession2"); + session.setShortName("TS3"); + + stubSessions.put("18273645", session); } private void fillWithDummyFeedbacks() { diff --git a/src/test/java/de/thm/arsnova/services/FeedbackServiceTest.java b/src/test/java/de/thm/arsnova/services/FeedbackServiceTest.java index 2ea24a36d5fc5c58173f02f1e978433b3d1399b8..e96de49ee2e1a51b206a68e319cf8566f49f652f 100644 --- a/src/test/java/de/thm/arsnova/services/FeedbackServiceTest.java +++ b/src/test/java/de/thm/arsnova/services/FeedbackServiceTest.java @@ -22,13 +22,16 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import de.thm.arsnova.dao.StubDatabaseDao; +import de.thm.arsnova.entities.User; import de.thm.arsnova.exceptions.NoContentException; import de.thm.arsnova.exceptions.NotFoundException; @@ -49,6 +52,53 @@ public class FeedbackServiceTest { @Autowired private StubDatabaseDao databaseDao; + @Before + public final void setup() { + userService.setUserAuthenticated(false); + + feedbackService.saveFeedback("87654321", 0, new TestUser("testuser01")); + feedbackService.saveFeedback("87654321", 0, new TestUser("testuser02")); + feedbackService.saveFeedback("87654321", 1, new TestUser("testuser11")); + feedbackService.saveFeedback("87654321", 1, new TestUser("testuser12")); + feedbackService.saveFeedback("87654321", 1, new TestUser("testuser13")); + feedbackService.saveFeedback("87654321", 2, new TestUser("testuser21")); + feedbackService.saveFeedback("87654321", 2, new TestUser("testuser22")); + feedbackService.saveFeedback("87654321", 2, new TestUser("testuser23")); + feedbackService.saveFeedback("87654321", 2, new TestUser("testuser24")); + feedbackService.saveFeedback("87654321", 2, new TestUser("testuser25")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser31")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser32")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser33")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser34")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser35")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser36")); + feedbackService.saveFeedback("87654321", 3, new TestUser("testuser37")); + + + feedbackService.saveFeedback("18273645", 0, new TestUser("testuser01")); + feedbackService.saveFeedback("18273645", 0, new TestUser("testuser02")); + feedbackService.saveFeedback("18273645", 1, new TestUser("testuser11")); + feedbackService.saveFeedback("18273645", 1, new TestUser("testuser12")); + feedbackService.saveFeedback("18273645", 1, new TestUser("testuser13")); + feedbackService.saveFeedback("18273645", 2, new TestUser("testuser21")); + feedbackService.saveFeedback("18273645", 2, new TestUser("testuser22")); + feedbackService.saveFeedback("18273645", 2, new TestUser("testuser23")); + feedbackService.saveFeedback("18273645", 2, new TestUser("testuser24")); + feedbackService.saveFeedback("18273645", 2, new TestUser("testuser25")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser31")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser32")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser33")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser34")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser35")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser36")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser37")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser38")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser39")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser310")); + feedbackService.saveFeedback("18273645", 3, new TestUser("testuser311")); + + } + @After public final void cleanup() { databaseDao.cleanupTestData(); @@ -112,4 +162,15 @@ public class FeedbackServiceTest { userService.setUserAuthenticated(true); assertEquals(2.1904, feedbackService.getAverageFeedback("18273645"), 0.001); } + + public static class TestUser extends User { + private static final long serialVersionUID = 1L; + + private String username; + private String type; + + public TestUser(String username) { + super( new UsernamePasswordAuthenticationToken(username, "secret") ); + } + } } \ No newline at end of file diff --git a/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java b/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java index a0e846e680327d4fac2cd135ba0ee84bf1d85c5a..ec348f3b67f4f70c53846a385ff1806983817693 100644 --- a/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java +++ b/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java @@ -67,7 +67,7 @@ public class StatisticsServiceTest { @Test public final void testShouldReturnStatistics() { Statistics actual = statisticsService.getStatistics(); - assertEquals(2, actual.getOpenSessions()); + assertEquals(3, actual.getOpenSessions()); assertEquals(1, actual.getClosedSessions()); } }