From 560f731547ca166476f7205daa0f9acf8e713377 Mon Sep 17 00:00:00 2001
From: Axel <wiepke@uni-potsdam.de>
Date: Fri, 14 Sep 2018 10:05:49 +0200
Subject: [PATCH] refac: Constraint Messages are prepared and should be given
 back on phase Shift control

---
 .../unipotsdam/gf/core/states/PhasesImpl.java | 20 +++++-----
 .../gf/core/states/model/Constraints.java     | 40 +++++--------------
 .../states/model/ConstraintsMessages.java     | 28 +++++++++++++
 .../unipotsdam/gf/interfaces/Feedback.java    |  6 ++-
 .../gf/interfaces/ICommunication.java         |  7 ++++
 .../unipotsdam/gf/interfaces/IJournal.java    |  4 +-
 .../gf/interfaces/IPeerAssessment.java        |  3 +-
 .../controller/service/FBAssessement.java     |  3 +-
 .../controller/service/PeerAssessment.java    |  3 +-
 .../service/PeerAssessmentDummy.java          |  5 ++-
 .../service/CommunicationDummyService.java    |  9 +++++
 .../modules/journal/service/IJournalImpl.java | 10 ++++-
 .../journal/service/JournalService.java       |  5 ++-
 .../journal/service/JournalServiceImpl.java   | 13 +++++-
 .../service/ProjectDescriptionImpl.java       | 14 ++++++-
 .../service/ProjectDescriptionService.java    |  4 +-
 .../peer2peerfeedback/DummyFeedback.java      | 13 ++++--
 .../gf/interfaces/ActivityFlowTest.java       |  5 +--
 .../service/JournalServiceImplTest.java       |  4 +-
 .../service/ProjectDescriptionImplTest.java   |  4 +-
 20 files changed, 133 insertions(+), 67 deletions(-)
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/ConstraintsMessages.java

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
index 685e6018..15b4be6f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PhasesImpl.java
@@ -3,6 +3,7 @@ package unipotsdam.gf.core.states;
 import unipotsdam.gf.core.database.mysql.MysqlConnect;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.core.states.model.ProjectPhase;
 import unipotsdam.gf.interfaces.*;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
@@ -75,7 +76,7 @@ public class PhasesImpl implements IPhases {
     @Override
     public void endPhase(ProjectPhase currentPhase, Project project) {
         ProjectPhase changeToPhase = getNextPhase(currentPhase);
-        Map<StudentIdentifier, Constraints> tasks = new HashMap<>();
+        Map<StudentIdentifier, ConstraintsMessages> tasks = new HashMap<>();
         switch (changeToPhase) {
             case CourseCreation:
                 // saving the state
@@ -89,9 +90,9 @@ public class PhasesImpl implements IPhases {
             case DossierFeedback:
                 // check if everybody has uploaded a dossier
 
-                Boolean feedbacksGiven = feedback.checkFeedbackConstraints(project);
-                if (!feedbacksGiven) {
-                    feedback.assigningMissingFeedbackTasks(project);
+                tasks = feedback.checkFeedbackConstraints(project);
+                if (tasks.size()>0) {
+                    iCommunication.informAboutMissingTasks(tasks, project);
                 } else {
                     // send a message to the users informing them about the start of the new phase
                     iCommunication.sendMessageToUsers(project, Messages.NewFeedbackTask(project));
@@ -100,19 +101,18 @@ public class PhasesImpl implements IPhases {
                 break;
             case Execution:
                 // check if the portfolios have been prepared for evaluation (relevant entries selected)
-                // todo: Boolean portfoliosReady = iJournal.getPortfoliosForEvaluationPrepared(project);
-                Boolean portfoliosReady = true;
-                if (portfoliosReady) {
+                tasks = iJournal.getPortfoliosForEvaluationPrepared(project);
+                if (tasks.size()<1) {
                     // inform users about the end of the phase
                     iCommunication.sendMessageToUsers(project, Messages.AssessmentPhaseStarted(project));
                     saveState(project,changeToPhase);
                 } else {
-                    iJournal.assignMissingPortfolioTasks(project);
+                    iCommunication.informAboutMissingTasks(tasks, project);
                 }
                 break;
             case Assessment:
-                Boolean allAssessmentsDone = iPeerAssessment.allAssessmentsDone(project.getId());
-                if(allAssessmentsDone){
+                tasks = iPeerAssessment.allAssessmentsDone(project.getId());
+                if(tasks.size()<1){
                     iCommunication.sendMessageToUsers(project, Messages.CourseEnds(project));
                     saveState(project, changeToPhase);
                 }else{
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/Constraints.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/Constraints.java
index ac413e63..27c3d4c5 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/Constraints.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/Constraints.java
@@ -1,34 +1,12 @@
 package unipotsdam.gf.core.states.model;
 
-import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
-
-public class Constraints {
-
-    public static String DossierWritten(StudentIdentifier student){
-        return student.getStudentId()+" hat noch kein Dossier hochgeladen.";
-    }
-
-    public static String FeedbackCount(StudentIdentifier student){
-        return student.getStudentId()+" hat noch nicht das erwartete Feedack gegeben.";
-    }
-
-    public static String QuizCount(StudentIdentifier student){
-        return student.getStudentId()+" hat noch kein Quiz erstellt.";
-    }
-
-    public static String JournalCount(StudentIdentifier student){
-        return student.getStudentId()+" hat noch nicht genug Tagebucheinträge verfasst.";
-    }
-
-    public static String DossierFinalized(StudentIdentifier student){
-        return student.getStudentId()+" hat sein Dossier noch nicht finalisiert.";
-    }
-
-    public static String JournalFinalized(StudentIdentifier student){
-        return student.getStudentId()+" hat sein Tagebuch noch nicht finalisiert";
-    }
-
-    public static String AssessmentDone(StudentIdentifier student){
-        return student.getStudentId()+" hat die Bewertung noch nicht abgeschlossen.";
-    }
+public enum Constraints {
+    DossierMissing,
+    FeedbackCount,
+    QuizCount,
+    JournalCount,
+    DossierOpen,
+    DescriptionsOpen,
+    JournalOpen,
+    AssessmentOpen
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/ConstraintsMessages.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/ConstraintsMessages.java
new file mode 100644
index 00000000..0d9d940d
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/model/ConstraintsMessages.java
@@ -0,0 +1,28 @@
+package unipotsdam.gf.core.states.model;
+
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
+
+public class ConstraintsMessages {
+    private final Constraints constraint;
+    private final StudentIdentifier student;
+
+    public ConstraintsMessages(Constraints enumConstraints, StudentIdentifier student) {
+        this.constraint = enumConstraints;
+        this.student = student;
+    }
+
+    @Override
+    public String toString() {
+        switch (constraint) {
+            case QuizCount: return student.getStudentId()+" hat noch kein Quiz erstellt.";
+            case DossierMissing: return student.getStudentId()+" hat noch kein Dossier hochgeladen.";
+            case FeedbackCount: return student.getStudentId()+" hat noch nicht das erwartete Feedack gegeben.";
+            case JournalCount: return student.getStudentId()+" hat noch nicht genug Tagebucheinträge verfasst.";
+            case DossierOpen: return student.getStudentId()+" hat sein Dossier noch nicht finalisiert.";
+            case DescriptionsOpen: return student.getStudentId()+" hat die Descriptions noch nicht abgeschlossen.";
+            case JournalOpen: return student.getStudentId()+" hat sein Tagebuch noch nicht finalisiert";
+            case AssessmentOpen: return student.getStudentId()+" hat die Bewertung noch nicht abgeschlossen.";
+            default: return "default message";
+        }
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java
index 773103d2..ab43f4b2 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/Feedback.java
@@ -1,11 +1,15 @@
 package unipotsdam.gf.interfaces;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.peer2peerfeedback.peerfeedback.Model.Peer2PeerFeedback;
 import unipotsdam.gf.modules.researchreport.ResearchReport;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Map;
 
 
 /**
@@ -66,7 +70,7 @@ public interface Feedback {
      * @param project
      * @return
      */
-    Boolean checkFeedbackConstraints(Project project);
+    Map<StudentIdentifier, ConstraintsMessages> checkFeedbackConstraints(Project project);
 
     /**
      * TODO implement a routine that assigns missing feedback tasks if someone drops out of a course
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
index 2705893f..8c3a7c89 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
@@ -3,11 +3,15 @@ package unipotsdam.gf.interfaces;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.assignments.NotImplementedLogger;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.Message;
 import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
 import unipotsdam.gf.modules.communication.model.chat.ChatRoom;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Provides connection to rocket chat
@@ -90,6 +94,9 @@ public interface ICommunication {
     // TODO implement as Email or whatever
     void sendSingleMessage(Message message, User user);
 
+    //added by Axel.
+    void informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project);
+
     // TODO implement as Email or whatever
     void sendMessageToUsers(Project project, String message);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
index 6d28297f..f3b8786d 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
@@ -3,12 +3,14 @@ package unipotsdam.gf.interfaces;
 
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.journal.model.EPortfolio;
 import unipotsdam.gf.modules.journal.model.Journal;
 import unipotsdam.gf.modules.researchreport.ResearchReport;
 
 import java.io.File;
 import java.util.List;
+import java.util.Map;
 
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 
@@ -23,7 +25,7 @@ public interface IJournal {
      * @return
      * @param project
      */
-    Boolean getPortfoliosForEvaluationPrepared(Project project) ;
+    Map<StudentIdentifier, ConstraintsMessages> getPortfoliosForEvaluationPrepared(Project project) ;
 
     /**
      * find out, who hasn't prepared their portfolio for evaluation and send message or highlight in view
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPeerAssessment.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPeerAssessment.java
index 1892ec39..600ab457 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPeerAssessment.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IPeerAssessment.java
@@ -1,6 +1,7 @@
 package unipotsdam.gf.interfaces;
 
 import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.*;
 
 import java.util.ArrayList;
@@ -98,7 +99,7 @@ public interface IPeerAssessment {
 
     String whatToRate(StudentIdentifier student);
 
-    Boolean allAssessmentsDone(String projectId);
+    Map<StudentIdentifier, ConstraintsMessages> allAssessmentsDone(String projectId);
 
     void assignMissingAssessmentTasks(Project project);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/FBAssessement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/FBAssessement.java
index 866d46be..e373e650 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/FBAssessement.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/FBAssessement.java
@@ -1,6 +1,7 @@
 package unipotsdam.gf.modules.assessment.controller.service;
 
 import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.*;
 
 import java.util.ArrayList;
@@ -86,7 +87,7 @@ public class FBAssessement extends AssessmentDAO {
     }
 
     @Override
-    public Boolean allAssessmentsDone(String projectId) {
+    public Map<StudentIdentifier, ConstraintsMessages> allAssessmentsDone(String projectId) {
         return null;
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
index 871b3c94..9662d75e 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessment.java
@@ -1,6 +1,7 @@
 package unipotsdam.gf.modules.assessment.controller.service;
 
 import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.modules.assessment.controller.model.*;
 
@@ -61,7 +62,7 @@ public class PeerAssessment implements IPeerAssessment {
     }
 
     @Override
-    public Boolean allAssessmentsDone(String projectId) {
+    public Map<StudentIdentifier, ConstraintsMessages> allAssessmentsDone(String projectId) {
         return null;
     }
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessmentDummy.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessmentDummy.java
index a5cb9fae..06fb0dbb 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessmentDummy.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/assessment/controller/service/PeerAssessmentDummy.java
@@ -3,6 +3,7 @@ package unipotsdam.gf.modules.assessment.controller.service;
 import unipotsdam.gf.assignments.Assignee;
 import unipotsdam.gf.assignments.NotImplementedLogger;
 import unipotsdam.gf.core.management.project.Project;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.interfaces.IPeerAssessment;
 import unipotsdam.gf.modules.assessment.controller.model.*;
 
@@ -90,8 +91,8 @@ public class PeerAssessmentDummy implements IPeerAssessment {
     }
 
     @Override
-    public Boolean allAssessmentsDone(String projectId) {
-        return true;
+    public Map<StudentIdentifier, ConstraintsMessages> allAssessmentsDone(String projectId) {
+        return new HashMap<StudentIdentifier, ConstraintsMessages>();
     }
 
     @Override
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
index 1aa5c32f..7f17f00c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationDummyService.java
@@ -6,7 +6,10 @@ import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.assignments.Assignee;
 import unipotsdam.gf.assignments.NotImplementedLogger;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.communication.model.Message;
 import unipotsdam.gf.modules.communication.model.chat.ChatMessage;
 import unipotsdam.gf.modules.communication.model.chat.ChatRoom;
@@ -18,6 +21,7 @@ import javax.inject.Singleton;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 @Resource
@@ -115,6 +119,11 @@ public class CommunicationDummyService implements ICommunication {
         NotImplementedLogger.logAssignment(Assignee.MARTIN, CommunicationDummyService.class, message2);
     }
 
+    @Override
+    public void informAboutMissingTasks(Map<StudentIdentifier, ConstraintsMessages> tasks, Project project) {
+
+    }
+
     @Override
     public void sendMessageToUsers(Project project, String message) {
         // TODO implement as email or directed message, popup after login or whatever
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
index d4e9d8a8..9ed61e8c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
@@ -4,6 +4,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.interfaces.IJournal;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.EPortfolio;
@@ -12,7 +13,9 @@ import unipotsdam.gf.modules.researchreport.ResearchReport;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class IJournalImpl implements IJournal {
 
@@ -23,8 +26,11 @@ public class IJournalImpl implements IJournal {
 
 
     @Override
-    public Boolean getPortfoliosForEvaluationPrepared(Project project) {
-        return descriptionService.checkIfAllDescriptionsClosed(project) && journalService.checkIfAllJournalClosed(project);
+    public Map<StudentIdentifier, ConstraintsMessages> getPortfoliosForEvaluationPrepared(Project project) {
+        Map<StudentIdentifier, ConstraintsMessages> result =new HashMap<>();
+        result.putAll(descriptionService.checkIfAllDescriptionsClosed(project));
+        result.putAll(journalService.checkIfAllJournalClosed(project));
+        return result;
     }
 
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalService.java
index be8dc781..028ea031 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalService.java
@@ -2,10 +2,13 @@ package unipotsdam.gf.modules.journal.service;
 
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.Journal;
 import unipotsdam.gf.modules.journal.model.JournalFilter;
 
 import java.util.ArrayList;
+import java.util.Map;
 
 /**
  * Service for learning Journal
@@ -57,7 +60,7 @@ public interface JournalService {
 
     void closeJournal(String journal);
 
-    boolean checkIfAllJournalClosed(Project project);
+    Map<StudentIdentifier, ConstraintsMessages> checkIfAllJournalClosed(Project project);
 
     ArrayList<User> getOpenUserByProject(Project project);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalServiceImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalServiceImpl.java
index e6367199..a48d76da 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalServiceImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/JournalServiceImpl.java
@@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory;
 import unipotsdam.gf.core.management.ManagementImpl;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.Journal;
 import unipotsdam.gf.modules.journal.model.JournalFilter;
@@ -14,6 +16,8 @@ import unipotsdam.gf.modules.journal.model.dao.JournalDAOImpl;
 import unipotsdam.gf.modules.journal.util.JournalUtils;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 public class JournalServiceImpl implements JournalService {
 
@@ -99,8 +103,13 @@ public class JournalServiceImpl implements JournalService {
     }
 
     @Override
-    public boolean checkIfAllJournalClosed(Project project) {
-        return (journalDAO.getOpenJournals(project).size() == 0);
+    public Map<StudentIdentifier, ConstraintsMessages> checkIfAllJournalClosed(Project project) {
+        Map<StudentIdentifier, ConstraintsMessages> result = new HashMap<>();
+        for (String studentId: journalDAO.getOpenJournals(project)) {
+            StudentIdentifier student = new StudentIdentifier(project.getId(), studentId);
+            result.put(student, new ConstraintsMessages(Constraints.JournalOpen, student));
+        }
+        return result;
     }
 
     @Override
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImpl.java
index 22ca2a4b..5dbeccab 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImpl.java
@@ -3,6 +3,8 @@ package unipotsdam.gf.modules.journal.service;
 import unipotsdam.gf.core.management.ManagementImpl;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.Link;
 import unipotsdam.gf.modules.journal.model.ProjectDescription;
@@ -12,6 +14,8 @@ import unipotsdam.gf.modules.journal.model.dao.ProjectDescriptionDAO;
 import unipotsdam.gf.modules.journal.model.dao.ProjectDescriptionDAOImpl;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 public class ProjectDescriptionImpl implements ProjectDescriptionService {
 
@@ -65,8 +69,14 @@ public class ProjectDescriptionImpl implements ProjectDescriptionService {
     }
 
     @Override
-    public boolean checkIfAllDescriptionsClosed(Project project) {
-        return (descriptionDAO.getOpenDescriptions(project).size() == 0);
+    public Map<StudentIdentifier, ConstraintsMessages> checkIfAllDescriptionsClosed(Project project) {
+        ArrayList<String> missingStudents = descriptionDAO.getOpenDescriptions(project);
+        Map<StudentIdentifier, ConstraintsMessages> result = new HashMap<>();
+        for (String studentId: missingStudents) {
+            StudentIdentifier student = new StudentIdentifier(project.getId(), studentId);
+            result.put(student, new ConstraintsMessages(Constraints.DescriptionsOpen, student));
+        }
+        return result;
     }
 
     @Override
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionService.java
index a99aef7d..03fa4816 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionService.java
@@ -2,10 +2,12 @@ package unipotsdam.gf.modules.journal.service;
 
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.ProjectDescription;
 
 import java.util.ArrayList;
+import java.util.Map;
 
 /**
  * Service for learning Journal
@@ -25,7 +27,7 @@ public interface ProjectDescriptionService {
 
     void closeDescription(String projectDescriptionId);
 
-    boolean checkIfAllDescriptionsClosed(Project project);
+    Map<StudentIdentifier, ConstraintsMessages> checkIfAllDescriptionsClosed(Project project);
 
     ArrayList<User> getOpenUserByProject(Project project);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java
index 0bf9d071..fbfb134c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/peer2peerfeedback/DummyFeedback.java
@@ -6,12 +6,17 @@ import unipotsdam.gf.assignments.Assignee;
 import unipotsdam.gf.assignments.NotImplementedLogger;
 import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.core.states.model.Constraints;
+import unipotsdam.gf.core.states.model.ConstraintsMessages;
 import unipotsdam.gf.interfaces.Feedback;
+import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.peer2peerfeedback.peerfeedback.Model.Peer2PeerFeedback;
 import unipotsdam.gf.modules.researchreport.ResearchReport;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 public class DummyFeedback implements Feedback {
 
@@ -21,7 +26,7 @@ public class DummyFeedback implements Feedback {
     PodamFactory factory = new PodamFactoryImpl();
 
     private static Boolean missingTaskAssigned = false;
-    private Boolean constraintsFulfilled = false;
+    private Map<StudentIdentifier, Constraints> openTasks;
 
 
     public DummyFeedback() {
@@ -52,12 +57,12 @@ public class DummyFeedback implements Feedback {
     }
 
     @Override
-    public Boolean checkFeedbackConstraints(Project project) {
+    public Map<StudentIdentifier, ConstraintsMessages> checkFeedbackConstraints(Project project) {
         // TODO implement constraints
         NotImplementedLogger.logAssignment(Assignee.KATHARINA, Feedback.class, "check Feedback constraints",
                 "checking feedback constraints ");
-        constraintsFulfilled = true;
-        return constraintsFulfilled;
+        Map<StudentIdentifier, ConstraintsMessages> result = new HashMap<>();
+        return result;
     }
 
     @Override
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java
index 284258c1..5a56ac27 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/interfaces/ActivityFlowTest.java
@@ -31,8 +31,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 import static org.mockito.Mockito.verify;
 
 
@@ -232,7 +231,7 @@ public class ActivityFlowTest {
         verify(feedback).assigningMissingFeedbackTasks(project);
 
         // assert that everybody has given and received mockfeedback
-        assertTrue(feedback.checkFeedbackConstraints(project));
+        assertEquals(0, feedback.checkFeedbackConstraints(project).size());
 
         // docent finishes phase
         phases.endPhase(ProjectPhase.DossierFeedback, project);
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/JournalServiceImplTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/JournalServiceImplTest.java
index 05ce97fb..63cdccef 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/JournalServiceImplTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/JournalServiceImplTest.java
@@ -181,13 +181,13 @@ public class JournalServiceImplTest {
 
         ArrayList<Journal> resultJournals = journalDAO.getAllByProject(testProject,testStudent);
 
-        assertFalse(journalService.checkIfAllJournalClosed(project));
+        assertEquals(0, journalService.checkIfAllJournalClosed(project).size());
 
         for(Journal j : resultJournals){
             journalDAO.closeJournal(j.getId());
         }
 
-        assertTrue(journalService.checkIfAllJournalClosed(project));
+        assertEquals(0, journalService.checkIfAllJournalClosed(project).size());
 
     }
 
diff --git a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImplTest.java b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImplTest.java
index 66b84406..bf20b972 100644
--- a/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImplTest.java
+++ b/gemeinsamforschen/src/test/java/unipotsdam/gf/modules/journal/service/ProjectDescriptionImplTest.java
@@ -172,13 +172,13 @@ public class ProjectDescriptionImplTest {
 
         Project project = new Project();
         project.setId(testProject);
-        assertFalse(projectDescriptionService.checkIfAllDescriptionsClosed(project));
+        assertEquals(0, projectDescriptionService.checkIfAllDescriptionsClosed(project).size());
 
         ProjectDescription resDescription = descriptionDAO.getDescription(new StudentIdentifier(testProject, testStudent));
 
         descriptionDAO.closeDescription(resDescription.getId());
 
-        assertTrue(projectDescriptionService.checkIfAllDescriptionsClosed(project));
+        assertEquals(0,projectDescriptionService.checkIfAllDescriptionsClosed(project).size());
 
     }
 
-- 
GitLab