From eadc5fbf6ff34abf68465b15ccc8f1f95c3b0651 Mon Sep 17 00:00:00 2001
From: Julian Dehne <julian.dehne@uni-potsdam.de>
Date: Fri, 6 Jul 2018 12:29:50 +0200
Subject: [PATCH] started implementing state rules

---
 .../gf/core/management/ManagementImpl.java    | 13 ++++-
 .../gf/core/management/project/Project.java   | 19 ++++++-
 .../gf/core/states/DosserUploadTask.java      | 19 +++++++
 .../gf/core/states/PeerAssessmentTask.java    | 21 +++++++
 .../gf/core/states/PeerFeedbackTask.java      | 22 ++++++++
 .../gf/core/states/ProjectPhase.java          |  9 +++
 .../unipotsdam/gf/core/states/States.java     | 35 ++++++++++++
 .../java/unipotsdam/gf/core/states/Task.java  | 56 +++++++++++++++++++
 .../gf/interfaces/ICommunication.java         |  1 +
 .../service/CommunicationDummyService.java    |  6 ++
 .../src/scripts/dbschema/fltrail.sql          | 20 ++++++-
 11 files changed, 218 insertions(+), 3 deletions(-)
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
index 8d98b2c0..62744cc0 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/ManagementImpl.java
@@ -7,6 +7,7 @@ import unipotsdam.gf.core.management.project.Project;
 import unipotsdam.gf.core.management.user.User;
 import unipotsdam.gf.core.management.user.UserInterests;
 import unipotsdam.gf.core.management.user.UserProfile;
+import unipotsdam.gf.core.states.ProjectPhase;
 import unipotsdam.gf.modules.assessment.controller.model.Quiz;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 
@@ -56,11 +57,12 @@ public class ManagementImpl implements Management {
         UUID uuid = UUID.randomUUID();
         String token = uuid.toString();
 
+
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
         String mysqlRequest =
                 "INSERT INTO projects (`id`, `password`, `active`, `timecreated`, `author`, "
-                        + "`adminPassword`, `token`) values (?,?,?,?,?,?,?)";
+                        + "`adminPassword`, `token`, `phase`) values (?,?,?,?,?,?,?,?)";
         connect.issueInsertOrDeleteStatement(mysqlRequest, project.getId(), project.getPassword(), project.isActive(),
                 project.getTimecreated(), project.getAuthor(), project.getAdminPassword(), token);
         connect.close();
@@ -162,6 +164,7 @@ public class ManagementImpl implements Management {
         String author = vereinfachtesResultSet.getString("author");
         String adminPassword = vereinfachtesResultSet.getString("adminpassword");
         String token = vereinfachtesResultSet.getString("token");
+        String phase = vereinfachtesResultSet.getString("phase");
 
         return new Project(id, password, active, timestamp, author, adminPassword, token);
     }
@@ -173,6 +176,7 @@ public class ManagementImpl implements Management {
         // TODO: determine how to get all User
         return new Group(id, new ArrayList<>(), projectId, chatRoomId);
     }
+
     @Override
     public String getUserToken(User user) {
         MysqlConnect connect = new MysqlConnect();
@@ -200,6 +204,13 @@ public class ManagementImpl implements Management {
         return getUserByField("email", email);
     }
 
+
+    /**
+     * TODO @Axel bitte in modules/asessment verschieben
+     * @param projectId
+     * @param quizId
+     * @return
+     */
     public Quiz getQuizByProjectGroupId(String projectId, String quizId){
         MysqlConnect connect = new MysqlConnect();
         connect.connect();
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
index 682b5c40..0cdf93a1 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/management/project/Project.java
@@ -1,5 +1,7 @@
 package unipotsdam.gf.core.management.project;
 
+import unipotsdam.gf.core.states.ProjectPhase;
+
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -16,6 +18,8 @@ public class Project {
     private String author;
     private String adminPassword;
     private String token;
+    // using enum ProjectPhase
+    private String phase;
 
     public Project() {
     }
@@ -26,8 +30,21 @@ public class Project {
         this.active = active;
         this.author = author;
         this.adminPassword = adminPassword;
-
         this.timecreated = Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
+        // default starting at course creation if new
+        this.setPhase(ProjectPhase.CourseCreationPhase);
+    }
+
+    public String getPhase() {
+        return phase;
+    }
+
+    /**
+     * setting phase only with enum
+     * @param phase
+     */
+    public void setPhase(ProjectPhase phase) {
+        this.phase = phase.name();
     }
 
     public Project(String id, String password, Boolean active, String author, String adminPassword, String token) {
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java
new file mode 100644
index 00000000..520f3a41
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/DosserUploadTask.java
@@ -0,0 +1,19 @@
+package unipotsdam.gf.core.states;
+
+import unipotsdam.gf.core.management.user.User;
+
+public class DosserUploadTask extends Task {
+    public DosserUploadTask(User owner) {
+        super(owner);
+    }
+
+    @Override
+    public String getTaskMessage() {
+        return null;
+    }
+
+    @Override
+    protected String getTaskUrl() {
+        return null;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java
new file mode 100644
index 00000000..3808b6b3
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerAssessmentTask.java
@@ -0,0 +1,21 @@
+package unipotsdam.gf.core.states;
+
+import unipotsdam.gf.core.management.user.User;
+
+public class PeerAssessmentTask extends Task {
+    public PeerAssessmentTask(User owner) {
+        super(owner);
+    }
+
+    @Override
+    public String getTaskMessage() {
+        return null;
+    }
+
+    @Override
+    protected String getTaskUrl() {
+        return null;
+    }
+
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java
new file mode 100644
index 00000000..283977e6
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/PeerFeedbackTask.java
@@ -0,0 +1,22 @@
+package unipotsdam.gf.core.states;
+
+import unipotsdam.gf.core.management.user.User;
+
+public class PeerFeedbackTask extends Task {
+    public PeerFeedbackTask(User owner) {
+        super(owner);
+    }
+
+    @Override
+    public String getTaskMessage() {
+        // TODO implement
+        return null;
+    }
+
+    @Override
+    protected String getTaskUrl() {
+        // TODO implement
+        return null;
+    }
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java
new file mode 100644
index 00000000..f17a652a
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/ProjectPhase.java
@@ -0,0 +1,9 @@
+package unipotsdam.gf.core.states;
+
+public enum ProjectPhase {
+    CourseCreationPhase,
+    GroupFormationPhase,
+    DossierFeedbackPhase,
+    ExecutionPhase,
+    AssessmentPhase
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java
new file mode 100644
index 00000000..638cf52b
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/States.java
@@ -0,0 +1,35 @@
+package unipotsdam.gf.core.states;
+
+import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.model.Message;
+
+import javax.inject.Inject;
+
+public class States {
+
+    @Inject
+    ICommunication iCommunication;
+
+
+    public void endPhase(ProjectPhase currentPhase) {
+        // TODO implement
+
+        // calculate reaction
+
+        // if no problem change phase
+
+        // if problem send message
+
+        // and start recovery process
+    }
+
+
+    private void sendProblemMessage(String message, User user) {
+        iCommunication.sendSingleMessage(new Message(null, message),user);
+    }
+
+
+
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java
new file mode 100644
index 00000000..821f480c
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/core/states/Task.java
@@ -0,0 +1,56 @@
+package unipotsdam.gf.core.states;
+
+import unipotsdam.gf.core.management.user.User;
+import unipotsdam.gf.interfaces.ICommunication;
+import unipotsdam.gf.modules.communication.model.Message;
+
+import javax.inject.Inject;
+
+public abstract class Task {
+
+    @Inject
+    ICommunication iCommunication;
+
+    // the user who has to do the task
+    protected User owner;
+
+    public Task(User owner) {
+        this.owner = owner;
+    }
+
+    public abstract String getTaskMessage();
+
+    public void start() {
+        sendTaskMessage();
+        save();
+    }
+
+    private void save() {
+        String name = getClass().getName(); // this returns the runtime name of the subclass i.e. PeerAssessmentTask
+        String url = getTaskUrl();
+
+    }
+
+    /**
+     * should be a relative path like
+     *  /dossiers/upload
+     *  /peerfeedback/{userId}/give
+     *  /peerassessment/{userId}/give
+     *  or similar
+     *
+     * @return
+     */
+    protected abstract String getTaskUrl();
+
+    public void sendTaskMessage() {
+        iCommunication.sendSingleMessage(new Message(null, getTaskMessage()), owner);
+    }
+
+    public User getOwner() {
+        return owner;
+    }
+
+    public void setOwner(User owner) {
+        this.owner = owner;
+    }
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
index 12d3d711..d66970b8 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ICommunication.java
@@ -85,4 +85,5 @@ public interface ICommunication {
 
     String getChatRoomLink(String userToken, String projectToken, String groupToken);
 
+    void sendSingleMessage(Message message, User user);
 }
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 3d989429..138e0d4a 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
@@ -100,6 +100,12 @@ public class CommunicationDummyService implements ICommunication {
         return Constants.ROCKET_CHAT_URL + "/channel/" + channelName + "?layout=embedded";
     }
 
+    @Override
+    public void sendSingleMessage(Message message, User user) {
+        // TODO implement as email or directed message, popup after login or whatever
+        System.out.println("sending email with message: "+ message.getMessage() + " to: "+ user.getEmail());
+    }
+
     // TODO: remove after done implementing
     // just for postman testing
     public User getUser() {
diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
index e0de36c8..906e40da 100644
--- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
@@ -20,7 +20,9 @@ CREATE TABLE if not exists `projects` (
 
   `adminPassword` varchar(400) NOT NULL,
 
-  `token`         varchar(400) NOT NULL
+  `token`         varchar(400) NOT NULL,
+
+  `phase`         varchar(400) NOT NULL
 
 )
 
@@ -125,6 +127,7 @@ CREATE TABLE if not exists projectuser
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;alter table users
 
   add isStudent tinyint(1) default '1' null;
+
 CREATE TABLE if not exists quiz
 
 (
@@ -145,4 +148,19 @@ CREATE TABLE if not exists quiz
 
   ENGINE = InnoDB
 
+  DEFAULT CHARSET = utf8;
+
+CREATE TABLE if not exists tasks
+
+(
+
+  userId varchar(400) NOT NULL,
+
+  projectId varchar(400) NOT NULL,
+
+  taskUrl varchar (400) NOT NULL
+)
+
+  ENGINE = InnoDB
+
   DEFAULT CHARSET = utf8;
\ No newline at end of file
-- 
GitLab