From e7974c89d828ccfc35bc77751c4b7798f50f278f Mon Sep 17 00:00:00 2001
From: tekay <tom.kaesler@mni.thm.de>
Date: Fri, 13 Mar 2015 15:20:00 +0100
Subject: [PATCH] #15360 reworked alphabetical sort

---
 .../LecturerQuestionController.java           | 29 ++++----
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 41 ++---------
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  4 +-
 .../de/thm/arsnova/entities/SortOrder.java    |  8 ++-
 .../arsnova/services/IQuestionService.java    |  5 ++
 .../thm/arsnova/services/QuestionService.java | 72 ++++++++++++++++---
 .../de/thm/arsnova/dao/StubDatabaseDao.java   | 13 ++++
 7 files changed, 113 insertions(+), 59 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
index b160c1722..e3ca7e6e2 100644
--- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
@@ -430,14 +430,16 @@ public class LecturerQuestionController extends AbstractController {
 
 	@RequestMapping(value = "/setsubjectsort", method = RequestMethod.POST)
 	public void setSubjectSortOrder(
-			@PathVariable final String questionId,
-			@RequestParam(required = false) final Boolean publish,
-			@RequestBody final Question question
+			@RequestParam(required = true) final String sessionkey,
+            @RequestParam(required = true) final String sortType,
+            @RequestParam(required = true) final String isPreparation,
+			@RequestBody String[] sortOrder
 			) {
-		if (publish != null) {
-			question.setActive(publish);
+		try {
+			questionService.setSubjectSort(sessionkey, sortType, isPreparation, sortOrder) ;
+		} catch (final Exception e) {
+			throw new BadRequestException();
 		}
-		//whaat?
 	}
 
 	@RequestMapping(value = "/getsubjectsort", method = RequestMethod.GET)
@@ -450,14 +452,17 @@ public class LecturerQuestionController extends AbstractController {
 
 	@RequestMapping(value = "/setquestionsort", method = RequestMethod.POST)
 	public void setQuestionSortOrder(
-			@PathVariable final String questionId,
-			@RequestParam(required = false) final Boolean publish,
-			@RequestBody final Question question
+			@RequestParam(required = true) final String sessionkey,
+            @RequestParam(required = true) final String subject,
+            @RequestParam(required = true) final String sortType,
+            @RequestParam(required = true) final String isPreparation,
+			@RequestBody String[] sortOrder
 			) {
-		if (publish != null) {
-			question.setActive(publish);
+		try {
+			questionService.setQuestionSort(sessionkey, subject, sortType, isPreparation, sortOrder);
+		} catch (final Exception e) {
+			throw new BadRequestException();
 		}
-		//whaat?
 	}
 
 	@RequestMapping(value = "/getquestionsort", method = RequestMethod.GET)
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index b747ab4fe..3350c198d 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -1396,14 +1396,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	public List<Question> getLectureQuestionsForUsers(final Session session) {
         SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", "");
         if (subjectSortOrder != null) {
-            List<Question> questions = new ArrayList<Question>();
-            if ("alphabet".equals(subjectSortOrder.getSortType())) {
-                // i srsly dunno, lol
-            }
-            else {
-                questions = getQuestionsBySortOrder(subjectSortOrder, true);
-            }
-            return questions;
+            return getQuestionsBySortOrder(subjectSortOrder, true);
         }
         else {
             String viewName = "skill_question/lecture_question_by_session_for_all";
@@ -1415,14 +1408,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	public List<Question> getLectureQuestionsForTeachers(final Session session) {
         SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", "");
         if (subjectSortOrder != null) {
-            List<Question> questions = new ArrayList<Question>();
-            if ("alphabet".equals(subjectSortOrder.getSortType())) {
-                // i srsly dunno, lol
-            }
-            else {
-                questions = getQuestionsBySortOrder(subjectSortOrder, false);
-            }
-            return questions;
+            return getQuestionsBySortOrder(subjectSortOrder, true);
         }
 		else {
             String viewName = "skill_question/lecture_question_by_session";
@@ -1448,14 +1434,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	public List<Question> getPreparationQuestionsForUsers(final Session session) {
         SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", "");
         if (subjectSortOrder != null) {
-            List<Question> questions = new ArrayList<Question>();
-            if ("alphabet".equals(subjectSortOrder.getSortType())) {
-                // i srsly dunno, lol
-            }
-            else {
-                questions = getQuestionsBySortOrder(subjectSortOrder, true);
-            }
-            return questions;
+            return getQuestionsBySortOrder(subjectSortOrder, true);
         }
 		else {
             String viewName = "skill_question/preparation_question_by_session_for_all";
@@ -1467,14 +1446,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	public List<Question> getPreparationQuestionsForTeachers(final Session session) {
         SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", "");
         if (subjectSortOrder != null) {
-            List<Question> questions = new ArrayList<Question>();
-            if ("alphabet".equals(subjectSortOrder.getSortType())) {
-                // i srsly dunno, lol
-            }
-            else {
-                questions = getQuestionsBySortOrder(subjectSortOrder, false);
-            }
-            return questions;
+            return getQuestionsBySortOrder(subjectSortOrder, true);
         }
 		else {
             String viewName = "skill_question/preparation_question_by_session";
@@ -1999,7 +1971,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
     }
     
     @Override
-    public SortOrder createOrUpdateQuestionSortOrder(SortOrder sortOrder) {
+    public SortOrder createOrUpdateSortOrder(SortOrder sortOrder) {
 		try {
 			String id = sortOrder.get_id();
 			String rev = sortOrder.get_rev();
@@ -2011,6 +1983,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			d.put("type", "sort_order");
             d.put("sessionId", sortOrder.getSessionId());
+            d.put("sortType", sortOrder.getSortType());
             d.put("questionVariant", sortOrder.getQuestionVariant());
             d.put("subject", sortOrder.getSubject());
             d.put("sortOrder", sortOrder.getSortOrder());
@@ -2028,7 +2001,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
     
     public List<Question> getQuestionsBySortOrder(SortOrder sortOrder, boolean onlyActive) {
         List<Question> questions = new ArrayList<Question>();
-        String[] questionIds = sortOrder.getSortOrder();
+        List<String> questionIds = sortOrder.getSortOrder();
         for (String t : questionIds) {
             Question tempQuestion = getQuestion(t);
             if (onlyActive) {
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 037c3ca0e..693bcaba0 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -198,7 +198,7 @@ public interface IDatabaseDao {
 
 	Statistics getStatistics();
     
-    SortOrder getSortOrder(String sessionkey, String questionVariant, String subject);
+    SortOrder createOrUpdateSortOrder(SortOrder sortOrder);
     
-    SortOrder createOrUpdateQuestionSortOrder(SortOrder sortOrder);
+    SortOrder getSortOrder(String sessionkey, String questionVariant, String subject);
 }
diff --git a/src/main/java/de/thm/arsnova/entities/SortOrder.java b/src/main/java/de/thm/arsnova/entities/SortOrder.java
index 01d87ebf1..e74990756 100644
--- a/src/main/java/de/thm/arsnova/entities/SortOrder.java
+++ b/src/main/java/de/thm/arsnova/entities/SortOrder.java
@@ -17,13 +17,15 @@
  */
 package de.thm.arsnova.entities;
 
+import java.util.List;
+
 public class SortOrder {
 
     private String sessionId;
 	private String sortType;
     private String questionVariant;
     private String subject;
-    private String[] sortOrder;
+    private List<String> sortOrder;
 
 	private String _id;
 	private String _rev;
@@ -60,11 +62,11 @@ public class SortOrder {
         return this.subject;
     }
     
-    public void setSortOrder(final String[] sortOrder) {
+    public void setSortOrder(final List<String> sortOrder) {
         this.sortOrder = sortOrder;
     }
     
-    public String[] getSortOrder() {
+    public List<String> getSortOrder() {
         return this.sortOrder;
     }
 
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index 46b940876..74c9c48fb 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -25,6 +25,7 @@ import de.thm.arsnova.entities.InterposedQuestion;
 import de.thm.arsnova.entities.InterposedReadingCount;
 import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.SortOrder;
 
 public interface IQuestionService {
 	Question saveQuestion(Question question);
@@ -137,7 +138,11 @@ public interface IQuestionService {
 
 	int getAbstentionAnswerCount(String questionId);
     
+    SortOrder setSubjectSort(String sessionkey, String sortType, String questionVariant, String[] sortOrder);
+    
     String getSubjectSortType(String sessionkey, String isPreparation);
     
+    SortOrder setQuestionSort(String sessionkey, String subject, String sortType, String questionVariant, String[] sortOrder);
+    
     String getQuestionSortType(String sessionkey, String isPreparation, String subject);
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index f99039eba..77723fe67 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -23,10 +23,12 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.Dictionary;
 
 import de.thm.arsnova.exceptions.ForbiddenException;
 
@@ -109,6 +111,7 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 	public Question saveQuestion(final Question question) {
 		final Session session = databaseDao.getSessionFromKeyword(question.getSessionKeyword());
 		question.setSessionId(session.get_id());
+        question.setTimestamp(long unixTime = System.currentTimeMillis() / 1000L);
 
 		if ("freetext".equals(question.getQuestionType())) {
 			question.setPiRound(0);
@@ -138,14 +141,8 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
         
         SortOrder sortOrder = databaseDao.getSortOrder(session.get_id(), question.getQuestionVariant(), question.getSubject());
         if (sortOrder != null) {
-            if("alphabet".equals(sortOrder.getSortType())) {
-                
-            }
-            else {
-                String[] tmp = sortOrder.getSortOrder();
-                tmp.append(question.get_id());
-                sortOrder.setSortOrder(tmp);
-            }
+            addQuestionToSortOrder(sortOrder, question);
+            databaseDao.createOrUpdateSortOrder(sortOrder);
         }
         
 		final NewQuestionEvent event = new NewQuestionEvent(this, session, result);
@@ -790,15 +787,74 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 		this.publisher = publisher;
 	}
     
+    @Override 
+    public SortOrder setSubjectSort(String sessionkey, String sortType, String questionVariant, String[] sortOrderList) {
+        Session session = databaseDao.getSessionFromKeyword(sessionkey);
+        SortOrder existing = databaseDao.getSortOrder(session.get_id(), questionVariant, "");
+        SortOrder sortOrder = new SortOrder();
+        if (existing != null) {
+            sortOrder.set_id(existing.get_id());
+            sortOrder.set_rev(existing.get_rev());
+        }
+        sortOrder.setSessionId(session.get_id());
+        sortOrder.setSubject("");
+        sortOrder.setSortType(sortType);
+        sortOrder.setQuestionVariant(questionVariant);
+        sortOrder.setSortOrder(Arrays.asList(sortOrderList));
+        return databaseDao.createOrUpdateSortOrder(sortOrder);
+    }
+    
     @Override
     public String getSubjectSortType(String sessionkey, String isPreparation) {
         SortOrder sortOrder = databaseDao.getSortOrder(sessionkey, isPreparation, "");
         return sortOrder.getSortType();
     }
     
+    @Override 
+    public SortOrder setQuestionSort(String sessionkey, String subject, String sortType, String questionVariant, String[] sortOrderList) {
+        Session session = databaseDao.getSessionFromKeyword(sessionkey);
+        SortOrder existing = databaseDao.getSortOrder(session.get_id(), questionVariant, subject);
+        SortOrder sortOrder = new SortOrder();
+        if (existing != null) {
+            sortOrder.set_id(existing.get_id());
+            sortOrder.set_rev(existing.get_rev());
+        }
+        sortOrder.setSessionId(session.get_id());
+        sortOrder.setSubject(subject);
+        sortOrder.setSortType(sortType);
+        sortOrder.setQuestionVariant(questionVariant);
+        sortOrder.setSortOrder(Arrays.asList(sortOrderList));
+        return databaseDao.createOrUpdateSortOrder(sortOrder);
+    }
+    
     @Override
     public String getQuestionSortType(String sessionkey, String isPreparation, String subject) {
         SortOrder sortOrder = databaseDao.getSortOrder(sessionkey, isPreparation, subject);
         return sortOrder.getSortType();
     }
+    
+    public SortOrder addQuestionToSortOrder(SortOrder sortOrder, Question question) {
+        List<String> tmpList = sortOrder.getSortOrder();
+        tmpList.add(question.get_id());
+        sortOrder.setSortOrder(tmpList);
+        if("alphabet".equals(sortOrder.getSortType())) {
+            sortOrder = alphabeticalSort(sortOrder);
+        }
+        return sortOrder;
+    }
+                                   
+    public SortOrder alphabeticalSort(SortOrder sortOrder){
+        Hashtable<String, String> hash = new Hashtable();
+        for (String qid : sortOrder.getSortOrder()) {
+            Question question = getQuestion(qid);
+            hash.put(question.getText(), qid);
+        }
+        List<String> sortList = new ArrayList();
+        List<String> keys = new ArrayList(hash.keySet());
+        for (String textKey : keys) {
+            sortList.add(hash.get(textKey));
+        }
+        sortOrder.setSortOrder(sortList);
+        return sortOrder;
+    }
 }
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index ab234bcc8..4fb7ad73b 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -36,6 +36,7 @@ import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.SessionInfo;
 import de.thm.arsnova.entities.Statistics;
 import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.SortOrder;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import de.thm.arsnova.exceptions.NoContentException;
 import de.thm.arsnova.exceptions.NotFoundException;
@@ -573,4 +574,16 @@ public class StubDatabaseDao implements IDatabaseDao {
 		stats.setInterposedQuestions(0);
 		return stats;
 	}
+    
+    @Override
+    public SortOrder createOrUpdateSortOrder(SortOrder sortOrder) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+    
+    @Override
+    public SortOrder getSortOrder(String sessionkey, String questionVariant, String subject) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
-- 
GitLab