diff --git a/.gitignore b/.gitignore index 043004ca4b70cbf09120b936500595f19d034055..fb7773093c65498cdb1b57bcdb3ff03623b5089a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ target/* chromedriver.log .checkstyle +/target diff --git a/pom.xml b/pom.xml index 4a86237d0ba8f48a5dd68ec7ba9e3c57f27a4222..b8cac2b708a6ea3bfad99f3c3983811abf16aad3 100644 --- a/pom.xml +++ b/pom.xml @@ -385,7 +385,7 @@ <configuration> <url>http://localhost:8080/manager/text</url> <server>arsnova</server> - <path>/arsnova-war</path> + <path>/mobile</path> </configuration> </plugin> <plugin> diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 547bf649b67363dffe1cb872f5eb5835530fb7b5..9c4692f3111f566a6f27ab4705d8d80c45e8b8f7 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -18,12 +18,15 @@ */ package de.thm.arsnova.controller; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletResponse; +import net.sf.json.JSONObject; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -178,11 +181,15 @@ public class SessionController extends AbstractController { } @RequestMapping(value = "/{sessionkey}/mylearningprogress", method = RequestMethod.GET) - public final int myLearningProgress( + public final JSONObject myLearningProgress( @PathVariable final String sessionkey, final HttpServletResponse response ) { - return sessionService.getMyLearningProgress(sessionkey); + SimpleEntry<Integer, Integer> result = sessionService.getMyLearningProgress(sessionkey); + JSONObject json = new JSONObject(); + json.put("myprogress", result.getKey()); + json.put("courseprogress", result.getValue()); + return json; } /* internal redirections */ diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index d33d692bdc5fa73cd88ef60df5c33957b704d9d1..bcb8ea1b31a0cece38f2d631f2419d984d4ebb51 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; +import java.util.AbstractMap; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -1323,42 +1325,62 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public int getLearningProgress(final Session session) { - final NovaView courseView = new NovaView("learning_progress_course_value/course_value"); - final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value"); - courseView.setKey(session.get_id()); - maximumView.setKey(session.get_id()); + public int getLearningProgress(Session session) { + // Note: we have to use this many views because our CouchDB version does not support + // advanced features like summing over lists. Thus, we have to do it all by ourselves... + NovaView maximumValueView = new NovaView("learning_progress_maximum_value/max"); + NovaView answerSumView = new NovaView("learning_progress_user_values/sum"); + NovaView answerDocumentCountView = new NovaView("learning_progress_course_answers/count"); + maximumValueView.setKey(session.get_id()); + answerSumView.setStartKeyArray(session.get_id()); + answerSumView.setEndKeyArray(session.get_id(), "{}"); + answerDocumentCountView.setStartKeyArray(session.get_id()); + answerDocumentCountView.setEndKeyArray(session.get_id(), "{}"); + answerDocumentCountView.setGroup(true); - return getProgressPercentage(courseView, maximumView); + List<Document> maximumValueResult = this.getDatabase().view(maximumValueView).getResults(); + List<Document> answerSumResult = this.getDatabase().view(answerSumView).getResults(); + List<Document> answerDocumentCountResult = this.getDatabase().view(answerDocumentCountView).getResults(); + + if (maximumValueResult.isEmpty() || answerSumResult.isEmpty() || answerDocumentCountResult.isEmpty()) { + return 0; + } + + final double courseMaximumValue = maximumValueResult.get(0).getInt("value"); + final double userTotalValue = answerSumResult.get(0).getInt("value"); + final double numUsers = answerDocumentCountResult.size(); + if (courseMaximumValue == 0 || numUsers == 0) { + return 0; + } + final double courseAverageValue = userTotalValue / numUsers; + final double courseProgress = courseAverageValue / courseMaximumValue; + return (int)Math.round(courseProgress * 100); } @Override - public int getMyLearningProgress(final Session session, final User user) { - final NovaView userView = new NovaView("learning_progress_user_value/user_value"); - final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value"); - userView.setKey(session.get_id(), user.getUsername()); - maximumView.setKey(session.get_id()); + public SimpleEntry<Integer,Integer> getMyLearningProgress(Session session, User user) { + final int courseProgress = this.getLearningProgress(session); - return getProgressPercentage(userView, maximumView); - } + NovaView maximumValueView = new NovaView("learning_progress_maximum_value/max"); + NovaView answerSumView = new NovaView("learning_progress_user_values/sum"); + maximumValueView.setKey(session.get_id()); + answerSumView.setKey(session.get_id(), user.getUsername()); - private int getProgressPercentage(final NovaView progressView, final NovaView maximumView) { - final List<Document> progressValue = getDatabase().view(progressView).getResults(); - final List<Document> maximumValue = getDatabase().view(maximumView).getResults(); - if (maximumValue.isEmpty()) { - return 0; + List<Document> maximumValueResult = this.getDatabase().view(maximumValueView).getResults(); + List<Document> answerSumResult = this.getDatabase().view(answerSumView).getResults(); + + if (maximumValueResult.isEmpty() || answerSumResult.isEmpty()) { + return new AbstractMap.SimpleEntry<Integer, Integer>(0, courseProgress); } - final int maximum = maximumValue.get(0).getInt("value"); - int progress = 0; - if (!progressValue.isEmpty()) { - if (progressValue.get(0).optJSONArray("value").isArray()) { - final JSONArray courseProgress = progressValue.get(0).getJSONArray("value"); - progress = courseProgress.getInt(0) / courseProgress.getInt(1); - } else { - progress = progressValue.get(0).getInt("value"); - } + + final double courseMaximumValue = maximumValueResult.get(0).getInt("value"); + final double userTotalValue = answerSumResult.get(0).getInt("value"); + + if (courseMaximumValue == 0) { + return new AbstractMap.SimpleEntry<Integer, Integer>(0, courseProgress); } - final int percentage = (int)(progress * 100.0f / maximum); - return percentage < 0 ? 0 : percentage; + final double myProgress = userTotalValue / courseMaximumValue; + + return new AbstractMap.SimpleEntry<Integer, Integer>((int)Math.round((myProgress*100)), courseProgress); } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 948402374f93dff6c72961635840580a47a06bce..40bb3f97ca33db3970cc8dd5f04f072f5d879471 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -19,6 +19,7 @@ package de.thm.arsnova.dao; +import java.util.AbstractMap.SimpleEntry; import java.util.List; import de.thm.arsnova.connector.model.Course; @@ -164,5 +165,5 @@ public interface IDatabaseDao { int getLearningProgress(Session session); - int getMyLearningProgress(Session session, User user); + SimpleEntry<Integer, Integer> getMyLearningProgress(Session session, User user); } diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index e9b4c543204dc82da2d1f41d1d392237199f3038..20e40d828d1b5958df5b0ed50935b496f5853fd3 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -19,6 +19,7 @@ package de.thm.arsnova.services; +import java.util.AbstractMap.SimpleEntry; import java.util.List; import java.util.UUID; @@ -55,5 +56,5 @@ public interface ISessionService { int getLearningProgress(String sessionkey); - int getMyLearningProgress(String sessionkey); + SimpleEntry<Integer, Integer> getMyLearningProgress(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 81cee4ce86ea7002db21d31c2dd090fa10b7fdee..595c0567a9e7b27320fafc439ab3ffe7b891c309 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -20,6 +20,7 @@ package de.thm.arsnova.services; import java.io.Serializable; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -262,7 +263,7 @@ public class SessionService implements ISessionService { @Override @PreAuthorize("isAuthenticated()") - public int getMyLearningProgress(final String sessionkey) { + public SimpleEntry<Integer,Integer> getMyLearningProgress(final String sessionkey) { final Session session = databaseDao.getSession(sessionkey); final User user = userService.getCurrentUser(); return databaseDao.getMyLearningProgress(session, user); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 20a6e9f35b3d7363a41a5ed34d3e2bf17f4085d0..c73b88f96c0560c885ed9865c881c3a530cd54eb 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -18,6 +18,7 @@ */ package de.thm.arsnova.dao; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -506,8 +507,8 @@ public class StubDatabaseDao implements IDatabaseDao { } @Override - public int getMyLearningProgress(Session session, User user) { + public SimpleEntry<Integer, Integer> getMyLearningProgress(Session session, User user) { // TODO Auto-generated method stub - return 0; + return null; } }